m41t81驱动中对时间的处理

我的环境:

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成员。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值