请教WINCE50 & 2416 的中断处理

czlzphs   2009-9-27 11:26 楼主
看了2416的BSP(wince50)下对中断的处理,我蒙了!!!

首先这个BSP中有两个intr.c   
   1、SMDK2416\Src\Kernel\Oal\intr.c
   2、SMDK2416\Src\Common\Intr\intr.c
看这两个intr.c发现能用的应该是在commo\intr\intr.c中,因为这个里面做了一些出里!

我现在需要的是做com16550的驱动,其中用到外部中断,接到了Eint3

wince4下如果加一个外部中断 ,除了在驱动中添加一个IST外
还需要在kernel中的INTR.C中的OEMinterruptEnable 、OEMinterruptDisabel 、OEMinterruptDone中对应添加相应的
寄存器配置

我想wince50也需要这种配置,

可是我看了一下BSP中对powerbutton的中断处理,想仿照这个对中断进行设置,
其中这个驱动的中断用到了EINT0

但是我在intr.c中并没有看到对eint0的处理

在intr.c中只有对:
   OALIntrEnableIrqs函数:
             else if (irq <= IRQ_EINT7)
            {
            // Use external mask register
            CLRREG32(&g_pIntrRegs->INTMSK1, 1 << IRQ_EINT4_7);
            CLRREG32(&g_pPortRegs->EINTMASK, 1 << (irq - IRQ_EINT4 + 4));
             }
   OALIntrDisableIrqs函数:
              无外部中断处理

   OALIntrDoneIrqs函数:
              无外部中断处理

   OEMInterruptHandler函数:
              if (irq == IRQ_EINT4_7 || irq == IRQ_EINT8_23) // 4 or 5
                   {

               // Find external interrupt number
                mask = INREG32(&g_pPortRegs->EINTPEND);
                mask &= ~ INREG32(&g_pPortRegs->EINTMASK);
                mask = (mask ^ (mask - 1)) >> 5;
                irq2 = IRQ_EINT4;
                while (mask != 0)
                {
                    mask >>= 1;
                    irq2++;
                }

                // Mask and clear interrupt
                mask = 1 << (irq2 - IRQ_EINT4 + 4);
                SETREG32(&g_pPortRegs->EINTMASK, mask);
                OUTREG32(&g_pPortRegs->EINTPEND, mask);

                // Clear primary interrupt
                mask = 1 << irq;
                OUTREG32(&g_pIntrRegs->SRCPND1, mask);
                OUTREG32(&g_pIntrRegs->INTPND1, mask);

                // From now we care about this irq
                irq = irq2;
            }

    也就是说在powerbutton驱动中用到了EINT0但是在intr.c中对ISR的处理并没有EINT0,
   (而这个POWERBUTTON驱动是BSP自带的,应该是可以用的)
    那么对外部中断0-----3的ISR处理是在哪里呢????

谢谢各位

回复评论 (4)

帮顶~
点赞  2009-9-27 11:54
if (irq <= IRQ_ADC) { // Use interrupt mask register if ((INREG32(&g_pIntrRegs->INTPND1) & (1<INTPND1, 1<INTMSK1, 1 << irq); }
EINT0~EINT3对应的irq都小于IRQ_ADC,所以在这个地方处理。
点赞  2009-9-27 12:33
我们的2416BSP中使用外部中断都是根据例子直接用的,没有查看那三个函数的内容,用起来没问题。
点赞  2009-9-27 12:36
引用: 引用 3 楼 veabol 的回复:
我们的2416BSP中使用外部中断都是根据例子直接用的,没有查看那三个函数的内容,用起来没问题。

引用: 引用 2 楼 hao507 的回复:
if (irq <= IRQ_ADC) { // Use interrupt mask register if ((INREG32(&g_pIntrRegs->INTPND1) & (1 < INTPND1, 1 < INTMSK1, 1 < < irq); }
EINT0~EINT3对应的irq都小于IRQ_ADC,所以在这个地方处理。


BSP ISR已经处理好,楼主只管驱动的IST即可。
点赞  2009-9-27 12:42
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复