疯狂单片机

一个普普通通的单片机、嵌入式学习个人博客站

触摸屏实现2440的LCD背光控制(续)

        上次的文章中提到有未解决的问题,就是当背光关闭后,点击触摸屏可以打开背光,可是程序也跟着运行了,就是运行的Qt程序默认发生了鼠标点击事件,如果正好点在按钮等地方,那就糗大了……想达到的效果应该像平时用的全触摸的手机一样一样的……轻轻一点,屏幕亮起,别的都不发生改变,不要任何冗余……终于,实现了……

         其实还是源码修改了……就是触摸屏的驱动……

       上次分析了源码,发现了理论与实际的区别……就是当AD转换4次结束后,就去等待触摸屏抬起的中断……static irqreturn_t stylus_action(int irq, void *dev_id)中,

else {
   mod_timer(&touch_timer, jiffies+1);
   iowrite32(WAIT4INT(1), base_addr+S3C2410_ADCTSC);
  }

        其实根本不是,不知道为什么2440还是没有发现触摸屏抬起的中断的……利用串口打印信息,发现程序运行是这样的:

        当触摸屏按下后,有了IRQ_TC 中断,调用static irqreturn_t stylus_updown(int irq, void *dev_id),进而调用static void touch_timer_fire(unsigned long data),开始AD转换,AD中断又调用了static irqreturn_t stylus_action(int irq, void *dev_id),然后AD转换后4次,有转而调用

static void touch_timer_fire(unsigned long data),如此这样,在触摸屏按下的期间,AD转换每满4次,就要调用一次static void touch_timer_fire(unsigned long data),直到触摸屏抬起……

         所以,知道了真正的运行过程,就有了应对方法,等待触摸屏抬起之后在进行背光控制,并在触摸屏休眠状态下,不上报触摸屏点击事件……好了,还是不废话,最后程序更改如下:

static inline void s3c2410_ts_connect(void)
{
 s3c2410_gpio_cfgpin(S3C2410_GPG12, S3C2410_GPG12_XMON);
 s3c2410_gpio_cfgpin(S3C2410_GPG13, S3C2410_GPG13_nXPON);
 s3c2410_gpio_cfgpin(S3C2410_GPG14, S3C2410_GPG14_YMON);
 s3c2410_gpio_cfgpin(S3C2410_GPG15, S3C2410_GPG15_nYPON);
 ////Add By Linan
 s3c2410_gpio_cfgpin(S3C2410_GPG4, S3C2410_GPG4_OUTP);
 /////////
}
///////Add By Linan
static void My_fun(unsigned long data)
{

flag_sleep=1;//CPU休眠标志位,初始化为0
 s3c2410_gpio_setpin(S3C2410_GPG4,0);
}
static struct timer_list lcd_timer=
   TIMER_INITIALIZER(My_fun,0,0);
////////////////////////////
static void touch_timer_fire(unsigned long data)
{
   unsigned long data0;
   unsigned long data1;
 int updown;

   data0 = ioread32(base_addr+S3C2410_ADCDAT0);
   data1 = ioread32(base_addr+S3C2410_ADCDAT1);

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

  if (updown) {
   if (count != 0) {

          if(flag_sleep!=1)//休眠期间,点击了触摸屏,只点亮屏幕,不上报事件

        {
            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;

   input_report_key(dev, BTN_TOUCH, 0);
   input_report_abs(dev, ABS_PRESSURE, 0);
   input_sync(dev);

   iowrite32(WAIT4INT(0), base_addr+S3C2410_ADCTSC);

  ///////Add By Linan
  s3c2410_gpio_setpin(S3C2410_GPG4,1);
  mod_timer(&lcd_timer,jiffies+10*200);

flag_sleep=0;
   ////////////////////

    }
  }
}

好,本话题结束!!

« 上一篇 | 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Arwen Build 90619 and Theme By BokeZhuti.cn

Copyright 2009-2010 www.mculover.com All Rights Reserved. 京ICP备09098861号
站长:莫旭冬 联系邮箱:moxudong@yeah.net