【问题标题】:QEMU MIPS32 - 16550 Uart Implementation on a Custom BoardQEMU MIPS32 - 定制板上的 16550 Uart 实现
【发布时间】:2020-02-18 23:26:36
【问题描述】:

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

详情:

目标设备:Qualcomm QCA9533(如果你好奇,Documentation here

目标固件:带有 U-Boot 引导加载的 VxWorks 6.6

CPU:MIPS 24Kc

板:mipssim(修改)

内存: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(TLB 重映射为 0x1F000000)

  • mipssim serial_init() ¬调用替换为 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 本身的方法会很有帮助,但同时我也不完全确定我在寻找什么。甚至关于如何缩小问题范围的建议也会很有用。

谢谢!

【问题讨论】:

  • 进一步更新:我更仔细地查看了文档,看来我可能需要实现 APB,因为 QCA9533 没有直接连接到 GPIO 引脚的 UART。我在 SPARC 代码中找到了 APB UART 的实现,但我仍在努力将其移植到 MIPS 上。不确定这是否是正确的答案,但这是迄今为止我得到的唯一线索。

标签: mips emulation qemu uart qualcomm


【解决方案1】:

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

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

【讨论】:

  • 干得好!继续努力:)
猜你喜欢
  • 2021-05-18
  • 2011-07-17
  • 2020-06-18
  • 2017-09-04
  • 2022-12-13
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 2017-05-10
相关资源
最近更新 更多