KERNEL II
On this page
ok, ci eravamo lasciati con degli errori. I primi sono semplici e indipendenti dal hardware che stiamo usando:
modprobe binfmt-464c cannot be processedNo 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:
menuconfigper modificare i simboli Kconfig definitidiffconfigper generare ifragmentda applicare
Apriamo menuconfig:
bitbake linux-stm -c menuconfigcercando BINFMT vediamo una lista di formati supportabili
tra cui:
BINFMT_ELFBINFMT_SCRIPT
salviamo la configurazione nel file .config
e usciamo. Generiamo il fragment:
bitbake linux-stm -c diffconfignella WORKDIR del recipe vedremo comparire un file:
CONFIG_BINFMT_ELF=y
CONFIG_COMPAT_BINFMT_ELF=y
CONFIG_ELFCORE=y
CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
CONFIG_BINFMT_SCRIPT=ycopiamolo 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:
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.
setenv bootargs "console=ttySTM0,115200 earlycon ignore_loglevel rdinit=/bin/sh"e facendo il boot:
...
[ 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:
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:
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:
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.ovediamo 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ì:
bitbake linux-stm -c devshell
./scripts/dtc/dt_to_config --config $KBUILD_OUTPUT/.config arch/arm64/boot/dts/st/stm32mp257f-dk.dtse 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 : nlo 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:
./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_stm32ottenendo
...
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,… ):
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=ypoi oltre a questi ne servono anche altri per configurare delle funzioni del kernel che però non dipendono dall’ hardware:
# 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=32buildiamo 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/Linuxe 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-minimalquesta contiene solo le cose essenziali tipo:
busyboxper darci i comandi linux di baseudevper 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:
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 zeroavviando il kernel vedremo:
[ 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: disablingla 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:
# /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 tty1e 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:
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:
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 tty1Dopo 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