目标:仿效" sabrelite:飞思卡尔i.MX6 Quad SABRE Lite主板(Cortex A9)" Qemu特别支持(做qemu-system-arm -M?'它出现了)。
Qemu ver:2.10.1(主持人:fedora-27)。
我已成功交叉编译并构建了一个4.1.46 Linux内核(使用了 imx_v6_v7_defconfig 配置文件)以及一个简单的"骨架"根文件系统(基于busybox)。 (仅供参考,我对ARM Cortex-A9 Versatile Express平台有类似的工作设置 - 我使用自己的家用旋转嵌入式Linux系统SEALS)来实现这一点。
查看类似主板使用的U-Boot配置文件,我想使用' root = / dev / mmcblk0p0' 作为内核的root = param。 所以,为了试一试,我按照以下方式运行qemu(pl水平滚动以查看):
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...
永远等待......
据我所知,在实际的实体板上,人们必须"格式化#34;或者对MMC(或SD)卡进行分区,并让u-boot将内核和rootfs加载到RAM中。但我目前有兴趣让IMX6在Qemu上工作...... 所以,我的实际问题是:如何在Qemu上安装和运行根文件系统? 任何帮助赞赏! TIA,
答案 0 :(得分:6)
这里有两个问题。首先,您的命令行实际上并没有创建SD卡:-drive选项会创建一个驱动对象,但不会尝试将其插入任何地方(因为sabrelite板没有定义“默认类型的块驱动器”) 。要将驱动器插入到模拟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版本中修复此问题,该版本将于2018年春季推出。
截至2018年3月9日编辑 - 相关修订现在位于QEMU master(提交fd1e5c81796,df2a5cf4c8),并且将在2.12中。