这样在设计驱动程序时只需要考虑驱动层的实现就可以了,减少了工作量,降低了设计难度。另外基于子系统的设计提高了驱动程序的可移植性和可适应性,因为基于子系统的驱动程序设计不用考虑向上层报告输入设备的接口没计,此工作由输入子系统来完成,而输入子系统对上层的接口具有通用性,可以使驱动程序的使用范围得到扩展。图2是Linux输入子系统的框架图。
3 触摸屏驱动程序设计
3.1 触摸屏驱动工作原理
本设计重在提出触摸屏驱动的整体设计方案,该设计流程也适用于其他触摸屏驱动设计开发。此设计可以采用SPI总线作为触摸屏和处理器的接口,硬件连接示意图如图3所示。TOUCH SCREEN是电容式触摸屏,可采用FT5201电容式全屏触摸芯片,INT是中断引脚,当触摸屏被触摸时,通过INT引脚触发中断处理程序,CPU可采用Intel公司的Atom D510处理器。
SPI总线是一种高速的、全双工、同步的通信总线,以主从方式工作,有4根线分别是SDI(数据输入)、SDO(数据输出)、CLK(时钟)、CS(片选)。SPI总线为了与外设进行数据交换,其输出串行同步时钟相位和极性可以根据外设工作要求进行配置。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。时钟极性(CPOL)对传输协议没有重大的影响,如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。
3.2 驱动程序软件设计
依托Linux输入子系统架构,驱动程序的设计需要完成以下工作。
(1)分配、注册、注销input设备
各个接口函数如下:
◆分配函数为struct input_dev*input_allocate_device(void);
◆注册函数为int input_register_device(struct input_dev*devr);
◆注销函数为void input_unregister_device(struct input_dev*dev)。
(2)设置input设备支持的事件类型
通过set_bit()告诉所支持的事件类型,触摸屏的事件类型代码为EV_ABS(0x03)。
(3)电容触摸屏参数设置
由input_set_abs_params()函数完成,代码如下:
input_set_abs_params(input,ABS_X,0,960,0,0);
//屏幕分辨率为960×640