BOOTLOADER U-BOOT : PRISE EN COMPTE DU SYSTÈME DE BUILD KBUILD

Lors de la création de notre BSP Yocto pour le SOC Hera, nous avons dû adapter 2 composants système essentiels : le boot loader U-Boot et le kernel Linux. La version du bootloader créée pour Yocto fido est basée sur le git Freescale http://git.freescale.com/git/cgit.cgi/imx/uboot-imx.git/, branche imx_v2014.04_3.14.28_1.0.0_ga. Comme son nom l’indique, cette branche utilise la version 2014.04 de U-Boot. A partir de cette branche du git Freescale, nous avons créé notre propre branche imx_v2014.04_3.14.28_1.0.0_ga-hera, dans laquelle a été ajouté le support de la carte Hera. Au delà de quelques patches sur le support Ethernet Marvell et Spi Nor, cela se résume à :
  • créer les fichiers board spécifiques Hera dans board/cio/hera et board/cio/mmx,
  • créer les fichiers de configuration spécifiques Hera dans include/configs
  • ajouter le descriptif de la carte Hera dans le fichier boards.cfg qui sert de point d’entrée au processus de compilation.
Pour porter cette adaptation de U-Boot pour Hera sur la version Yocto jethro, il faut porter les modifications décrites ci dessus sur la branche imx_v2015.04_3.14.52_1.1.0_ga du git Freescale (branche sélectionnée dans la recette Yocto jethro de U-Boot). Le patch sur le support Marvell n’est plus nécessaire, celui sur la Spi Nor demeure. Une fois celui ci reporté, les fichiers dans board/cio et les fichiers de configuration Hera de include/configs sont reportés sur la nouvelle branche sans souci. Par contre au moment de reporter l’ajout d’Hera dans le fichier boards.cfg, on constate que celui-ci a disparu. Une petite recherche sur Google avec les mots clés « u-boot boards.cfg » nous amène rapidement à l’explication : U-Boot a intégré le système de configuration du kernel Kbuild, tel que décrit dans « Kbuild et Kconfig for U-Boot ». Premier constat : les champs Arch, CPU[:SPLCPU], SoC, Vendor, Board Name et Config Name du fichier boards.cfg sont transférés dans le fichier Kconfig du répertoire de la board concernée. Ainsi pour la carte mx6qsabresd de Freescale, on avait en version v2014.04 une ligne :
Active arm armv7 mx6 freescale mx6sabresd mx6qsabresd mx6sabresd:IMX_CONFIG=board/freescale/imx/ddr/mx6q_4x_mt41j128.cfg,MX6Q,DEFAULT_FDT_FILE="imx6q-sabresd.dtb",DDR_MB=1024,SYS_USE_SPINOR Fabio Estevam <fabio.estevam@freescale.com>
qui donnent le Kconfig suivant :
if TARGET_MX6SABRESD

config SYS_BOARD
    default "mx6sabresd"

config SYS_VENDOR
    default "freescale"

config SYS_SOC
    default "mx6"

config SYS_CONFIG_NAME
    default "mx6sabresd"

endif
Le dernier champ (mainteneur) est transféré dans un fichier MAINTAINERS :
MX6SABRESD BOARD
M: Fabio Estevam <fabio.estevam@freescale.com>
S: Maintained
F: board/freescale/mx6sabresd/
F: include/configs/mx6sabresd.h
F: configs/mx6dlsabresd_defconfig
F: configs/mx6qsabresd_defconfig
F: configs/mx6sabresd_spl_defconfig
Le fichier MAINTAINERS nous indique l’apparition d’un nouveau fichier de configuration dans le répertoire configs. C’est ce fichier qui sert de point d’entrée au nouveau système de build : une commande make _defconfig se base sur le fichier configs/_defconfig. Intéressons nous donc au fichier configs/mx6qsabresd_defconfig :
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6sabresd/mx6q_4x_mt41j128.cfg,MX6Q,SYS_USE_SPINOR"
CONFIG_ARM=y
CONFIG_TARGET_MX6SABRESD=y
CONFIG_DM=y
CONFIG_DM_THERMAL=y
On y retrouve le champ Options de l’ancien fichier boards.cfg dans la variable CONFIG_SYS_EXTRA_OPTIONS. On définit également l’architecture CONFIG_ARM=Y, et la variable CONFIG_TARGET_MX6SABRESD=Y, faisant ainsi le lien avec le fichier Kconfig vu ci-dessus. Enfin la variable CONFIG_DM=y active le Driver Model d’U-Boot et CONFIG_DM_THERMAL active le support driver des devices thermal. En ce qui concerne Hera la ligne :
Active arm armv7 mx6 cio hera hera_quad hera:IMX_CONFIG=board/cio/imx/ddr/mx6q_4x_mt41j128.cfg,MX6Q,DEFAULT_FDT_FILE="imx6q-hera.dtb",DDR_MB=1024 -
donne donc le Kconfig suivant :
if TARGET_MX6QHERA
config SYS_BOARD
    default "hera"
config SYS_VENDOR
    default "cio"
