Android系统级深入开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

4.3.4 Alarm驱动程序

Alarm驱动程序为用户空间提供了一个时钟的接口。它和RTC系统密切相关,起到封装的作用,同时使用了Android系统的wake_lock等功能。Alarm提供给用户空间的接口是主设备号为10的Misc字符设备,其次设备号是动态生成的。在用户空间中,Alarm设备节点为:/dev/alarm。

Alarm驱动程序的内容在drivers/rtc/目录中,KConfig和Makefile中定义了相关的内容,如下所示:

    rtc-core-$(CONFIG_RTC_INTF_ALARM) += alarm.o

Alarm驱动程序的头文件是include/linux/中的android_alarm.h文件,alarm.c文件中定义了misc设备。

Alarm可以提供一些ioctl的命令供用户空间调用,如下所示:

    #define ANDROID_ALARM_CLEAR(type)            _IO('a', 0 | ((type) << 4))
    #define ANDROID_ALARM_WAIT                   _IO('a', 1)
    #define ALARM_IOW(c, type, size)             _IOW('a', (c) | ((type) << 4), size)
    #define ANDROID_ALARM_SET(type)              ALARM_IOW(2, type, struct timespec)
    #define ANDROID_ALARM_SET_AND_WAIT(type)    ALARM_IOW(3, type, struct timespec)
    #define ANDROID_ALARM_GET_TIME(type)        ALARM_IOW(4, type, struct timespec)
    #define ANDROID_ALARM_SET_RTC                _IOW('a', 5, struct timespec)
    #define ANDROID_ALARM_BASE_CMD(cmd)         (cmd & ~(_IOC(0, 0, 0xf0, 0)))
    #define ANDROID_ALARM_IOCTL_TO_TYPE(cmd)    (_IOC_NR(cmd) >> 4)

以上ioctl命令主要用于设置警报器的时间,设置RTC(实时时钟)时间,获取当前时间等功能。

提示:Alarm设备需要利用内核中的RTC部分,但是和具体的RTC驱动程序没有直接关系。