2022年触摸屏驱动 .pdf

上传人:Q****o 文档编号:30540194 上传时间:2022-08-06 格式:PDF 页数:17 大小:377.97KB
返回 下载 相关 举报
2022年触摸屏驱动 .pdf_第1页
第1页 / 共17页
2022年触摸屏驱动 .pdf_第2页
第2页 / 共17页
点击查看更多>>
资源描述

《2022年触摸屏驱动 .pdf》由会员分享,可在线阅读,更多相关《2022年触摸屏驱动 .pdf(17页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、二、前提知识1、Linux输入子系统 (Input Subsystem):在 Linux中,输入子系统是由输入子系统设备驱动层、输入子系统核心层(Input Core)和输入子系统事件处理层(Event Handler)组成。其中设备驱动层提供对硬件各寄存器的读写访问和将底层硬件对用户输入访问的响应转换为标准的输入事件,再通过核心层提交给事件处理层;而核心层对下提供了设备驱动层的编程接口,对上又提供了事件处理层的编程接口;而事件处理层就为我们用户空间的应用程序提供了统一访问设备的接口和驱动层提交来的事件处理。所以这使得我们输入设备的驱动部分不在用关心对设备文件的操作,而是要关心对各硬件寄存器的

2、操作和提交的输入事件。下面用图形来描述一下这三者的关系吧!另外,又找了另一幅图来说明Linux输入子系统的结构,可能更加形象容易理解。如下:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 17 页 - - - - - - - - - 2、输入子系统设备驱动层实现原理:在 Linux中,Input设备用 input_dev结构体描述, 定义在 input.h中。设备的驱动只需按照如下步骤就可实现了。、在驱动模块加载函数中设置Input设备支持 input子系统的哪些事件;、

3、将 Input设备注册到input子系统中;、在 Input设备发生输入操作时(如:键盘被按下/ 抬起、 触摸屏被触摸/ 抬起 / 移动、 鼠标被移动/ 单击 / 抬起时等 ) ,提交所发生的事件及对应的键值/ 坐标等状态。Linux中输入设备的事件类型有(这里只列出了常用的一些,更多请看linux/input.h中) :EV_SYN 0 x00 同步事件EV_KEY 0 x01 按键事件名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 17 页 - - - - - - -

4、 - - EV_REL 0 x02 相对坐标 ( 如:鼠标移动,报告的是相对最后一次位置的偏移) EV_ABS 0 x03 绝对坐标 ( 如:触摸屏和操作杆,报告的是绝对的坐标位置) EV_MSC 0 x04 其它EV_LED 0 x11 LED EV_SND 0 x12 声音EV_REP 0 x14 Repeat EV_FF 0 x15 力反馈用于提交较常用的事件类型给输入子系统的函数有:void input_report_key( struct input_dev *dev,unsignedint code ,int value ); /提交按键事件的函数void input_report

5、_rel( struct input_dev *dev,unsignedint code ,int value); /提交相对坐标事件的函数void input_report_abs( struct input_dev *dev,unsignedint code ,int value); /提交绝对坐标事件的函数注意,在提交输入设备的事件后必须用下列方法使事件同步,让它告知input系统,设备驱动已经发出了一个完整的报告:void input_sync(struct input_dev *dev)三、触摸屏驱动的实现步骤1、硬件原理图分析:S3c2440芯片内部触摸屏接口与ADC 接口是集成在

6、一起的,硬件结构原理图请看:S3C2440上 ADC 驱动实例开发讲解中的图, 其中通道7(XP或 AIN7)作为触摸屏接口的X 坐标输入,通道5(YP 或 AIN5)作为触摸屏接口的Y 坐标输入。在S3C2440上 ADC 驱动实例开发讲解 中,AD 转换的模拟信号是由开发板上的一个电位器产生并通过通道1(AIN0)输入的,而这里的模拟信号则是由点触触摸屏所产生的X 坐标和 Y 坐标两个模拟信号,并分别通过通道7 和通道 5 输入。 S3c2440提供的触摸屏接口有4 种处理模式,分别是:正常转换模式、单独的 X/Y 位置转换模式、 自动 X/Y 位置转换模式和等待中断模式,对于在每种模式下

7、工作的要求,请详细查看数据手册的描述。本驱动实例将采用自动X/Y 位置转换模式和等待中断模式。注意:在每步中,为了让代码逻辑更加有条理和容易理解,就没有考虑代码的顺序,比如函数要先定义后调用。如果要编译此代码,请严格按照C 语言的规范来调整代码的顺序。2、建立触摸屏驱动程序my2440_ts.c,首先实现加载和卸载部分,在驱动加载部分,我们主要做的事情是:启用ADC 所需要的时钟、映射IO 口、初始化寄存器、申请中断、初始化输入设备、将输入设备注册到输入子系统。代码如下:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整

8、理 - - - - - - - 第 3 页,共 17 页 - - - - - - - - - #include #include #include #include #include #include #include #include #include /* 用于保存从平台时钟列表中获取的ADC时钟 */staticstruct clk *adc_clk ;/* 定义了一个用来保存经过虚拟映射后的内存地址*/staticvoid _iomem *adc_base ;/* 定义一个输入设备来表示我们的触摸屏设备*/staticstruct input_dev *ts_dev ;/* 设备名称

9、*/#define DEVICE_NAME my2440_TouchScreen/* 定义一个WAIT4INT 宏,该宏将对ADC触摸屏控制寄存器进行操作S3C2410_ADCTSC_YM_SEN这些宏都定义在regs-adc.h中*/#define WAIT4INT( x)( x) evbit 0= BIT ( EV_SYN )| BIT ( EV_KEY )| BIT ( EV_ABS );/*keybit字段用于描述按键的类型,在input.h中定义了很多,这里用BTN_TOUCH类型来表示触摸屏的点击*/ ts_dev- keybit BITS_TO_LONGS ( BTN_TOUCH

10、)= BIT ( BTN_TOUCH);/* 对于触摸屏来说,使用的是绝对坐标系统。这里设置该坐标系统中X和 Y坐标的最小值和最大值(0-1023范围 ) ABS_X和 ABS_Y就表示 X坐标和 Y坐标,ABS_PRESSURE就表示触摸屏是按下还是抬起状态 */ input_set_abs_params( ts_dev , ABS_X, 0 , 0 x3FF , 0 , 0 ); input_set_abs_params( ts_dev , ABS_Y, 0 , 0 x3FF , 0 , 0 ); input_set_abs_params( ts_dev , ABS_PRESSURE, 0

11、 , 1 , 0 , 0 );/* 以下是设置触摸屏输入设备的身份信息,直接在这里写死。这些信息可以在驱动挂载后在/proc/bus/input/devices中查看到 */ ts_dev- name = DEVICE_NAME ;/* 设备名称 */ ts_dev- id . bustype = BUS_RS232;/* 总线类型 */ ts_dev- id . vendor = 0 xDEAD;/* 经销商 ID 号*/ ts_dev- id . product = 0 xBEEF;/* 产品 ID 号*/ ts_dev- id . version = 0 x0101 ;/* 版本 ID

12、号*/* 好了,一些都准备就绪,现在就把ts_dev 触摸屏设备注册到输入子系统中*/ input_register_device( ts_dev );名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 17 页 - - - - - - - - - return 0 ;/* 下面是错误跳转处理*/err_noclk: clk_disable(adc_clk ); clk_put(adc_clk );err_nomap : iounmap(adc_base );err_noir

