QEMU MIPS32-自定义板上的16550 Uart实现

问题描述 投票:2回答:1

我正在尝试使用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板时,我仅对代码做了些微改动,如下所示:

  • Rebased bios内存区域为0x1F000000

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

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

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

虽然看起来[可能是当前接受的标准,但我对重新映射它没有任何运气。我注意到马耳他板在我给它的MIPS测试内核上输出没有问题,因此我试图模仿在那里所做的事情。但是,我仍然无法理解QEMU的工作原理,也无法找到许多好的资源来解释它。我一直在搜寻源代码和包含的文档,但与此同时,我希望有人可以对我做错的事情有所了解。

该二进制文件从地址0xBF000000正确加载并执行,但是在遇到第一个UART轮询循环时挂起。在QEMU监视器中查看

mtree

,表明I / O设备已正确映射到地址范围0x18020000-0x1802003F,并且当固件写入Tx缓冲区时,gdb显示该字符已成功写入内存。串行设备没有采取任何进一步的操作来拉出该字符并显示它,因此固件不断地在LSR上轮询以等待更新。关于QEMU中的串行/硬件交互,我缺少什么吗?我本以为重新映射mipssim板的所有现有功能组件就足以至少使串行通信正常工作,尤其是因为目标使用与mipssim相同的16550 UART。如果您有任何见解,请告诉我。如果可以找到一种使用符号调试QEMU本身的方法,这将很有帮助,但是与此同时,我不确定自己要寻找的内容。甚至有关如何缩小问题范围的建议也会很有用。

谢谢!

mips emulation qemu uart qualcomm
1个回答
0
投票
经过大量的努力,我使UART正常工作。问题的答案位于serial_ioport_read()serial_ioport_write()函数中。当对串行设备(在MemoryRegionserial_init()中初始化)的数据读取或写入serial_mm_init()时,这两种方法被分配为QEMU调用的回调。这些函数对地址进行一些屏蔽(作为addr传递给函数),以确定正在引用哪个寄存器,然后从与该寄存器相对应的SerialState结构返回值。它非常简单,但是我想一旦您弄清楚了,一切似乎就变得简单了。最大的转折点是人们意识到QEMU有效地将串行设备实现为具有特殊功能的MemoryRegion,该功能在存储操作中触发。

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

© www.soinside.com 2019 - 2024. All rights reserved.