Samsung的cpu,nand启动.想在eboot中使用中断,进而使用usb下载功能.怎么办?
1.Eboot是工作在mmu开启的虚拟地址模式下.
2.arm在发生中断时候会跳动地址0x18.但eboot不在0地址运行.地址0是4k的nboot程序.
方法.eboot直接修改地址0x18的中断跳转指令,将它指向新的地址,指向自己的中断服务程序.
#define pISR (*(unsigned *)(0x00000000+0x18))
pISR =(unsigned)(0xEA000000)+(((unsigned)IsrHandler-(0x8c000000+0x18+0x8) )>>2);
上面第二条是构造一个跳转指令,相当于b IsrHandler这样的指令. 0xEA000000是b,后面的是计算相对偏移地址.具体是0x8c000000还是0x80000000要看你的MMU的映射表来决定.另外因为arm流水线特殊性,中断调用和普通调用不同,主要是返回地址的区别,所以IsrHandler需要处理中断返回地址和寄存器保护等工作,然后跳动用户isr.
LEAF_ENTRY IsrHandler
sub lr, lr, #4
stmfd sp!, {r0-r12,lr}
mov r0, lr
bl IsrUsbd
ldmfd sp!, {r0-r12,lr}
movs pc, lr
ENDP
如上面,在中断发生时候就会自动跳转到IsrUsbd这个中断服务函数里面了.这个函数是普通的函数.最后需要注意的是,初始化时候,你要允许中断发生,中断使能.特别是相关的io配置.