/* kernel/kernel/time/posix-timers.c */
static struct k_clock posix_clocks[MAX_CLOCKS];
/* kernel/kernel/time/alarmtimer.c */
static struct rtc_device *rtcdev;
static struct alarm_base {
spinlock_t lock;
struct timerqueue_head timerqueue;
ktime_t (*gettime)(void);
clockid_t base_clockid;
} alarm_bases[ALARM_NUMTYPE];
定时开关机的学习:
static int __init alarmtimer_init(void)
/* kernel/kernel/time/alarmtimer.c */
posix_timers_register_clock(CLOCK_REALTIME_ALARM, &alarm_clock);
posix_clocks[clock_id] = *new_clock;
/* Initialize alarm bases */
alarm_bases[ALARM_REALTIME].base_clockid = CLOCK_REALTIME;
alarm_bases[ALARM_REALTIME].gettime = &ktime_get_real;
alarm_bases[ALARM_BOOTTIME].base_clockid = CLOCK_BOOTTIME;
alarm_bases[ALARM_BOOTTIME].gettime = &ktime_get_boottime;
for (i = 0; i < ALARM_NUMTYPE; i++) {
timerqueue_init_head(&alarm_bases[i].timerqueue);
spin_lock_init(&alarm_bases[i].lock);
}
struct class_interface {
struct list_head node;
struct class *class;
int (*add_dev) (struct device *, struct class_interface *);
void (*remove_dev) (struct device *, struct class_interface *);
};
static struct class_interface alarmtimer_rtc_interface = {
.add_dev = &alarmtimer_rtc_add_device,
};
alarmtimer_rtc_interface_setup
alarmtimer_rtc_interface.class = rtc_class;
return class_interface_register(&alarmtimer_rtc_interface);
platform_driver_register(&alarmtimer_driver);
platform_device_register_simple("alarmtimer", -1, NULL, 0);
return platform_device_register_resndata(NULL, "alarmtimer", -1,NULL, 0, NULL, 0);
struct platform_device_info pdevinfo = {
.parent = NULL,
.name = "alarmtimer",
.id = -1,
.res = NULL,
.num_res = 0,
.data = NULL,
.size_data = 0,
.dma_mask = 0,
};
platform_device_register_full(&pdevinfo);
pdev = platform_device_alloc(pdevinfo->name, pdevinfo->id);
wakeup_source_register("alarmtimer");