KERNEL II

ok, ci eravamo lasciati con degli errori. I primi sono semplici e indipendenti dal hardware che stiamo usando:

  • modprobe binfmt-464c cannot be processed
  • No working init found

binfmt indica Binary Format e 464c indica il formato ELF. Quindi il kernel non è configurato per eseguire file ELF e di conseguenza lo script init fallisce. Per configurare il kernel utilizziamo due task bitbake:

  • menuconfig per modificare i simboli Kconfig definiti
  • diffconfig per generare i fragment da applicare

Apriamo menuconfig:

terminal
bitbake linux-stm -c menuconfig

cercando BINFMT vediamo una lista di formati supportabili tra cui:

  • BINFMT_ELF
  • BINFMT_SCRIPT

salviamo la configurazione nel file .config e usciamo. Generiamo il fragment:

terminal
bitbake linux-stm -c diffconfig

nella WORKDIR del recipe vedremo comparire un file:

tmp/work/stm32mp257f_dk-oe-linux/linux-stm-tut/6.6.78+git/fragment.cfg
CONFIG_BINFMT_ELF=y
CONFIG_COMPAT_BINFMT_ELF=y
CONFIG_ELFCORE=y
CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
CONFIG_BINFMT_SCRIPT=y

copiamolo nel nostro recipe e diamogli un nome un pelo più descrittivo. Per utilizzare il fragment ci basta definirlo tramite SRC_URI, la classe kernel penserà al resto:

recipes-kernel/linux/linux-stm.bb
FILESEXTRAPATHS:prepend := "${THISDIR}/fragments:"
SRC_URI += "file://fragment_essential.cfg;subdir=git"

per essere riconosciuto come fragment, è necessario che il file abbia estensione .cfg Adesso buildiamo, flashiamo e vediamo se è cambiato qualcosa. Facciamo anche una piccola modifica ai nostri bootargs, specificando che il nostro init script è /bin/sh, così da evitare che il kernel provi a montare un rootfs da disco che non abbiamo ancora preparato.

uboot console
setenv bootargs "console=ttySTM0,115200 earlycon ignore_loglevel rdinit=/bin/sh"

e facendo il boot:

kernel log
...
[    0.232917] Serial: AMBA PL011 UART driver
...
[    1.302417] Registering stm32-rifsc firewall controller
...
[    1.328116] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
...
[    1.339311] STM32 USART driver initialized
...
[    1.355588] arm_smc_wdt watchdog: Watchdog registered (timeout=32 sec, nowayout=0)
...
[    1.388018] ------------[ cut here ]------------
[    1.392260] WARNING: CPU: 1 PID: 1 at /drivers/firmware/arm_scmi/driver.c:3008 scmi_driver_init+0x0/0xc
[    1.401716] Modules linked in:
[    1.404784] CPU: 1 PID: 1 Comm: swapper/0 Not tainted 6.6.78-stm32mp #1
[    1.411439] Hardware name: STMicroelectronics STM32MP257F-DK Discovery Board (DT)
[    1.418973] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[    1.425982] pc : scmi_driver_init+0x0/0xc
[    1.430013] lr : do_one_initcall+0x68/0x180
[    1.434217] sp : ffff0000800c7dc0
[    1.437545] x29: ffff0000800c7dc0 x28: 0000000000000000 x27: ffff800081076068
[    1.444726] x26: ffff800080ff00a0 x25: ffff800080f7f090 x24: ffff800080fd6f50
[    1.451907] x23: ffff800081076078 x22: 0000000000000000 x21: ffff000080098000
[    1.459094] x20: ffff8000817fc000 x19: ffff80008103827c x18: ffff0000800c7cf0
[    1.466278] x17: ffff80008173ea80 x16: 0000000058465ebb x15: 00000000f5b0e375
[    1.473459] x14: 00000000d4f5cf5f x13: 00000000931f8395 x12: 00000000932fb357
[    1.480640] x11: 00000000f6dded2f x10: 00000000b149fede x9 : 0000000000000000
[    1.487824] x8 : ffff0000800c7dc0 x7 : 0000000000000000 x6 : 000000000000003f
[    1.495008] x5 : 0000000000000040 x4 : ffffffffffffffd0 x3 : 0000000000000280
[    1.502196] x2 : 0000000000000000 x1 : 0000000000000000 x0 : 0000000000000000
[    1.509380] Call trace:
[    1.511833]  scmi_driver_init+0x0/0xc
[    1.515513]  kernel_init_freeable+0x1c0/0x280
[    1.519893]  kernel_init+0x20/0x1d0
[    1.523398]  ret_from_fork+0x10/0x20
[    1.526990] ---[ end trace 0000000000000000 ]---
...
[    1.674563] Warning: unable to open an initial console.
[    1.681947] Freeing unused kernel memory: 5312K
[    1.684403] Run /bin/sh as init process
[    1.688183]   with arguments:
[    1.691156]     /bin/sh
[    1.693609]   with environment:
[    1.696758]     HOME=/
[    1.699132]     TERM=linux
[    1.704061] Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000000
[    1.709561] CPU: 0 PID: 1 Comm: sh Tainted: G        W          6.6.78-stm32mp #1
[    1.717096] Hardware name: STMicroelectronics STM32MP257F-DK Discovery Board (DT)

