飞凌干货丨OK-xx18 Android实时时钟框架介绍

原创 2020-03-06 17:07:00 RTC 实时时钟 电池供电 Android

RTC(Real-TimeClock)实时时钟为操作系统提供了一个可靠的时间,并且在断电的情况下,RTC实时时钟也可以通过电池供电,一直运行下去。本文以OK-4418-C为例,介绍在Android实时时钟框架。

整体流程介绍

由于实时时钟子系统,硬件抽象层、框架层、应用层、谷歌的android开发包都已经做好,因此此接口的主要设计工作在于rx8010芯片的驱动的实现,包括芯片的初始化及配置时间,读取时间及接入实时时钟子系统等功能。

板子上电以后,内核驱动会初始化rtc芯片rx8010,并生成/dev/rtc0设备文件,注册其设置时间等操作函数。

进入android系统后,点击设置界面的设置时间,应用程序会调用框架层闹钟管理服务的设置时间的接口,框架层会调用硬件抽象层的设置时间接口,硬件抽象层会打开/dev/rtc0设备文件并调用其ioctl函数,内核层实时时钟子系统将调用实时时钟芯片驱动的设置时间函数,内核驱动层实时时钟芯片驱动调用设置时间的函数,设置实时时钟芯片的对应寄存器。


 流程图说明 

 

 


成/dev/rtc0设备文件,注册其设置时间等操作函数。进入android系统后,点击设置界面的设置时间,应用程序会调用框架层闹钟管理服务的设置时间的接口,框架层会调用硬件抽象层的设置时间接口,硬件抽象层会打开/dev/rtc0设备文件并调用其ioctl函数,内核层实时时钟子系统将调用实时时钟芯片驱动的设置时间函数,内核驱动层实时时钟芯片驱动调用设置时间的函数,设置实时时钟芯片的对应寄存器。


 基本逻辑图如下: 


 

板子上电以后,内核驱动会初始化rtc芯片rx8010,并生成/dev/rtc0设备文件,注册其设置时间等操作函数。

进入android系统后,点击设置界面的设置时间,应用程序会调用框架层闹钟管理服务的设置时间的接口,框架层会调用硬件抽象层的设置时间接口,硬件抽象层会打开/dev/rtc0设备文件并调用其ioctl函数,内核层实时时钟子系统将调用实时时钟芯片驱动的设置时间函数,内核驱动层实时时钟芯片驱动调用设置时间的函数,设置实时时钟芯片的对应寄存器。

流程图中各个部分涉及到的函数名称及功能 

■ 应用层函数:

packages/apps/Settings/src/com/android/settings/DateTimeSettings.java文件

static void setTime(Context context, int hourOfDay, int minute)

功能:设置Calendar的时分秒毫秒信息,并调用系统的闹钟服务的设置时间setTime的接口。


■ 系统框架层函数:

./frameworks/base/services/core/java/com/android/server/AlarmManagerService.java文件

public boolean setTime(long millis)

功能:检查权限及是否存在alarm驱动,并调用setKernelTime(mNativeData,millis)接口。


■ 硬件抽象层函数:

frameworks/base/services/core/jni/com_android_server_AlarmManagerService.cpp文件

static jint android_server_AlarmManagerService_setKernelTime(JNIEnv*,jobject, jlong nativeData, jlong millis)

功能:将毫秒转换成秒及微秒并调用setTime接口。

frameworks/base/services/core/jni/com_android_server_AlarmManagerService.cpp文件

int AlarmImplTimerFd::setTime(struct timeval *tv)

功能:打开的内核生成的/dev/rtc0设备文件,并调用其ioctl接口。


■ 内核驱动层函数:

linux/kernel/kernel-3.4.39/drivers/rtc/rtc-dev.c文件

static long rtc_dev_ioctl(struct file *file,

unsigned int cmd, unsigned long arg)

功能:根据ioctl的相关条件做出对应的rtc函数的调用。

linux/kernel/kernel-3.4.39/drivers/rtc/interface.c文件

int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm)

功能:调用rtc设备操作函数的set_time函数。

linux/kernel/kernel-3.4.39/drivers/rtc/rtc-rx8010.c文件

static int rx8010_probe(struct i2c_client *client, const structi2c_device_id *id)

功能:初始化rx8010芯片,并注册生成/dev/rtc0设备。

linux/kernel/kernel-3.4.39/drivers/rtc/rtc-rx8010.c文件

static int rx8010_set_time(struct device *dev, struct rtc_time *dt)

功能:此为rtc操作函数set_time对应的函数,作用是将时间值写入rx8010寄存器。


 实际运行效果 

板子上电,系统起来以后,选择“ ”->“Settings”->“Date&time”,在这里可以更改日期和时间,并且在您断电之后时间仍可同步更新(确保板子上已经安装了纽扣电池)。

注意:此步测试一定要先去掉“Automaticdate & time”以及“Automatictime zone”两部分的勾选,否则无法准确测试RTC功能,如下:


运行结果5.jpg

 

 

点击“set date”和“set time”设置好之后,就可以给板子断电再上电,再次进入时间设置界面,就会看到时间已经同步更新了。


相关产品 >

  • OK4418/6818-C开发板

    飞凌提供S5P4418/s5p6818,S5P4418/s5p6818开发板,4418/6818开发板,s5p4418/s5p6818开发板解决方案,S5p4418/s5p6818多媒体解决方案,s5p4418硬件解决方案,更多S5P4418/s5p6818方案敬请联系飞凌嵌入式。Cortex-A9 四核S5P4418/6818 支持Android5.1.1,Linux3.4.39、QT4.8.6等系统 了解详情
    OK4418/6818-C开发板
  • OK3568-C开发板

    强而稳,国产芯,1Tops算力,多路高速接口|飞凌RK3568系列RK3568开发板基于国产工业级AI处理器RK3568四核64位Cortex-A55 处理器设计。RK3568作为国产化高性能处理器,瑞芯微RK3568芯片是一款定位中高端的通用型SoC,瑞芯微RK3568芯片是一款定位中高端的通用型SoC,NPU达到1Tops,飞凌RK3568系列核心板提供瑞芯微RK3568规格书_datasheet_数据手册_原理图等,


    了解详情
    OK3568-C开发板

推荐阅读 换一批 换一批