关于android系统中的系统时间和rtc时间

关于android系统中的系统时间和rtc时间

说明:这是注册账号以来的第二次登录,平时也不写什么博客,今天登录一次完全是为了评论一个老铁的博客,明明是标题 systohc 的,结果内容是写的 hctosys ,难受。既然都登录了,也想不起来有什么可写的,之前的工作都在有道笔记了,刚好把最近手头上的工作记录一下,为后来有需要的老铁们提供一个思路什么的,毕竟现在我也没有搞的太明白。
最近在搞android的时间,客户反馈说设置时间或者是联网更新时间之后,重启时间就回到1970了。搞来搞去没有复现过一次,很迷,把最近看到资料整理一下。

关于android的时间

网上资料了解到,android Linux都有两个时间,一个是系统时间,一个是硬件时间(RTC时间)。RTC是实时时钟的英文 缩写,基本上在硬件上都有纽扣电池,不会断电,会一直计时;但系统时钟不一样,系统运行的时候能一直计时,但系统关机或者断电的时候就gg了。所以每次系统开机的时候,会去读取rtc中的硬件时间,写入到系统时间,然后系统时间就自己搞起来了,不再关rtc时间什么事情了。等系统关机或者什么时候,会把时间写入到rtc,这样才能保证下次开机你这个系统的时间不会错乱。

基本就是这个大概了,可能有偏差,知道的大佬评论区走一波,我自己搞的,不是专业的,不正确的指教一下。附上一些资料,上面我说的都有介绍到。
介绍了rtc驱动,以及开机读取rtc时间的机制和代码

rtc驱动以及文件结构

android写时间到rtc

疑问

我这边用的是pcf8563的rtc,驱动和网上介绍的都一样,唯独多了一个 systohc.c文件。这很明显啊,和hctosys.c文件是相反的,把系统时钟写到rtc里面保存。但是我查看内核的配置里面,并没有把这两个文件编译进内核,现在rtc有供电,系统关机可以正常保存时间,也能读时间,时间还非常准。我不明白,如果没有编译进内核,那是怎么调用的?明明没有调用,愣是打印出了log信息,整蒙了。
关于android系统中的系统时间和rtc时间_第1张图片
另外网上没有找到 systohc.c的资料,目前为止没有。有经验的大佬赐教!感激!

更新

昨晚说到内核里面没有配置 systohc.c hctosys.c 的编译选项,但内核确实执行了读rtc的操作,关机的时候确实也写入了系统时间,这什么情况呢?说一下我的理解。

关于读rtc时间的函数,hctosys.c 虽然没有编译进内核,但是文件里面,在最后使用 late_initcall 函数将 rtc_hctosys 函数注册到了内核的init字段,等到内核启动的后期就会执行这一段的函数,所以就执行了读rtc时间,设置到系统时间这个操作。

开机打印的log,打印信息在hctosys文件和pcf8563驱动的读函数中。
关于android系统中的系统时间和rtc时间_第2张图片

关于android系统中的系统时间和rtc时间_第3张图片
从log可以看出来,在内核启动后期,执行了 rtc_hctosys 函数,调用8563驱动的读函数,获取rtc时间,设置到 系统时间。

另外关于systohc 文件,这个文件同样没有编译进内核,而且没有使用initcall函数,这个函数是真没调用,打印信息都没出来。但是总要把时间设置进rtc,我试过使用reboot开机,发现关机的时候系统没有将时间写入rtc,那这个操作很可能就在设置时间的时候直接调用了底层驱动的写函数,设置系统时间的时候顺带把时间也设置进了rtc,这样就保证了系统时间和rtc时间同步,等到系统关机的时候,再开机读取的rtc时间就是正确的时间。

验证:打印log
关于android系统中的系统时间和rtc时间_第4张图片
打印信息
从打印信息可以看到,手动在android界面设置时间之后,就调用了底层的写函数将时间写入rtc了。机智的我

你可能感兴趣的:(android,android,rtc)