vediamo un bel po’ di cose interessanti.

simboli kconfig

Affrontarle in maniera lineare, spiegando il come si capiscono le cause di certi errori, è parecchio complicato. In sostanza è una lunga serie di trial-and-error e di fare avanti indietro tra:

  • log
  • sorgenti del kernel
  • devicetree

Questo perchè dobbiamo assicurarci di avere i driver per una determinata periferica, di avere definito i simboli KCONFIG necessari per attivare la compilazione, fare la stessa cosa anche per le altre periferiche da cui questa dipende (clock, alimentazioni, bus …), assicurarci che i driver corrispondano con quelli dichiarati nel devicetree e che i parametri di configurazione siano sensati. Siccome stiamo usando un devicetree già configurato per la nostra scheda, la cosa che rimane da fare è verificare che i driver che vengono utilizzati da questo siano effettivamente compilati nel kernel (o caricati come moduli).

Ad esempio:

arch/arm64/boot/dts/st/stm32mp251.dtsi
usart2: serial@400e0000 {
        access-controllers = <&rifsc 0x20>;
        clocks = <&rcc 0xff>;
        compatible = "st,stm32h7-uart";
        interrupts-extended = <&exti1 0x1b 0x04>;
        pinctrl-0 = <&usart2_pins_a>;
        pinctrl-1 = <&usart2_idle_pins_a>;
        pinctrl-2 = <&usart2_sleep_pins_a>;
        pinctrl-names = "default", "idle", "sleep";
        power-domains = <&d1_pd>;
        reg = <0x400e0000 0x400>;
        status = "okay";
        wakeup-source;
};

Cerchiamo la stringa compatibile st,stm32h7-uart all’ interno dei sorgenti dei driver del kernel:

terminal
grep -r "st,stm32h7-uart" tmp/work/stm32mp257f_dk-oe-linux/linux-stm/6.6.78+git/git/drivers/
.../drivers/tty/serial/stm32-usart.c:  { .compatible = "st,stm32h7-uart", .data = &stm32h7_info},
.../drivers/tty/serial/stm32-usart.c:OF_EARLYCON_DECLARE(stm32, "st,stm32h7-uart", early_stm32_h7_serial_setup);

e andiamo a cercare il Makefile che si occupa di compilare stm32-usart.c:

terminal
grep -r "stm32-usart.o" tmp/work/stm32mp257f_dk-oe-linux/linux-stm/6.6.78+git/git/drivers/
.../drivers/tty/serial/Makefile:obj-$(CONFIG_SERIAL_STM32) += stm32-usart.o

