wake lock/ wake unlock 应用


如果给一个需要锁的驱动,添加一把锁呢?

和android上层看到的锁类似,锁有超时锁与非超时锁两种。超时锁我们以USB为例

需要包含的头文件:#include <linux/wakelock.h>

在初始化函数或者_probe函数中,

[csharp]  view plain copy
  1. wake_lock_init(&usb_wakelock, WAKE_LOCK_SUSPEND, "usb_detect");  

这样就注册上一个name为"usb_detect"的锁,此锁属性是WAKE_LOCK_SUSPEND,区别与WAKE_LOCK_IDLE。

在锁的初始化上,是不区分超时锁与非超时锁的,而是在申请与释放锁。

我们下面申请一个超时锁,目的是在USB拔掉之后几秒时间内,系统不要进入深度睡眠。

[csharp]  view plain copy
  1. static irqreturn_t usb_detect_irq_handler(int irq, void *dev_id)  
  2. {  
  3.     wake_lock_timeout(&usb_wakelock, 3 * HZ);//3秒的超时时间  
  4.     schedule_delayed_work(&wakeup_work, HZ / 10);  
  5.     return IRQ_HANDLED;  
  6. }  

在拔掉和插入USB后,会出发这个handler,从而申请 "usb_detect"的超时锁,超时时间是3秒,3秒后,自动释放这个锁。

可以在串口输入cat proc/wakelocks查看当前系统所有锁情况。



非超时锁,需要手动申请,手动释放,而且需要注意匹配使用申请与释放。我们以alarm为例,

Alarm Manager 
AlarmManage有一个AlarmManagerService,该服务程序主要维护app注册下来的各类Alarm,并且一直监听Alarm设备,一旦有Alarm触发,或者是Alarm事件发生,AlarmManagerService就会遍历Alarm列表,找到相应的注册Alarm并发出广播

Alarm Manager会维持一个cpu的wake lock。这样能保证电话休眠时,也能处理alarm的广播。一旦alarm receiver的onReceive() 方法执行完,wake lock会迅速被释放。如果在receiver中开启一个service,有可能service还没启动,wake lock已经被释放了。所以此时要实现单独的wake lock策略。

有4种Alarm类型: 
1)RTC_WAKEUP 
在指定的时刻(设置Alarm的时候),唤醒设备来触发Intent。

2)RTC 
在一个显式的时间触发Intent,但不唤醒设备。   
3)ELAPSED_REALTIME 
从设备启动后,如果流逝的时间达到总时间,那么触发Intent,但不唤醒设备。流逝的时间包括设备睡眠的任何时间。注意一点的是,时间流逝的计算点是自从它最后一次启动算起。   
4)ELAPSED_REALTIME_WAKEUP 
从设备启动后,达到流逝的总时间后,如果需要将唤醒设备并触发Intent。 

同样,先在_probe中初始化一个锁

[csharp]  view plain copy
  1. wake_lock_init(&hym8563->wake_lock, WAKE_LOCK_SUSPEND, "rtc_hym8563");  

在_remove中反初始化

[csharp]  view plain copy
  1. wake_lock_destroy(&hym8563->wake_lock);  
然后在set_alarm的时候,申请锁

[csharp]  view plain copy
  1. wake_lock(&hym8563->wake_lock)  
在alarm结束后释放这个锁

[csharp]  view plain copy
  1. wake_unlock(&hym8563->wake_lock)



用ec43_GPIO的中断来唤醒系统,将系统从深度休眠中唤醒并保证系统wakup 一段时间用过了,方法如下,有同样使用的童鞋可以参考一下!
1.   定义一人局部静态变量 ec43_wlock:
static struct wake_lock ec43_wlock;
2. 初始化  wake_lock:
wake_lock_init(&ec43_wlock, WAKE_LOCK_SUSPEND, "ec43_wakelock");
3.在需要唤醒处调用:
wake_lock_timeout(&ec43_wlock, msecs_to_jiffies(10*1000));
                        作用同上,详细不再说明,自己查看
//wake_lock_timeout(&ec43_wlock, 10*HZ);
4. remove中移除该waku_lock:
wake_lock_destroy(&ec43_wlock);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值