输入子系统(input subsystem)
按键、触摸屏、鼠标等都可以利用input接口来实现设备驱动
体系
1.驱动程序<---->input core<----->handlers
设备描述
在linux内核中,input设备用input_dev结构体描述,使用input子系统实现输入设备驱动的时候,
驱动的核心工作是向系统报告按键、触摸屏、键盘、鼠标等输入事件(event,通过input_event结构体描述),不再需要关心文件操作接口,因为input子系统已经完成了文件操作接口。驱动报告的事件经过inputcore和eventhandler最终到达用户空间。
字符驱动程序的核心是实现file_operations
使用input_dev描述
input_register_device()注册
input_unregister_device()注销
1.驱动实现-事件支持
设备驱动通过set_bit告诉input子系统它支持哪些事件,如下所示:
set_bit(EV_KEY,button_dev.evbit)
struct input_dev中有两个成员,一个是evbit;一个是keybit.分别用来表示设备所支持的事件类型和按键类型。
事件类型
EV_RST reset
EV_REL 相对坐标
EV_MSC 其他
EV_SND 声音
EV_FF 力反馈
EV_KEY 按键
EV_ABS 绝对坐标
EV_LED LED
EV_REP repeat
2.驱动实现-报告事件
用于报告EV_KEY EV_REL EV_ABS的事件函数分别是
input_report_key(struct input_dev *dev,unsigned int code,int value)
input_report_rel(struct input_dev *dev,unsigned int code,int value)
input_report_abs(struct input_dev *dev,unsigned int code,int value)
code:事件代码。如果事件的类型是EV_KEY,该代码code为设备键盘代码。代码值0-127为键盘上的按键代码,0x110-0x116为鼠标上按键代码,其中0x110(BTN_LEFT)为鼠标左键,0x111(BTN_RIGHT)为鼠标右键,0x112(BTN_MIDDLE)为鼠标中键。其他代码含义请参看include/linux/input.h文件
value:事件的值。如果事件的类型是EV_KEY,当按键按下时值为1,松开时为0
input_sync()用于事件同步,它告知事件的接受者:驱动已经发出了一个完整的报告。
例如:在触摸屏设备驱动中,一次坐标及按下状态的整个报告过程如下:
input_report_abs(input_dev,ABS_X,x)//x坐标
input_report_abs(input_dev,ABS_Y,y)//y坐标
input_report_abs(input_dev,ABS_PRESSURE,pres)//压力
input_sync(input_dev)//同步,已经全部报告完成
3.实例见课件
4.怎么使用
0.中断请求
1.初始化set_bit
2.注册input_register_device()
3.中断中报告
按键、触摸屏、鼠标等都可以利用input接口来实现设备驱动
体系
1.驱动程序<---->input core<----->handlers
设备描述
在linux内核中,input设备用input_dev结构体描述,使用input子系统实现输入设备驱动的时候,
驱动的核心工作是向系统报告按键、触摸屏、键盘、鼠标等输入事件(event,通过input_event结构体描述),不再需要关心文件操作接口,因为input子系统已经完成了文件操作接口。驱动报告的事件经过inputcore和eventhandler最终到达用户空间。
字符驱动程序的核心是实现file_operations
使用input_dev描述
input_register_device()注册
input_unregister_device()注销
1.驱动实现-事件支持
设备驱动通过set_bit告诉input子系统它支持哪些事件,如下所示:
set_bit(EV_KEY,button_dev.evbit)
struct input_dev中有两个成员,一个是evbit;一个是keybit.分别用来表示设备所支持的事件类型和按键类型。
事件类型
EV_RST reset
EV_REL 相对坐标
EV_MSC 其他
EV_SND 声音
EV_FF 力反馈
EV_KEY 按键
EV_ABS 绝对坐标
EV_LED LED
EV_REP repeat
2.驱动实现-报告事件
用于报告EV_KEY EV_REL EV_ABS的事件函数分别是
input_report_key(struct input_dev *dev,unsigned int code,int value)
input_report_rel(struct input_dev *dev,unsigned int code,int value)
input_report_abs(struct input_dev *dev,unsigned int code,int value)
code:事件代码。如果事件的类型是EV_KEY,该代码code为设备键盘代码。代码值0-127为键盘上的按键代码,0x110-0x116为鼠标上按键代码,其中0x110(BTN_LEFT)为鼠标左键,0x111(BTN_RIGHT)为鼠标右键,0x112(BTN_MIDDLE)为鼠标中键。其他代码含义请参看include/linux/input.h文件
value:事件的值。如果事件的类型是EV_KEY,当按键按下时值为1,松开时为0
input_sync()用于事件同步,它告知事件的接受者:驱动已经发出了一个完整的报告。
例如:在触摸屏设备驱动中,一次坐标及按下状态的整个报告过程如下:
input_report_abs(input_dev,ABS_X,x)//x坐标
input_report_abs(input_dev,ABS_Y,y)//y坐标
input_report_abs(input_dev,ABS_PRESSURE,pres)//压力
input_sync(input_dev)//同步,已经全部报告完成
3.实例见课件
4.怎么使用
0.中断请求
1.初始化set_bit
2.注册input_register_device()
3.中断中报告
5.应用程序