vediamo che il simbolo che ci interessa definire per compilare il driver nel kernel è CONFIG_SERIAL_STM32 Quindi andremo poi a definirlo in menuconfig assieme a tutti gli altri simboli che ci servono e poi generiamo il nostro fragment.

Un metodo comodo per automatizzare questo processo è di utilizzare lo script dt_to_config presente nella repo del kernel. Per eseguire lo script senza il rischio di non avere le dipendenze necessarie, apriamo una devshell nel recipe e lo eseguiamo da lì:

terminal
bitbake linux-stm -c devshell

./scripts/dtc/dt_to_config --config $KBUILD_OUTPUT/.config arch/arm64/boot/dts/st/stm32mp257f-dk.dts

e vedremo un output del genere, con la sintassi flags : dt-node : compatible-string : driver_file : kconfig-symbol

Md-c-------y- : /interrupt-controller@4ac00000 : st,stm32mp2-cortex-a7-gic : drivers/irqchip/irq-gic.c : CONFIG_ARM_GIC : y
Md-c-------y- : /interrupt-controller@4ac00000 : arm,cortex-a7-gic : drivers/irqchip/irq-gic.c : CONFIG_ARM_GIC : y
-d-c-------y- : /interrupt-controller@4ac00000/v2m@48090000 : arm,gic-v2m-frame : drivers/irqchip/irq-gic-v2m.c : CONFIG_ARM_GIC_V2M : y
M------------ : /panel-lvds : edt,etml0700z9ndha : no_driver : no_config : x
MdDc-----n--F : /panel-lvds : panel-lvds : drivers/gpu/drm/panel/panel-lvds.c : CONFIG_DRM_PANEL_LVDS : n

lo script elenca tutti i driver che supportano determinate compatible string, quindi tanti simboli non ci interessano. Usando grep possiamo però isolare tutti i simboli STM32 associati al devicetree della scheda:

terminal
./scripts/dtc/dt_to_config --config $KBUILD_OUTPUT/.config arch/arm64/boot/dts/st/stm32mp257f-dk.dts > dt_config

# grep, sort and remove duplicates
grep -o 'CONFIG_[^ :]*STM32[^ :]*' dt_config | sort -u > dt_config_stm32

ottenendo

...
CONFIG_IIO_STM32_TIMER_TRIGGER
CONFIG_MFD_STM32_LPTIMER
CONFIG_MFD_STM32_TIMERS
CONFIG_MMC_STM32_SDMMC
CONFIG_MTD_NAND_STM32_FMC2
CONFIG_PCIE_STM32
CONFIG_PCIE_STM32_EP
CONFIG_PHY_STM32_COMBOPHY
CONFIG_PHY_STM32_USB2PHY
CONFIG_PINCTRL_STM32_HDP
CONFIG_PINCTRL_STM32MP257
...

e almeno abbiamo un decente punto di partenza. Tanti di questi sono definiti nel fragment arch/arm64/configs/fragment-02-defconfig-addons.config, ma per potere fare il boot della scheda ne mancano alcuni. Dopo svariate ore di prove e lettura di documentazione possiamo arrivare ad avere una lista dei simboli per far funzionare almeno le periferiche essenziali (uart, clocks, alimentazioni, firewall di memoria,… ):

meta-stm32mp2/recipes-kernel/linux/fragments/fragment_stm32mp2.cfg
CONFIG_ARCH_STM32=y

# RCC  (Reset and Clock Control)
# https://wiki.st.com/stm32mpu/wiki/RCC_internal_peripheral
#
# clock
# https://wiki.st.com/stm32mpu/wiki/Clock_overview#Kernel_configuration
#
# reset
# https://wiki.st.com/stm32mpu/wiki/Reset_overview#Kernel_configuration
#
CONFIG_RESET_CONTROLLER=y

