触摸中断分析:
WINCE500/PLATFORM/smdk2440/KERNEL/HAL/ARM armint.c
按下触摸,首先产生IntPendVal == INTSRC_ADC AD硬中断中断,下面程序判断是按下还是提起操作,修改odo_tsb->status = TOUCH_PEN_UP变量的值。并向上层返回SYSINTR_TOUCH_CHANGED软中断值。
定时器1会一直监控按下的状态,IntPendVal == INTSRC_TIMER1如果一直按下会一直产生SYSINTR_TOUCH软中断值返回给上层。
按键会出现四种CASE
CASE1:长按放下,定时器会首先检测到按键放下率先向上层返回SYSINTR_TOUCH_CHANGED中断值,并改变odo_tsb->status = TOUCH_PEN_UP的值,然后是ADC检测到按键返回SYSINTR_TOUCH_CHANGED中断值,同时也改变odo_tsb->status = TOUCH_PEN_UP的值。
CASE2:短按放下,由于定时器在定时的时间内没有检测到,所以只会产生ADC中断,改变odo_tsb->status = TOUCH_PEN_UP的值。并向上层返回SYSINTR_TOUCH_CHANGED软中断值。
CASE3:调试的时候发现,在短按放下的时候也会只产生定时中断,原因不详。
CASE4:另外会极少发生一种情况是:在短按放下会产生ADC产生TOUCH_PEN_DOWN,但后面定时器和ADC都没有检测到TOUCH_PEN_UP,导致BELL一直叫。
加上触摸BELL声音驱动:
只需在WINCE500/PLATFORM/smdk2440/KERNEL/HAL/ARM armint.c 三个地方加上BELL的开关操作就可以了。
在ADC中断else if (IntPendVal == INTSRC_ADC)这个分支中
if( (s2440ADC->rADCDAT0 & 0x8000) || (s2440ADC->rADCDAT1 & 0x8000) )
{
s2440INT->rINTMSK |= BIT_TIMER1; // Mask timer1 interrupt.
s2440INT->rSRCPND = BIT_TIMER1; // Clear pending bit
if (s2440INT->rINTPND & BIT_TIMER1) s2440INT->rINTPND = BIT_TIMER1;
//RETAILMSG(0,(TEXT("INT Touch pen up /r/n")));
odo_tsb->status = TOUCH_PEN_UP;
加上关闭BELL操作
}
else
{
//RETAILMSG(0,(TEXT("INT Touch pen down /r/n")));
odo_tsb->status = TOUCH_PEN_DOWN;
加上打开BELL操作
}
在定时器1中断else if (IntPendVal == INTSRC_TIMER1) // INTSRC_TIMER1这个分支中
if( (s2440ADC->rADCDAT0 & 0x8000) || (s2440ADC->rADCDAT1 & 0x8000) )
{
//RETAILMSG(0,(TEXT("INT Touch SYSINTR_TOUCH_CHANGED 1/r/n")));
odo_tsb->status = TOUCH_PEN_UP;
加上关闭BELL操作
return SYSINTR_TOUCH_CHANGED;
}