13、q: free_irq( IRQ_ADC , 1 );return ret;/* 初始化 ADC控制寄存器和ADC触摸屏控制寄存器*/staticvoid adc_initialize( void )/* 计算结果为 ( 二进制 ) :111111111000000 ,再根据数据手册得知此处是将AD转换预定标器值设为255、AD转换预定标器使能有效*/ writel( S3C2410_ADCCON_PRSCEN | S3C2410_ADCCON_PRSCVL( 0 xFF), adc_base +S3C2410_ADCCON);/* 对 ADC开始延时寄存器进行设置,延时值为0 xffff*/

14、 writel( 0 xffff, adc_base + S3C2410_ADCDLY );/*WAIT4INT 宏计算结果为( 二进制 ) :11010011,再根据数据手册得知名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 17 页 - - - - - - - - - 此处是将ADC触摸屏控制寄存器设置成等待中断模式*/ writel( WAIT4INT( 0), adc_base + S3C2410_ADCTSC );staticvoid _exit ts_exit

15、( void )/* 屏蔽和释放中断*/ disable_irq(IRQ_ADC ); disable_irq(IRQ_TC); free_irq( IRQ_ADC , 1 ); free_irq( IRQ_TC , 1 );/* 释放虚拟地址映射空间*/ iounmap(adc_base );/* 屏蔽和销毁时钟*/if ( adc_clk ) clk_disable( adc_clk ); clk_put(adc_clk ); adc_clk = NULL ;/* 将触摸屏设备从输入子系统中注销*/ input_unregister_device( ts_dev );module_init

