上次的文章中提到有未解决的问题,就是当背光关闭后,点击触摸屏可以打开背光,可是程序也跟着运行了,就是运行的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;
////////////////////
}
}
}
好,本话题结束!!