Linux下的触摸屏驱动.doc

上传人:新** 文档编号:560920151 上传时间:2022-10-18 格式:DOC 页数:18 大小:72.50KB
返回 下载 相关 举报
Linux下的触摸屏驱动.doc_第1页
第1页 / 共18页
Linux下的触摸屏驱动.doc_第2页
第2页 / 共18页
Linux下的触摸屏驱动.doc_第3页
第3页 / 共18页
Linux下的触摸屏驱动.doc_第4页
第4页 / 共18页
Linux下的触摸屏驱动.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

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

1、Linux下的触摸屏驱动一触摸屏理论概述对于触摸屏驱动,我们主要需要掌握触摸屏驱动代码和应用层测试代码。下面讲的是基于Mini2440的触摸屏驱动,现在的驱动我们都将设备和驱动分离,挂在平台设备总线上,让设备和驱动去匹配。而我们在linu2.6.32.2内核版本中的触摸屏驱动仍然没有将设备和驱动分离,这样就不存在匹配问题,这种现象其实我们并不陌生,在我们学习驱动的前期,都会研究简单字符驱动代表LED驱动,那个驱动就是把设备和驱动写在了一起。总结下,驱动和设备可以分离也可以不分离,建议分离,而本触摸屏驱动没有分离设备和驱动,有兴趣可以将设备和驱动进行分离。先说明下触摸屏的工作原理,当有人在触摸屏

2、上按下触笔时,触摸屏的四个引脚会产生不同的电压值,这样触摸屏控制器就能检测到这种变化,从而产生INT_TC中断,表示触笔按下。然后在得到CPU指示的情况下,触摸屏控制器可以根据四个引脚上产生的不同电压值进行AD转换,从而计算出X和Y坐标的数值,并在将这两个值保持到其内部寄存器后,发出INT_ADC中断,表示坐标转换已完成,从而软件就可以读取按下触笔的位置。二触摸屏驱动分析本驱动分析很有特点,我对触摸屏驱动的分析是按照整个触摸事件的执行顺序进行代码分析的,有的函数由于每次被执行完成的任务不同,所以需要多次分析。同时,我把整个触摸事件的来龙去脉也都说的很清楚了。驱动分析/driver/input/

3、touchscreen/s3c2410_ts.cstatic int _init s3c2410ts_init(void) struct input_dev *input_dev; adc_clock = clk_get(NULL, adc); /获取时钟 if (!adc_clock) printk(KERN_ERR failed to get adc clock sourcen); return -ENOENT; clk_enable(adc_clock); /使能时钟 base_addr=ioremap(S3C2410_PA_ADC,0x20); /物理地址转为虚拟地址 if (base

4、_addr = NULL) printk(KERN_ERR Failed to remap register blockn); return -ENOMEM; s3c2410_ts_connect(); /触摸屏端口配置 /使能预分频,分频系数为0xff iowrite32(S3C2410_ADCCON_PRSCEN| S3C2410_ADCCON_PRSCVL(0xFF),base_addr+S3C2410_ADCCON); iowrite32(0xffff, base_addr+S3C2410_ADCDLY); /延时 /检查光标按下中断信号,等待中断 iowrite32(WAIT4INT

5、(0), base_addr+S3C2410_ADCTSC); input_dev = input_allocate_device(); /分配input设备 if (!input_dev) printk(KERN_ERR Unable to allocate the input device !n); return -ENOMEM; dev = input_dev; /支持按键事件、坐标事件 dev-evbit0 = BIT(EV_SYN) | BIT(EV_KEY) | BIT(EV_ABS); dev-keybitBITS_TO_LONGS(BTN_TOUCH) = BIT(BTN_TO

6、UCH); /对于X轴范围是0-ox3ff,数据误差是0,中心平滑位置是0 input_set_abs_params(dev, ABS_X, 0, 0x3FF, 0, 0); input_set_abs_params(dev, ABS_Y, 0, 0x3FF, 0, 0); input_set_abs_params(dev, ABS_PRESSURE, 0, 1, 0, 0); dev-name = s3c2410ts_name; dev-id.bustype = BUS_RS232; dev-id.vendor = 0xDEAD; dev-id.product = 0xBEEF; dev-i

7、d.version = S3C2410TSVERSION; /申请AD转换中断if(request_irq(IRQ_ADC,stylus_action,IRQF_SHARED|IRQF_SAMPLE_RANDOM,s3c2410_action, dev) printk(KERN_ERR s3c2410_ts.c: Could not allocate ts IRQ_ADC !n); iounmap(base_addr); return -EIO; /申请触摸中断 if (request_irq(IRQ_TC, stylus_updown, IRQF_SAMPLE_RANDOM, s3c2410

8、_action, dev) printk(KERN_ERR s3c2410_ts.c: Could not allocate ts IRQ_TC !n); iounmap(base_addr); return -EIO; printk(KERN_INFO %s successfully loadedn, s3c2410ts_name); input_register_device(dev); return 0;下面是这个模块加载函数中调用的一个配置端口函数static inline void s3c2410_ts_connect(void)/将触摸屏用到的四个端口配置成触摸屏模式 s3c241

9、0_gpio_cfgpin(S3C2410_GPG(12), S3C2410_GPG12_XMON); s3c2410_gpio_cfgpin(S3C2410_GPG(13), S3C2410_GPG13_nXPON); s3c2410_gpio_cfgpin(S3C2410_GPG(14), S3C2410_GPG14_YMON); s3c2410_gpio_cfgpin(S3C2410_GPG(15), S3C2410_GPG15_nYPON);我们来分析两种情况,第一种情况,如果没有按下触摸屏驱动中定义了一个定时器static struct timer_list touch_timer

10、= TIMER_INITIALIZER(touch_timer_fire, 0, 0);因为这个定时器的期限时间设置为0,这表示当驱动加载后就会执行一次定时函数touch_timer_firestatic void touch_timer_fire(unsigned long data) unsigned long data0; unsigned long data1; int updown; data0 = ioread32(base_addr+S3C2410_ADCDAT0); /读取X坐标 data1 = ioread32(base_addr+S3C2410_ADCDAT1); /读取Y

11、坐标 updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN) & (!(data1 & S3C2410_ADCDAT0_UPDOWN); /触摸屏是否被按下,如果按下updowm=1 if (updown) if (count != 0) long tmp; tmp = xp; xp = yp; yp = tmp; xp = 2; yp = 2; input_report_abs(dev, ABS_X, xp); input_report_abs(dev, ABS_Y, yp); input_report_key(dev, BTN_TOUCH, 1); inpu

12、t_report_abs(dev, ABS_PRESSURE, 1); input_sync(dev); xp = 0; yp = 0; count = 0; iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC); iowrite32(ioread32(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START, base_addr+S3C2410_ADCCON); else /没有被按下 count = 0; /初始化count为0,表示当前AD转换没发生 input_report_key(dev, BTN_TOUCH, 0); /向input子系统报告未按下 input_report_abs(dev, ABS_PRESSURE, 0); input_sync(dev); iowrite32(WAIT4INT(0),

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

最新文档


当前位置:首页 > 生活休闲 > 社会民生

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