在下对6410中断不了解,下面是我尝试写的6410中断程序(当然它是不能工作的),我不知道错在哪?希望看出问题的大侠帮我指出。
程序简析:
1 配置GPN0~5 GPL11~12作外部中断脚,mini6410板的8个按键。
2 配置外部中断寄存器
EINT0CON0 0x222 下降沿 EINT0~5
EINT0CON1 0x22 << 4 下降沿 EINT19 20
EINT0FLTCON0 设置滤波
EINT0MASK 打开屏蔽
3 配置中断寄存器
rVIC0INTSELECT
rVIC0VECTADDR
rVIC0INTENABLE
4 打开CPSR IRQ
5 死循环,等待按键中断
硬件说明:按键一端接6410(有上拉电阻),另一端接地。
环境说明:uboot相当于裸机,uboot里汇编中转到do_irq(),但运行没有进这个函数。我采用的是读VICxADDRESS的寄存器方式,在do_irq()里读。
/********************************************************************/
void key_int_init(void)
{
unsigned long temp;
//configuration //GPN0~5 GPL11~12
//configed as Ext. Interrupt, and disable pull-up/down
writel(readl(rGPNCON) & (~0xFFF) | 0xAAA, rGPNCON);
writel(readl(rGPNPUD) & (~0xFFF) | 0x0, rGPNPUD);
writel(readl(rGPLCON1) & (~(0xFF << 12)) | (0x33 << 12), rGPLCON1);
writel(readl(rGPLPUD ) & (~(0xFF << 22)) | (0x00 << 12), rGPLPUD);
//config extern interrupt registers
writel(readl(rEINT0CON0) & (~0xFFF) | 0x222, rEINT0CON0);
writel(readl(rEINT0CON1) & (~(0xFF << 4)) | (0x22 << 4), rEINT0CON1);
writel(readl(rEINT0FLTCON0) & (~0xFFFFFF) | 0x808080, rEINT0FLTCON0); //EINT0~5
writel(readl(rEINT0FLTCON2) & (~(0xFFFF << 8)) | (0x8080 << 8), rEINT0FLTCON2); //EINT19 20
writel(~0x1F003F, rEINT0MASK);
//config interrupt registers
writel(readl(rVIC0INTSELECT) & (~0x3), rVIC0INTSELECT); //irq 0,1
writel(readl(rVIC1INTSELECT) & (~0x3), rVIC1INTSELECT); //irq 32,33
writel((unsigned int *)key_isr, rVIC0VECTADDR(0));
writel((unsigned int *)key_isr, rVIC0VECTADDR(1));
writel((unsigned int *)key_isr, rVIC1VECTADDR(0));
writel((unsigned int *)key_isr, rVIC1VECTADDR(1));
writel(0x3, rVIC0INTENABLE); //enable 0,1
writel(0x3, rVIC1INTENABLE); //ebable 32,33
__asm__ __volatile__("mrs %0, cpsr\n" "bic %0, %0, #0x80\n" "msr cpsr_c, %0":"=r"(temp)
::"memory"); //enable interrupts
//估计: %0 代表 r0
}
while(1);
/**************************************************/