Linux 输入子系统
前面章节讲解按键设备驱动,实际上,在 Linux 系统中,一种更值得推荐
的实现这类设备驱动的方法是利用 input 子系统。Linux 系统提供了 input 子系
统,按键、触摸屏、鼠标都可以利用 input 接口函数来实现设备驱动。
input 子系统体系结构
设备描述:
在 Linux 内核中,input 设备用 input_dev 结构体描述,使用 input 子系统实现输
入设备驱动的时候,驱动的核心工作是向系统报告按键、触摸屏、鼠标等输入
事件(event,通过 input_event 结构体描述),不再需要关心文件操作接口,因
为 input 子系统那个已经完成了文件操作接口。驱动报告的事件经过 InputCore
和 Eventhandler 最终到达用户空间。
设备注册/注销:
注册输入设备的函数为:
int input_register_device(struct input_dev *dev)
注销输入设备的函数为:
void input_unregister_device(struct input_dev *dev)
驱动实现—事件支持
设备驱动通过 set_bit()告诉 input 子系统它支持哪些事件,如下所示:
set_bit(EV_KEY, button_dev.evbit)
struct iput_dev 有两个成员,一个是 evbit,一个是 keybit。分别用来表示设备所
支持的事件类型和按键类型。
事件类型:
EV_RST Reset
EV_REL 相对坐标
EV_MSC 其它
EV_SND 声音
EV_FF 力反馈
EV_KEY 按键
EV_ABS 绝对坐标
EV_LED LED
EV_REP Repeat
驱动实现—报告事件:
用于报告 EV_KEY、EV_REL、EV_ABS 事件的函数分别为:
void input_report_key(struct input_dev *dev, unsigned int code, int value)
void input_report_rel(struct input_dev *dev, unsigned int code, int value)
void input_report_abs(struct input_dev *dev, unsigned int code, int value)