COMMON_CLK_REGMAP=y
CONFIG_COMMON_CLK_STM32MP=y

# Clock driver for stm32m21x clocks
#CONFIG_COMMON_CLK_STM32MP215=y

# Support for stm32mp25x SoC family clocks
CONFIG_COMMON_CLK_STM32MP257=y




# psci (Power State Coordination Interface)
# https://wiki.st.com/stm32mpu/wiki/Power_overview#Source_code_location

CONFIG_CPU_PM=y
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
# CONFIG_CPU_IDLE_GOV_LADDER is not set
CONFIG_CPU_IDLE_GOV_MENU=y
# CONFIG_CPU_IDLE_GOV_TEO is not set

# ARM CPU Idle Drivers
CONFIG_CPU_IDLE=y
CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y
CONFIG_DT_IDLE_GENPD=y
CONFIG_DT_IDLE_STATES=y


# GENPD driver
CONFIG_PM=y
CONFIG_PM_GENERIC_DOMAINS=y
CONFIG_PM_GENERIC_DOMAINS_OF=y


# PSCI drivers
CONFIG_ARM_PSCI_FW=y
CONFIG_ARM_PSCI_CPUIDLE=y
CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y

# STM32MP specific driver
CONFIG_ARM_STM32_CPUIDLE=y
CONFIG_STM32MP_PM_DOMAIN=y


# SMC (Secure Monitor Call)
CONFIG_HAVE_ARM_SMCCC=y
CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y
CONFIG_ARM_SMC_WATCHDOG=y




# SCMI  (System Control and Management Interface)
# https://wiki.st.com/stm32mpu/wiki/SCMI_overview#Kernel_configuration
CONFIG_ARM_SCMI_PROTOCOL=y
CONFIG_ARM_SCMI_CPUFREQ=y
CONFIG_ARM_SCMI_HAVE_SHMEM=y
CONFIG_ARM_SCMI_HAVE_MSG=y
CONFIG_REGULATOR_ARM_SCMI=y
CONFIG_COMMON_CLK_SCMI=y
CONFIG_RESET_SCMI=y

# supported protocols
CONFIG_ARM_SCMI_HAVE_TRANSPORT=y
CONFIG_ARM_SCMI_TRANSPORT_OPTEE=y
CONFIG_ARM_SCMI_TRANSPORT_MAILBOX=y
CONFIG_ARM_SCMI_TRANSPORT_SMC=y


CONFIG_TEE=y
CONFIG_OPTEE=y




# GPIO and Pin Multiplexing controllers
#
CONFIG_PINCTRL_STM32=y
#CONFIG_PINCTRL_STM32MP215=y
#CONFIG_PINCTRL_STM32MP235=y
CONFIG_PINCTRL_STM32MP257=y

# interrupt
CONFIG_STM32MP_EXTI=y

# debug
#PINCTRL_STM32_HDP  (Hardware Debug Port)

CONFIG_RTC_DRV_STM32=y
CONFIG_STM32_DMA3=y



# # # # # # # # # # # # # #
#     PERIPHERALS         #
# # # # # # # # # # # # # #

# FIREWALL
#
CONFIG_STM32_FIREWALL=y

# Resource Isolation Slave Address Block (bus firewall peripheral)
CONFIG_STM32_RISAB=y

# Resource Isolation Slave Address Filter (DDR/memory firewall filter)
CONFIG_STM32_RISAF=y



# watchdog linux device
#CONFIG_STM32_WATCHDOG=y



# STORAGE
# 
# mmc subsystem
CONFIG_MMC_STM32_SDMMC=y

# support the Octo-SPI (OSPI/OMI) controller
CONFIG_STM32_OMI=y

# Octo-SPI Memory Manager
CONFIG_STM32_OMM=y

# support for external memories adhering to the Cypress/Infineon HyperBus protocol
CONFIG_STM32_HYPERBUS=y

