另外,键盘又属于输入设备,Linux内核提供了输入子系统,如键盘、触摸屏、鼠标等输入设备都可以利用输入子系统的接口函数来实现设备驱动[4]。输入子系统由核心层(Input Core)、驱动层和事件处理层(Event Handler)三部分组成[9]。在Linux内核中,使用输入子系统实现输入设备驱动的时候,驱动的核心工作是向系统报告按键、触摸屏、鼠标等输入事件,而不再需要关心文件操作接口,因为输入子系统已经完成了文件操作接口。通过输入子系统,实现输入设备驱动时只需要完成以下工作:
(1)在模块加载函数中告知输入子系统输入设备可以报告的事件。例如,可通过__set_bit(EV_KEY,input_dev->evbit)来告知输入子系统该设备可报告按键事件。
(2)在模块加载函数中注册输入设备。注册函数为:int input_register_device(struct input_dev *dev);
(3)当有输入事件发生时,如按键按下/抬起、触摸屏被触摸/抬起/移动时,通过input_report_xxx()报告发生的事件及对应的键值、坐标等状态。主要的事件类型包括EV_KEY(按键事件)、EV_REL(相对值,如鼠标移动,报告相对于最后一次位置的偏移)和EV_ABS(绝对值,如触摸屏)。