Qemu Freescale i.MX6 DualLite SABER: корневая файловая система не монтируется
Цель: эмулировать "sabrelite: Freescale i.MX6 Quad SABER Lite Board (Cortex A9)", который Qemu специально поддерживает (выполняя команду "qemu-system-arm -M?", Которую он показывает).
Версия Qemu: 2.10.1 (ведущий: fedora-27).
Я успешно кросс-скомпилировал и собрал ядро Linux 4.1.46 (использовало файл конфигурации imx_v6_v7_defconfig), а также простую "скелетную" корневую файловую систему (на основе busybox). (К вашему сведению, у меня есть аналогичная рабочая установка для платформы ARM Cortex-A9 Versatile Express - я делаю это, используя свою собственную встроенную Linux-систему, называемую SEALS).
Глядя на файл конфигурации U-Boot, используемый аналогичными платами, я решил использовать root=/dev/mmcblk0p0 в качестве параметра root = для ядра. Итак, чтобы попробовать это, я затем запускаю 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...
Здесь ждет вечно...
Я понимаю, что на реальной физической плате нужно было бы "отформатировать" или разделить карту MMC (или SD), и иметь u-boot для загрузки ядра и rootfs в RAM. Но в настоящее время я заинтересован в том, чтобы IMX6 работал на Qemu... Итак, мой актуальный вопрос: как я могу установить и использовать корневую файловую систему на Qemu? Любая помощь приветствуется! ТИА,
1 ответ
Здесь есть две проблемы. Во-первых, ваша командная строка на самом деле не создает SD-карту: опция -drive создает приводной объект, но нигде не пытается подключить его (потому что на плате сабрелита не определен "блочный тип по умолчанию"), Чтобы действительно подключить диск к эмулируемой SD-карте, вам нужно
-drive file=yourfile.img,format=raw,id=mycard -device sd-card,drive=mycard
Во-вторых, в текущей эмуляции контроллера imx6 sd QEMU есть ошибки, потому что если вы это сделаете, то гостевое ядро будет постоянно печатать
[ 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. (По сути, SD-контроллер imx6 не является полностью совместимым со стандартом контроллером sdhci, но то, что мы создавали в модели QEMU, было простым вариантом.)
Если вы сделаете все это, вы можете загрузить ядро, которое может видеть карту MMC:
[ 8.878283] mmc1: new SD card at address 4567
[ 8.910566] mmcblk0: mmc1:4567 QEMU! 256 MiB
Если немного повезет, мы сможем исправить это в выпуске QEMU 2.12, который выйдет через некоторое время весной 2018 года.
Редактировать по состоянию на 9 марта 2018 года - соответствующие исправления теперь находятся в мастере QEMU (фиксирует fd1e5c81796, df2a5cf4c8) и будет в 2.12.