一,编写触摸屏驱动程序的准备知识之一:输入子系统
1.输入子系统简单介绍
Linux系统提供了input子系统,按键、触摸屏、鼠标等输入型设备都可以利用input接口函数来实现设备驱动。
2.输入子系统的组成
输入子系统由驱动层(drivers)、输入子系统核心层(input core)和事件处理层(Event Handler)三部分组成。
驱动层:将底层的硬件输入转化为统一的事件型式,向输入核心层汇报。
输入子系统核心层:为驱动层提供输入设备注册与操作接口,如input_register_device ;通知事件处理层对事件进行处理;在/proc下产生相应的设备信息。
事件处理层:将硬件设备上报的事件分发到用户空间和内核。
3.设备描述
在Linux内核中,input设备用input_dev结构体描述,使用input子系统实现输入设备驱动编写的时候,驱动的核心工作是向系统报告按键、触摸屏、键盘、鼠标等输入事件,不再需要关心文件操作接口,因为input子系统已经完成了文件操作接口。驱动报告的事件经过输入子系统核心层和事件处理层最终到达用户空间。
4.input设备驱动的编写
4.1 设备注册/注销
注册输入设备的函数为:int input_register_device(struct input_dev*dev)
注销输入设备的函数为: void input_unregister_device(struct input_dev*dev)
4.2 事件支持
设备驱动通过set_bit()或者BIT()告诉input子系统它支持哪些事件,哪些按键。例如下面的例子:
set_bit(EV_KEY,dev->evbit) 也可以写成dev->evbit[0] = BIT(EV_KEY)
表示输入子系统支持按键事件。
struct input_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_SYN 同步事件
当事件类型为EV_KEY时,还需要指明按键类型:
BTN_LEFT 鼠标左键 BTN_0 数字0键
BTN_RIGHT 鼠标右键 BTN_1 数字1键
BTN_MIDDLE 鼠标中键 BTN_TOUCH 触摸屏点击
注:更多的事件类型请看linux源码中的input.h这个头文件。
4.3 报告事件
用于报告EV_KEY、EV_REL和EV_ABS事件的函数分别如下:
void input_report_key(struct input_dev *dev,unsigned int code,int value)
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)
参数说明:
code 事件的代码,所有事件的代码都在linux源码中的input.h头文件中。
value 事件的值。如果事件的类型是EV_KEY,当按键按下时值为1,松开时值为0。
4.4 完成事件的报告
使用input_sync(struct input_dev *dev)来告诉input core 报告事件已经完成。
二,编写触摸屏驱动程序的准备知识之二:触摸屏驱动的原理
触摸屏的工作流程
1.1 设置触摸屏接口为等待中断模式,等待触摸屏被按下。
1.2 如果中断发生(TC中断,即触摸屏被按下),选择X、Y坐标转换模式(X、Y坐标分别转换模式或者X、Y坐标自动转换模式),启动A/D转换。
1.3 当A/D转换完成后,通过中断(AD中断,用来表示X、Y 坐标转换完成)获取X/Y坐标,ADCDAT0 bit[9:0]--X坐标,ADCDAT1 bit[9:0]--Y坐标。
1.4 设置触摸屏接口为等待中断模式,等待触摸笔离开触摸屏。
1.5 返回步骤1,等待下次触摸屏被按下。
TQ2440触摸屏驱动程序整体流程图