[Linux 基础] -- Linux input 子系统要点总结

输入设备的主要工作过程

动作产生(按键、触屏 ....)—— 产生中断 —— 读取数据(键值、坐标 ....)—— 将数据传递给应用程序。

事件的处理

input device 向上报告——input core接收报告,并根据在注册input device时建立好的连接选择哪一类handler来处理事件——通过handler将数据存放在相应dev(evdev、mousedev ...)实例的缓冲区中,等待应用程序来读取。

注册与连接

注册 input_dev 和 input_handler时,会两两比较 input_handler_list中的每一项input_handler和input_dev_list中的每一项input_dev。input_handler 中的blacklist和id_table判断这个设备是否支持这个handler,如果支持则调用input_handler的函数建立连接。

由事件层(Evdev.c、keyboard.c、Joydev.c、Mousedev.c ...)定义一个input_handler结构,指定 .fops、.connect、id_table 等,通过input_register_handler进行注册。

input_handler和input_dev怎么进行连接?

  1. 分配一个input_handle结构;
  2. input_handle.dev = input_dev;
    input_handle.handler = input_handler;
  3. input_dev.h_list = input_handle.d_node;
    input_handler.hlist = input_handle.h_node;

在设备相关的中断服务程序里面,确定事件产生,则调用相应的input_handler的event处理函数

Linux 输入设备驱动编程

编写符合输入子系统框架的设备驱动程序主要有以下四个步骤:

  1. 分配一个input_dev结构体,调用input_allocate_device()或者devm_input_allocate_device(struct input_dev*)实现;
  2. 设置input设备支持的事件类型;
  3. 将输入设备注册到输入子系统中,调用input_register_device(struct input_dev *)函数实现;
  4. 硬件相关的代码:注册中断处理函数,比如键盘设备需要编写按键的抬起、放下,触摸屏设备需要编写按下、抬起、绝对移动,鼠标设备需要编写单击、抬起、相对移动,并且需要在必要的时候提交硬件数据(键值/坐标/状态 等等),即上报输入事件。

上报事件的函数为input_event;当提交输入设备产生的输入事件之后,需要调用input_sync函数来通知输入子系统,以处理设备产生的完整事件。

/dev/input目录下显示的是已经注册在内核中的设备编程接口,用户通过open这些设备文件来打开不同的输入设备进行硬件操作。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值