您的位置:首页 > 运维架构 > Linux

linux下测试RTC驱动相关的命令date和hwclock常见用法简介

2012-05-18 22:09 741 查看
原文地址

之前对Linux下面时间相关的内容,一无所知,第一次见到hwclock,不知为何物,也没找到解释清楚的帖子。故此整理一下,简单介绍Linux下验证rtc驱动是否工作正常,相关的的命令:date和hwclock。

先说明:

1.本贴主要内容来整理自后注所引用的帖子。

2.如下介绍,不涉及如何编写rtc驱动,只简单介绍,驱动实现后,如果通过date和hwclock去验证rtc驱动是否正常工作。

【基础知识】

1.date
,Linux中用于显示/修改系统时间的一个命令。

2.Linux的RTC驱动实现完了后,一般是默认的是一个普通的字符型设备,或者一个misc设备,也可以是一个平台设备。

对应地,如果insomod驱动后,或者build-in到kernel后,对应的设备一般是

/dev/rtc 或 /dev/rtc0 或者 /dev/misc/rtc

3.hwclock,见名知意,hw clock, hardware clock,硬件(RTC)时钟。

对于hwclock,看看具体什么用途和用法(此处是嵌入式开发中用到的用busybox中的hwclock):

# hwclock --help

BusyBox v1.13.4 (2009-09-18 16:05:03 CST) multi-call binary

Usage: hwclock [-r|--show] [-s|--hctosys] [-w|--systohc] [-l|--localtime] [-u|--utc] [-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和-w的解释搞晕了,也就后来用错了。。。。

所以,找了下,找到意思更清晰的,是man hwclock的解释,摘录相关部分如下:

hwclock -r or hwclock --show

hwclock -w or hwclock --systohc

hwclock -s or hwclock --hctosys

--show

Read the Hardware Clock and print the time on Standard Output......

--hctosys

Set the System Time from the Hardware Clock......

This is a good option to use in one of the system startup scripts.

--systohc

Set the Hardware Clock to the current System Time.

上面的解释就很清楚了,用中文解释为:

hwclock –r show, 显示硬件时钟, 等价于不加参数的hwclock。

hwclock –s hctosys,hardware clock to system, 将“硬件时钟”RTC的时间写到Linux“系统”时钟里。

hwclock –w systohc,system to hardware clock ,将“系统”时钟写到“硬件时钟”RTC里面。

运行hwclock,会自动去寻找对应的rtc设备,然后执行对应的操作。

网上所找到的,busybox中的对应的代码如下:

static const char *rtcname;

static int xopen_rtc(int flags)

{

int rtc;

if (!rtcname) {

rtc = open("/dev/rtc", flags);

if (rtc >= 0)

return rtc;

rtc = open("/dev/rtc0", flags);

if (rtc >= 0)

return rtc;

rtcname = "/dev/misc/rtc";

}

return xopen(rtcname, flags);

}

4. 在Linux中有硬件时钟与系统时钟等两种时钟。

硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟,对于嵌入式开发,对应开发板上有对应的rtc模块。

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

所有Linux相关指令与函数都是读取系统时钟的设定。系统时钟的设定就是我们常用的date命令。

而我们写的RTC驱动就是为硬件时钟服务的,它有属于自己的命令hwclock。

因此,可以简单理解为,date命令操作Linux的系统(软件)时钟,hwclock命令操作硬件时钟(rtc模块)。

所以,对应地,我们要验证rtc驱动是否工作正常,只需要hwclock,

但往往又会涉及Linux的系统时钟和硬件时钟之间的同步等操作,所以,一般都是将date和hwclock一起搭配使用。

【用date和hwclock测试rtc驱动工作是否正常】

一般来说,最简单的测试rtc是否工作正常的步骤就是,在加载完rtc驱动后(或者本身驱动是已经编译进内核的):

1.显示当前Linux系统时间

date

[2].如果date时间也不正常,比如是1970年之类的,而不是我当前的时间,比如2009年,那么就自己手动设置一下正确时间

date MMDDhhmm[[YY]YY][.ss]

3.显示硬件rtc时间

hwclock

由于此处是rtc驱动第一次加载,还没设置正确的时间,所以此时显示的时间,多数是不正确的是1969,1970年。

4.将Linux系统时间设置到硬件rtc中

hwclock -w

5.再次查看硬件rtc时间是否和系统中的一致

hwclcok

如果驱动正确工作的话,此处显示的时间,就应该和你当前的系统时间一致了,也就是传说中的,时间同步了。。。

否则,就说明你驱动工作不正确,没有正确地把系统时间设置进入硬件rtc中,就要你自己回去调试驱动,找原因去。

6.等个几秒,再次输入:

hwclock

正常的话,会看到此处的时间,相对步骤5中显示的时间,增加了对应的那几秒

那就说明rtc正常工作了。

下面是我的示例:

# date

Wed Dec 31 17:01:25 MST 1969

//我这里此处系统时间也不正常,所以,下面去重新设置Linux系统时间

# date --help

BusyBox v1.13.4 (2009-09-18 16:05:03 CST) multi-call binary

Usage: date [OPTION]... [+FMT] [TIME]

Display time (using +FMT), or set time

Options:

-u Work in UTC (don't convert to local time)

-R Output RFC-822 compliant date string

-I[SPEC] Output ISO-8601 compliant date string

SPEC='date' (default) for date only,

'hours', 'minutes', or 'seconds' for date and

time to the indicated precision

-d TIME Display TIME, not 'now'

-r FILE Display last modification time of FILE

[-s] TIME Set time to TIME

-D FMT Use FMT for str->date conversion

Recognized formats for TIME:

hh:mm[:ss]

[YYYY.]MM.DD-hh:mm[:ss]

YYYY-MM-DD hh:mm[:ss]

MMDDhhmm[[YY]YY][.ss]

//设置的格式,上面提示的很清楚了,MM是月份,DD是日期,hh是小时,mm是分钟,年份可以写2位的YY或者4位的YYYY,秒可以用.ss表示

# date 110313172009.05

Tue Nov 3 13:17:05 MST 2009

# hwclock -w

# hwclock

Tue Nov 3 13:18:33 2009 0.000000 seconds

# hwclock

Tue Nov 3 13:18:41 2009 0.000000 seconds

当然,知道了具体用法后,你可以再次去试试其他的,比如将硬件hwclock里面的时间设置了,

用hwclock -s把rtc时间写到Linux系统时间里面去。

【小提示】

为了使系统时间和RTC时间同步,而不用等待Linux系统启动后,要麻烦地,每次都这样输入命令去同步Linux系统时间和硬件RTC的时间,

可以在初始化文件中添加命令hwclock –s,使每次开机时读取硬件RTC时间,并同步给Linux系统时间。

具体方法是:

在etc/init.d/rcS(旧版本的,应该是/etc/inittab)中添加

/bin/hwclock -s

即可。

【资料引用】

1.关于linux的RTC驱动
http://blog.csdn.net/myleeming/archive/2008/11/05/3228154.aspx
2.RTC\date
http://hi.baidu.com/grdd/blog/item/554c2b3f11d612e455e7234a.html
3.关于rtc的问题?
http://www.linuxforum.net/forum/showflat.php?Board=embedded&Number=725797
4.hwclock(8) - Linux man page
http://linux.die.net/man/8/hwclock
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: