硬件平台:RK3128
Android版本:6.0
Kernel版本:3.10.92
先来看rtc的注册:
devm_rtc_device_register ->
rtc_device_register ->
device_register ->
device_add ->
class_intf->add_dev ->
alarmtimer_rtc_add_device //alarmtimer.c
看下定义:
static int alarmtimer_rtc_add_device(struct device *dev,
struct class_interface *class_intf)
{
unsigned long flags;
struct rtc_device *rtc = to_rtc_device(dev);
if (rtcdev)
return -EBUSY;
if (!rtc->ops->set_alarm)
return -1;
if (!device_may_wakeup(rtc->dev.parent))
return -1;
spin_lock_irqsave(&rtcdev_lock, flags);
if (!rtcdev) {
rtcdev = rtc; //将rtc_device赋值给全局变量rtcdev
/* hold a reference so it doesn't go away */
get_device(dev);
}
spin_unlock_irqrestore(&rtcdev_lock, flags);
return 0;
}
注意alarmtimer_rtc_add_device中,有两个地方出错会导致注册失败,可以看我另一篇文章。到这里就注册完成了。
下面看设置时间到rtc的流程:
Android设置时间后,最终调用到jni:
frameworks/base/services/core/jni/com_android_server_AlarmManagerService.cpp中的
AlarmImplAlarmDriver::setTime ->
ioctl(fds[0], ANDROID_ALARM_SET_RTC, &ts) ->
alarm_ioctl -> //alarm-dev.c
alarm_do_ioctl ->
alarm_set_rtc ->
alarmtimer_get_rtcdev //获取到注册时保存的全局变量rtcdev
rtc_set_time -> //interface.c
rtc->ops->set_time //设置时间到硬件RTC中
到这里,时间就保存到我们的RTC中了。