博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ds1339驱动源码及RTC设备驱动简介
阅读量:4286 次
发布时间:2019-05-27

本文共 2072 字,大约阅读时间需要 6 分钟。

RTC

实时时钟,在嵌入式设备中以芯片来表现,一般有八个脚

芯片会被一直供电.所以里面的一些寄存器会一直存在值,且一直都是变化的.

linux中有两个时间,一个是rtc中的时间(一般由hwclock命令来控制),一个是linux系统中的时间(一般由date命令来控制)

在系统启动时,可以在/etc/init.d/rcS中写入命令将rtc中的时间拷贝到linux中.从而达到看起来像是时间没掉电的表象


RTC驱动

RTC设备属于一种字符设备,在一些文件中通过杂项设备的框架进行搭建驱动.RTC设备与主芯片的交互可能是任意方式(例如spi或者i2c),所以读写的时候要遵循相应的协议.

//杂项设备miscdevice结构体static struct miscdevice ds1339_driver = {    .minor      = MISC_DYNAMIC_MINOR,    .name       = "rtc-ds1339",    .fops       = &ds1339_fops,};//通过下面的语句被注册misc_register(&ds1339_driver);//操作指针static struct file_operations ds1339_fops = {    .owner      = THIS_MODULE,    .unlocked_ioctl  = ds1339_ioctl,    .open       = ds1339_open,    .release    = ds1339_close};
//一般的驱动都会实现读写case CMD_SET_TIME:    printk("Will set the ds1339 time and date\n");    //拷贝进来    copy_from_user(&wtime, (struct rtc_time_new *)arg, sizeof(struct rtc_time_new));//一般会检验    //处理    ds1339_time[0] = bin2bcd(wtime.tm_sec);    ds1339_time[1] = bin2bcd(wtime.tm_min);    ds1339_time[2] = bin2bcd(wtime.tm_hour);    ds1339_time[3] = bin2bcd(wtime.tm_wday+1);    ds1339_time[4] = bin2bcd(wtime.tm_mday);    ds1339_time[5] = (bin2bcd(wtime.tm_month+1)|DS1339_BIT_CENTURY);     ds1339_time[6] = bin2bcd(wtime.tm_year%100);    gpio_i2c_write(ADDRTC,0,0);//选中芯片,让芯片做准备    for (temp=1;temp<7;temp++)    {        gpio_i2c_write(ADDRTC,temp,ds1339_time[temp]);//将数据写入芯片    }    break;
case CMD_GET_TIME:    printk("\nWill get the ds1339 time and date\n");    for (temp=0;temp<7;temp++)    {        ds1339_time[temp]  = gpio_i2c_read(ADDRTC,temp);//将数据读出来    }    //处理    wtime.tm_sec    = bcd2bin(ds1339_time[0] & 0x7f);    wtime.tm_min    = bcd2bin(ds1339_time[1] & 0x7f);    wtime.tm_hour   = bcd2bin(ds1339_time[2] & 0x3f);    wtime.tm_wday   = bcd2bin(ds1339_time[3]& 0x07) - 1;    wtime.tm_mday   = bcd2bin(ds1339_time[4]& 0x3f);    wtime.tm_month  = bcd2bin(ds1339_time[5]& 0x1f) - 1;    wtime.tm_year   = bcd2bin(ds1339_time[6]);    //拷贝出去    copy_to_user((void *)arg, &wtime, sizeof (struct rtc_time_new));    break;

注意:

  • 上例中的驱动,是杂项设备框架和i2c框架(没有展示代码)的结合.

源码下载

源码已经附到链接中,自己改的,和展示代码稍有不同,


转载地址:http://qvigi.baihongyu.com/

你可能感兴趣的文章
JavaScript实现简单图片滚动 --9张图告诉你,C罗欲哭无泪
查看>>
国外优秀JavaScript资源推荐
查看>>
JS中单引号/双引号以及外部js引入的一些问题
查看>>
加班防猝死的十个小建议
查看>>
《JavaScript权威指南》学习笔记之二十---XMLHttpRequest和AJAX解决方案
查看>>
Ubuntu安装二:在VM中安装Ubuntu
查看>>
PHP获取表单方法总结
查看>>
Git学习笔记总结和注意事项
查看>>
谈“穷”-----穷只是一种结果,真正穷的是思维和行动
查看>>
六位创业者分享内心最恐惧的事情
查看>>
JavaScript数值转换总结
查看>>
JavaScript中的重载解读
查看>>
浅谈JavaScript中的原型模式
查看>>
HTML的奇葩嵌套规则
查看>>
我是如何自学编程的——“3遍读书法”
查看>>
当老实人遇到世态炎凉
查看>>
程序猿,你们这么拼是找不到妹纸的!
查看>>
问题与对策:CSS的margin塌陷(collapse)
查看>>
识别“百度权重”作弊的方法
查看>>
干货|程序员常去的14个顶级开发社区
查看>>