[RK3288][Android6.0] RTC驅動的上層呼叫流程
Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92
說明:
RTC驅動在註冊的時候提供了兩個字元裝置給使用者空間供操作。
1. /dev/alarm, android特有裝置,為了提高平臺無關性而加入,這裡不關注鬧鐘的設定。
2. /dev/rtcx, 原始linux操作字元裝置的方法。
通過alarm節點操作:
上層的操作最終都是通過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
可見最終呼叫的介面是一樣的。