config SYS_SOC
    default "mx6"
config SYS_CONFIG_NAME
    default "hera_quad"
endif
La ligne Hera ne contenait pas d’indication de mainteneur. Créons le à l’occasion de ce portage :
MX6HERA BOARD
M:	Christian Charreyre <christian.charreyre@ciose.fr>
S:	Maintained
F:	board/cio/hera/
F:	include/configs/hera.h
F:	include/configs/hera_common.h
F:	configs/mx6qhera_defconfig
Par analogie avec la SabreSD, on peut donc créer une 1ère version de fichier configs/mx6qhera_defconfig comme suit :
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/cio/imx/ddr/mx6q_4x_mt41j128.cfg,MX6Q,DEFAULT_FDT_FILE="imx6q-hera.dtb",DDR_MB=1024"
CONFIG_ARM=y
CONFIG_TARGET_MX6QHERA=y
CONFIG_DM=y
CONFIG_DM_THERMAL=y
Après avoir lancé la compilation par un make mx6qhera_defconfig, on constate au travers du fichier .config généré que l’on ne sélectionne pas correctement la carte Hera, mais que c’est l’architecture ARM par défaut qui est compilée :
…
CONFIG_SYS_ARCH="arm"
CONFIG_SYS_CPU="arm720t"
CONFIG_SYS_VENDOR="armltd"
CONFIG_SYS_BOARD="integrator"
CONFIG_SYS_CONFIG_NAME="integratorap"
…
Ceci s’explique par un chaînage du répertoire board/cio manquant au niveau de l’arborescence des Kconfig. Patchons le fichier arch/arm/Kconfig pour effectuer le chaînage :
cch@cch-tosh:/media/yocto-1504/hera/uboot-imx/arch/arm$ git diff
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 0c82b17..737431b 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -514,6 +514,10 @@ config TARGET_MX6QARM2
        bool "Support mx6qarm2"
        select CPU_V7
 
+config TARGET_MX6QHERA
+       bool "Support mx6qhera"
+       select CPU_V7
+
 config TARGET_MX6QSABREAUTO
        bool "Support mx6qsabreauto"
        select CPU_V7
@@ -840,6 +844,7 @@ source "board/boundary/nitrogen6x/Kconfig"
 source "board/broadcom/bcm28155_ap/Kconfig"
 source "board/broadcom/bcmcygnus/Kconfig"
 source "board/broadcom/bcmnsp/Kconfig"
+source "board/cio/hera/Kconfig"
 source "board/cirrus/edb93xx/Kconfig"
 source "board/compulab/cm_t335/Kconfig"
 source "board/compulab/cm_fx6/Kconfig"
Relançons la compilation. Ce coup ci la carte Hera est bien sélectionnée comme le prouve l’extrait du fichier .config :
...
CONFIG_SYS_ARCH="arm"
CONFIG_SYS_CPU="armv7"
CONFIG_SYS_SOC="mx6"
CONFIG_SYS_VENDOR="cio"
CONFIG_SYS_BOARD="hera"
CONFIG_SYS_CONFIG_NAME="hera_quad"
...
mais nous obtenons une erreur sur le nom du fichier de config :
In file included from ../include/common.h:18:0:
include/config.h:8:31: fatal error: configs/hera_quad.h: No such file or directory
En effet il y a une incohérence entre le fichier configs/hera.h et la valeur de SYS_CONFIG_NAME qui vaut hera_quad (héritage de la version v2014.04). Corrigeons cela en redéfinissant SYS_CONFIG_NAME à hera :
cch@cch-tosh:/media/yocto-1504/hera/uboot-imx/arch/arm$ git diff
diff --git a/board/cio/hera/Kconfig b/board/cio/hera/Kconfig
index 880c1a3..4fdebec 100644
--- a/board/cio/hera/Kconfig
+++ b/board/cio/hera/Kconfig
@@ -10,6 +10,6 @@ config SYS_SOC
        default "mx6"
 
 config SYS_CONFIG_NAME
-       default "hera_quad"
+       default "hera"
 
 endif
Recompilons. Cette fois ci tout est nominal. Il reste quelques erreurs à corriger mais ce sont des erreurs qui n’ont pas de lien avec l’adoption du nouveau système de build donc elles n’entrent pas dans le cadre de cet article. Par ces quelques adaptations nous avons donc pris en compte le nouveau système de build de U-Boot. Cependant cette prise en compte n’est que partielle car il resterait maintenant à transférer toutes les options définies inconditionnellement dans include/configs/hera.h et include/configs/hera_common.h par des options définies conditionnellement par Kconfig.

Partager cet article

Partager sur facebook
Partager sur twitter
Partager sur linkedin
Partager sur pinterest
Partager sur print
Partager sur email

UN BLOG DE

CIO Systèmes Embarqués – 1 Rue de la Presse, 42 000 Saint-Étienne – contact@ciose.fr – 04 77 93 34 32 

CIO  Systèmes Embarqués est le nom commercial de la SAS CIO Informatique Industrielle 

CIO Informatique Industrielle © 1991-2020 v3.0

Mentions Légales