驱动程序设计 利用RTC显示年月日时分秒到终端 7.11

驱动控制RTC

  1. 用户需求:写一个RTC时钟控制的驱动,实现RTC显示年月日时分秒到用户端

  2. 驱动需求:设备:RTC模块 功能:打印显示

  3. 寄存器操作:

    1. 原理图: 设备–>pin–>设备控制芯片

      ​ 驱动需求 --> 设备需求

    2. 芯片手册:设备控制芯片–>寄存器

驱动程序

/*===============================================
*   文件名称:modRtc.c
*   创 建 者: memories
*   创建日期:2023年07月10日
*   描    述:have a nice day
================================================*/
//头文件
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kdev_t.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include "rtc.h"#define MA 300
#define MI 0static dev_t no = 0;
static unsigned count = 1;
static const char *name = "mydev";
static struct cdev mydev;
static int *rtccon     = NULL;
static int *bcdsec     = NULL;
static int *bcdmin     = NULL;
static int *bcdhour    = NULL;
static int *bcddayweek = NULL;
static int *bcdday     = NULL;
static int *bcdmon     = NULL;
static int *bcdyear    = NULL;void addr_map(void)
{rtccon     = ioremap(RTCCON,4);bcdsec     = ioremap(BCDSEC,4);bcdmin     = ioremap(BCDMIN,4);bcdhour    = ioremap(BCDHOUR,4);bcddayweek = ioremap(BCDDAYWEEK,4);bcdday     = ioremap(BCDDAY,4);bcdmon     = ioremap(BCDMON,4);bcdyear    = ioremap(BCDYEAR,4);
}void dev_init(void)
{writel(readl(rtccon)|(0x1),rtccon);writel(0x46,bcdsec);writel(0x23,bcdmin);writel(0x14,bcdhour);writel(0x1,bcddayweek);writel(0x11,bcdday);writel(0x4,bcdmon);writel(0x023,bcdyear);}void addr_unmap(void)
{iounmap(rtccon);iounmap(bcdsec);iounmap(bcdmin);iounmap(bcdhour);iounmap(bcddayweek);iounmap(bcdday);iounmap(bcdmon);iounmap(bcdyear);
}struct RTC mydata(void)
{struct RTC rtc;rtc.sec     = readl(bcdsec);rtc.min     = readl(bcdmin);rtc.hour    = readl(bcdhour);rtc.dayweek = readl(bcddayweek);rtc.year    = readl(bcdyear);rtc.mon     = readl(bcdmon);rtc.day     = readl(bcdday);return rtc;
}/*
时间设置之后会一直走,不用open和release
int myopen (struct inode *pi, struct file *pf)
{printk("open success\n");return 0;
}
int myrelease (struct inode *pi, struct file *pf)
{printk("release success\n");writel(readl(rtccon)&~(0x1),rtccon);return 0;
}
*/
ssize_t myread(struct file *pf, char __user *rbuf, size_t len, loff_t *poff)
{int ret = -1;struct RTC rtc = mydata();ret = copy_to_user(rbuf,&rtc,sizeof(struct RTC));if(ret !=0 ){printk("copy is failed\n");return -1;}return len;
}static struct file_operations myfops={// .open = myopen,// .release = myrelease,.read = myread,
};
//初始化
int myinit(void)
{int ret;//向上内核no = MKDEV(MA,MI);//注册设备号ret = register_chrdev_region(no,count,name);if(ret !=0){printk("reg is error\n");return -1;}//设备操作初始化cdev_init(&mydev,&myfops);//添加设备ret = cdev_add(&mydev,no,count);if(ret != 0){unregister_chrdev_region(no,count);return -1;}//向下驱动//1.映射addr_map();//2.寄存器初始化dev_init();printk("my init is ok\n");return 0;
}
//退出
void myexit(void)
{//删除设备cdev_del(&mydev);//注销设备号unregister_chrdev_region(no,count);//解除映射addr_unmap();printk("my exit is ok\n");return ;
}
module_init(myinit);
module_exit(myexit);
//信息
MODULE_LICENSE("GPL");

应用程序

/*===============================================
*   文件名称:rtc.c
*   创 建 者: memories
*   创建日期:2023年07月10日
*   描    述:have a nice day
================================================*/
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include "rtc.h"int main(int argc, char *argv[])
{ int fd = open("/dev/mydev",O_RDWR);if(fd < 0){printf("open is failed\n");return -1;}while(1){int ret;struct RTC rtc;ret = read(fd,&rtc,sizeof(struct RTC));if(ret < 0){perror("read");return -1;}printf("2%03x-%x-%x %x %x:%x:%x\n",rtc.year,rtc.mon,rtc.day,rtc.dayweek,rtc.hour,rtc.min,rtc.sec);sleep(1);}close(fd);return 0;
} 
/*===============================================
*   文件名称:rtc.h
*   创 建 者: memories
*   创建日期:2023年07月10日
*   描    述:have a nice day
================================================*/
#ifndef __rtc_H_
#define __rtc_H_#define RTCCON     0x10070040
#define BCDSEC     0x10070070
#define BCDMIN     0x10070074
#define BCDHOUR    0x10070078
#define BCDDAYWEEK 0x10070080
#define BCDDAY     0x1007007C
#define BCDMON     0x10070084
#define BCDYEAR    0x10070088struct RTC{int sec;int min;   int hour;  int dayweek; int year;  int mon;int day;   };  #endif
打开设备文件失败的原因:
1.文件没有创建  ls-l /dev/mydev 检查文件有没有和设备号open("/dev/mydev")
2.驱动没有加载  lsmodsys_open()   file-->no-->mydev
3.open(fops->open)返回失败

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/29775.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

