1.框架概述
- APP发起读操作,若无数据则休眠
- 用户操作设备,硬件上产生中断;
- 输入系统驱动层对应的驱动程序处理中断:读取到数据,转换为标准的输入事件,向核心层汇报,就是汇报一个“struct_input_event”结构体
- 核心层可以决定把输入事件转发给上面某一个handler来处理:一般有evdev_handler、kbd_handler、joydev_handler。常用evdev_handler:它只把input_event结构体保存在内核buffer。APP来读取时就本地返回。支持多个APP同时访问。
- APP对输入事件处理:APP可以直接访问设备节点(/dev/input/event0,1,2)或者通过tslib、libinput这类库来间接访问。
2.使用input_dev结构体来表示输入设备
3.APP可以得到什么数据
得到一系列输入事件:“struct_input_event”
timeval time:表示时间,内有两个成员:秒和微妙
type:类型
例如:EV_KEY表示按键类、EV_REL表示相对位移(鼠标)
code:哪个事件
该类型下的事件,比如EV_KEY类事件,表示键盘,所以就是表示是哪一个按键
value:事件值
例如:0和1表示按键的按下和松开
事件之间的界线
驱动程序上报完一系列数据后,会上报一个同步事件,表示数据上班完毕。同步事件也是一个input_event结构体,type、code、value都是0。
4.调试技巧
1.确定设备信息
ls /dev/input/* -l
查看设备节点对应的硬件
cat /proc/bus/input/devices
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="venus_DMIC"
P: Phys=venus/input2
S: Sysfs=/devices/virtual/input/input1
U: Uniq=
H: Handlers=event1
B: PROP=0
B: EV=23
B: KEY=40000 0 0 4000
B: SW=4000
对应含义:
I:id of the device(设备ID),该参数由结构体input_id表示
N:name of the device(设备名称)
P:physical path to the device(系统层次结构中设备的物理路径)
S:sysfs path(位于sys文件系统的路径)
U:unique identific code(设备唯一标识码)
H:list of input handles associated with the device(与设备关联的输入句柄列表)
B:bitmaps
举例:KEY=40000 0 0 4000,每一个都是32位数据,转换位二进制,即可找对应支持的事件
KEY表示类型。