Linux下rtc驱动

Linux下rtc驱动
-
 

 

先简单介绍date与hwclock的异同。

相同点:都是表示时间的。

差异点:

date 是表示系统的时间,假如在系统启动时没有设置的话,系统都会从1970年开始。

hwclock是表示硬件的时间,如时钟芯片或主芯片自带的rtc里面的时间。

Date就不做介绍了,看下hwclock

 

# hwclock --help

BusyBox v1.14.1 (2010-01-22 10:35:16 CST) multi-call binary

 

Usage: hwclock [-r] [-s] [-w] [-l] [-u] [-f FILE]

 

Query and set 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   Set system time from hardware clock 从硬件时钟读取数据到系统时钟,主要用于刚开始时,系统时钟从硬件时钟读取时间信息,如果没有这步,则系统时间就会为1970年了。

-w  Set hardware clock to system time    把系统时钟设置到硬件时钟里面,主要用于设置硬件时钟的时间,比如在使用busybox制作的根文件系统中,要设置时间有2个步骤:1,先使用date设置系统时间;2,再利用hwclock –w把当前系统时间写到硬件时钟里面。如果没有第二步,下次启动时,系统时间是不会更新的。

可以看看下面例子:

# date

Thu Jan  1 12:10:11 UTC 1970

# hwclock

Thu Jan  1 12:10:13 1970  0.000000 seconds

时间是一致的(当然了秒不一样,是我操作需要时间的原因)

用date 设置下时间

# date -s 13:00:00

Thu Jan  1 13:00:00 UTC 1970

# date

Thu Jan  1 13:00:02 UTC 1970

# hwclock

Thu Jan  1 12:14:27 1970  0.000000 seconds

很明显设置后date 与hwclock显示不一样

然后,使用

# hwclock -w

# date

Thu Jan  1 13:01:27 UTC 1970

# hwclock

Thu Jan  1 13:01:29 1970  0.000000 seconds

很明显,时间又一致了。

然后,再来看下驱动。

 

先把at91sam9263自带的rtc配置上,启动的时候提示

rtc-at91sam9 at91_rtt.0: hctosys: unable to read the hardware clock

于是用hwclock来检查,到底是哪里出了问题

# hwclock

hwclock: can't open '/dev/misc/rtc': No such file or directory

没有这个设备,需要建立一个

查看下rtc设备号

# cat /proc/devices

Character devices:

  1 mem

  2 pty

  3 ttyp

  4 /dev/vc/0

  4 tty

  4 ttyS

  5 /dev/tty

  5 /dev/console

  5 /dev/ptmx

  7 vcs

 10 misc

 13 input

 90 mtd

128 ptm

136 pts

153 spi

253 pcmcia

254 rtc

 

Block devices:

  1 ramdisk

  7 loop

 31 mtdblock

179 mmc

#

rtc是254,建立设备

# mknod /dev/misc/rtc c 254 0

这里查看下busybox的源码

int FAST_FUNC rtc_xopen(const char **default_rtc, int flags)

{

        int rtc;

 

        if (!*default_rtc) {

                *default_rtc = "/dev/rtc";

                rtc = open(*default_rtc, flags);

                if (rtc >= 0)

                        return rtc;

                *default_rtc = "/dev/rtc0";

                rtc = open(*default_rtc, flags);

                if (rtc >= 0)

                        return rtc;

                *default_rtc = "/dev/misc/rtc";

        }

 

        return xopen(*default_rtc, flags);

}

就会发现调用hwclock时做了3次尝试,随便你用/dev/rtc,/dev/rtc0,/dev/misc/rtc哪个设备都可以,若3个都没有就会提示错误。

为了简单,以后就弄个/dev/rtc0

# mknod /dev/rtc0 c 254 0

再用hwclock 查看下

# hwclock

Thu Jan  1 00:05:41 1970  0.000000 seconds

就有了时间了。

如果时钟芯片或主芯片自带的时钟格式有问题的话,会出现如下错误

# hwclock

hwclock: RTC_RD_TIME: Invalid or incomplete multibyte or wide character

这里就需要把系统的时间设置到时钟芯片或主芯片自带的rtc里面去,如下

#hwclock –w

 

然后rtc就可以用了。
 

你可能感兴趣的:(Linux下rtc驱动)