1. 程式人生 > >[RK3288][Android6.0] RTC驅動的上層呼叫流程

[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
可見最終呼叫的介面是一樣的。