Comment démarrer Ubuntu pour ARM à travers U-boot ? J'ai un firmware qui supporte uniquement U-boot.
Réponse
Trop de publicités?Il n'existe pas de guide universel pour l'installation d'ARM avec U-boot car les fabricants de matériel en général veulent garder leur matériel fermé. Donc la difficulté de cette tâche dépend totalement du matériel et du fabricant de ce matériel.
Consultez la documentation officielle section 5.1 qui propose une méthode générique pour identifier et ajuster les paramètres lorsque vous devez utiliser u-boot, mais lisez aussi la section 3.7 :
1ère partie de 3.7 :
3.7.1. Systèmes avec un firmware U-Boot
Comme mentionné précédemment, il n'existe malheureusement pas de norme pour le firmware système sur les systèmes ARM. Même le comportement de différents systèmes utilisant nominalement le même firmware peut être assez différent. Cela est dû au fait qu'une grande partie des appareils utilisant l'architecture ARM sont des systèmes embarqués, pour lesquels les fabricants construisent généralement des versions de firmware fortement personnalisées et incluent des correctifs spécifiques au périphérique. Malheureusement, les fabricants soumettent souvent leurs modifications et extensions aux développeurs de firmware principaux, donc leurs modifications ne sont pas intégrées dans les versions plus récentes du firmware d'origine.
Par conséquent, même les systèmes récemment vendus utilisent souvent un firmware basé sur une version modifiée par le fabricant il y a des années, dont le code source principal a évolué depuis lors et offre des fonctionnalités supplémentaires ou montre un comportement différent dans certains aspects. En plus de cela, la désignation des périphériques intégrés n'est pas cohérente entre différentes versions modifiées par le fabricant du même firmware, il est donc presque impossible de fournir des instructions product-indépendantes utilisables pour les systèmes basés sur ARM.
Si vous avez un système connu, la section 5.1.3.1 détaille comment le faire. Il y a cependant des directives générales et vous devrez probablement les ajuster pour votre cas spécifique.
5.1.3.1. Amorçage TFTP dans U-Boot
L'initialisation réseau sur les systèmes utilisant le firmware U-Boot se compose de trois étapes :
- a) configuration du réseau,
- b) chargement des images (noyau/ramdisk initial/dtb) en mémoire
- c) exécution du code précédemment chargé.
Tout d'abord, vous devez configurer le réseau, soit automatiquement via DHCP en exécutant
setenv autoload no
dhcp
ou manuellement en définissant plusieurs variables d'environnement
setenv ipaddr
setenv netmask
setenv serverip
setenv dnsip
setenv gatewayip
Si vous le préférez, vous pouvez rendre ces paramètres permanents en exécutant
saveenv
Ensuite, vous devez charger les images (noyau/ramdisk initial/dtb) en mémoire. Cela se fait avec la commande tftpboot, à laquelle il faut fournir l'adresse à laquelle l'image doit être stockée en mémoire. Malheureusement, la carte mémoire peut varier d'un système à l'autre, il n'y a donc pas de règle générale concernant les adresses pouvant être utilisées pour cela.
Dans certains systèmes, U-Boot pré-définit un ensemble de variables d'environnement avec des adresses de chargement adaptées : kernel_addr_r, ramdisk_addr_r et fdt_addr_r. Vous pouvez vérifier s'ils sont définis en exécutant
printenv kernel_addr_r ramdisk_addr_r fdt_addr_r
S'ils ne sont pas définis, vous devez consulter la documentation de votre système pour des valeurs appropriées et les définir manuellement. Pour les systèmes basés sur les SOC Allwinner SunXi (par exemple, l'Allwinner A10, nom d'architecture “sun4i” ou l'Allwinner A20, nom d'architecture
“sun7i”), vous pouvez par exemple utiliser les valeurs suivantes :
setenv kernel_addr_r 0x46000000
setenv fdt_addr_r 0x47000000
setenv ramdisk_addr_r 0x48000000
Une fois les adresses de chargement définies, vous pouvez charger les images en mémoire depuis le serveur TFTP précédemment défini avec
tftpboot ${kernel_addr_r}
tftpboot ${fdt_addr_r}
tftpboot ${ramdisk_addr_r}
La troisième partie consiste à définir la ligne de commande du noyau et à exécuter le code chargé. U-Boot transmet le contenu de la variable d'environnement “bootargs” comme ligne de commande au noyau, donc tous les paramètres pour le noyau et l'installateur - tels que le périphérique de console (voir la section 5.3.1, “Console de démarrage”) ou les options de préconfiguration (voir la section 5.3.2, “Paramètres de l'installateur Ubuntu” et l'annexe B, Automatisation de l'installation en utilisant la préconfiguration) - peuvent être définis avec une commande comme
setenv bootargs console=ttyS0,115200 rootwait panic=10
La commande exacte pour exécuter le code chargé dépend du format de l'image utilisé. Avec uImage/uInitrd, la commande est
bootm ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}
et avec des images Linux natives, c'est
bootz ${kernel_addr_r} ${ramdisk_addr_r}:${filesize} ${fdt_addr_r}
Remarque : Lors du démarrage des images Linux standards, il est important de charger l'image du ramdisk initial après le noyau et le dtb car U-Boot définit la variable filesize sur la taille du dernier fichier chargé et la commande bootz nécessite la taille de l'image du ramdisk pour fonctionner correctement. En cas de démarrage d'un noyau spécifique à la plate-forme, c'est-à-dire un noyau sans arborescence de périphériques, il suffit d'omettre le paramètre ${fdt_addr_r}.