gpt4 book ai didi

mips - QEMU MIPS32 - 定制板上的 16550 Uart 实现

转载 作者:行者123 更新时间:2023-12-03 17:02:08 25 4
gpt4 key购买 nike

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

细节:

目标设备:Qualcomm QCA9533(Documentation here 如果你好奇的话)

目标固件:VxWorks 6.6 with U-Boot bootload

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(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 显示字符已成功写入内存。串行设备没有进一步的 Action 来拉取该字符并显示它,因此固件无休止地轮询 LSR 以等待更新。

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

    谢谢!

    最佳答案

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

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

    关于mips - QEMU MIPS32 - 定制板上的 16550 Uart 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58510586/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com