基于MeeGo的电容式触摸屏驱动设计
SPI总线是一种高速的、全双工、同步的通信总线,以主从方式工作,有4根线分别是SDI(数据输入)、SDO(数据输出)、CLK(时钟)、CS(片选)。SPI总线为了与外设进行数据交换,其输出串行同步时钟相位和极性可以根据外设工作要求进行配置。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。时钟极性(CPOL)对传输协议没有重大的影响,如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。
依托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)。
由input_set_abs_params()函数完成,代码如下:
input_set_abs_params(input,ABS_X,0,960,0,0);
//屏幕分辨率为960×640
Input_set_abs_params(input,ABS_Y,0.640,0,0);
//X坐标范围0~960
Input_set_abs_params(input,ABS_MAJOR,0,255,0,0);
//Y坐标范围0~640
(4)上报输入事件
触摸屏被触摸感应时,通过input_report_abs()函数上报发生的事件及坐标值。
(1)void spi_init()函数
在该函数中通过spi_register_driver(strcut spi_driver*drv)来注册触摸屏SPI接口。
(2)Touch_probe()函数
在这个函数中,会对SPI总线的相关参数进行配置,并注册open()和close()函数。调用input_dev*input_allocate_device(void)进行输入设备分配;调用set_bit(EV_ABS,input_evbit)来设置触摸屏事件;调用input_set_params()设置坐标范围及接触点主轴长度范围;最后调用input_register_device(struct input_dev*dev)把触摸屏注册为输入子系统设备。
(3)触摸屏中断注册及中断处理函数
request_irq(TOUCH IRQ,Touch interrupt,0,“touch”,NULL)为中断函数注册,其中Touch_interrupt是中断处理函数。当触摸屏有感应时将拉低INT引脚,此时便触发中断处理函数Touch_interrupt。该中断函数调用intput_report_abs()将采集到的坐标数据上报给输入子系统,当为单点触摸时,上报该触点;当为多点触摸时,依次将每个点的坐标上报。这里为了消除抖动带来的误操作,在中断处理程序中启用了一个定时器init_timer(),进入中断后将延时5 ms,然后才对数据读取。
电容式触摸屏相关文章:电容式触摸屏原理
评论