# Drives the Flexible Memory Controller 2 (FMC2) external memory bus
CONFIG_STM32_FMC2_EBI=y


# SERIAL
CONFIG_SERIAL_STM32=y
CONFIG_SERIAL_STM32_CONSOLE=y




# CONFIG_SPI_STM32_OSPI=y
# CONFIG_VIDEO_HANTRO_STM32MP25=y
# CONFIG_CLKSRC_STM32_LP=y
# CONFIG_STM32_IPCC=y
# CONFIG_STM32_HOG=y
# CONFIG_STM32_SYSCON=y
# CONFIG_STM32_FMC2_EBI=y
# CONFIG_NVMEM_STM32_BSEC_OPTEE_TA=y
# CONFIG_NVMEM_STM32_ROMEM=y
# CONFIG_NVMEM_STM32_TAMP=y


# Hardware CRC calculation acceleration engine
#CONFIG_CRYPTO_DEV_STM32_CRC=m

# Hardware AES / DES encryption/decryption accelerator
#CONFIG_CRYPTO_DEV_STM32_CRYP=m

# Hardware SHA1, SHA224, SHA256, MD5 hashing accelerator
#CONFIG_CRYPTO_DEV_STM32_HASH=m

# ST Ethernet MAC (DesignWare Core glue) for gigabit/100M LAN
#CONFIG_DWMAC_STM32=m

# True Hardware Random Number Generator (RNG) for kernel entropy.
#CONFIG_HW_RANDOM_STM32=y

poi oltre a questi ne servono anche altri per configurare delle funzioni del kernel che però non dipendono dall’ hardware:

meta-stm32mp2/recipes-kernel/linux/fragments/fragment_linux_essential.cfg
# BINARY FORMATS
CONFIG_BINFMT_ELF=y
CONFIG_COMPAT_BINFMT_ELF=y
CONFIG_BINFMT_SCRIPT=y

CONFIG_SERIAL_DEV_CTRL_TTYPORT=y
CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y

# FILESYSTEMS
CONFIG_EXT4_FS=y


# hw should decide for this
# CONFIG_MMC
CONFIG_MMC_BLOCK=y
CONFIG_MMC_BLOCK_MINORS=32

buildiamo il tutto e riproviamo ancora una volta.

initramfs funzionante

e dopo queste modifiche finalmente riusciamo ad arrivare ad una shell linux:

...
[    2.000437] Freeing unused kernel memory: 5440K
[    2.000549] Run /bin/sh as init process
[    2.003332]   with arguments:
[    2.006251]     /bin/sh
[    2.008676]   with environment:
[    2.011809]     HOME=/
[    2.014229]     TERM=linux
/bin/sh: can't access tty; job control turned off
[    2.044482] mmc1: new HS200 MMC card at address 0001
[    2.058231] mmc0: new ultra high speed SDR104 SDHC card at address aaaa
ls
# bin     etc     init.d  root    usr
# dev     init    lib     sbin    var
uname -a
# Linux (none) 6.6.78-stm32mp #1 SMP PREEMPT Wed Jun 25 12:03:32 UTC 2025 aarch64 GNU/Linux

e possiamo fare cose interessanti:

mkdir -p /proc /sys 
mount -t proc proc /proc 
mount -t sysfs sysfs /sys
mount -t devtmpfs devtmpfs /dev
mount -t debugfs none /sys/kernel/debug

# exploring kernel API
cat /proc/device-tree/chosen/u-boot,version 
cat /proc/devices
cat /proc/interrupts
ls /sys/bus/platform/drivers/stm32-usart/

abbiamo una shell linux (e non molto altro) a nostra disposizione, che però persisterà nel disco. Quindi ogni modifica andrà persa. Possiamo fare di meglio.

rootfs

Se vogliamo caricare un vero rootfs, dobbiamo prima generarlo:

bitbake core-image-minimal

