




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/*触摸屏驱动程序及分析*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include /* For ts.dev.id.version */#define S3C2410TSVERSION0x0101#define WAIT4INT(x) (x)= 2; yp = 2; /* 报告x、y的绝对坐标值 */ input_report_abs(dev, ABS_X, xp); input_report_abs(dev, ABS_Y, yp); /* 报告按键事件,键值为1(代表触摸屏对应的按键被按下) */ input_report_key(dev, BTN_TOUCH, 1); /* 报告触摸屏的状态,1表明触摸屏被按下 */ input_report_abs(dev, ABS_PRESSURE, 1);/* 同步 */ input_sync(dev); xp = 0; yp = 0; count = 0; /*自动X/Y轴坐标转换模式的设置,自动地进行X轴和Y轴的转换操作,随后产生相应的INT_ADC中断通知转换完毕*/ iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC); /*如果还没有启动ADC或者ADC转换四次完毕后则启动ADC*/ iowrite32(ioread32(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START, base_addr+S3C2410_ADCCON); else count = 0; /* 如果触摸笔是弹起状态,则提出报告,并让触摸屏处于等待触摸的阶段 */ /* 报告按键事件,键值为0(代表触摸屏对应的按键被释放) */ input_report_key(dev, BTN_TOUCH, 0); /* 报告触摸屏的状态,0表明触摸屏未被按下 */ input_report_abs(dev, ABS_PRESSURE, 0); /*同步 */ input_sync(dev); /* 设置触摸屏为等待中断模式,等待触摸笔按下 */ iowrite32(WAIT4INT(0), base_addr+S3C2410_ADCTSC);if (OwnADC) OwnADC = 0;up(&ADC_LOCK); static struct timer_list touch_timer =TIMER_INITIALIZER(touch_timer_fire, 0, 0); /*当触摸按下时,产生INT_TC中断,会进入到stylus_updown中断处理函数当有中断产生时,会使OwnADC=1,然后读取数据,并判断是抬起还是按下,按下则调用touch_timer_fire()函数,抬起则释放锁,并使OwnADC=0 */static irqreturn_t stylus_updown(int irq, void *dev_id)unsigned long data0;unsigned long data1;int updown;/*注意在触摸屏驱动模块中,这个ADC_LOCK的作用是保证任何时候都只有一个驱动程序使用ADC的中断线,因为在mini2440的adc模块中也会使用到ADC,这样只有拥有了这个锁,才能进入到启动ADC代码部分,注意尽管LDD3中说过信号量因为休眠不适合使用在ISR中,但down_trylock是一个例外,它不会休眠*/if (down_trylock(&ADC_LOCK) = 0) OwnADC = 1;/获取ADC转换的数据data0 = ioread32(base_addr+S3C2410_ADCDAT0);data1 = ioread32(base_addr+S3C2410_ADCDAT1);updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN) & (!(data1 & S3C2410_ADCDAT0_UPDOWN); /*判断目前触摸笔的状态 updown = 1 触摸笔按下; updown = 0 触摸笔弹起; */if (updown) /当触摸笔按下时touch_timer_fire(0); /*这是一个定时器函数,当然在这里只是作为普通函数调用,用来启动ADC*/ else /当笔弹起时,释放锁OwnADC = 0;up(&ADC_LOCK);return IRQ_HANDLED;/*INT_ADC 中断处理函数读取四次AD转换的值,然后求和,超过四次后执行touch_time_fire()函数*/static irqreturn_t stylus_action(int irq, void *dev_id)unsigned long data0;unsigned long data1;if (OwnADC) data0 = ioread32(base_addr+S3C2410_ADCDAT0);data1 = ioread32(base_addr+S3C2410_ADCDAT1);xp += data0 & S3C2410_ADCDAT0_XPDATA_MASK;yp += data1 & S3C2410_ADCDAT1_YPDATA_MASK;count+; if (count (1evbit0 = BIT(EV_SYN) | BIT(EV_KEY) | BIT(EV_ABS);/* 设置所支持的按键(键值),触摸屏可以看成只有一个按键的设备 */dev-keybitBITS_TO_LONGS(BTN_TOUCH) = BIT(BTN_TOUCH);/* 设置绝对坐标x的最小最大值(0-0x3FF) */input_set_abs_params(dev, ABS_X, 0, 0x3FF, 0, 0);/* 设置绝对坐标y的最小最大值(0-0x3FF) */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;duct = 0xBEEF;dev-id.version = S3C2410TSVERSION; /*INT_TC, INT_ADC中断注册,问题:两种中断的产生时机?哪种中断会先产生?答案:INT_TC会先产生,并不断的产生*/* Get irqs */中断处理函数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_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);/* All went ok, so register to the input system */*注册输入设备*/input_register_device(dev);return 0;/*主要完成:1、中断的释放2、注销input设备3、释放虚拟内存*/static void _exit s3c2410ts_exit(void)disable_irq(IRQ_ADC);disable_irq(IRQ_TC);free_irq(IRQ_TC,dev);free_irq(IRQ_ADC,dev);if (adc_c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论