Linux设备驱动—触摸屏驱动

上传人:平*** 文档编号:12790820 上传时间:2017-10-20 格式:DOC 页数:8 大小:151.41KB
返回 下载 相关 举报
Linux设备驱动—触摸屏驱动_第1页
第1页 / 共8页
Linux设备驱动—触摸屏驱动_第2页
第2页 / 共8页
Linux设备驱动—触摸屏驱动_第3页
第3页 / 共8页
Linux设备驱动—触摸屏驱动_第4页
第4页 / 共8页
Linux设备驱动—触摸屏驱动_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《Linux设备驱动—触摸屏驱动》由会员分享,可在线阅读,更多相关《Linux设备驱动—触摸屏驱动(8页珍藏版)》请在金锄头文库上搜索。

1、Linux 设备驱动工程师之路 触摸屏驱动 s3c2410_ts.c 分析Linux 设备驱动工程师之路触摸屏驱动 s3c2410_ts.c 分析K-Style转载请注明来自于衡阳师范学院 08 电 2 K-Style http:/ 邮箱:一、触摸屏硬件知识1.模块原理图S3C2440 有 8 路的 ADC 通道其中触摸屏控制器接口 XP,XM,YP,YM 与四路 ADC 通道复用四个 IO 引脚。从原理图看出 8 路 ADC 只有一个 A/D 转换器,通过一个 8 选 1 开关MUX 来选通哪一路 A/D 通道进行转换。触摸屏控制会产生两个中断,一个触摸屏中断INT_ADC,一个 ADC_转

2、换完成中断 INT_ADC。ADC 需要时钟才能工作,因为它需要设置采样率。再复习一下 ARM 裸机实验时触摸屏寄存器操作流程流程:初始化1 设置采样延时和分频值 ADCDLY ADCCON2 中断相关设置3 设置触摸屏 AD 转换为等待中断模式 ADCTSC中断服务函数4 清相关挂起寄存器5 设置转换模式,一般为连续 x,y 转换6 启动转换7 转换完成后读取 x y 坐标 ADCDAT0ADCDAT18 设置触摸屏 AD 转换为等待中断模式,设置等待弹起中断 ADCTSC9 弹起中断发生后,设置触摸屏转换为等待中断模式,等待下一次触笔按下 rADCTSC程序二、触摸屏驱动程序1.模块初始化

3、html view plaincopy1. static int _init s3c2410ts_init(void) 2. 3. struct input_dev *input_dev; 4. 5. /获取时钟 6. adc_clock = clk_get(NULL, adc); 7. if (!adc_clock) 8. printk(KERN_ERR failed to get adc clock sourcen); 9. return -ENOENT; 10. 11. clk_enable(adc_clock); 12. /使能时钟 13. /需要时钟的是因为触摸屏要用到 ADC 转换

4、,而完成 ADC 转换则需要时钟(采用时间) 14. 15. /映射 ADC 的 IO 内存 16. base_addr=ioremap(S3C2410_PA_ADC,0x20); 17. if (base_addr = NULL) 18. printk(KERN_ERR Failed to remap register blockn); 19. return -ENOMEM; 20. 21. 22. /初始化触摸屏的 IO 引脚 23. /* Configure GPIOs */ 24. s3c2410_ts_connect(); 25. 26. /设置预分频值 27. iowrite32(

5、S3C2410_ADCCON_PRSCEN | S3C2410_ADCCON_PRSCVL(0xFF), 28. base_addr+S3C2410_ADCCON); 29. iowrite32(0xffff, base_addr+S3C2410_ADCDLY);/设置采用延时 30. iowrite32(WAIT4INT(0), base_addr+S3C2410_ADCTSC); 31. /设置触摸屏控制器为等待按下中断 32. 33. /* Initialise input stuff */ 34. /申请一个 input 设备 35. input_dev = input_allocat

