Linux下的触摸屏驱动

发表于:2013-1-10 09:43

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:weiqing1981127    来源:51Testing软件测试网采编

分享:

  下面是这个模块加载函数中调用的一个配置端口函数

static inline void s3c2410_ts_connect(void)
{
//将触摸屏用到的四个端口配置成触摸屏模式
       s3c2410_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 =
TIMER_INITIALIZER(touch_timer_fire, 0, 0);

  因为这个定时器的期限时间设置为0,这表示当驱动加载后就会执行一次定时函数touch_timer_fire

static 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坐标
      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);
                    input_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), base_addr+S3C2410_ADCTSC); //等待按键中断
              if (OwnADC) { //OwnADC是获取一把锁标示,在此为0
                     OwnADC = 0;
                     up(&ADC_LOCK);
              }
      }
}

52/5<12345>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号