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

news2024/11/24 13:03:46

驱动控制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 0

static 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    0x10070088


struct 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.驱动没有加载  lsmod
	sys_open()   file-->no-->mydev
3.open(fops->open)返回失败

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

信号波形时序图常用工具推荐

Refer: 下载&#xff1a;画时序图的四大神器_可编程器件-面包板社区 (eet-china.com) 软件工程师&#xff0c;习惯使用StarUML画Timing Diagram, 硬件工程师建议使用一下软件。 1、AndyTiming 免费的&#xff0c;这个有一个知乎的博文可以参考 https://zhuanlan.zhihu.com/p…

Android 中利用多个Button组合实现选项切换效果

效果图&#xff1a; xml布局: <LinearLayoutandroid:orientation"horizontal"android:layout_width"match_parent"android:layout_height"50dp"android:gravity"center"android:background"color/White">​<Linear…

SpringCloud Alibaba微服务分布式架构组件演变

文章目录 1、SpringCloud版本对应1.1 技术选型依据1.2 cloud组件演变&#xff1a; 2、Eureka2.1 Eureka Server &#xff1a; 提供服务注册服务2.2 EurekaClient &#xff1a; 通过注册中心进行访问2.3 Eureka自我保护 3、Eureka、Zookeeper、Consul三个注册中心的异同点3.1 CP…

Mysql:常见的面试题和答案

1. 数据库事务的特性&#xff1f; 原子性&#xff1a;即不可分割性&#xff0c;事务要么全部被执行&#xff0c;要么就全部不被执行。一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态隔离性。在事务正确提交之前&#xff0c;不允许把该事务对数据的任…

华为数通智选交换机S5735S-L24T4S-QA2无法SSH远程访问

以前都是按照华为S5700交换机开启SSH远程访问方法配置不同网段通过静态路由实现互通,华为S5700交换机开启ssh远程登陆,现在新买的华为数通智选交换机S5735S-L24T4S-QA2,也是按照这步骤配置,令人不解的是,竟然无法ssh访问,仔细看了配置也没有发现问题,在华为eNSP模拟器上验…

FreeSwitch 1.10.9 在CentOS7.9编译spandsp版本匹配问题

最近FreeSwitch 1.10.9 在CentOS7.9编译mod_spandsp出问题, making all mod_spandsp make[4]: Entering directory /usr/local/src/freeswitch-1.10.9.-release/src/mod/applications/mod_spandspCC mod_spandsp_la-mod_spandsp.loCC mod_spandsp_la-udptl.loCC …

HTTP以及Servlet的学习

HTTP和Servlet 联系&#xff1a; HTTP是一个通信协议&#xff0c;而Servlet是服务器端程序&#xff0c;用于处理HTTP请求。Servlet通常用于处理HTTP请求&#xff0c;在服务器上生成动态内容&#xff0c;并生成HTTP响应。HTTP协议就是Servlet处理的基础。 区别&#xff1a; …

【MySQL】如何查询MySQL执行过的所有SQL语句

文章目录 1 MySQL 的通常查询日志实验2 参考资料 1 MySQL 的通常查询日志实验 通过 MySQL 的通用查询日志可以找到你指定的每一条 sql 语句。很明显会有严重的性能损耗所以也只会在开发测试时才会使用。 前言&#xff1a;关于本实验与慢日志实验几乎一模一样&#xff0c;故本文…

05-算法部分 (数据结构和算法)

一 排序算法 1.1 冒泡法排序 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单直观的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。 首先从数组的第一个元素开始到数组最后一个元素为止&#x…

串行FLASH文件系统FatFs-文件系统介绍

目录 串行FLASH文件系统FatFs-文件系统介绍 文件系统介绍 使用SPI FLASH直接存储数据缺点 Windows上的文件系统 磁盘的物理结构 磁盘分区表 文件系统的结构与特性 文件系统的空间示意图 FATFS文件系统 FATFS文件系统简介 1 . 特征 2. 层级结构 FatFs的目录结构 FatF…

文件操作--文件的随机读写、标准输入输出重定向

