我的环境:
BOARD:S3C2410
SYSTEM:LINUX2.6.20.6
时钟芯片:M41T81
这两天一直在对M41T81的驱动进行调试,我在应用程序中设的时间在读取后老是不对,还好最终搞定了。
首先看一下对时钟进行设置的数据结构
struct rtc_time {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
我在应用程序中,对这个结构中的某些成员进行赋值
struct rtc_time rt = {
.tm_sec = 10,
.tm_min = 10,
.tm_hour = 9,
.tm_mday = 8,
.tm_mon = 8,
.tm_year = 2009,
};
这个赋值的运行结果总是不对,后来对驱动里的代码进行分析,发现linux系统的时间都是从1900年开始算的,比如我想把年设为1999,那么上术结构中 tm_year = 99。 想把年设为2009, tm_year = 109。就是把要设的年减去1900。
上面是关于tm_year的赋值问题,下面总结一下驱动中对所设置时间的处理步骤:
存储时间:
1)、把用户设置的时间转换为自1970年1月1日0时0分0秒以来的秒数。
2)、把转换过来的秒数再转换为bin码形式的时间,依然是存在struct rtc_time结构中。
3)、将bin码转换为bcd码,再经过一些处理存入时钟芯片
取时间就是上述过程的逆过程。这里要注意,驱动中把时间转换为秒数调用
unsigned long
mktime(const unsigned int year0, const unsigned int mon0,
const unsigned int day, const unsigned int hour,
const unsigned int min, const unsigned int sec)
中传递year0和mon0参数前,就先把年数加1900、把月数加1,然后再传递给mktime函数。比如我给tm_year、tm_mon设置的值分别为109、8,在调用mktime之前就先把它们分别加上1900、1,变为2009、9传递给mktime的year0、mon0成员。