S3C2440驱动篇之触摸屏驱动分析

发布者:superstar11最新更新时间:2024-06-14 来源: elecfans关键字:S3C2440  触摸屏驱动  linux 手机看文章 扫描二维码
随时随地手机看文章

一.硬件简介

S3C2440触摸屏接口与ADC接口集成在一起,触摸屏X、Y坐标所产生的模拟信号通过通道7、5输入,2440提供触摸屏接口有4种处理模式:普通转换模式、分离的X/Y轴坐标转换模式、自动X/Y轴坐标转换模式、等待中断模式。具体参考2440硬件手册16章。


二.驱动实现

下面是触摸屏驱动源码,其中使用了linux输入子系统input。暂时还没研究这一块,想深入了解可参考相关资料。

  1. #include    

  2. #include    

  3. #include    

  4. #include    

  5. #include    

  6. #include    

  7. #include    

  8. #include    

  9. #include    

  10. #include    

  11. #include    

  12. #include    

  13. #include    

  14. #include    

  15. #include    

  16.   

  17. #define S3C2410TSVERSION 0x0101   

  18. #define DEVICE_NAME 'YC2440_TS'   

  19.   

  20. //定义一个WAIT4INT宏,该宏将对ADC触摸屏控制寄存器进行操作S3C2410_ADCTSC_YM_SEN这些宏都定义在regs-adc.h中   

  21. #define WAIT4INT(x) (((x)>>8)|S3C2410_ADCTSC_YM_SEN|S3C2410_ADCTSC_YP_SEN|S3C2410_ADCTSC_XP_SEN|S3C2410_ADCTSC_XY_PST(3))   

  22. #define AUTOPST (S3C2410_ADCTSC_YM_SEN|S3C2410_ADCTSC_YP_SEN|S3C2410_ADCTSC_XP_SEN|   

  23.         S3C2410_ADCTSC_AUTO_PST|S3C2410_ADCTSC_XY_PST(0))  

  24.   

  25. static struct input_dev *dev;  //输入设备结构体   

  26. static long xp;    //记录转换后的X、Y坐标值   

  27. static long yp;  

  28. static int count;  

  29.   

  30. extern struct semaphore ADC_LOCK;  //在ADC驱动中定义的信号量   

  31. static int ownADC = 0;  

  32.   

  33. static struct clk *adc_clk;  

  34.   

  35. static void __iomem *base_addr;  

  36. //touch_timer_fire函数分三块执行,下面1、2、3分别实现不同功能   

  37. static void touch_timer_fire(unsigned long data)  

  38. {        

  39.     unsigned long data0;  

  40.     unsigned long data1;  

  41.     int updown;  

  42.   

  43.     data0 = ioread32(base_addr+S3C2410_ADCDAT0);  

  44.     data1 = ioread32(base_addr+S3C2410_ADCDAT1);  

  45.        //判断触摸屏是按下、抬起状态   

  46.     updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN));  

  47.          

  48.     if(updown)                    

  49.     {  

  50.         if(count != 0)     //1.如果触摸屏按下,并且ADC已转换,则报告事件、数据   

  51.         {  

  52.             long tmp;  

  53.               

  54.             tmp = xp;  

  55.             xp = yp;  

  56.             yp = tmp;  

  57.   

  58.             xp >>= 2;  

  59.             yp >>= 2;  

  60.   

  61. #ifdef CONFIG_TOUCHSCREEN_DEBUG    

  62.             struct timeval tv;  

  63.             do_gettimeofday(&tv);  

  64.             printk(KERN_DEBUG 'T:%06d, X:%03d, Y:%03dn',(int)tv.tv_usec,xp,yp);  

  65. #endif   

  66.   

  67.             input_report_abs(dev,ABS_X,xp);  

  68.             input_report_abs(dev,ABS_Y,yp);  

  69.   

  70.             input_report_key(dev,BTN_TOUCH,1);  

  71.             input_report_abs(dev,ABS_PRESSURE,1);  

  72.             input_sync(dev);    //等待接收方受到数据后回复确认,用于同步   

  73.         }  

  74.         //2.如果触摸屏按下,并且没有ADC转换,则启动ADC转换   

  75.         xp = 0;  

  76.         yp = 0;  

  77.         count = 0;  

  78.   

  79.         iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE|AUTOPST,base_addr+S3C2410_ADCTSC);  

  80.         iowrite32(ioread32(base_addr+S3C2410_ADCCON)|S3C2410_ADCCON_ENABLE_START,base_addr+S3C2410_ADCCON);  

  81.     }  

  82.     else    //3.如果触摸屏抬起状态,则报告事件、数据,重置等待按下状态   

  83.     {  

  84.         count = 0;  

  85.   

  86.         input_report_key(dev,BTN_TOUCH,0);  

  87.         input_report_abs(dev,ABS_PRESSURE,0);  

  88.         input_sync(dev);  

  89.   

  90.         iowrite32(WAIT4INT(0),base_addr+S3C2410_ADCTSC);    //将触摸屏重新设置为等待中断状态   

  91.   

  92.         if(ownADC)        //如果触摸屏抬起,www.linuxidc.com就意味着这一次的操作结束,所以就释放ADC资源的占有   

  93.         {  

  94.             printk(KERN_INFO 'upn');  

  95.             ownADC = 0;  

  96.             up(&ADC_LOCK);  

  97.         }  

  98.     }  

  99. }  

  100. //定义并初始化了一个定时器touch_timer,定时器服务程序为touch_timer_fire   

  101. static struct timer_list touch_timer=TIMER_INITIALIZER(touch_timer_fire,0,0);  

  102.   

  103. static irqreturn_t stylus_updown(int irq,void *dev_id)  //触摸屏中断服务程序,触摸屏按下、抬起执行   

  104. {  

  105.     unsigned long data0;  

  106.     unsigned long data1;  

  107.     int updown;  

  108.   

  109.     if(down_trylock(&ADC_LOCK)==0)  

  110.     {  

  111.         ownADC = 1;  

  112.         data0 = ioread32(base_addr+S3C2410_ADCDAT0);  

  113.         data1 = ioread32(base_addr+S3C2410_ADCDAT1);  

  114.   

  115.         updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN));  

  116.   

  117.         if(updown)  

  118.         {      //如果触摸屏按下,则执行touch_timer_fire的功能2   

  119.             printk(KERN_INFO 'downn');  

  120.             touch_timer_fire(0);      

  121.         }  

  122.         else  

  123.         {      //如果抬起,结束一次操作,释放相应资源   

  124.             printk(KERN_INFO 'up-irqn');  

  125.             ownADC = 0;  

  126.             up(&ADC_LOCK);  

  127.         }  

  128.     }  

  129.     return IRQ_HANDLED;  

  130. }  

  131.   

  132. static irqreturn_t stylus_action(int irq,void *dev_id)    //ADC中断服务程序   

  133. {  

  134.     unsigned long data0;  

  135.     unsigned long data1;  

  136.       

[1] [2]
关键字:S3C2440  触摸屏驱动  linux 引用地址:S3C2440驱动篇之触摸屏驱动分析

上一篇:S3C2440驱动篇之ADC驱动分析
下一篇:S3C2440裸机实验

推荐阅读最新更新时间:2024-11-03 20:57

恩智浦推出新一代安全高能效i.MX 91系列,为广泛的边缘应用扩展Linux功能
i.MX 9 系列的新成员简化了高性价比边缘设备的开发过程,助力构建需要安全性、高性能表现以及Linux支持的可扩展、高可靠性的平台 中国上海——2023年6月1日—— 恩智浦半导体(NXP Semiconductors N.V.,)正式发布i.MX 91应用处理器系列。 凭借恩智浦二十多年来在开发多市场应用处理器方面的领先优势,i.MX 91系列提供了安全、多功能、高能效的优化组合,可满足下一代基于Linux®的物联网和工业应用的需求。 产品重要性 新发布的协议改变了物联网和工业市场新产品类别的方向,如面向未来智能家居的可互操作安全连接标准Matter,或面向电动汽车充电器的ISO 15118-20标准。此类新产品通
[嵌入式]
回顾Linux、Git 之父Linus Torvalds的传奇技术人生
提起 Linus Torvalds 大家的第一反应是怎样的?是严苛刻薄,还是神级伟大,亦或是孤傲清高?二十五年来,Linus Torvalds 一直坚持在技术第一线,开发了 Linux 和 Git 两个项目,并深刻影响了软件行业。如果没有 Linux,就不会有基于 Linux 的安卓系统,那世界是怎样的?如果没有 Git 的诞生,就不会基于 Git 的 GitHub,那么开源的兴旺之势将会迟来多久?下面就随手机便携小编一起来了解一下相关内容吧。 回顾Linux、Git 之父Linus Torvalds的传奇技术人生 有人问 Linus,你是如何成长为今天的你自己的?Linus Torvalds 说,我本人并不适合回答这个
[手机便携]
在基于ADSP BF533的嵌入式Linux系统上的移植
1 引言 Boot Loader(内核引导程序)是在操作系统内核运行之前运行的一段自举程序,用于初始化硬件设备、改变处理器运行模式、重组中断向量和建立内存空间映射图,从而将系统的软硬件带到一个合适的状态或者用户定制的特定状态,以便为最终加载操作系统内核准备好正确的环境 。 嵌入式Linux系统常用的Boot Loader有arm-boot、redboot、U-Boot等。U-Boot (全称Universal Boot Loader)是当前比较流行的遵循GPL条件的开放源码项目。U-Boot具有源码公开的特点,开发人员可根据自身需要进行裁减;支持多种处理器和嵌入式操作系统内核;具有多种设备驱动源码:支持种引导方式;具有功能
[单片机]
在基于ADSP BF533的嵌入式<font color='red'>Linux</font>系统上的移植
ARM9(S3C2440) LED控制
下面为TQ2440开发板的硬件LED接口: LED控制思想 1、将相应的引脚设置为输出 2、再将相应的引脚设置为低电平 代码实现 src: inc: 2440init.s为开发板开启首先运行的代码。目的:初始化C语言环境。 ; NAME: 2440INIT.S ; DESC: C start up codes ; Configure memory, ISR ,stacks ; Initialize C-variables 。。。。。。 。。。。。。 IMPORT MMU_SetAsyncBusMode IMPORT MMU_SetF
[单片机]
ARM9(<font color='red'>S3C2440</font>) LED控制
I2C总线学习—查缺补漏—S3C2440的I2C控制器
学习了IIC总线协议的理论部分,觉得应该学习具体操作2440的IIC控制器,毕竟最终都是为了学习S3C2440,所以就把这一部分补上。 S3C2440的I2C接口有四种工作模式:主机发送器、主机接收器、从机发送器、从机接收机。其内部结构如下图所示。 从上图可以看出,S3C2440提供4个寄存器来完成所有的IIC操作。SDA线上的数据从IICDS寄存器经过移位寄存器发出,或通过移位寄存器传入IICDS寄存器;IICADD寄存器中保存S3C2440当做从机时的地址;IICCON、IICSTAT两个寄存器用来控制或标识各种状态,比如选择工作工作模式,发出S信号、P信号,决定是否发出ACK信号,检测是否
[单片机]
I2C总线学习—查缺补漏—<font color='red'>S3C2440</font>的I2C控制器
s3c2440裸板_中断体系结构
S3C2440一共有60个中断源,其中有15个子中断源,它们与SUBSRCPND寄存器中的每一位相对应,其他45个中断源与SRCPND中的每一位相对应。要注意的是EINT4~7对应的是同一位SRCPND ,而EINT8~23对应的也是SRCPND 一位 1 S3C2440的中断寄存器 中断分两大类:外部中断和内部中断。 1.1 外部中断寄存器 24个外部中断占用GPF0-GPF7(EINT0-EINT7),GPG0-GPG15(EINT8-EINT23)。用这些脚做中断输入,则必须配置引脚为中断,并且不要上拉。具体可参考datesheet数据手册。 寄存器: EXTINT0-EXT
[单片机]
<font color='red'>s3c2440</font>裸板_中断体系结构
基于S3C2440Linux内核移植和yaffs2文件系统制作--根文件系统
第二章 制作根文件系统 2.1 根文件系统预备知识 嵌入式Linux中都需要构建根文件系统,构建根文件系统的规则在FHS(Filesystem Hierarchy Standard)文档中,下面是根文件系统顶层目录。 目录 内容 bin 存放所有用户都可以使用的、基本的命令。 sbin 存放的是基本的系统命令,它们用于启动系统、修复系统等。 usr 里面存放的是共享、只读的程序和数据。 proc 这是个空目录,常作为proc文件系统的挂载点。 dev 该目录存放设备文件和其它特殊文件。 etc 存放系统配置文件,包括启动文件。 lib 存放共享库和可加载块(即驱动程序),共享库用于启动系统、运行根文件系统中的可执行程序。 boo
[单片机]
基于ARM9的嵌入式LINUX地震数据采集系统设计
  0 引言   随着数字技术的飞速发展,数字化仪器已成为观测技术领域的主流仪器,因而数据采集技术也成为观测技术领域中一个十分重要的技术环节。众所周知,地震预报是一个的世界性难题,作为地震预报的基础,地震及地震前兆观测数据的地位可想而知,获得真实、可靠的观测数据取决于地震观测仪(包括传感器和采集器两部分)。伴随着计算机的迅速发展,以嵌入式为平台的数据采集系统就应运而生了,它具有可靠性高,体积小,易扩展、功能强,开发周期短、成本低。本论文是基于东方地球物理公司地震采集系统设计项目,采用ARM9的嵌入式系统,因此对其研究具有非常重要的现实意义。   1 总体设计方案   作为一个通用的工业数据采集系统的硬件平台,其基本目的是获取
[单片机]
基于ARM9的嵌入式<font color='red'>LINUX</font>地震数据采集系统设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved