[RK3288][Android6.0] RTC驱动的上层调用流程

Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92
说明:
RTC驱动在注册的时候提供了两个字符设备给用户空间供操作。
1. /dev/alarm, android特有设备,为了提高平台无关性而加入,这里不关注闹钟的设置。
2. /dev/rtcx, 原始linux操作字符设备的方法。
通过alarm节点操作:
【[RK3288][Android6.0] RTC驱动的上层调用流程】上层的操作最终都是通过alarm节点来实现,JNI提供给上层应用的接口在
frameworks/base/services/core/jni/com_android_server_AlarmManagerService.cpp
初始化:
android_server_AlarmManagerService_init -> init_alarm_driver

static jlong init_alarm_driver() { int fd = open("/dev/alarm", O_RDWR); ...... AlarmImpl *ret = new AlarmImplAlarmDriver(fd); }

设置时间:
android_server_AlarmManagerService_setKernelTime -> impl->setTime
impl即AlarmImplAlarmDriver, 所以有
AlarmImplAlarmDriver::setTime ->
ioctl(fds[0], ANDROID_ALARM_SET_RTC, &ts); ->
alarm_ioctl -> alarm-dev.c
alarm_do_ioctl ->
alarm_set_rtc ->
rtc_set_time -> interface.c
rtc->ops->set_time ->
rx8010_set_time //最终设置时间到硬件RTC中

通过rtc节点操作 :
如hwclock命令就是通过/dev/rtcX来读写RTC时间。
external/busybox/libbb/rtc.c
初始化:
int FAST_FUNC rtc_xopen(const char **default_rtc, int flags) { int rtc; if (!*default_rtc) { *default_rtc = "/dev/rtc"; rtc = open(*default_rtc, flags); if (rtc >= 0) return rtc; *default_rtc = "/dev/rtc0"; rtc = open(*default_rtc, flags); if (rtc >= 0) return rtc; *default_rtc = "/dev/misc/rtc"; } return xopen(*default_rtc, flags); }

open -> rtc_dev_open
设置时间:
from_sys_clock -> xioctl(rtc, RTC_SET_TIME, &tm_time) -> rtc_dev_ioctl -> rtc_set_time -> rtc->ops->set_time -> rx8010_set_time
可见最终调用的接口是一样的。

    推荐阅读