16、(ts_init);module_exit(ts_exit);名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 17 页 - - - - - - - - - MODULE_LICENSE( GPL);MODULE_AUTHOR(Huang Gang );MODULE_DESCRIPTION( My2440 Touch Screen Driver);3、接下来要做的是,在两个中断服务程序中实现触摸屏状态和坐标的转换。先看代码,如下:/* 定义一个外部的信号量ADC_LOCK,

17、因为 ADC_LOCK 在 ADC驱动程序中已申明这样就能保证ADC资源在 ADC驱动和触摸屏驱动中进行互斥访问*/externstruct semaphore ADC_LOCK;/* 做为一个标签,只有对触摸屏操作后才对X和 Y坐标进行转换*/staticint OwnADC = 0 ;/* 用于记录转换后的X坐标值和Y坐标值 */staticlong xp ;staticlong yp ;/* 用于计数对触摸屏压下或抬起时模拟输入转换的次数*/staticintcount ;/* 定义一个AUTOPST 宏,将 ADC触摸屏控制寄存器设置成自动转换模式*/#define AUTOPST (

18、 S3C2410_ADCTSC_YM_SEN | S3C2410_ADCTSC_YP_SEN |S3C2410_ADCTSC_XP_SEN | S3C2410_ADCTSC_AUTO_PST | S3C2410_ADCTSC_XY_PST( 0)/* 触摸屏中断服务程序,对触摸屏按下或提笔时触发执行*/static irqreturn_t tc_irq( int irq,void*dev_id )/* 用于记录这一次AD转换后的值 */名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第

19、10 页,共 17 页 - - - - - - - - - unsignedlong data0 ;unsignedlong data1 ;/* 用于记录触摸屏操作状态是按下还是抬起*/int updown;/*ADC 资源可以获取,即上锁*/if(down_trylock(&ADC_LOCK)= 0 )/* 标识对触摸屏进行了操作*/ OwnADC = 1 ;/* 读取这一次AD转换后的值,注意这次主要读的是状态*/ data0 = readl( adc_base + S3C2410_ADCDAT0 ); data1 = readl( adc_base + S3C2410_ADCDAT1 )

