TI中文支持网
TI专业的中文技术问题搜集分享网站

AM335X 触摸屏ADCSTAT寄存器的PEN_IRQ位是做什么的?

hi:

     之前帖子上有描述问题,AM335X的触摸屏有几率出现driver中无法接收到PEN_UP中断,发帖子询问,没有找到原因,我在probe函数中,把IRQENABLE_SET寄存器的PEN_UP_EVENT[9]是能后,每次点触屏幕,现在触摸驱动的irq函数每次都能收到抬起中断,但是还存在一个问题,在代码中,向上层报告抬起状态,是有个判断函数的,如下,逻辑中,只有ADCSTAT寄存器的值为0x10的时候,才会上报触摸抬起事件,现在有些情况下,当抬起中断触发后,ADCSTATE寄存器的值是0x50,也就是说PEN_IRQ0[6]值为1,这个位是用来做什么的?在TRM文档中我没找到相关的描述?为什么我的触摸屏驱动无法上报抬起中断?

if (status & IRQENB_PENUP) {
fsm = titsc_readl(ts_dev, REG_ADCFSM);
printk("[huzz]%s:fsm=0x%x\n",__func__,fsm);
if (fsm == ADCFSM_STEPID) {
ts_dev->pen_down = false;
input_report_key(input_dev, BTN_TOUCH, 0);
input_report_abs(input_dev, ABS_PRESSURE, 0);
input_sync(input_dev);
pm_relax(ts_dev->mfd_tscadc->dev);
} else {
ts_dev->pen_down = true;
}
irqclr |= IRQENB_PENUP;
}

zizhen hu:

自顶。

现在的问题好像是pen_up_event被置位的同时,pen_down同样被置位导致,请问改如何协调?

我描述下使用SDK-PROCESSOR03.02自带的触摸驱动碰到的问题:

      使用自带触摸驱动,调试的时候,发现按下QT程序的按钮,发现有时候按钮无法抬起,添加调试信息后发现原因是触摸驱动的中断函数,在触摸抬起的时候没有被调用,后来我在probe中配置了IRQENABLE_SET寄存器中配置了pen_up_event使能,继续调试,发现抬起的时候,每次都能触发中断函数了,但是有时候不会report抬起事件,继续调试,发现函数中,判断是否是抬起中断有个ADCSTATE寄存器,只有这个寄存器值为0x10的时候,才回向上层报告抬起事件,通过打印信息发现,有时候触发抬起中断的时候,ADCSTATE的值为0x50,所以依旧无法向上层报告抬起事件,但是当这次中断函数调用完成后,又不会重新调用中断函数,结果还是导致了抬起事件无法触发,请问大家该如何解决。

Steven Liu1:

回复 zizhen hu:

在AM335X TRM的12.5.1 TSC_ADC_SS Registers章节Table 12-7. IRQSTATUS_RAW Register Field Descriptions不是由对PEN_IRQ位的描述么。

对于下面帖子中提出的问题我没太明白,首先你用了PDK 03.02.00.05这个版本的ADC/TSC driver做触屏,现在是接的4wire的TSC吗?我们原生态的driver之前验证过没什么问题,现在提到的无法检测到PEN_UP中断的问题,是在怎样的场景下发生的?

从学习TSC这个里面的功能来说,可以参考以下的overview对架构有部分讲解,另外一方面,需仔细研读TRM的TSC章节。

http://processors.wiki.ti.com/index.php/Sitara_ADC/Touchscreen_Overview

zizhen hu:

回复 Steven Liu1:

谢谢回复。

用的是4线的电阻触摸屏,场景就是连续点击屏幕,有几率出现PEN_UP中断无法触发的情况,这个时候不再点击触摸屏,直接读取IRQSTATUS_RAW寄存器,可以发现第九位的pen_up_event的值是被置1了。而正常情况下点击完成,pen_up_event是被清空了的。

Jian Zhou:

回复 zizhen hu:

正常应该进到高优先级中断响应进程,然后清中断进中断task。

zizhen hu:

回复 Jian Zhou:

但是有个地方我不理解,之前有个帖子说因为用了IRQSTATUS_RAW,所以不需要PEN_UP中断,这个是怎么个说法?

因为代码的probe函数里面,确实是没有使能PEN_UP中断的,probe的代码如下

titsc_writel(ts_dev, REG_IRQSTATUS, IRQENB_MASK); titsc_writel(ts_dev, REG_IRQENABLE, IRQENB_FIFO0THRES); titsc_writel(ts_dev, REG_IRQENABLE, IRQENB_EOS);

那么当触摸抬起后,但是又没有收到FIFO相关的中断的时候,通过什么办法处理PEN_UP?

xixiguo:

回复 zizhen hu:

Hi zizhen,

我遇到了类似的问题,就是按下按键并抬起后,中断上报的最后一个事件是pen down,但是之前会有pen up事件。这个问题你最后是怎么解决的呢?

xixiguo:

回复 Steven Liu1:

Hi Steven,

我遇到了类似的问题,就是点击按键并松开,有一定概率出现中断最后一个事件是作为pen down。也就是最后一个中断处理的时候,IRQSTATUS_RAW Register的bit9 pen up event没有被置位。这样上层处理起来就像是丢失了pen up事件一样,请问为什么松开按键后,还有一定的额几率最后一个事件为pen down呢?

赞(0)
未经允许不得转载:TI中文支持网 » AM335X 触摸屏ADCSTAT寄存器的PEN_IRQ位是做什么的?
分享到: 更多 (0)