在android中,Linux内核中、rtc时钟,默认的起始日期都是1970年1月1日。
那么如何把默认日期指到2012-01-01呢?实践中发现,在RTC驱动中可以很容易实现。
在RTC驱动加载的时候,一般都有个probe函数需要先执行,因此在probe函数里下手最直接有效。
RTC从1970-01-01开始,那当然很容易把默认值设置到2012-01-01,
所需要设置的seconds也就是从1970-01-01所差的秒数,以秒为单位。
因此,一旦读出来的RTC值小于我们预想的值比如2012-01-01(1325402913)小,
我们就把它设置到这个时间点。
然后我们具体分析到MTK方案中如何修改,
MTK方案中,RTC 模块有自己独立出来的模块。
该模块的实现文件是mtk_rtc.c.在该文件中,
我们根据上面的线索可以定位到rtc_pdrv_probe函数。
在改函数中有如下片断代码:
.....rtc = rtc_device_register(RTC_NAME, &pdev->dev, &rtc_ops, THIS_MODULE);
.....
上面函数注册了设备及相关操作设备的方法. rtc_ops这个结构体定义了我们操作rtc模块的方法,
代码如下:
static struct rtc_class_ops rtc_ops =
{
.read_time = rtc_ops_read_time,
.set_time = rtc_ops_set_time,
.read_alarm = rtc_ops_read_alarm,
.set_alarm = rtc_ops_set_alarm,
};继续跟踪代码到rtc_ops_read_time函数,
其中有片断代码:
......
if RTC_OVER_TIME_RESET
if (unlikely(time > (unsigned long)LONG_MAX)) { rtc_reset_to_deftime(tm); rtc_tm_to_time(tm, &time); }
endif
......
我们可以看到rtc_reset_to_deftime(tm);从这个函数的名字就可以知道大概意思, 就是设置默认时间.上面函数有片断代码如下:
......
tm->tm_year = RTC_DEFAULT_YEA - 1900;
tm->tm_mon = RTC_DEFAULT_MTH - 1;
tm->tm_mday = RTC_DEFAULT_DOM;
......
RTC_DEFAULT_YEA 这个就是我们所需要找的东东.它的定义位于:mediatek\custom\ckt77_cu_ics2\kernel\rtc\rtc 目录下.分析完毕。