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

来源:互联网 发布:2017永久免费顶级域名 编辑:程序博客网 时间:2024/05/16 14:15

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
可见最终调用的接口是一样的。

原创粉丝点击