6、e_device(); 36. 37. if (!input_dev) 38. printk(KERN_ERR Unable to allocate the input device !n); 39. return -ENOMEM; 40. 41. 42. dev = input_dev; 43. 44. /设置可被支持的事件为同步、按键、绝对坐标事件 45. dev-evbit0 = BIT(EV_SYN) | BIT(EV_KEY) | BIT(EV_ABS); 46. /设置按键时间类型为触摸屏 47. dev-keybitBITS_TO_LONGS(BTN_TOUCH) = BIT(B

7、TN_TOUCH); 48. 49. /设置事件数值范围 X,Y 坐标范围为 0 到 3FF,按键数值范围从 0,到 1 50. input_set_abs_params(dev, ABS_X, 0, 0x3FF, 0, 0); 51. input_set_abs_params(dev, ABS_Y, 0, 0x3FF, 0, 0); 52. input_set_abs_params(dev, ABS_PRESSURE, 0, 1, 0, 0); 53. 54. /设置设备的身份信息 55. dev-name = s3c2410ts_name; 56. dev-id.bustype = BUS

8、_RS232; 57. dev-id.vendor = 0xDEAD; 58. dev-id.product = 0xBEEF; 59. dev-id.version = S3C2410TSVERSION; 60. 61. 62. /* Get irqs */ 63. /获取触摸屏中断 IRQ_TC,ADC 转换完成中断 IRQ_ADC 64. if (request_irq(IRQ_ADC, stylus_action, IRQF_SHARED|IRQF_SAMPLE_RANDOM, 65. s3c2410_action, dev) 66. printk(KERN_ERR s3c2410_t

9、s.c: Could not allocate ts IRQ_ADC !n); 67. iounmap(base_addr); 68. return -EIO; 69. 70. if (request_irq(IRQ_TC, stylus_updown, IRQF_SAMPLE_RANDOM, 71. s3c2410_action, dev) 72. printk(KERN_ERR s3c2410_ts.c: Could not allocate ts IRQ_TC !n); 73. iounmap(base_addr); 74. return -EIO; 75. 76. 77. printk

10、(KERN_INFO %s successfully loadedn, s3c2410ts_name); 78. 79. /* All went ok, so register to the input system */ 80. /注册设备 81. input_register_device(dev); 82. 83. return 0; 84. 我们再来看看模块初始化函数中初始化触摸屏的 IO 引脚的 s3c2410_ts_connect();函数html view plaincopy1. static inline void s3c2410_ts_connect(void) 2. 3.

11、s3c2410_gpio_cfgpin(S3C2410_GPG12, S3C2410_GPG12_XMON); 4. s3c2410_gpio_cfgpin(S3C2410_GPG13, S3C2410_GPG13_nXPON); 5. s3c2410_gpio_cfgpin(S3C2410_GPG14, S3C2410_GPG14_YMON); 6. s3c2410_gpio_cfgpin(S3C2410_GPG15, S3C2410_GPG15_nYPON); 7. 触摸屏控制器接口是与 IO 端口复用的。2.触摸屏中断服务函数html view plaincopy1. static ir

12、qreturn_t stylus_updown(int irq, void *dev_id) 2. 3. unsigned long data0; 4. unsigned long data1; 5. int updown; 6. 7. if (down_trylock(&ADC_LOCK) = 0) 8. OwnADC = 1; 9. 10. /读取 ADCDAT0 和 ADCDAT1 寄存器,判断是按下中断还是弹起中断 11. /ADCDAT0 和 ADCDAT1 查手册可知其第 15 位当按下时为 0,弹起为 1 12. data0 = ioread32(base_addr+S3C241

13、0_ADCDAT0); 13. data1 = ioread32(base_addr+S3C2410_ADCDAT1); 14. 15. updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN) & (!(data1 & S3C2410_ADCDAT0_UPDOWN); 16. 17. if (updown) 18. touch_timer_fire(0);/当判断为按下时 19. else 20. OwnADC = 0; 21. up(&ADC_LOCK); 22. 23. 24. 25. return IRQ_HANDLED; 26. 我们再来看 touch_timer_fire(0);这个函数html view plaincopy1. static void touch_timer_fire(unsigned long data) 2. 3. unsigned long data0; 4. unsigned long data1; 5. int updown; 6. 7. /读取 ADCDAT0 和 ADCDAT1 判断为弹起还是按下 8. data0 = ioread32(base_addr+S3C2410_ADCDAT0); 9. data1 = iore

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号