接下来,我们就开始看Input子系统的软件设计流程,我在阅读的时候同时整理设计代码中的相关API,并在下一篇文章详细介绍input子系统的代码实现。
input子系统的软件设计流程
软件设计流程如下所示:
分配一个输入设备——注册一个输入设备——上报输入事件——注销一个输入设备——释放一个输入设备
设计有关的API
分配一个输入设备
C/C++代码
- struct input_dev *input_allocate_device*(void);
注册一个输入设备
C/C++代码
- int input_register_device(struct input_dev *dev);
驱动实现-事件支持
C/C++代码
- Set_bit(EV_KEY,button_dev.evbit)
-
-
事件类型
Linux中输入设备的事件类型有(这里只列出了常用的一些,更多请看linux/input.h中):
C/C++代码
- EV_SYN 0x00 同步事件
- EV_KEY 0x01 按键事件
- EV_REL 0x02 相对坐标
- EV_ABS 0x03 绝对坐标
- EV_MSC 0x04 其它
- EV_LED 0x11 LED
- EV_SND 0x12 声音
- EV_REP 0x14 Repeat
- EV_FF 0x15 Force feedback事件
按键类型
当事件类型为EV_KEY时,还需指明按键类型:
C/C++代码
- BTN_LEFT 鼠标左键
- BTN_RIGHT 鼠标右键
- BTN_MIDDLE 鼠标中键
- BTN_0 数字0键
- BTN_1 数字1键
上述set_bit函数实则完成了把EV_KEY赋值到button_dev.evbit
驱动实现-报告事件
C/C++代码
- Void input_event(struct input_dev *dev,unsigned int type,unsigned int code,int value);
- Void input_report_key(struct input_dev *dev,unsigned int code,int value);
- value : 事件的值,如果事件的类型是EV_KEY,当按键按下时值为1,松开时为0。
- 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);
- Void input_sync(struct input_dev *dev);
在触摸屏驱动设计中,一次坐标及按下状态的整个报告过程如下:
C/C++代码
- Input_report_abs(input_dev,ABS_X,x);
- Input_report_abs(input_dev,ABS_Y,y);
- Input_report_abs(input_dev,ABS_PRESSURE,pres);
- input_sync(struct input_dev *dev);
释放与注销设备
C/C++代码
- Void input_free_device(struct input_dev *dev);
- Void input_unregister_device(struct input_dev *);
阅读(3389) | 评论(1) | 转发(3) |