请教WINCE50 & 2416 的中断处理

wangxin_801115 2009-09-27 11:26:08
看了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处理是在哪里呢????

谢谢各位
...全文
116 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
gooogleman 2009-09-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 veabol 的回复:]
我们的2416BSP中使用外部中断都是根据例子直接用的,没有查看那三个函数的内容,用起来没问题。
[/Quote]

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

BSP ISR已经处理好,楼主只管驱动的IST即可。
博说医械研发 2009-09-27
  • 打赏
  • 举报
回复
我们的2416BSP中使用外部中断都是根据例子直接用的,没有查看那三个函数的内容,用起来没问题。
九个太阳2023 2009-09-27
  • 打赏
  • 举报
回复
if (irq <= IRQ_ADC) { // Use interrupt mask register if ((INREG32(&g_pIntrRegs->INTPND1) & (1<<irq)) != 0) { OUTREG32(&g_pIntrRegs->INTPND1, 1<<irq); } CLRREG32(&g_pIntrRegs->INTMSK1, 1 << irq); }
EINT0~EINT3对应的irq都小于IRQ_ADC,所以在这个地方处理。
九个太阳2023 2009-09-27
  • 打赏
  • 举报
回复
帮顶~

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