Input输入型驱动程序设计
Linux系统提供了input子系统,按键、触摸屏、鼠标等度可以利用input接口函数来实现设备驱动。体系结构如下图所示
设备描述
在Linux内核中,input设备用input_dev结构体描述,使用input子系统实现输入设备驱动的时候,驱动的核心工作是向系统报告按键、触摸屏、键盘、鼠标等输入事件((event,,通过过input_event结构体描述),不再需要关心文件操作接口,因为input子系统子系统已经完成了文件操作接口。驱动报告的事件经过过InputCore和和Eventhandler最终到达用户空间。
驱动注册
intinput_register_device(structinput_dev*dev)
驱动注销
voidinput_unregister_device(structinput_dev*dev)
驱动实现–事件支持
设备驱动通过set_bit()告诉input子系统它支持哪些事件,
如下所示:
set_bit(EV_KEY,button_dev.evbit)
Structiput_dev中有两个成员,一个是evbit;一个是keybit。分别用来表示设备所支持的事件类型和按键类型。
事件类型:
EV_RST Reset EV_KEY 按键
EV_REL 相对坐标 EV_ABS 绝对坐标
EV_MSC 其它 EV_LED LED
EV_SND 声音 EV_REP Repeat
EV_FF力反馈
驱动实现-报告事件
用于报告EV_KEY、EV_REL和EV_ABS事件的函数分别为:
voidinput_report_key(struct input_dev*dev,unsigned int code,int value)
void input_report_rel(struct input_dev*dev,unsigned int code,int value)
voidinput_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);//同步
代码示例
/*在在按键中断中报告事件事件*/
staticvoidbutton_interrupt(int irq,void*dummy,struct pt_regs * fp)
{
input_report_key(&button_dev,BTN_0,inb(BUTTON_PORT0));
input_report_key(&button_dev,BTN_0,inb(BUTTON_PORT1));
input_sync(&button_dev);
}
static int __initbutton_init(void){
/*申请申请中断断*/
if(request_irq(BUTTON_IRQ,button_interrupt,0,"button",NULL))
return-EBUSY;
set_bit(EV_KEY,button_dev.evbit)//支持EV_KEY事件事件
set_bit(BTN_0,button_dev.keybit);//设备设备支持两个键
set_bit(BTN_1,button_dev.keybit);
input_register_device(&button_dev);//注注册册input设备设备
}