You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:02:50