questa contiene solo le cose essenziali tipo:

  • busybox per darci i comandi linux di base
  • udev per montare dispositivi in /dev

e vabbè qualche altra cosina. Quello che ci interessa è creare un’ altra partizione ext4 sulla sdcard e trasferirci il rootfs generato da yocto:

# sgdisk arguments
#  -n --new=partnum:start:end
#  -A (--attributes)
#  -c (--change-name)
#  -t (--typecode)
#  -u (--partition-guid) 
#
# Linux filesystem data (ext2/ext4/fat file system)
# TYPE CODE GUID = 0FC63DAF-8483-4772-8E79-3D69D8477DE4

# ROOTFS
PART=11
DEVICE=/dev/sde
ROOTFS_TAR=tmp/deploy/images/stm32mp257f-dk/core-image-minimal-stm32mp257f-dk.rootfs.tar.gz

sudo sgdisk \
    -n ${PART}:0:+50M \
    -c ${PART}:rootfs \
    -t ${PART}:0FC63DAF-8483-4772-8E79-3D69D8477DE4 \
    -u ${PART}:R \
    "$DEVICE" 

sudo mkfs.ext4 -L "rootfs" "${DEVICE}${PART}"

MNTPOINT=/tmp/rootfs
sudo mkdir -p "$MNTPOINT"
sudo mount "${DEVICE}${PART}" "$MNTPOINT"
sudo tar -xp -f ${ROOTFS_TAR} -C "$MNTPOINT"
sudo sync
sudo umount "$MNTPOINT"

e poi nella console di uboot:

setenv bootargs "console=ttySTM0,115200 root=/dev/mmcblk0p11 rootwait rw earlycon ignore_loglevel"

dove mmcblk0p11 è la partizione rootfs che abbiamo appena creato. Questo è il nome che linux assegna al dispositivo perchè sta sfruttando il driver mmcblk (mmc block). Lo potevamo vedere dalla shell nel initramfs esplorando /dev:

initramfs shell
ls /dev/
autofs           mmcblk1p1        tty27            tty55
console          mmcblk1p10       tty28            tty56
cpu_dma_latency  mmcblk1p11       tty29            tty57
dri              mmcblk1p2        tty3             tty58
full             null             tty30            tty59
gpiochip0        ptmx             tty31            tty6
gpiochip1        random           tty32            tty60
gpiochip2        snd              tty33            tty61
gpiochip3        tee0             tty34            tty62
gpiochip4        teepriv0         tty35            tty63
gpiochip5        tty              tty36            tty7
gpiochip6        tty0             tty37            tty8
gpiochip7        tty1             tty38            tty9
gpiochip8        tty10            tty39            ttyS0
gpiochip9        tty11            tty4             ttyS1
hwrng            tty12            tty40            ttyS2
kmsg             tty13            tty41            ttyS3
kvm              tty14            tty42            ttySTM0
mmcblk0          tty15            tty43            ubi_ctrl
mmcblk0boot0     tty16            tty44            urandom
mmcblk0boot1     tty17            tty45            vcs
mmcblk0p1        tty18            tty46            vcs1
mmcblk0p2        tty19            tty47            vcsa
mmcblk0p3        tty2             tty48            vcsa1
mmcblk0p4        tty20            tty49            vcsu
mmcblk0p5        tty21            tty5             vcsu1
mmcblk0p6        tty22            tty50            vfio
mmcblk0p7        tty23            tty51            vga_arbiter
mmcblk0p8        tty24            tty52            watchdog
mmcblk0rpmb      tty25            tty53            watchdog0
mmcblk1          tty26            tty54            zero

avviando il kernel vedremo:

