QEMU MIPS32 - 16550 UART 在定制板上的实现



我正在尝试使用 QEMU 来模拟固件,但我无法让 UART 设备正确更新线路状态寄存器并显示输入字符。

详:

目标设备:高通QCA9533(如果您好奇,请在此处查看文档)

目标固件:VxWorks 6.6,带U-Boot引导负载

中央处理器: MIPS 24Kc

板:米普西姆(修改)

内存: 512MB

使用的命令:qemu-system-mips -S -s -cpu 24Kc -M mipssim –nographic -device loader,addr=0xBF000000,cpu-num=0 -serial /dev/ttyS0 -bios target_image.bin

我必须在这里道歉,但我无法分享我的消息来源。但是,当我尝试重新装备 mipssim 板时,我只对代码进行了微小的更改,如下所示:

  • BIOS内存区域重新定位为0x1F000000

  • load_image_targphys()目标地址更改为0x1F000000

  • $pc初始值更改为0xBF000000(0x1F000000的 TLB 重映射)

  • mipssim serial_init()¬call 替换为serial_mm_init(isa, 0x20000, env->irq[0], 115200, serial_hd(0), DEVICE_NATIVE_ENDIAN)。

虽然看起来serial_init()可能是当前公认的标准,但我在重新映射它方面没有任何运气。我注意到马耳他板在我给它的 MIPS 测试内核上输出没有问题,所以我试图模仿那里所做的。但是,我仍然无法理解QEMU的工作原理,也无法找到许多好的资源来解释它。我对源代码和包含的文档的艰苦工作正在进行中,但与此同时,我希望有人可能对我做错了什么有所了解。

二进制文件从地址0xBF000000正确加载和执行,但在命中第一个 UART 轮询循环时挂起。查看 QEMU 监视器中的mtree显示 I/O 设备已正确映射到地址范围 0x18020000-0x1802003F,当固件写入 Tx 缓冲区时,gdb 显示字符已成功写入内存。只是串行设备没有进一步的操作来拉取该字符并显示它,因此固件在 LSR 上无休止地轮询等待更新。

在QEMU中的串行/硬件交互方面,我缺少什么吗?我本以为重新映射mipssim板的所有现有功能组件至少足以使串行通信正常工作,特别是因为目标使用与mipssim相同的16550 UART。如果您有任何见解,请告诉我。如果我能找到一种方法来调试带有符号的 QEMU 本身,那将很有帮助,但同时我不完全确定我要寻找什么。即使就如何缩小问题范围提出建议也是有用的。

谢谢!

经过大量的努力,我让UART工作了。问题的答案在于serial_ioport_read()serial_ioport_write()功能。这两个方法被分配为 QEMU 在将数据读取或写入串行设备(以serial_init()serial_mm_init()初始化)的MemoryRegion时调用的回调。这些函数对地址(作为addr传递到函数中)进行一些屏蔽,以确定正在引用哪个寄存器,然后从与该寄存器对应的SerialState结构中返回值。这出奇地简单,但我想一旦你弄清楚了,一切似乎都很简单。最大的转折点是意识到QEMU有效地将串行设备实现为具有特殊功能的MemoryRegion,该在内存操作上触发。

无论如何,希望这可以帮助将来有人避免我经历的噩梦。干杯!

相关内容

  • 没有找到相关文章

最新更新