20、;/* 记录这一次对触摸屏是压下还是抬起,该状态保存在数据寄存器的第15 位,所以与上 S3C2410_ADCDAT0_UPDOWN*/ updown = (!( data0 & S3C2410_ADCDAT0_UPDOWN)& (!(data1 &S3C2410_ADCDAT0_UPDOWN);/* 判断触摸屏的操作状态*/if(updown)/* 如果是按下状态,则调用touch_timer_fire函数来启动ADC转换,该函数定义后面再讲 */ touch_timer_fire( 0);else名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - -

21、- - - - - 名师精心整理 - - - - - - - 第 11 页,共 17 页 - - - - - - - - - /* 如果是抬起状态,就结束了这一次的操作,所以就释放ADC资源的占有 */ OwnADC = 0 ; up(&ADC_LOCK );return IRQ_HANDLED ;staticvoid touch_timer_fire( unsignedlong data )/* 用于记录这一次AD转换后的值 */unsignedlong data0 ;unsignedlong data1 ;/* 用于记录触摸屏操作状态是按下还是抬起*/int updown;/* 读取这一次

22、AD转换后的值,注意这次主要读的是状态*/ data0 = readl( adc_base + S3C2410_ADCDAT0 ); data1 = readl( adc_base + S3C2410_ADCDAT1 );/* 记录这一次对触摸屏是压下还是抬起,该状态保存在数据寄存器的第15 位,所以与上S3C2410_ADCDAT0_UPDOWN*/ updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)& (!( data1 &S3C2410_ADCDAT0_UPDOWN);/* 判断触摸屏的操作状态*/名师资料总结 - - -精品资料欢迎下载 - - -

23、- - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 17 页 - - - - - - - - - if( updown)/* 如果状态是按下,并且ADC已经转换了就报告事件和数据*/if( count!= 0 )long tmp ; tmp = xp ; xp = yp ; yp = tmp ; xp = 2 ; yp = 2 ;#ifdef CONFIG_TOUCHSCREEN_MY2440_DEBUG /* 触摸屏调试信息,编译内核时选上此项后,点击触摸屏会在终端上打印出坐标信息 */structtimeval tv ;

24、do_gettimeofday(& tv ); printk( KERN_DEBUG T: %06d, X: %03ld, Y: %03ldn, ( int ) tv . tv_usec , xp ,yp);#endif/* 报告 X、Y 的绝对坐标值*/ input_report_abs(ts_dev , ABS_X, xp ); input_report_abs(ts_dev , ABS_Y, yp );名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 17 页 -

25、- - - - - - - - /* 报告触摸屏的状态,1 表明触摸屏被按下*/ input_report_abs( ts_dev , ABS_PRESSURE, 1 );/* 报告按键事件,键值为1( 代表触摸屏对应的按键被按下)*/ input_report_key(ts_dev , BTN_TOUCH , 1 );/* 等待接收方受到数据后回复确认,用于同步*/ input_sync( ts_dev );/* 如果状态是按下,并且ADC还没有开始转换就启动ADC进行转换 */ xp = 0 ; yp = 0 ;count= 0 ;/* 设置触摸屏的模式为自动转换模式*/ writel(S

26、3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST , adc_base +S3C2410_ADCTSC);/* 启动 ADC转换 */ writel(readl ( adc_base + S3C2410_ADCCON )| S3C2410_ADCCON_ENABLE_START,adc_base + S3C2410_ADCCON );else/* 否则是抬起状态*/count= 0 ;/* 报告按键事件,键值为0( 代表触摸屏对应的按键被释放)*/名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师

27、精心整理 - - - - - - - 第 14 页,共 17 页 - - - - - - - - - input_report_key( ts_dev , BTN_TOUCH , 0 );/* 报告触摸屏的状态,0 表明触摸屏没被按下*/ input_report_abs( ts_dev , ABS_PRESSURE, 0 );/* 等待接收方受到数据后回复确认,用于同步*/ input_sync( ts_dev );/* 将触摸屏重新设置为等待中断状态*/ writel(WAIT4INT( 0), adc_base + S3C2410_ADCTSC );/* 如果触摸屏抬起,就意味着这一次的

28、操作结束,所以就释放ADC资源的占有 */if(OwnADC ) OwnADC = 0 ; up(&ADC_LOCK );/* 定义并初始化了一个定时器touch_timer,定时器服务程序为touch_timer_fire*/staticstruct timer_list touch_timer = TIMER_INITIALIZER ( touch_timer_fire, 0 , 0 );/*ADC 中断服务程序,AD转换完成后触发执行*/static irqreturn_t adc_irq( int irq,void*dev_id )/* 用于记录这一次AD转换后的值 */unsigne

29、dlong data0 ;unsignedlong data1 ;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 17 页 - - - - - - - - - if ( OwnADC )/* 读取这一次AD转换后的值,注意这次主要读的是坐标*/ data0 = readl( adc_base + S3C2410_ADCDAT0 ); data1 = readl( adc_base + S3C2410_ADCDAT1 );/* 记录这一次通过AD转换后的X 坐标值和Y坐标

30、值, 根据数据手册可知,X和 Y坐标转换数值分别保存在数据寄存器0 和 1 的第 0-9 位,所以这里与上S3C2410_ADCDAT0_XPDATA_MASK就是取 0-9 位的值 */ xp += data0 & S3C2410_ADCDAT0_XPDATA_MASK; yp += data1 & S3C2410_ADCDAT1_YPDATA_MASK;/* 计数这一次AD转换的次数 */count +;if(count ( 12)/* 如果转换的次数小于4,则重新启动ADC转换 */ writel( S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST , a

31、dc_base +S3C2410_ADCTSC); writel( readl ( adc_base + S3C2410_ADCCON ) | S3C2410_ADCCON_ENABLE_START,adc_base + S3C2410_ADCCON );else/* 否则,启动1 个时间滴答的定时器,这是就会去执行定时器服务程序上报事件和数据 */名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 17 页 - - - - - - - - - mod_timer(&tou

32、ch_timer, jiffies + 1 ); writel( WAIT4INT( 1), adc_base + S3C2410_ADCTSC );return IRQ_HANDLED ;我们从整体上描述转换这个的过程:(1) 如果触摸屏感觉到触摸,则触发触摸屏中断即进入tc_irq,获取 ADC_LOCK后判断触摸屏状态为按下,则调用touch_timer_fire启动 ADC 转换;(2) 当 ADC 转换启动后,触发ADC 中断即进入adc_irq,如果这一次转换的次数小于4,则重新启动 ADC 进行转换,如果4 次完毕后,启动1 个时间滴答的定时器,停止ADC 转换,也就是说在这个时

33、间滴答内,ADC 转换是停止的;(3) 这里为什么要在1 个时间滴答到来之前停止ADC 的转换呢?这是为了防止屏幕抖动。(4) 如果 1 个时间滴答到来则进入定时器服务程序touch_timer_fire,判断触摸屏仍然处于按下状态则上报事件和转换的数据,并重启ADC 转换,重复第(2) 步;(5) 如果触摸抬起了,则上报释放事件,并将触摸屏重新设置为等待中断状态。四、移植和测试触摸屏驱动程序移植和测试请看Linux-2.6.30.4在 2440 上的移植之触摸屏驱动名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 17 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com