看了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处理是在哪里呢????
谢谢各位
if (irq <= IRQ_ADC) { // Use interrupt mask register if ((INREG32(&g_pIntrRegs->INTPND1) & (1<INTPND1, 1<INTMSK1, 1 << irq); }
EINT0~EINT3对应的irq都小于IRQ_ADC,所以在这个地方处理。
我们的2416BSP中使用外部中断都是根据例子直接用的,没有查看那三个函数的内容,用起来没问题。
引用: 引用 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即可。