自助设备在没有人的情况下需要休眠,然而还得通过触摸屏唤醒设备。
需要做休眠唤醒必须需要了解一下内核的休眠唤醒机制,相应的android 上得再次加深一下大致流程。
触摸唤醒分两种情况:
第一种、CPU进入深度休眠 第二种、假休眠
第二种情况比较容易实现:
Android系统休眠的方式在android4.2.2之后就缘用了linux的wakeup source机制,我们可以写一个程序写阻止休眠即可。那么触摸屏是在正常工作的,点击的时候我们可以上报一个power键值,就可以点亮屏幕了。还有一种更简单的办法,就是配置一下触摸屏的配置文件 驱动名.idcdevice.internal = 0 #配置为0
第一种情况:
cpu进入了深度休眠,这种情况下只能通过外部中断唤醒。那么我们的办法就是讲触摸屏当成按键来用,从而唤醒CPU。
这里做法是改驱动,以cyttsp5这个屏的驱动为例。
1.将设备配置为可唤醒。int cyttsp5_probe(const struct cyttsp5_bus_ops *ops, struct device *dev, u16 irq, size_t xfer_buf_size) {
//注i册一个input设备,用来上报POWER按键 wake_key_dev = input_allocate_device(); wake_key_dev->name = "touch_key"; wake_key_dev->evbit[0] = BIT(EV_KEY); set_bit(116, wake_key_dev->keybit); input_register_device(wake_key_dev);//当进入休眠后,允许设备唤醒机器device_init_wakeup ( dev, 1 );
}2.在中断里发送power键
static irqreturn_t cyttsp5_irq(int irq, void *handle){
struct cyttsp5_core_data *cd = handle; if(cd->is_sleeped) { if(get_power_status()==1){ printk("w^^^^ wake\n"); wake_system(); cd->is_sleeped=false; }else{ } }else{ cd->is_sleeped=false;//not
}//省略一万字 return IRQ_HANDLED;}
static void wake_system(){ if(wake_key_dev!=NULL) { input_event(wake_key_dev, EV_KEY, 116, 1); input_sync(wake_key_dev); input_event(wake_key_dev, EV_KEY, 116, 0); input_sync(wake_key_dev); printk("wake system...\n");
}}
当然我们查询一下驱动的屏蔽掉使得触摸屏休眠和唤醒的函数,我们的触摸屏不能休眠,否则目的达不到。suspendresume
对应的函数:
static int cyttsp5_core_suspend(struct device *dev){
struct cyttsp5_core_data *cd = dev_get_drvdata(dev); cd->is_sleeped =true;
// cyttsp5_core_sleep(cd);
if (!(cd->cpdata->flags & CY_CORE_FLAG_WAKE_ON_GESTURE)) return 0; //disable_irq(cd->irq); //cd->irq_disabled = 1;
if (device_may_wakeup(dev)) { dev_vdbg(dev, "%s Device MAY wakeup\n", __func__); if (!enable_irq_wake(cd->irq)) cd->irq_wake = 1; } else { dev_dbg(dev, "%s Device MAY NOT wakeup\n", __func__); }
return 0;}
static int cyttsp5_core_resume(struct device *dev){
struct cyttsp5_core_data *cd = dev_get_drvdata(dev); cd->is_sleeped = false;
if (!(cd->cpdata->flags & CY_CORE_FLAG_WAKE_ON_GESTURE)) goto exit; if (device_may_wakeup(dev)) { dev_vdbg(dev, "%s Device MAY wakeup\n", __func__);
if (cd->irq_wake) { disable_irq_wake(cd->irq); cd->irq_wake = 0; } } else { dev_dbg(dev, "%s Device MAY NOT wakeup\n", __func__);
}
/* if (cd->irq_disabled) { enable_irq(cd->irq); cd->irq_disabled = 0; }
*/
exit:
// cyttsp5_core_wake(cd);
return 0;}
接下去我们在配置一个键值文件即可,当然默认的键值文件包含116 POWER按键,我们就省略了