kernel log
[    2.090589] EXT4-fs (mmcblk0p11): mounted filesystem ca9a2359-a579-4d69-898a-0821255f8a4e r/w with ordered data mode. Quota mode: none.
[    2.097334] VFS: Mounted root (ext4 filesystem) on device 179:107.
[    2.106180] devtmpfs: mounted
[    2.107095] Freeing unused kernel memory: 2432K
[    2.111115] Run /sbin/init as init process
[    2.115391]   with arguments:
[    2.118113]     /sbin/init
[    2.120841]   with environment:
[    2.123976]     HOME=/
[    2.126293]     TERM=linux
INIT: version 3.04 booting
Starting udev
[    2.462345] udevd[131]: starting version 3.2.14
[    3.574394] random: crng init done
[    3.595776] udevd[132]: starting eudev-3.2.14
[    3.595908] udevd[132]: inotify_init failed: Function not implemented
[    3.601111] udevd[132]: error initializing inotify
[    3.711200] EXT4-fs (mmcblk0p11): re-mounted ca9a2359-a579-4d69-898a-0821255f8a4e r/w. Quota mode: none.
hwclock: can't open '/dev/misc/rtc': No such file or directory
Fri Mar  9 12:34:56 UTC 2018
hwclock: can't open '/dev/misc/rtc': No such file or directory
hwclock: can't open '/dev/misc/rtc': No such file or directory
INIT: Entering runlevel: 5
Configuring network interfaces... ip: SIOCGIFFLAGS: No such device
ip: SIOCGIFFLAGS: No such device
Starting syslogd/klogd: done
[   12.063401] platform 48010000.display-controller: deferred probe pending
[   12.064558] stm32mp_pm_domain power-domain-d1: sync_state() pending due to 40010000.timer
[   12.072833] stm32mp_pm_domain power-domain-d1: sync_state() pending due to 400b0000.audio-controller
[   12.081999] stm32mp_pm_domain power-domain-d1: sync_state() pending due to 40130000.i2c
[   12.090062] stm32mp_pm_domain power-domain-d1: sync_state() pending due to 404c0000.crc
[   12.098118] stm32mp_pm_domain power-domain-d1: sync_state() pending due to 404d0000.mdf
[   12.106177] stm32mp_pm_domain power-domain-d1: sync_state() pending due to 48010000.display-controller
[   12.115542] stm32mp_pm_domain power-domain-d1: sync_state() pending due to 48030000.dcmipp
[   12.123908] stm32mp_pm_domain power-domain-d1: sync_state() pending due to 480c0000.phy
[   12.131978] stm32mp_pm_domain power-domain-d1: sync_state() pending due to 48240000.mmc
[   12.140032] stm32mp_pm_domain power-domain-d1: sync_state() pending due to 482c0000.eth1
[   12.148183] stm32mp_pm_domain power-domain-d1: sync_state() pending due to 42080000.bus:usb@482e0000
[   12.157340] stm32mp_pm_domain power-domain-d1: sync_state() pending due to 42080000.bus:usb@48300000
[   12.166599] stm32mp_pm_domain power-domain-d1: sync_state() pending due to 48000000.dsi
[   12.174652] stm32mp_pm_domain power-domain-d1: sync_state() pending due to 48060000.lvds
[   12.182813] stm32mp_pm_domain power-domain-d1: sync_state() pending due to 480d0000.vdec
[   12.190967] stm32mp_pm_domain power-domain-d1: sync_state() pending due to 480e0000.venc
[   12.199118] stm32mp_pm_domain power-domain-d1: sync_state() pending due to 48280000.gpu
[   12.207172] stm32mp_pm_domain power-domain-d1: sync_state() pending due to 42030000.crypto
[   12.215562] psci-cpuidle-domain psci: sync_state() pending due to 0.m33
[   32.286445] vddio3: disabling
[   32.286518] vddio4: disabling
[   32.286782] vdda18adc: disabling
[   32.290036] vddcore: disabling
[   32.293116] v1v8: disabling
[   32.295894] v3v3: disabling
[   32.298799] v5v_vconn: disabling

