Linux input子系统,负责上报输入事件,例如KEY,TP,鼠标键盘等。
cat /proc/bus/input/devices来显示当前连接的输入设备列表。
按键中断过来后,包括按下和抬起,进入中断服务函数,中断函数中开一个定时器10ms,10ms消抖后在定时器中去读取gpio口,gpio_get_value(),然后再去上报事件。input_report_key(struct input_dev *dev, unsigned int code, bool value) 上报哪一个按键code以及按键事件value。input_sync()上报一个同步事件,这一步必须要做,对应下面打印出来的同步类事件
打开/dev/input/event0设备文件
调用read来读取数据,如果没有数据会进入休眠,当有数据读取时,应用程序被唤醒去读取数据。
每一次read操作都是struct input_event结构体类型数据,这个结构体定义在<linux/input.h>里面。
struct input_event
{
_u16 type; //0代表同步类事件,1代表按键类事件,4代表其他杂类事件
_u16 code; //表示该类事件的哪一个具体事件,比如键盘A,B,C,D按键。我们可以定义扫描键为117
_s32 value; //按键按下1,按键松开0
};
读取数据如下:
type:1 code:117 value:1 //表示扫描键按下
type:0 code:0 value:0 //同步类事件,表示本轮数据已经完整,报告同步
type:1 code:117 value:0 //表示扫描键抬起
type:0 code:0 value:0 //同步类事件,表示本轮数据已经完整,报告同步
type:1 code:117 value:1
type:0 code:0 value:0
type:1 code:117 value:0
type:0 code:0 value:0