介绍
在linux系统中输入设备有很多,想鼠标,按键,触摸屏等都是输入设备的典型案例
学习输入设备驱动主要学习框架就搞定了开发大部分工作
使用步骤:
1)初始化输入结构体,分配结构体内存
2)输入设备注册到内核
3)设置输入设备的能力:即输入类型type,类型中的具体事件code
4)申请中断
5)在中断中上报输入事件
通用输入设备(evdev.c)识别
- /dev/input/event0
- /dev/input/event1
一般情况下当我们的输入设备有了驱动之后就可以在/dev/input目录下找到对应的文件设备,这样我们应用层就可以利用
查看输入设备名和event对应关系
cat /proc/bus/input/devices
通过命令即可以查看所有的输入设备的信息,比如总线,版本
事件类型type
include/linux/input.h
#define EV_SYN 0x00 //同步事件
#define EV_KEY 0x01 //按键事件
#define EV_REL 0x02 //相对事件
#define EV_ABS 0x03 //绝对事件
…
#define EV_CNT (EV_MAX+1)
具体事件code
这个是在时间类型基础上来说的,
比如前面的type为按键类型,那么code就表示具体的按键,比如按键1,按键2…
比如前面的type为绝对事件,那么code表示的就有,x坐标轴,坐标轴…
具体分析步骤内容
1)初始化输入结构体,分配结构体内存
struct input_dev *input_allocate_device(void)
2)输入设备注册到内核
int input_register_device(struct input_dev *dev)
3)设置输入设备的能力:即输入类型type,类型中的具体事件code
void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int code)
4)申请中断
5)在中断中上报输入事件
一般来说输入设备的上报需要再中断里面上报,所以我们还需要结合中断的知识
input_event()函数 通用事件上报接口(所有上报事件都可以用)
void input_event(struct input_dev *dev,unsigned int type, unsigned int code, int value)
input_report_key()函数 按键上报事件
static inline void input_report_key(struct input_dev *dev, unsigned int code, int value)
{
input_event(dev, EV_KEY, code, !!value);
}
input_report_rel()函数 相对坐标事件
input_report_abs()函数 绝对坐标事件
input_sync()函数
include/linux/input.h
同步事件上报接口 我们使用上面的上报事件并不是立马就上报了,等使用 input_sync()函数之后才会同步上报