我正在尝试使用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()¬调用。
虽然看起来[
mtree
,表明I / O设备已正确映射到地址范围0x18020000-0x1802003F,并且当固件写入Tx缓冲区时,gdb显示该字符已成功写入内存。串行设备没有采取任何进一步的操作来拉出该字符并显示它,因此固件不断地在LSR上轮询以等待更新。关于QEMU中的串行/硬件交互,我缺少什么吗?我本以为重新映射mipssim板的所有现有功能组件就足以至少使串行通信正常工作,尤其是因为目标使用与mipssim相同的16550 UART。如果您有任何见解,请告诉我。如果可以找到一种使用符号调试QEMU本身的方法,这将很有帮助,但是与此同时,我不确定自己要寻找的内容。甚至有关如何缩小问题范围的建议也会很有用。谢谢!
serial_ioport_read()
和serial_ioport_write()
函数中。当对串行设备(在MemoryRegion
或serial_init()
中初始化)的数据读取或写入serial_mm_init()
时,这两种方法被分配为QEMU调用的回调。这些函数对地址进行一些屏蔽(作为addr
传递给函数),以确定正在引用哪个寄存器,然后从与该寄存器相对应的SerialState
结构返回值。它非常简单,但是我想一旦您弄清楚了,一切似乎就变得简单了。最大的转折点是人们意识到QEMU有效地将串行设备实现为具有特殊功能的MemoryRegion
,该功能在存储操作中触发。 无论如何,希望这能在将来帮助某人避免我经历的噩梦。干杯!