WINCE触摸声音驱动修改

触摸中断分析:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值