一、唤醒源
设备休眠后,通过触发唤醒源使设备恢复正常工作模式。设备唤醒源有多种,对于Android设备常见的就有PowerKey、来电唤醒、Alarm唤醒等。
唤醒源的实现处于内核空间,本文重点讨论下PowerKey作为唤醒源的具体实现。
二、PowerKey唤醒源
PowerKey唤醒设备的原理,本质其实就是中断。
PowerKey连接到CPU的一个输入(Input)引脚(Pin)上,该Pin运行在中断模式上。一旦PowerKey按下,引发Pin中断;而该中断具有唤醒CPU的功能,于是设备得以唤醒。
三、PowerKey对应的Pin Configuration
和PowerKey相连的Pin的具体配置位于板级dts文件中,比如如下配置:
arch/arm/boot/dts/xxxxx.dtspower-key {/** 是CPU的哪个Pin */gpios = &gpio0 GPIO_A5 GPIO_ACTIVE_LOW;/** Key code */linux,code = 116;/** 起个名字 */label = power;/** 该Pin具有wakeup的功能 */gpio-key,wakeup;};
着重说下linux,code = 116,116怎么来的?
对于键盘,每一个按键都有唯一的编码,在Linux中,编码值位于:
input.h (kernel\include\uapi\linux)/** Keys and buttons*/#define KEY_RESERVED 0#define KEY_ESC 1#define KEY_BACKSPACE 14#define KEY_TAB 15#define KEY_POWER 116 /* SC System Power Down */
可知,PowerKey的编码也在该文件中,且编码值为116;一旦按下PowerKey,该值作为键值传到input_event结构体的code成员变量中:
input.h (kernel\include\uapi\linux)/** The event structure itself*/struct input_event {struct timeval time;__u16 type;__u16 code;__s32 value;};
之后我们会写个Linux应用程序读取code值。
取消
评论