la partizione è stata montata (VFS: Mounted root), init è partito (INIT: version 3.04 booting), ma non si è aperta nessuna console dove inserire i comandi. Questo succede perchè il kernel lascia spazio allo userspace, ma non trova una console a cui collegarsi. Questa è definita nel file:

/etc/inittab
# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
#
# Format:
#  <id>:<runlevels>:<action>:<process>
#

1:12345:respawn:/sbin/getty 38400 tty1

e infatti dovrebbe esserci ttySTM0, cioè lo stesso device in cui stavamo visualizzando il log del kernel. Per configurare questo passaggio, in Yocto esiste la variabile SERIAL_CONSOLES per configurare la console di avvio dello userspace:

stm32mp257f-dk.conf
SERIAL_CONSOLES = "115200;ttySTM0"

il valore di questa è fortemente legato al devicetree, quindi è hardware dipendente e ha senso definirlo nel machine.conf invece che nel recipe del kernel. Definendolo, vedremo una nuova riga nel file inittab:

/etc/inittab
STM0:12345:respawn:/usr/sbin/ttyrun ttySTM0 /bin/start_getty 115200 ttySTM0 vt102
# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
#
# Format:
#  <id>:<runlevels>:<action>:<process>
#

1:12345:respawn:/sbin/getty 38400 tty1

Dopo tutta questa trafila, potremo finalmente vedere:

[    1.958167] Waiting for root device /dev/mmcblk0p11...
[    2.020737] mmc1: new HS200 MMC card at address 0001
[    2.021586] mmcblk1: mmc1:0001 008GB1 7.28 GiB
[    2.027343] mmc0: new ultra high speed SDR104 SDHC card at address aaaa
[    2.032138] mmcblk0: mmc0:aaaa SC16G 14.8 GiB
[    2.037977]  mmcblk1: p1 p2 p3 p4 p5 p6 p7 p8
[    2.041429] mmcblk1boot0: mmc1:0001 008GB1 4.00 MiB
[    2.045609] mmcblk1boot1: mmc1:0001 008GB1 4.00 MiB
[    2.050354] mmcblk1rpmb: mmc1:0001 008GB1 4.00 MiB, chardev (246:0)
[    2.058848]  mmcblk0: p1 p2 p10 p11
[    2.100037] EXT4-fs (mmcblk0p11): mounted filesystem ca9a2359-a579-4d69-898a-0821255f8a4e r/w with ordered data mode. Quota mode: none.
[    2.106784] VFS: Mounted root (ext4 filesystem) on device 179:43.
[    2.115404] devtmpfs: mounted
[    2.116546] Freeing unused kernel memory: 2432K
[    2.120577] Run /sbin/init as init process
[    2.124425]   with arguments:
[    2.127465]     /sbin/init
[    2.130193]   with environment:
[    2.133319]     HOME=/
[    2.135636]     TERM=linux
INIT: version 3.04 booting
Starting udev
[    2.466159] udevd[131]: starting version 3.2.14
[    3.536878] random: crng init done
[    3.558885] udevd[132]: starting eudev-3.2.14
[    3.909117] EXT4-fs (mmcblk0p11): re-mounted ca9a2359-a579-4d69-898a-0821255f8a4e r/w. Quota mode: none.
hwclock: can't open '/dev/misc/rtc': No such file or directory
Fri Mar  9 12:34:56 UTC 2018
hwclock: can't open '/dev/misc/rtc': No such file or directory
hwclock: can't open '/dev/misc/rtc': No such file or directory
INIT: Entering runlevel: 5
Configuring network interfaces... ip: SIOCGIFFLAGS: No such device
ip: SIOCGIFFLAGS: No such device
Starting syslogd/klogd: done

OpenEmbedded nodistro.0 stm32mp257f-dk /dev/ttySTM0

stm32mp257f-dk login: root
root@stm32mp257f-dk:~# 

ohhh là, finalmente il nostro sistema linux è vivoooooo