输入子系统带来的好处:
统一了物理形态各异的相似的输入设备的处理功能。例如,各种鼠标,不论是PS/2、USB,还是蓝牙,都做同样的处理;
简单的事件接口;
简化了驱动程序
input_dev结构体来描述input设备。驱动的 核心工作是向系统 报告按键,触摸屏,鼠标等 输入事件(event,用 input_event描述),驱动中不再需要关心文件操作接口,驱动报告的事件经过inputcore和eventhardler,最终到达用户空间
驱动实现:
①分配input结构,并用set_bit()告诉input子系统需要报告那些事件,
②注册输入设备
③在有按键按下/抬起、或触摸屏被触摸/抬起/滑动等发生时(用中断或查询抓捕事件发生),用report_xxx()报告发生的事件及对应的键值/坐标状态
主要事件包括:
EV_KEY(案件事件),
EV_REL(相对值,比如光标移动,是相对最后一次位置的偏移),
EV_ABS(绝对值,比如触摸屏坐标)
- 常见典型事件
- EV_RST 0x00 Reset
- 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 力反馈
报告EV_KEY,EV_REL,EV_ABS的函数分别是
- void input_report_key(struct input_dev *dev, unsigned int code, int value)
- (struct input_dev *dev, unsigned int code, int value)
- (struct input_dev *dev, unsigned int code, int value)
input_sync()用于事件同步,告诉事件接收者驱动已经发出了一个完整的报告。比如触摸屏案件事件
- void input_report_abs(input_dev,ABS_X,x);
- (input_dev,ABS_Y,y);
- (input_dev,ABS_PRESSURE,pres);//压力
- (input_dev);
注册,注销函数
- void input_register_device(struct input_dev *dev)
- (struct input_dev *dev)
手头案例的部分代码(按键板输入,IIC接口)