⑬tiny4412 Linux驱动开发之RTC子系统驱动程序

本文介绍了Linux系统中的RTC子系统,探讨了RTC实时时钟的功能和特性,包括BCD数据、闰年生成器、闹钟功能、滴答功能等。同时,详细解析了RTC的工作原理,涉及RTC的相关寄存器如INTP、RTCCON和RTCALM,并给出了Linux驱动程序的加载和测试说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本次来说一下Linux的RTC子系统. (Real Time Clock).

在说之前,先说一下STM32上的一些事儿,在移植UCOS的时候,总是想着用timer为系统提供定时中断服务,然后这次搞RTC驱动,忽然,就想到了实际上还可以使用RTC来为UCOS提供系统时钟中断服务,STM32上是有集成RTC的,其实UCOS的创始人出的书上就有说,能提供定时中断的对象有很对,甚至可以用交流电来提供,这样一判断,发现STM32上能提供类似定时中断的器件还是不少呢,比如timer, watchdog, RTC等等都可以.

好了回到主题,本次说一下Linux上的RTC子系统驱动程序如何编写,并在这之前,先来认识一下RTC这个器件.

RTC实时时钟

RTC一般成为RTC实时时钟. 实时时钟(RTC)单元可以在系统电源关闭的情况下依靠备用电池工作,一般主板上都有一个纽扣电池作为实时时钟的电源.RTC可以通过使用STRB/LDDRB这两个ARM指令向CPU传递8为数据(BCD码).数据包括秒, 分, 小时, 日期, 天, 月, 年.RTC实时时钟依靠一个外部的32.768kHz的石英晶体,产生周期性的脉冲信号.每一个脉冲信号到来时,计数器就加1,通过这种方式,完成计时功能.
RTC实时时钟有如下特性:
1).BCD数据:这些数据包括秒,分,小时,日期,星期几,月和年.
2).闰年产生器.
3).闹钟功能:闹钟中断或者从掉电模式唤醒.
4).滴答功能:支持滴答中断或者滴答唤醒.
5).独立电源引脚RTCVDD.
6).支持ms中断作为RTOS内核时钟.

 

RTC实时时钟的功能

如下图所示,是RTC实时时钟的框架图.XrtcXTI和XercXTO产生脉冲信号.XRTCCLKO则是把这个产生的信号输出外部,这个可以通过配置RTCCON寄存器使能或者关闭,传给2^15 的之时钟分频器,得到一个128Hz的频率,这个频率用来产生滴答计数.当TICNT计数为0时,产生一个TIME TICK中断信号.RTCCON寄存器用来控制RTC实时时钟的功能.RTCRST是重置寄存器,用来重置SEC和MIN寄存器.Leap Year Generator是一个闰年发生器,用来产生闰年逻辑.RTCALM用来控制是否产生报警信号.下面对这些功能分别介绍:

 

1,闰年发生器(Leap Year Generator)

闰年发生器可以基于BCDDATE, BCDMON, BCDYEAR决定每月最后一天的日期是28,29,30 还是31.一个8位计数器只能表示两位BCD码,每一位BCD码由4位表示.因此不能决定00年是否是闰年,例如它不能区别1900年还是2000年.RTC模块通过硬件逻辑支持2000年为闰年(注意1900年不是闰年,2000年才是闰年).因此这两位"00"指的是2000年,而不是1900年.

2,读写寄存器

要写BCD寄存器时必须要将RTCCON寄存器的0位置1;要显示秒,分,小时,日期,星期几,月和年等时间,必须单独读取BCDSEC,BCDMIN,BCDHOUR,BCDDAY,BCDDATE,BCDMON,BCDYEAR寄存器的值.但是这中间可能存在1秒钟的偏差,因为要读多个寄存器.例如,用户读取到的结果是2017年12月31日23点59分,如果读取BCDSEC寄存器的值是1~59是没有问题的,但是如果是0,由于存在1秒的偏差,时间将变成2018年1月1日0时0分.这种情况下,应该重新读取BCDYEAR~BCDSEC寄存器的值,否则读出的时间仍然是2017年12月31日23点59分.

3,后备电池

即使系统电源关闭,RTC模块可以由后备电池通过RTCVDD引脚供电.当系统电源关闭时,CPU和RTC的接口应该被阻塞,后备电池应该只驱动晶振电路和BCD计数器,以消耗最少的电量.

 

4,报警功能

在正常模式和掉电模式下,RTC在指定的时刻会产生一个报警信号.正常模式下,报警中断ALMINT有效,对应INT_RTC引脚.掉电模式下,报警中断ALMINT有效外还产生一个唤醒信号PMWKUP,对用PMWKUP引脚.RTC报警寄存器RTCALM决定是否使能报警状态和设置报警条件.

 

5,时钟脉冲中断与时钟唤醒

RTC时钟脉冲用于中断请求,如上图中的TICNT寄存器有一个中断/唤醒使能位和一个相关的计数器值.最高位是中断/唤醒使能位,低7位是计数位,每产生一个时钟脉冲,计数值减1.如果当时钟脉冲发生时,计数器值到达0,那么会发生一个TIME TICK中断.上图方框Time Tick Generator下有一个128Hz的时钟频率,表示1秒钟产生128次时钟滴答.可以给TICNT的低7位赋值,取值范围为0~127,用n表示.则产生中断请求的周期为如下公式所示:
Period = (n + 1) / 128 second

其中,n表示产生中断前需要滴答的次数(1~127).

 

6,后循环测试功能

注意:在Exynos 4412的datasheet上处理上面那个图里边有写RTCRST之外,我没有找到这个寄存器,可能是没有了,但是还是写出来,万一有呢,哈哈, 后循环测试功能由RTCRST寄存器执行.秒执行发生器的循环边界可以选择为30秒,40秒或50秒,第二个值变为0.例如,如果当前时间是23:37:45,循环测试时间为40秒,则循环测试将当前时间设为23:38:00.注意,所有RTC寄存器都必须使用STRB和LDRB指令或者字符型指针操作.

RTC实时时钟的工作原理

RTC实时时钟的工作由多个寄存器来控制.Exynos 4412都有如下寄存器:

从上面的表格看,好像是没有RTCRST寄存器,下面对其中一些寄存器进行一个大概地讲解,详细的请直接参考datasheet.

1.INTP寄存器

INTP寄存器主要控制ALARM和TICK是否产生中断,从上面的表格来看,只有到了低两位.

2,RTCCON寄存器

配置寄存器则是一个整体功能的控制,从0位开始包括RTC使能,时钟选择,计数器选择,时钟复位滴答频率选择,滴答使能,以及是否向外部提供RTC时钟.

3,RTC报警控制寄存器RTCALM

RTCALM控制报警使能和报警时间,注意,注意,RTCALM在掉电模式下产生ALMINT和PMWKUP报警信号,而在正常模式下,只产生ALMINT信号.RTCALM寄存器的各位表示的内容如下:

4,RTC报警秒数据寄存器ALMSEC

5,RTC报警分钟数据寄存器ALMMIN

6,RTC报警小时数据寄存器ALMHOUR

7,RTC报警日期数据寄存器ALMDATE

8,RTC报警月数据寄存器ALMMON

9,RTC报警年数据寄存器ALMYEAR

10,RTC秒数据寄存器BCDSEC

11,RTC分数据寄存器BCDMIN

12,RTC小时数据寄存器BCDHOUR

由于代码里把关键的地方都进行了注释,所以,代码就直接贴出来了:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值