Android、X windows等众多应用对于linux系统中键盘、鼠标、触摸屏等输入设备的支持越来越倾向于标准的input输入子系统。
Input子系统架构
(1)驱动层功能:负责和底层的硬件设备打交道,将底层硬件设备对用户输入的响应转换为标准的输入事件以后再向上发送给输入子系统核心层(Input Core)。
(2)Input系统核心层:Input Core即Input Layer,由driver/input/input.c及相关头文件实现,它对下提供了设备驱动层的接口,对上提供了事件处理层(Event Handler)的编程接口。
(3)事件处理层将硬件设备上报的事件分发到用户空间和内核。
Input子系统设备驱动
使用input子系统实现输入设备驱动的时候,驱动的工作是向系统报告按键、触摸屏、键盘、鼠标等输入事件(event,通过input_event结构体描述),不再需要关心文件操作(open,read,write)接口,因为input子系统已经完成了文件操作接口。驱动报告的事件经过InputCore和 Eventhandler最终到达用户空间。
1.分配input_dev结构体,
struct input_dev *input_allocate_device(void)
2.初始化input_dev
//设置上报哪类事件set_bit(EV_KEY, btn_dev->evbit);//按键类事件
set_bit(EV_REP, btn_dev->evbit);//重复类事件
//指定上报哪些按键
for (i = 0; i < ARRAY_SIZE(btn_info); i++)
set_bit(btn_info[i].code, btn_dev->keybit);
btn_dev->name = "my_button"; //设备名
keybit为按键码:在linux/input.h中有定义,即KEY_1 、KEY_2、KEY_A等标准的键值
evbit为事件类型:有EV_SYN 同步事件、EV_KEY按键事件、EV_REL 相对坐标(鼠标)、EV_ABS 绝对坐标(触摸屏)等
3.注册input_dev结构体
int input_register_device(struct input_dev *dev)
4.申请中断,在中断处理函数中上报键值
void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
type为事件类型:EV_SYN 、EV_KEY等
code为按键码:KEY_1、KEY_A等
value为值:自定义
上报后调用同步:
void input_sync(struct input_dev *dev)
相关头文件:
<linux/input.h>
用户程序:
open打开/dev/eventN或者/dev/input/eventN
read读取一个struct input_event
对键值进行判断即可
相关头文件:
<linux/input.h>