fl2440移植RTC驱动及hwclock命令使用

RTC实时时钟 

RTC(real time clock)实时时钟,主要作用是给Linux系统提供时间。RTC因为是电池供电的,所以掉电后时间不丢失。Linux内核把RTC用作“离线”的时间与日期维护器。当Linux内核启动时,它从RTC中读取时间与日期,作为基准值。在运行期间内核完全抛开RTC,以软件的形式维护系统的当前时间与日期,并在需要时将时间回写RTC芯片。另外如果RTC提供了IRQ中断并且可以定时,那么RTC还可以作为内核睡眠时唤醒内核的闹钟。应用程序可以用RTC提供的周期中断做一些周期的任务。

RTC驱动模型结构


fl2440移植RTC驱动及hwclock命令使用_第1张图片


与RTC核心有关的文件有:
        /drivers/rtc/class.c          这个文件向linux设备模型核心注册了一个类RTC,然后向驱动程序提供了注册/注销接口
        /drivers/rtc/rtc-dev.c       这个文件定义了基本的设备文件操作函数,如:open,read等
        /drivers/rtc/interface.c     顾名思义,这个文件主要提供了用户程序与RTC驱动的接口函数,用户程序一般通过ioctl与RTC驱动交互,这里定义了每个ioctl命令需要调用的函数
        /drivers/rtc/rtc-sysfs.c     与sysfs有关
        /drivers/rtc/rtc-proc.c      与proc文件系统有关
        /include/linux/rtc.h         定义了与RTC有关的数据结构




下面我们开始实际的移植过程,还是主要分为两个部分,一是在内核中添加对rtc驱动的支持,二是修改设备信息。



一、在内核中添加对rtc驱动的支持


Device Drivers  --->[*] Real Time Clock  --->

--- Real Time Clock                                                                       

                        [*]   Set system time from RTC on startup and resume                                            
                          (rtc0)  RTC used to set the system time                                                        
                        [ ]   RTC debug support                                                                        
                            *** RTC interfaces ***                                                                
                      [*]   /sys/class/rtc/rtcN (sysfs)                                                            
                        [*]   /proc/driver/rtc (procfs for rtc0)                                              
                      [*]   /dev/rtcN (character devices)                                                        
                      [*]     RTC UIE emulation on dev interface                                                  
                        <*>   Test driver/device               


fl2440移植RTC驱动及hwclock命令使用_第2张图片



二、修改arch/arm/mach-s3c2410/mach-smdk2410.c


fl2440移植RTC驱动及hwclock命令使用_第3张图片




[fanmaolin@Centeros linux-3.0]$ make


编译内核后移植到开发板上,ok啦。



可以看到有添加RTC的信息。



在开发板上进行测试操作:


Linux命令之hwclock - 查询和设置硬件时钟

hwclock命令,与clock命令是同一个命令,hw clock, hardware clock,硬件(RTC)时钟,主要用来查询和设置硬件时钟。

Options:
-r      Show hardware clock time
-s      Set system time from hardware clock
-w      Set hardware clock to system time
-u      Hardware clock is in UTC
-l      Hardware clock is in local time
-f FILE Use specified device (e.g. /dev/rtc2)


这里注意区分-s 和-w的使用区别,最常用的有三个:

  -r, --show         读取并打印硬件时钟(read hardware clock and print result )
  -s, --hctosys     将硬件时钟同步到系统时钟(set the system time from the hardware clock )
  -w, --systohc     将系统时钟同步到硬件时钟(set the hardware clock to the current system time )



这里要说明的是 hwclock命令与clock命令是一个东西。仅介绍hwclock


date 命令用来显示当前系统时间
cal命令显示日历
fl2440移植RTC驱动及hwclock命令使用_第4张图片

>: hwclock //显示硬件时钟时间
Thu Jan  1 00:05:51 1970  0.000000 seconds
>: hwclock -r //显示硬件时钟时间
Thu Jan  1 00:06:51 1970  0.000000 seconds


date -s "..." 设置系统时间
>: date -s "2017-4-28 21:04:35"
Fri Apr 28 21:04:35 MDT 2017


>: hwclock -w //将系统时间写入硬件时钟
rtc-test rtc-test.0: test_rtc_set_mmss, secs = 1493413496
>: hwclock -r //已经显示为系统时间
Sat Apr 29 03:0 5:04 2017  0.000000 seconds
>: hwclock -r //可以看到时间在变化
Sat Apr 29 03:0 6:18 2017  0.000000 seconds
>: hwclock -r
Sat Apr 29 03:0 7:07 2017  0.000000 seconds
fl2440移植RTC驱动及hwclock命令使用_第5张图片


问题总结

1、

当Linux启动时,系统时钟会去读取硬件时钟的设定,之后系统时钟即独立运作。

要注意系统时钟和硬件时钟的关系。

 在Linux中有硬件时钟系统时钟等两种时钟。
硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟,对于嵌入式开发,对应开发板上有对应的rtc模块。
系统时钟则是指kernel中的时钟。当Linux启动时,系统时钟会去读取硬件时钟的设定,之后系统时钟即独立运作。
所有Linux相关指令与函数都是读取系统时钟的设定。系统时钟的设定就是我们常用的date命令。
而我们写的RTC驱动就是为硬件时钟服务的,它有属于自己的命令hwclock
因此,可以简单理解为,date命令操作Linux的系统(软件)时钟,hwclock命令操作硬件时钟(rtc模块)。
所以,对应地,我们要验证rtc驱动是否工作正常,只需要hwclock,
但往往又会涉及Linux的系统时钟和硬件时钟之间的同步等操作,所以,一般都是将date和hwclock一起搭配使用。


2、

开机后这样显示,而且输入hwclock无法识别

在内核配置时,添加<*>   Test driver/device    选项,解决了。



3、

仔细看会发现我的系统时间是1969年,理论上应该是1970年,可能是开发板运作过程中硬件有问题,而且我设置了系统时间后,再写入硬件时钟,发现相差6个小时,可以在文件系统树下查看,可能是时区的问题。
[fanmaolin@Centeros ~]$ cat /etc/sysconfig/clock
# The time zone of the system is defined by the contents of /etc/localtime.
# This file is only for evaluation by system-config-date, do not rely on its
# contents elsewhere.
ZONE="Asia/Shanghai"

比较好的解决办法是

使用ntpdate命令从网络同步时间,再同步到硬件时钟。

你可能感兴趣的:(驱动篇)