如果给一个需要锁的驱动,添加一把锁呢?
和android上层看到的锁类似,锁有超时锁与非超时锁两种。超时锁我们以USB为例
需要包含的头文件:#include <linux/wakelock.h>
在初始化函数或者_probe函数中,
- wake_lock_init(&usb_wakelock, WAKE_LOCK_SUSPEND, "usb_detect");
这样就注册上一个name为"usb_detect"的锁,此锁属性是WAKE_LOCK_SUSPEND,区别与WAKE_LOCK_IDLE。
在锁的初始化上,是不区分超时锁与非超时锁的,而是在申请与释放锁。
我们下面申请一个超时锁,目的是在USB拔掉之后几秒时间内,系统不要进入深度睡眠。
- static irqreturn_t usb_detect_irq_handler(int irq, void *dev_id)
- {
- wake_lock_timeout(&usb_wakelock, 3 * HZ);//3秒的超时时间
- schedule_delayed_work(&wakeup_work, HZ / 10);
- return IRQ_HANDLED;
- }
在拔掉和插入USB后,会出发这个handler,从而申请 "usb_detect"的超时锁,超时时间是3秒,3秒后,自动释放这个锁。
可以在串口输入cat proc/wakelocks查看当前系统所有锁情况。
非超时锁,需要手动申请,手动释放,而且需要注意匹配使用申请与释放。我们以alarm为例,
Alarm
AlarmManage有一个AlarmManagerService,该服务程序主要维护app注册下来的各类Alarm,并且一直监听Alarm设备,一旦有Alarm触发,或者是Alarm事件发生,AlarmManagerService就会遍历Alarm列表,找到相应的注册Alarm并发出广播
Alarm
有4种Alarm类型:
1)RTC_WAKEUP
在指定的时刻(设置Alarm的时候),唤醒设备来触发Intent。
2)RTC
在一个显式的时间触发Intent,但不唤醒设备。
3)ELAPSED_REALTIME
从设备启动后,如果流逝的时间达到总时间,那么触发Intent,但不唤醒设备。流逝的时间包括设备睡眠的任何时间。注意一点的是,时间流逝的计算点是自从它最后一次启动算起。
4)ELAPSED_REALTIME_WAKEUP
从设备启动后,达到流逝的总时间后,如果需要将唤醒设备并触发Intent。
同样,先在_probe中初始化一个锁
- wake_lock_init(&hym8563->wake_lock, WAKE_LOCK_SUSPEND, "rtc_hym8563");
在_remove中反初始化
- wake_lock_destroy(&hym8563->wake_lock);
- wake_lock(&hym8563->wake_lock)
- wake_unlock(&hym8563->wake_lock)