55 # 实现可写流

先在 LinkedList.js 给链表添加一个移除方法 class Node {constructor(element, next) {this.element element;this.next next;} }class LinkedList {constructor() {this.head null; // 链表的头this.size 0; // 链表长度}// 可以直接在尾部添加内容&#xff0c;或者根据…

国内流行的数据可视化软件工具

在信息爆炸的时代&#xff0c;越来越多的数据堆积如山。但是&#xff0c;这些密集的数据没有重点且可读性较差。因此&#xff0c;我们需要数据可视化来帮助数据易于理解和接受。相比之下&#xff0c;可视化更直观、更有意义&#xff0c;使用适当的数据可视化工具来可视化数据非…

密码学总结杂七杂八的wp

快捷键 折叠&#xff08;展开&#xff09;所有代码这里是指按下快捷键后凡事.py文件里可折叠的都折叠。 折叠所有代码&#xff1a;Ctrl Shift - &#xff08;减号&#xff09; 展开所有代码&#xff1a;Ctrl Shift &#xff08;加号&#xff09; 折叠&#xff08;展开&…

在Illustrator中创建 3D 冰淇淋模型对象

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 一旦你学会了如何在Illustrator中制作一个对象3D&#xff0c;你可以前往Envato Elements&#xff0c;在那里你可以找到大量的3D设计来激发你的灵感。这个基于订阅的市场拥有超过 2&#xff0c;000 个 Illus…

一、音频基础-音频分析的重要工具(语谱图)

文章目录 1. 傅里叶转换2. 语谱图3. 应用1. 傅里叶转换 通过前面的描述可以知道,声音的本质就是各种声波,那么任意某一个时刻,都不可能是只有一个频率的波,而且声波也不可能是我们理解的标准的正弦波: 而一般我们对声音进行处理时,需要分析出频率当中的有哪些频率,然…

麒麟SP3X86系统下,安装Oracle11g数据库

目录 1、写在前面 2、准备工作 2.1 环境准备 2.2 数据库安装前准备 2.2.1 安装依赖 2.2.2 系统环境准备 2.2.3 上传软件安装包 2.2.4 安装调图形化界面的依赖和相关设置 3、执行安装程序 1、写在前面 随着国产化进程&#xff0c;各大应用需要在国产服务器上面进行部署…

Python调用ImageMagick生成PDF文件缩略图

使用Python调用ImageMagick生成PDF文件缩略图 Imagemagick使用Ghostscript作为其依赖项之一&#xff0c;以便能够处理和转换PDF相关的图像。 准备 安装Ghostscript&#xff0c;网站安装ImageMagick&#xff0c;网站 安装完毕后&#xff0c;需要自行配置环境路径 脚本 使用示…

准备WebUI自动化测试面试?这30个问题你必须掌握(二)

本文共有11000字&#xff0c;包含了后十五个问题&#xff0c;如需要前十五个问题&#xff0c;可查看文末链接~ 16. 在WebUI自动化测试中&#xff0c;你如何处理验证码或图像识别的问题&#xff1f; 1. 人工识别&#xff1a;一种简单但费时费力的方法是使用人工手动识别验证码。…

pycharm里debug时torch数组显示不全

pycharm里查看torch数组全部值 一、在Pycharm运行torch数组时&#xff0c;通常只能看到数组的一部分二、解决办法1、debug后&#xff0c;鼠标右键想要查看完整的数组&#xff0c;选择Evaluate Expression2、输入np.array(x0.data)&#xff0c;x0为想要查看的数组名&#xff0c;…

Kubernetes Volume及其类型(NFS、SAN) - PV - PVC - PV与PVC与Pod的关系

目录 volume 卷 官方文档&#xff1a;卷 | Kubernetes 一、emptyDir&#xff08;临时卷&#xff09; 二、hostPath卷 type字段参数 hostPath 实验&#xff1a; 三、第3方提供的存储卷&#xff08;百度云、阿里云、亚马逊云、谷歌云等&#xff09; 四、local卷 五、NF…

mysql、redis 、RabbitMQ只能本机访问,怎么改?

如果只能本机访问&#xff0c;怎么改? 一、mysql - 改my.ini 刷脚本 bind-address0.0.0.0 然后重启一下mysql服务 任务管理器-关掉mysql 搜索 计算机管理-重启mysql服务 然后 打开查询&#xff0c;并选择mysql数据&#xff0c;输入这个sql语句&#xff0c;点击运行 sele…

解码 LangChain|用 LangChain 和 Milvus 从零搭建 LLM 应用

如何从零搭建一个 LLM 应用&#xff1f;不妨试试 LangChain Milvus 的组合拳。 作为开发 LLM 应用的框架&#xff0c;LangChain 内部不仅包含诸多模块&#xff0c;而且支持外部集成&#xff1b;Milvus 同样可以支持诸多 LLM 集成&#xff0c;二者结合除了可以轻松搭建一个 LLM…