Linux输入子系统后面章节讲解按钮设备驱动,实际上,在Linux系统中,一种更值得推荐的实现这类设备驱动的方式是借助input子系统。
Linux系统提供了input子系统,键盘、触摸屏、鼠标都可以借助input插口函数来实现设备驱动。
input子系统体系结构设备描述:在Linux内核中,input设备用input_dev结构体描述linux按键驱动,使用input子系统实现输入设备驱动的时侯linux模拟,驱动的核心工作是向系统报告按钮、触摸屏、鼠标等输入风波(event,通过input_event结构体描述),不再须要关心文件操作插口,由于input子系统那种早已完成了文件操作插口。
驱动报告的风波经过InputCore和Eventhandler最终抵达用户空间。
设备注册/注销:注册输入设备的函数为:intinput_register_device(structinput_dev*dev)注销输入设备的函数为:voidinput_unregister_device(structinput_dev*dev)驱动实现风波支持设备驱动通过set_bit()告诉input子系统它支持什么风波,如下所示:set_bit(EV_KEY,button_dev.evbit)structiput_dev有两个成员,一个是evbitlinux按键驱动,一个是keybit。
分别拿来表示设备所支持的风波类型和键盘类型。
风波类型:EV_RSTResetEV_REL相对座标EV_MSC其它EV_SND声音EV_FF力反馈EV_KEY键盘EV_ABS绝对座标EV_LEDLEDEV_REPRepeat驱动实现报告风波:用于报告EV_KEY、EV_REL、EV_ABS风波的函数分别为:voidinput_report_key(structinput_dev*dev,unsignedintcode,intvalue)voidinput_report_rel(structinput_dev*dev,unsignedintcode,intvalue)voidinput_report_abs(structinput_dev*dev,unsignedintcode,intvalue)code:风波的代码。
假如风波的类型是EV_KEY,该代码code为设备鼠标代码。
代码值0-127为鼠标上的按钮代码linux服务器系统,0x110-0x116为键盘上键盘代码,其中0x110(BTN_LEFT)为键盘左键,0x111(BTN_RIGHT)为键盘右键,0x112(BTN_MIDDLE)为键盘中键。
其代码涵义参看include/linux/input.h文件value:风波的值。
假如风波的类型