ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:21.17KB ,
资源ID:10319669      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10319669.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(s3c2440触摸屏.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

s3c2440触摸屏.docx

1、s3c2440触摸屏S3C2440上触摸屏驱动实例开发讲解(摘自: 建立触摸屏驱动程序my2440_ts.c,首先实现加载和卸载部分,在驱动加载部分,我们主要做的事情是:启用ADC所需要的时钟、映射IO口、初始化寄存器、申请中断、初始化输入设备、将输入设备注册到输入子系统。代码如下:1. #include2. #include3. #include4. #include5. #include6. #include7. #include8. #include9. #include10. 11. /*用于保存从平台时钟列表中获取的ADC时钟*/12. staticstructclk*adc_clk

2、;13. /*定义了一个用来保存经过虚拟映射后的内存地址*/14. staticvoid_iomem*adc_base;15. /*定义一个输入设备来表示我们的触摸屏设备*/16. staticstructinput_dev*ts_dev;17. /*设备名称*/18. #defineDEVICE_NAMEmy2440_TouchScreen19. /*定义一个WAIT4INT宏,该宏将对ADC触摸屏控制寄存器进行操作20. S3C2410_ADCTSC_YM_SEN这些宏都定义在regs-adc.h中*/21. #defineWAIT4INT(x)(x)evbit0=BIT(EV_SYN)|

3、BIT(EV_KEY)|BIT(EV_ABS);84. 85. /*keybit字段用于描述按键的类型,在input.h中定义了很多,86. 这里用BTN_TOUCH类型来表示触摸屏的点击*/87. ts_dev-keybitBITS_TO_LONGS(BTN_TOUCH)=BIT(BTN_TOUCH);88. 89. /*对于触摸屏来说,使用的是绝对坐标系统。这里设置该坐标系统中X和Y坐标的最小值和最大值90. (0-1023范围)ABS_X和ABS_Y就表示X坐标和Y坐标,ABS_PRESSURE就表示触摸屏是按下还是抬起状态*/91. input_set_abs_params(ts_de

4、v,ABS_X,0,0x3FF,0,0);92. input_set_abs_params(ts_dev,ABS_Y,0,0x3FF,0,0);93. input_set_abs_params(ts_dev,ABS_PRESSURE,0,1,0,0);94. 95. /*以下是设置触摸屏输入设备的身份信息,直接在这里写死。96. 这些信息可以在驱动挂载后在/proc/bus/input/devices中查看到*/97. ts_dev-name=DEVICE_NAME;/*设备名称*/98. ts_dev-id.bustype=BUS_RS232;/*总线类型*/99. ts_dev-id.ve

5、ndor=0xDEAD;/*经销商ID号*/100. ts_dev-id.product=0xBEEF;/*产品ID号*/101. ts_dev-id.version=0x0101;/*版本ID号*/102. 103. /*好了,一些都准备就绪,现在就把ts_dev触摸屏设备注册到输入子系统中*/104. input_register_device(ts_dev);105. 106. return0;107. 108. /*下面是错误跳转处理*/109. err_noclk:110. clk_disable(adc_clk);111. clk_put(adc_clk);112. 113. er

6、r_nomap:114. iounmap(adc_base);115. 116. err_noirq:117. free_irq(IRQ_ADC,1);118. 119. returnret;120. 121. 122. /*初始化ADC控制寄存器和ADC触摸屏控制寄存器*/123. staticvoidadc_initialize(void)124. 125. /*计算结果为(二进制):111111111000000,再根据数据手册得知126. 此处是将AD转换预定标器值设为255、AD转换预定标器使能有效*/127. writel(S3C2410_ADCCON_PRSCEN|S3C2410

7、_ADCCON_PRSCVL(0xFF),adc_base S3C2410_ADCCON);128. 129. /*对ADC开始延时寄存器进行设置,延时值为0xffff*/130. writel(0xffff,adc_base S3C2410_ADCDLY);131. 132. /*WAIT4INT宏计算结果为(二进制):11010011,再根据数据手册得知133. 此处是将ADC触摸屏控制寄存器设置成等待中断模式*/134. writel(WAIT4INT(0),adc_base S3C2410_ADCTSC);135. 136. 137. staticvoid_exitts_exit(vo

8、id)138. 139. /*屏蔽和释放中断*/140. disable_irq(IRQ_ADC);141. disable_irq(IRQ_TC);142. free_irq(IRQ_ADC,1);143. free_irq(IRQ_TC,1);144. 145. /*释放虚拟地址映射空间*/146. iounmap(adc_base);147. 148. /*屏蔽和销毁时钟*/149. if(adc_clk)150. 151. clk_disable(adc_clk);152. clk_put(adc_clk);153. adc_clk=NULL;154. 155. 156. /*将触摸屏

9、设备从输入子系统中注销*/157. input_unregister_device(ts_dev);158. 159. 160. module_init(ts_init);161. module_exit(ts_exit);162. 163. MODULE_LICENSE(GPL);164. MODULE_AUTHOR(HuangGang);165. MODULE_DESCRIPTION(My2440TouchScreenDriver);3、接下来要做的是,在两个中断服务程序中实现触摸屏状态和坐标的转换。先看代码,如下:1. /*定义一个外部的信号量ADC_LOCK,因为ADC_LOCK在AD

10、C驱动程序中已申明2. 这样就能保证ADC资源在ADC驱动和触摸屏驱动中进行互斥访问*/3. externstructsemaphoreADC_LOCK;4. 5. /*做为一个标签,只有对触摸屏操作后才对X和Y坐标进行转换*/6. staticintOwnADC=0;7. 8. /*用于记录转换后的X坐标值和Y坐标值*/9. staticlongxp;10. staticlongyp;11. 12. /*用于计数对触摸屏压下或抬起时模拟输入转换的次数*/13. staticintcount;14. 15. /*定义一个AUTOPST宏,将ADC触摸屏控制寄存器设置成自动转换模式*/16. #

11、defineAUTOPST(S3C2410_ADCTSC_YM_SEN|S3C2410_ADCTSC_YP_SEN17. |S3C2410_ADCTSC_XP_SEN|S3C2410_ADCTSC_AUTO_PST|S3C2410_ADCTSC_XY_PST(0)18. 19. 20. /*触摸屏中断服务程序,对触摸屏按下或提笔时触发执行*/21. staticirqreturn_ttc_irq(intirq,void*dev_id)22. 23. /*用于记录这一次AD转换后的值*/24. unsignedlongdata0;25. unsignedlongdata1;26. 27. /*用

12、于记录触摸屏操作状态是按下还是抬起*/28. intupdown;29. 30. /*ADC资源可以获取,即上锁*/31. if(down_trylock(&ADC_LOCK)=0)32. 33. /*标识对触摸屏进行了操作*/34. OwnADC=1;35. 36. /*读取这一次AD转换后的值,注意这次主要读的是状态*/37. data0=readl(adc_base S3C2410_ADCDAT0);38. data1=readl(adc_base S3C2410_ADCDAT1);39. 40. /*记录这一次对触摸屏是压下还是抬起,该状态保存在数据寄存器的第15位,41. 所以与上S

13、3C2410_ADCDAT0_UPDOWN*/42. updown=(!(data0&S3C2410_ADCDAT0_UPDOWN)&(!(data1&S3C2410_ADCDAT0_UPDOWN);43. 44. /*判断触摸屏的操作状态*/45. if(updown)46. 47. /*如果是按下状态,则调用touch_timer_fire函数来启动ADC转换,该函数定义后面再讲*/48. touch_timer_fire(0);49. 50. else51. 52. /*如果是抬起状态,就结束了这一次的操作,所以就释放ADC资源的占有*/53. OwnADC=0;54. up(&ADC_

14、LOCK);55. 56. 57. 58. returnIRQ_HANDLED;59. 60. 61. staticvoidtouch_timer_fire(unsignedlongdata)62. 63. /*用于记录这一次AD转换后的值*/64. unsignedlongdata0;65. unsignedlongdata1;66. 67. /*用于记录触摸屏操作状态是按下还是抬起*/68. intupdown;69. 70. /*读取这一次AD转换后的值,注意这次主要读的是状态*/71. data0=readl(adc_base S3C2410_ADCDAT0);72. data1=re

15、adl(adc_base S3C2410_ADCDAT1);73. 74. /*记录这一次对触摸屏是压下还是抬起,该状态保存在数据寄存器的第15位,75. 所以与上S3C2410_ADCDAT0_UPDOWN*/76. updown=(!(data0&S3C2410_ADCDAT0_UPDOWN)&(!(data1&S3C2410_ADCDAT0_UPDOWN);77. 78. /*判断触摸屏的操作状态*/79. if(updown)80. 81. /*如果状态是按下,并且ADC已经转换了就报告事件和数据*/82. if(count!=0)83. 84. longtmp;85. 86. tmp

16、=xp;87. xp=yp;88. yp=tmp;89. 90. xp=2;91. yp=2;92. 93. #ifdefCONFIG_TOUCHSCREEN_MY2440_DEBUG94. /*触摸屏调试信息,编译内核时选上此项后,点击触摸屏会在终端上打印出坐标信息*/95. structtimevaltv;96. do_gettimeofday(&tv);97. printk(KERN_DEBUGT:%06d,X:%03ld,Y:%03ldn,(int)tv.tv_usec,xp,yp);98. #endif99. 100. /*报告X、Y的绝对坐标值*/101. input_report

17、_abs(ts_dev,ABS_X,xp);102. input_report_abs(ts_dev,ABS_Y,yp);103. 104. /*报告触摸屏的状态,1表明触摸屏被按下*/105. input_report_abs(ts_dev,ABS_PRESSURE,1);106. 107. /*报告按键事件,键值为1(代表触摸屏对应的按键被按下)*/108. input_report_key(ts_dev,BTN_TOUCH,1);109. 110. /*等待接收方受到数据后回复确认,用于同步*/111. input_sync(ts_dev);112. 113. 114. /*如果状态是按

18、下,并且ADC还没有开始转换就启动ADC进行转换*/115. xp=0;116. yp=0;117. count=0;118. /*设置触摸屏的模式为自动转换模式*/119. writel(S3C2410_ADCTSC_PULL_UP_DISABLE|AUTOPST,adc_base S3C2410_ADCTSC);120. 121. /*启动ADC转换*/122. writel(readl(adc_base S3C2410_ADCCON)|S3C2410_ADCCON_ENABLE_START,123. adc_base S3C2410_ADCCON);124. 125. else126.

19、127. /*否则是抬起状态*/128. count=0;129. /*报告按键事件,键值为0(代表触摸屏对应的按键被释放)*/130. input_report_key(ts_dev,BTN_TOUCH,0);131. /*报告触摸屏的状态,0表明触摸屏没被按下*/132. input_report_abs(ts_dev,ABS_PRESSURE,0);133. /*等待接收方受到数据后回复确认,用于同步*/134. input_sync(ts_dev);135. /*将触摸屏重新设置为等待中断状态*/136. writel(WAIT4INT(0),adc_base S3C2410_ADCTSC);137. /*如果触摸屏抬起,就意味着这一次的操作结束,所以就释放ADC资源的占有*/138. if(OwnADC)139. 140. OwnADC=0;141. up(&ADC_LOCK);142. 143. 144. 145. 146. /*定义并初始化了一个定时器touch_timer,定时器服务程序为touch_timer_fire*/147. staticstructtimer_listtouch_timer=TIMER_INITIALIZER(touch_timer_fire,0,0);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1