使用 QEMU aarch64 为树莓派 4 模拟 UART

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

我按照 https://github.com/s-matyukevich/raspberry-pi-os/blob/master/docs/lesson01/rpi-os.md 为树莓派运行我的第一个 aarch64 内核。我构建了它并将

kernel8.img
放入从 https://downloads.raspberrypi.com/raspios_full_arm64/images/raspios_full_arm64-2024-07-04/获取的图像中。

为了运行 QEMU,我使用了以下命令:

emu-system-aarch64 \
        -machine raspi4b \
        -cpu cortex-a72 \
        -smp 4 -m 2G \
        -dtb bcm2711-rpi-4-b.dtb \
        -drive format=raw,file=2024-07-04-raspios-bookworm-arm64-full.img

在QEMU中我只看到黑屏,我用谷歌搜索并发现Qemu裸机仿真 - 如何查看UART输出?,实际上

-semihosting --semihosting-config enable=on,target=native
-serial mon:stdio
都不适合我,屏幕仍然是黑色的。

我也尝试过命令:

qemu-system-aarch64 -M raspi4b \
    -display none \
    -serial null \
    -serial stdio \
    -kernel kernel8.img

来自如何在 Qemu (raspi3b) 中的 miniUART 中打印某些内容?,这也不起作用。我认为代码是有效的,因为我没有更改它,实际上是从 github 克隆的。

gdb
中,我可以看到 QEMU 执行指令,但是当我将
-kernel
选项与原始二进制文件一起使用时,QEMU 甚至没有开始执行
kernel_main
它在两者之间的某个地方丢失了自己。虽然当我使用 ELF 二进制文件时,它开始执行
kernel_main
但在
uart_send
中使用第一个字符 (
H
) 循环,并且控制台中没有任何反应,当我使用
-sd
选项启动它时也会发生同样的情况。

UPD1:

我发现,如果我使用

-sd
选项启动它(内核被复制到映像中),它会在 UART 初始化
put32(AUX_MU_IER_REG,0);
上循环,其中
AUX_MU_IER_REG = PBASE+0x00215044
PBASE = 0x3F000000
,我不知道为什么会发生这种情况。

UPD2:

嗯,我发现辅助寄存器和 GPIO 寄存器的寄存器基址和偏移量对于

raspi4b
raspi3b
是不同的,因此上面链接的代码预计不会在
raspi4b
上运行。 如果我使用
raspi3b
,此代码仍然会输出相同的内容,所以我仍然不知道为什么这不起作用。
我错过了输出,上面链接的代码实际上适用于
raspi3b
,所以剩下的问题是采用代码
raspi4b
.

附注:

QEMU版本:

$ qemu-system-aarch64 --version
QEMU emulator version 9.0.2
Copyright (c) 2003-2024 Fabrice Bellard and the QEMU Project developers

上面的命令有什么问题?如何检查 QEMU 是否模拟 UART 以及如何检查其输出?

P.S2.:我不想要

-machine virt
,因为它是通用的,我想完全模仿
-machine raspi4b

qemu arm64 uart raspberry-pi4
1个回答
0
投票

尝试添加

-append "earlycon=pl011,mmio32,0xfe201000 console=ttyAMA0,115200"

qemu-system-aarch64 --version
QEMU emulator version 9.0.50 (v9.0.0-265-gfd87be1dad)
Copyright (c) 2003-2024 Fabrice Bellard and the QEMU Project developers

qemu-system-aarch64 -M raspi4b -serial mon:stdio -nographic -kernel kernel8.img -dtb bcm2711-rpi-4-b.dtb -append "earlycon=pl011,mmio32,0xfe201000 console=ttyAMA0,115200"

[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd083]
[    0.000000] Linux version 6.6.44-v8+ (dom@buildbot) (aarch64-linux-gnu-gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #1790 SMP PREEMPT Mon Aug  5 16:07:01 BST 2024
[    0.000000] KASLR disabled due to lack of seed
[    0.000000] Machine model: Raspberry Pi 4 Model B
[    0.000000] earlycon: pl11 at MMIO32 0x00000000fe201000 (options '')
[    0.000000] printk: bootconsole [pl11] enabled
[    0.000000] efi: UEFI not found.
[    0.000000] Reserved memory: created CMA memory pool at 0x000000002c000000, size 64 MiB
[    0.000000] OF: reserved mem: initialized node linux,cma, compatible id shared-dma-pool
[    0.000000] OF: reserved mem: 0x000000002c000000..0x000000002fffffff (65536 KiB) map reusable linux,cma
[    0.000000] Zone ranges:
[    0.000000]   DMA      [mem 0x0000000000000000-0x000000003bffffff]
[    0.000000]   DMA32    empty
[    0.000000]   Normal   empty
...
[    3.679878] Memory Limit: none
[    3.680988] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) ]---
© www.soinside.com 2019 - 2024. All rights reserved.