S3C2440 Linux 触摸屏驱动

发布时间:2024-06-14  

主机:VM - RedHat 9.0

开发板:FL2440,linux-2.6.12

arm-linux-gcc:3.4.1

代码中的第90行,若不支持拖拽,则可以获取到笔触坐标,但是LCD上的图标没有响应,不知什么原因。

  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.   

  16. #include    

  17. #include    

  18. #include    

  19. #include    

  20.   

  21. // YM_SEN输出驱动器使能,XP_SEN,YP_SEN输出驱动器禁止   

  22. // S3C2410_ADCTSC_XY_PST(3) -- 手动测量X、Y方向,等待中断模式   

  23. // x=0, 将ADCTSC[8]设置为0,即检测笔尖落下中断信号   

  24. #define WAIT4INT(x)  (((x)<<8) |    

  25.              S3C2410_ADCTSC_YM_SEN | S3C2410_ADCTSC_YP_SEN | S3C2410_ADCTSC_XP_SEN |   

  26.              S3C2410_ADCTSC_XY_PST(3))  

  27.                

  28. /* ADCTSC Register Bits */  

  29. #define S3C2410_ADCTSC_YM_SEN       (1<<7)   

  30. #define S3C2410_ADCTSC_YP_SEN       (1<<6)   

  31. #define S3C2410_ADCTSC_XM_SEN       (1<<5)   

  32. #define S3C2410_ADCTSC_XP_SEN       (1<<4)   

  33. #define S3C2410_ADCTSC_PULL_UP_DISABLE  (1<<3)   

  34. #define S3C2410_ADCTSC_AUTO_PST     (1<<2)   

  35. #define S3C2410_ADCTSC_XY_PST(x)    (((x)&0x3)<<0)   

  36.   

  37. /* ADCCON Register Bits */  

  38. #define S3C2410_ADCCON_ECFLG        (1<<15)   

  39. #define S3C2410_ADCCON_PRSCEN       (1<<14)   

  40. #define S3C2410_ADCCON_PRSCVL(x)    (((x)&0xFF)<<6)   

  41. #define S3C2410_ADCCON_PRSCVLMASK   (0xFF<<6)   

  42. #define S3C2410_ADCCON_SELMUX(x)    (((x)&0x7)<<3)   

  43. #define S3C2410_ADCCON_MUXMASK      (0x7<<3)   

  44. #define S3C2410_ADCCON_STDBM        (1<<2)   

  45. #define S3C2410_ADCCON_READ_START   (1<<1)   

  46. #define S3C2410_ADCCON_ENABLE_START (1<<0)   

  47. #define S3C2410_ADCCON_STARTMASK    (0x3<<0)   

  48.   

  49. #ifdef S3C2410_ADCCON   

  50. #undef S3C2410_ADCCON   

  51. #endif   

  52.   

  53. #ifdef S3C2410_ADCTSC   

  54. #undef S3C2410_ADCTSC   

  55. #endif   

  56.   

  57. #ifdef S3C2410_ADCDLY   

  58. #undef S3C2410_ADCDLY   

  59. #endif   

  60.   

  61. #ifdef S3C2410_ADCDAT0   

  62. #undef S3C2410_ADCDAT0   

  63. #endif   

  64.   

  65. #ifdef S3C2410_ADCDAT1   

  66. #undef S3C2410_ADCDAT1   

  67. #endif   

  68.   

  69. #ifdef S3C2410_PA_ADC   

  70. #undef S3C2410_PA_ADC   

  71. #endif   

  72.   

  73. #define S3C2410_PA_ADC     (0x58000000)    

  74.   

  75. static void __iomem *base_addr;  

  76. #define S3C2410_ADCCON (base_addr+(0x00))   

  77. #define S3C2410_ADCTSC (base_addr+(0x04))   

  78. #define S3C2410_ADCDLY (base_addr+(0x08))   

  79. #define S3C2410_ADCDAT0 (base_addr+(0x0c))   

  80. #define S3C2410_ADCDAT1 (base_addr+(0x10))   

  81.   

  82.   

  83. #ifdef CONFIG_PM   

  84. #include    

  85. #endif   

  86.   

  87. // 支持拖拽   

  88. // 若不支持拖拽,则可以获取到笔触坐标,但是LCD上的图标没有响应。   

  89. // 可以看到read接口被调用到,不知为何图标没有响应。   

  90. #define HOOK_FOR_DRAG   

  91.   

  92.   

  93. //#define   DEBUG   

  94. #ifdef DEBUG   

  95. #define DPRINTK printk   

  96. #else   

  97. #define DPRINTK   

  98. #endif   

  99.   

  100. typedef struct {  

  101.   unsigned short pressure;  

  102.   unsigned short x;  

  103.   unsigned short y;  

  104.   unsigned short pad;  

  105. } TS_RET;  

  106.   

  107. typedef struct {  

  108.   int xscale;  

  109.   int xtrans;  

  110.   int yscale;  

  111.   int ytrans;  

  112.   int xyswap;  

  113. } TS_CAL;  

  114.   

  115. #define PEN_UP          0          

  116. #define PEN_DOWN    1   

  117. #define PEN_FLEETING    2   

  118. #define MAX_TS_BUF  16  /* how many do we want to buffer */   

  119.   

  120. #undef USE_ASYNC       

  121. #define DEVICE_NAME "s3c2410-ts"   

  122. #define TSRAW_MINOR 1   

  123.   

  124. typedef struct {  

  125.     unsigned int penStatus;     /* PEN_UP, PEN_DOWN, PEN_SAMPLE */  

  126.     TS_RET buf[MAX_TS_BUF];     /* protect against overrun */  

  127.     unsigned int head, tail;    /* head and tail for queued events */  

  128.     wait_queue_head_t wq;  

  129.     spinlock_t lock;  

  130. #ifdef USE_ASYNC   

  131.     struct fasync_struct *aq;  

  132. #endif   

  133. #ifdef CONFIG_PM   

  134.     struct pm_dev *pm_dev;  

  135. #endif   

  136. } TS_DEV;  

  137.   

  138. static TS_DEV tsdev;  

  139.   

  140. #define BUF_HEAD    (tsdev.buf[tsdev.head])   

  141. #define BUF_TAIL    (tsdev.buf[tsdev.tail])   

  142. #define INCBUF(x,mod)   ((++(x)) & ((mod) - 1))   

  143.   

  144. static int tsMajor = 0;  

  145.   

  146. static void (*tsEvent)(void);  

  147.   

  148. #ifdef HOOK_FOR_DRAG   

  149. #define TS_TIMER_DELAY  (HZ/100) /* 10 ms */   

  150. static struct timer_list ts_timer;  

  151. #endif   

  152.   

  153. // pick-up regs val from 2.4.18&2440   

  154. // YM_SEN输出驱动器使能,XP上拉使能,正常ADC转换,检测笔尖落下中断信号,等待中断模式   

  155. #define wait_down_int() __raw_writel(0x000000d3,S3C2410_ADCTSC)   

  156.   

  157. // YM_SEN输出驱动器使能,XP上拉使能,正常ADC转换,检测笔尖抬起中断信号,等待中断模式   

  158. #define wait_up_int()   __raw_writel(0x000001d3, S3C2410_ADCTSC)   

  159.   

  160. // XM_SEN、XP_SEN输出驱动器使能,XP上拉禁止,正常ADC转换,X方向测量模式   

  161. #define mode_x_axis()   __raw_writel(0x00000069, S3C2410_ADCTSC)   

  162.   

  163. // 相当于__raw_writel(0x00000068, S3C2410_ADCTSC),即   

  164. // XM_SEN、YP_SEN使能,XP上拉禁止,正常ADC转换,无操作模式   

  165. #define mode_x_axis_n() __raw_writel(XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ |    

  166.                 XP_PULL_UP_DIS | XP_PST(NOP_MODE), S3C2410_ADCTSC)  

  167.                   

  168. // YM_SEN、YP_SEN使能,XP上拉禁止,正常ADC转换,Y方向测量模式   

  169. #define mode_y_axis()   __raw_writel(0x0000009a, S3C2410_ADCTSC)   

  170.   

  171. // __raw_writel(0x00007ffa, S3C2410_ADCCON); -- A/D转换器预分频器使能,预分频值0xff,模拟输入通道SEL_MUX为XP,正常工作模式,使能读启动操作   

  172. // __raw_readl(S3C2410_ADCDAT0); -- 读取ADCDAT)的值   

  173. #define start_adc_x()   do {__raw_writel(0x00007ffa, S3C2410_ADCCON);    

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>