Qemu Freescale i.MX6 DualLite SABRE:根文件系统未挂载

Qemu Freescale i.MX6 DualLite SABRE : root filesystem does not mount

目标:模拟 Qemu 特别支持的 "sabrelite : Freescale i.MX6 Quad SABRE Lite Board (Cortex A9)"(执行 'qemu-system-arm -M ?' 它会出现)。

Qemu ver: 2.10.1 (host: fedora-27).

我已经成功交叉编译并构建了一个 4.1.46 Linux 内核(使用 imx_v6_v7_defconfig 配置文件)以及一个简单的 "skeleton" 根文件系统(基于busybox)。 (仅供参考,我有一个类似的 ARM Cortex-A9 Versatile Express 平台的工作设置 - 我使用我自己的自制嵌入式 Linux 系统 SEALS)。

查看类似板子使用的 U-Boot 配置文件,我想使用 'root=/dev/mmcblk0p0' 作为内核的 root= 参数。 所以,为了尝试一下,我然后 运行 qemu 如下(请水平滚动查看):

qemu-system-arm -m 512 -M sabrelite -kernel zImage -drive file=rfs.img,format=raw -append "console=ttymxc0 rootfstype=ext4 root=/dev/mmcblk0p0 rw rootwait init=/sbin/init " -nographic -dtb imx6dl-sabresd.dtb

[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 4.1.46 (kai@klaptop) (gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29) ) #2 SMP Mon Nov 27 17:16:22 IST 2017
[    0.000000] CPU: ARMv7 Processor [410fc090] revision 0 (ARMv7), cr=10c5387d
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
[    0.000000] Machine model: Freescale i.MX6 DualLite SABRE Smart Device Board
[    0.000000] cma: Reserved 16 MiB at 0x2f000000

[...]

所以它开始正常启动。但是然后:

[...]
[    2.210965] /soc/aips-bus@02100000/usdhc@02194000: voltage-ranges unspecified
[    2.211796] sdhci-esdhc-imx 2194000.usdhc: Got CD GPIO
[    2.212199] sdhci-esdhc-imx 2194000.usdhc: Got WP GPIO
[    2.214392] sdhci-esdhc-imx 2194000.usdhc: could not get ultra high speed state, work on normal mode
[    2.218084] sdhci-esdhc-imx 2194000.usdhc: No vmmc regulator found
[    2.218367] sdhci-esdhc-imx 2194000.usdhc: No vqmmc regulator found
[    2.265431] mmc0: SDHCI controller on 2194000.usdhc [2194000.usdhc] using ADMA
[    2.267300] mmc0: mmc_rescan_try_freq: trying to init card at 400000 Hz
[    2.281912] /soc/aips-bus@02100000/usdhc@02198000: voltage-ranges unspecified
[    2.282956] sdhci-esdhc-imx 2198000.usdhc: Got CD GPIO
[    2.283703] sdhci-esdhc-imx 2198000.usdhc: Got WP GPIO
[    2.284044] sdhci-esdhc-imx 2198000.usdhc: could not get ultra high speed state, work on normal mode
[    2.284892] sdhci-esdhc-imx 2198000.usdhc: No vmmc regulator found
[    2.285167] sdhci-esdhc-imx 2198000.usdhc: No vqmmc regulator found
[    2.298029] mmc0: mmc_rescan_try_freq: trying to init card at 300000 Hz
[    2.337904] mmc1: SDHCI controller on 2198000.usdhc [2198000.usdhc] using ADMA
[    2.357051] /soc/aips-bus@02100000/usdhc@0219c000: voltage-ranges unspecified
[    2.358313] sdhci-esdhc-imx 219c000.usdhc: No vmmc regulator found
[    2.358642] sdhci-esdhc-imx 219c000.usdhc: No vqmmc regulator found
[    2.368204] mmc0: mmc_rescan_try_freq: trying to init card at 200000 Hz
[    2.414722] mmc2: SDHCI controller on 219c000.usdhc [219c000.usdhc] using ADMA
[    2.440456] mmc0: mmc_rescan_try_freq: trying to init card at 100000 Hz

[...]

[    2.986441]   No soundcards found.
[    3.007698] Waiting for root device /dev/mmcblk0p0...

永远在这里等待...

据我了解,在实际的物理板上,必须 "format" 或对 MMC(或 SD)卡进行分区,并让 u-boot 将内核和 rootfs 加载到 RAM 中。但我目前有兴趣让 IMX6 在 Qemu 上工作...... 所以,我的实际问题是:如何在 Qemu 上挂载和运行根文件系统? 任何帮助表示赞赏! TIA,

这里有两个问题。首先,您的命令行实际上并没有创建 SD 卡:-drive 选项创建了一个驱动器对象,但不会尝试将其插入任何地方(因为 sabrelite 板没有定义 "default kind of block drive")。要实际将驱动器插入模拟 SD 卡,您需要

-drive file=yourfile.img,format=raw,id=mycard -device sd-card,drive=mycard

其次,QEMU 当前的 imx6 sd 控制器仿真中存在错误,因为如果您这样做,那么来宾内核会不断打印

[   28.971663] mmc1: Timeout waiting for hardware interrupt.
[   28.973619] mmc1: error -110 whilst initialising SD card

...所以它找到了模拟卡,但没有收到预期的中断。

这些可以通过当前在 qemu-devel 邮件列表上的补丁修复并通过代码审查:http://patchwork.ozlabs.org/patch/834805/ 加上对 hw/arm/fsl-imx6.c 的简单更改以使其创建 TYPE_IMX_USDHC 设备而不是 TYPE_SYSBUS_SDHCI。 (基本上 imx6 的 SD 控制器不是完全标准兼容的 sdhci 控制器,但我们在 QEMU 模型中创建的是普通的品种。)

如果你做了所有这些,那么你就可以启动一个可以看到 mmc 卡的内核:

[    8.878283] mmc1: new SD card at address 4567
[    8.910566] mmcblk0: mmc1:4567 QEMU! 256 MiB 

运气好的话,我们将能够在 QEMU 的 2.12 版本中修复此问题,该版本将在 spring 2018 年的某个时间发布。

2018 年 3 月 9 日编辑——相关修复现在在 QEMU master 中(提交 fd1e5c81796、df2a5cf4c8)并将在 2.12 中。