在uboot的运行状态下,如何响应外部硬件的中断?
如何在uboot的运行状态下(此时linux kernel还未运行),响应外部按键产生的gpio中断,使uboot重启或做其他工作?在linux kernel运行状态下我已实现此功能,只要调用request_irq()注册一个中断就行了。但在uboot里似乎没有这样的函数和机制,该怎样把gpio产生的中断和我自己定义的中断服务程序关联起来?我的uboot版本是1.1.4,系统是AR9130 SoC,MIPS 24K 32-bit cpu 400MHz。
联系信箱:wb51job@163.com。多谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
裸机下的编程,uboot只是一个bootloader,并非OS。
硬件的中断如果LZ了解的话,那么看datasheet应该足够搞定这个了。
datasheet我看过的,貌似没有讲这个问题——可能是我没看懂。兄台能否讲得再详细一点?
很简单,自己写。可以参考杜春雷《arm体系结构与编程》第九章第五节
直接写中断向量表就可以了
谢谢楼上几位朋友的回复。书和文章都看了不少,但还是没搞定。我也试图写中断向量表,但是改了之后没反应。技穷了。
我用的PPC的CPU,uboot提供这个功能的。
我看了一下mips的start.S
不是有注册中断服务程序的吗?
RVECENT(romReserved,4)
RVECENT(romReserved,5)
你说的对!我也是在这改的。因为我手头资料不全,不知道gpio21脚对应哪个中断号,我就把所有的都改了,可是都没反应。我又把所有的romReserved改成了reset,结果也没一点反应。郁闷。我看其他地方也没重新修改这个表的嘛,还有哪不对吗?
在uboot的start.s文件中,关于中断向量表的代码是这样的:
#define RVECENT(f,n) \
b f; nop
#define XVECENT(f,bev) \
b f ; \
li k0,bev
.set noreorder
.globl _start
.text
_start:
RVECENT(reset,0) /* U-boot entry point */
RVECENT(reset,1) /* software reboot */
RVECENT(romReserved,2)
RVECENT(romReserved,3)
....
RVECENT(romReserved,63)
XVECENT(romExcHandle,0x200) /* bfc00200: R4000 tlbmiss vector */
RVECENT(romReserved,65)
RVECENT(romReserved,66)
....
RVECENT(romReserved,79)
XVECENT(romExcHandle,0x280) /* bfc00280: R4000 xtlbmiss vector */
RVECENT(romReserved,81)
....
RVECENT(romReserved,95)
XVECENT(romExcHandle,0x300) /* bfc00300: R4000 cache vector */
RVECENT(romReserved,97)
....
RVECENT(romReserved,111)
XVECENT(romExcHandle,0x380) /* bfc00380: R4000 general vector */
RVECENT(romReserved,113)
....
RVECENT(romReserved,127)
/* We hope there are no more reserved vectors!
* 128 * 8 == 1024 == 0x400
* so this is address R_VEC+0x400 == 0xbfc00400
*/
reset:
/*
* Clearing CP0 registers - WAR for the Linux hang issue
*/
mtc0 zero, $0
....
/* Exception handlers.
*/
romReserved:
b romReserved
romExcHandle:
b romExcHandle
我对上面定义的128个中断没看懂是怎么调用的。我尝试过把所有的RVECENT(romReserved, X) 都改成RVECENT(reset, X),结果都没一点反应。
[ 本帖最后由 wbybyb 于 2008-1-29 14:27 编辑 ]
中断会由CPU自动调用
我觉得你应该确认一下是否已经产生了中断以及中断是否开放了
mips的CPU我不懂,看一下CPU手册中关于中断的描述应该会有帮助