为QEMU模拟的MIPS Malta启用键盘中断问题求助
MIPS Malta QEMU 键盘中断不工作的排查与解决
我之前在MIPS Malta平台上调试内核中断时也碰到过几乎一模一样的键盘中断问题,给你梳理几个关键排查点和解决思路:
1. 先确认中断位的对应关系是否正确
你提到设置了CP0 STATUS寄存器的第11、12位,但这里很可能搞错了中断映射!MIPS Malta的USB键盘中断并不是直接关联这两个位的:
- Malta的USB OHCI控制器中断会先路由到GT64120外部中断控制器的中断1,再由GT64120转发到CPU的INT1(对应CP0 STATUS寄存器的第9位,也就是
IM[1]位)。 - 你需要先查Malta的硬件手册,确认目标中断对应的CPU IM位,再调整STATUS寄存器的掩码位,而不是盲目设置11、12位。
示例正确设置CP0 STATUS的汇编代码:
# 读取STATUS寄存器 mfc0 t0, $12 # 启用INT1(第9位)+ 全局中断(第0位) ori t0, t0, 0x101 # 写回寄存器 mtc0 t0, $12
2. 必须初始化外部中断控制器(GT64120)
只配置CP0的STATUS是不够的,因为键盘中断要先经过GT64120的中断控制器,你需要打开对应的中断掩码:
- GT64120的中断掩码寄存器地址是
0x1BE00000(物理地址),USB OHCI对应的是第1位(假设你的硬件映射如此,需对照手册确认)。
示例C代码片段:
volatile uint32_t *gt64120_int_mask = (volatile uint32_t *)0x1BE00000; // 打开USB OHCI对应的中断掩码位 *gt64120_int_mask |= (1 << 1);
3. 确保USB主机控制器已正确初始化
QEMU的-usb-kbd依赖于内核对USB主机控制器(OHCI/EHCI)的支持:
- 你需要在内核中完成USB控制器的初始化:设置控制器寄存器、枚举USB设备、识别键盘设备,并启用键盘的中断端点。
- 如果USB控制器没初始化,即使硬件连接了,按键事件也不会触发任何中断。
4. 用QEMU调试工具定位问题
QEMU自带的调试功能能帮你快速定位中断是否产生:
- 启动QEMU时添加
-d int参数,QEMU会打印所有中断触发的细节。如果按键时看不到中断日志,说明硬件层面(USB/中断路由)没配置好;如果有日志但内核没响应,就是中断服务程序的问题。 - 进入QEMU monitor(按
Ctrl+Alt+2),用info gt64120查看外部中断控制器的状态,确认对应中断是否处于pending或被屏蔽状态。
5. 检查中断服务程序的正确性
最后确认你的中断服务程序(ISR)是否正确:
- 确保CP0的
VectAddr寄存器已设置正确的中断向量基地址,或者ISR已放置在固定的中断向量地址。 - ISR必须正确保存/恢复所有寄存器,最后用
eret指令返回,否则会导致后续中断无法正常触发。
内容的提问来源于stack exchange,提问作者ulfsigvardsson
相关产品推荐
相关产品推荐