目录 一、文件的随机读写 二、便准输入输出重定向 一、文件的随机读写 前面的例程执行的都是顺序文件处理&#xff08;Sequential File Processing&#xff09;。在顺序文件处理过程中&#xff0c;数据项是一个接着一个进行读取或者写入的。例如&#xff0c;如果想读取文件中…

HarmonyOS学习路之开发篇—流转(多端协同 一)

多端协同开发 场景介绍 开发者在应用FA中通过调用流转任务管理服务、分布式任务调度的接口&#xff0c;实现多端协同。 主要流程如下&#xff1a; 设备A上的应用FA向流转任务管理服务注册一个流转回调。 Alt1-系统推荐流转&#xff1a;系统感知周边有可用设备后&#xff0c;主…

Leangoo领歌敏捷管理工具标签升级,企业级标签组上线

在Leangoo领歌敏捷工具中&#xff0c;标签通常用作对任务的分类&#xff0c;或任务的优先级区分等。这次我们发布了大家期待已久的“企业级标签组”功能&#xff0c;标签可以统一管理啦&#xff5e; 之前&#xff0c;Leangoo领歌的标签功能只限于单个看板使用&#xff0c;需要…

视频孪生赋能智慧交通综合管理系统的数智化升级

交通是重大民生工程,涉及公共安全和人民群众切身利益,必须树牢安全发展理念,强化企业主体责任落实。根据国家标准《城市轨道交通公共安全防范系统工程技术规范》中要求&#xff1a; 未来的智慧交通系统要建立在安防集成平台的应用上&#xff0c;对各类重要部位进行视频图像与三…

CUDA编程实战(使用Sobel算子对rgb图片进行边缘检测)

写在前面&#xff0c;本篇文章为一个CUDA实例&#xff0c;使用GPU并行计算对程序进行加速。如果不需要看环境如何配置&#xff0c;可以直接到看代码部分:点击直达 关于如何更改代码和理解代码写在这个地方:点击直达 运行环境&#xff1a; 系统:windows10专业版 显卡:NVIDIA …

sharding-jdbc分库连接数优化 | 京东物流技术团队

一.背景: 配运平台组的快递订单履约中心(cp-eofc)及物流平台履约中心(jdl-uep-ofc)系统都使用了ShardingSphere生态的sharding-jdbc作为分库分表中间件, 整个集群采用只分库不分表的设计,共16个MYSQL实例,每个实例有32个库,集群共512个库. 当每增加一台客户端主机,一个MYSQl实…

AE/PR/OFX插件-Mocha Pro 2023 v10.0.2 Win 专业平面/三维跟踪摄像机反求插件

插件简介 Mocha Pro是用于VFX视觉特效和后期制作强大的平面跟踪工具&#xff0c;这里提供的是AE和PR的插件版。具有GPU加速的跟踪和对象去除功能&#xff0c;具有边缘捕捉功能的高级遮罩&#xff0c;稳定功能&#xff0c;镜头校准&#xff0c;3D摄像头求解器&#xff0c;立体3…

Win32 汇编在对话框上画线

参阅前文&#xff0c;首先要有一个基本的对话框&#xff1b; 把对话框资源文件里的控件定义都删除&#xff0c;得到的一个rc文件&#xff0c;test.rc&#xff1b; #include <resource.h>#define DLG_MAIN 1DLG_MAIN DIALOG 193, 180, 130, 150 STYLE DS_MODALFRAME | …

在win32 asm中了解intel浮点运算

看老罗的书中有如下一段&#xff0c; ...... fild dwRadius fild _dwDegree fldpi fmul ;角度*Pi fild dwPara180 fdivp st(1),st ;角度*Pi/180 fsin ;Sin(角度*Pi/180) fild …

038、TiDB特性_聚簇索引和非聚簇索引

聚簇表 表中的行数据才能出顺序与主键存储的顺序一致表的主键即为KV映射中Key的一部分通过主键访问行记录时&#xff0c;可以直接获取行记录 create table t( a biging primary key clustered ,b varchar(255)); # a列为主键列&#xff0c;聚簇列聚簇表&#xff08;且ID为主键…