ARM|9260 linux RTC驱动问题修正

原帖地址:http://blog.csdn.net/xuwukong/article/details/4113812



sbc9260 RTC设置问题修正
问题描述:
用date命令设置系统时间
[root@sbc9260 /]# date 042208092009.30
Wed Apr 22 08:09:30 EDT 2009
用hwclock –w将系统时间写到RTC中,更新RTC时钟为系统时钟
[root@sbc9260 /]# hwclock –w
断电重启板子,用date命令设置系统时间
[root@sbc9260 /]# date
Wed Apr 22 04:10:31 EDT 2009
发现系统时间和设置的相差了4个小时。

刚开始怀疑在执行hwclock –w设置RTC时钟的时候有问题,可能用户输入的时间和实际设置的时间不同,为了查看设置RTC时钟的情况,将设置过程用Printk打印出来。
[root@sbc9260 /]# date 042208092009.30
Wed Apr 22 08:09:30 EDT 2009
[root@sbc9260 /]# hwclock -w
set to register[before BIN2BCD]
secs=45, mins=9, hours=8, mday=22, mon=3, year=109, wday=3
set to register[after BIN2BCD]
%raw data is st1=00, st2=00, sec=45, min=09, hr=08, mday=22, wday=03, mon=04, year=09
查看输入信息,发现设置数据没有错误,不过这只是证明在设置RTC时钟的时候,传送给RTC的数据正确送达了RTC的数据缓冲区,是不是正确写入了RTC内部的寄存器还未知。
断电重启,执行hwclock –r.
确认将用户输入输入正确写入了RTC寄存器。
RTC正确地保存了断电以前设置的时间,而系统时间又不对,说明系统重启后没有成功执行hwclock –s,将系统时间更新为RTC时间。那么手动输入hwclock –s 命令后系统时间和RTC时间应该一致了。输入hwclock –s后,再执行date,果然系统时间和RTC对上了。
跌跌撞撞到这里,想起来还没有了解RTC时间和系统时间时怎样同步的,汗。
内事问百度,外事问谷歌,前辈们说的。
Google之后,对RTC和系统时间的大致关系了解如下。
1.系统启动后会读取RTC中的时间,来更新系统时间。
2.系统时间,RTC时间独立运行。
3..每隔660s,系统检查是否需要将系统时间保存到RTC中。
4.系统关闭时,将系统时间保存到RTC中,更新RTC时间
如此说来,系统在启动时应该会自动执行hwclock –s命令,应该在某个启动脚本里,最终在/etc/rc.sysinit shell脚本中找到如下内容
If [-f “/dev/rtc”];then
/sbin/hwclock –s
Fi
这段程序的意思,若存在/dev/rtc文件,则执行hwclcok –s 命令,而实际是没有执行hwclock –s命令,也就是说if为假,不存在/dev/rtc文件,再/dev目录下执行ls –l,
lrwxrwxrwx1 rootroot4 Apr 22 06:21 rtc -> rtc0
crw-------1 rootroot254,0 Apr 22 06:21 rtc0
该文件确实存在,到此又迷糊了,明明存在,怎么判断不存在呢,先不管了,加上#屏蔽判断
#If [-f “/dev/rtc”];then
/sbin/hwclock –s
#Fi
【ARM|9260 linux RTC驱动问题修正】重新编译根文件系统,烧录,重启,用date设置时间,再重启,再执行date命令。
系统时间和RTC时间一致了!
到此问题似乎解决了,但是前提是/dev/rtc是始终存在的,是想当然的认为/dev/rtc是一定存在的,感觉不够严谨,因为对shell语言不熟悉,找了shell的文章,在test章节发现如下内容。
test –e File文件存在
test –f File文件存在并且是普通文件
那么设备文件应该不是普通文件,应该是-e才对,将-f改为-e,去掉if屏蔽。
Game over!
问题最终解决了。

    推荐阅读