alarm_dev.c 则创建具体的 alarm 设备,注册到该设备 class 中。alarm.c 还实现了与 interface.c
的接口,即建立了与具体 rtc 驱动和 rtc 芯片的联系。alarm_dev.c 在 alarm.c 基础包装了一层,
主要是实现了标准的 miscdevice 接口,提供给应用层调用。
可以这样概括:alarm.c 实现的是机制和框架,alarm_dev.c 则是实现符合这个框架的设备驱
动,alarm_dev.c 相当于在底层硬件 rtc 闹钟功能的基础上虚拟了多个软件闹钟。
11.2 关键数据结构
alarm
定义在 include/linux/android_alarm.h 中。
struct alarm {
struct rb_node node;
enum android_alarm_type type;
ktime_t softexpires; //最早的到期时间
ktime_t expires; //绝对到期时间
void (*function)(struct alarm *); //当到期时系统回调该函数
};
这个结构体代表 alarm 设备,所有的 alarm 设备按照它们过期时间的先后被组织成一
个红黑树,alarm.node 即红黑树的节点,alarm 设备通过这个变量插入红黑树。alarm.type
是类型,android 中一共定义了如下 5 种类型,在现在的系统中每种类型只有一个设备。
enum android_alarm_type {
/* return code bit numbers or set alarm arg */
ANDROID_ALARM_RTC_WAKEUP,
ANDROID_ALARM_RTC,
ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP,
ANDROID_ALARM_ELAPSED_REALTIME,
ANDROID_ALARM_SYSTEMTIME,
ANDROID_ALARM_TYPE_COUNT,
/* return code bit numbers */
/* ANDROID_ALARM_TIME_CHANGE = 16 */
};
alarm_queue
struct alarm_queue {
struct rb_root alarms; //红黑树的根
struct rb_node *first; //指向第一个 alarm device,即最早到时的
struct hrtimer timer; //内核定时器,android 利用它来确定 alarm 过期时间
ktime_t delta; //是一个计算 elasped realtime 的修正值
bool stopped;
ktime_t stopped_time;
};
这个结构体用于将前面的 struct alarm 表示的设备组织成红黑树。它是基于内核定时器
来实现 alarm 的到期闹铃的。
11.3 关键代码分析
alarm_dev.c
评论3
最新资源