Où sommes nous ?

Retour

Mainline U-Boot

Ma source

Même si elle n'est pas d'une clareté violente:

La doc de SunXI

Lors de l'installation précédente, le Board Support Package avait fait tout le travail à notre place et avait installé entre autre U-Boot, le boot loader des BananaPI. Sauf que le dit BSP était bloqué à l'antique noyau 3.4.x associé à un non moins antédiluvien U-Boot.
Les kernels récents nécessitent un U-Boot à la page ... heureusement, pas de big-bang, car ce dernier fonctionne aussi avec notre vieux kernel.

Première étape donc : mettre à jour U-Boot et continuer à booter sous 3.4.x

Note importante

U-boot permet maintenant d'afficher ses informations aussi sur un écran (HDMI, VGA ou composite, voir ses options).
Il n'empêche que je ne saurais trop recommander l'usage d'un câble permettant l'accès à la console ... indispensable si quelque chose ne va pas !

Préparons le terrain

Nous allons avoir besoin de 2 outils supplémentaires pour mener à bien cette installation :

emerge -va dtc dev-embedded/u-boot-tools

Récupération des sources

Pas besoin d'être joueur ici : évitons les problèmes en prenant la dernière version stable.

cd bPI
git clone git://git.denx.de/u-boot.git
cd u-boot

Compilation

Accélérons les choses

Il faut bien avouer que notre A20 n'est pas des plus rapide pour les grosses compilations : comme je le sais avec portage, j'utiliserai donc la puissance des autres machines de mon parc grâce à distcc.

Dorénavant, la compilation d'U-Boot ressemble étrangement à celle du ... kernel.

Détermination de la cible

Pas de surprise, pas de piège, le BananaPI (ainsi d'ailleurs que le BananaPro) fait partie des cibles connues :

make Bananapi_defconfig

la compilation en elle-même

make CC="distcc" -j4

On obtient dans la racine des sources la tant convoitée image d'U-Boot :

-rw-r--r--   1 laurent laurent  494509 26 avril 00:20 u-boot-sunxi-with-spl.bi

Le script de démarrage

Il ne reste plus qu'à créer le script de démarrage comme suit :

setenv bootm_boot_mode sec
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait panic=10
load mmc 0:1 0x43000000 script.bin || load mmc 0:1 0x43000000 boot/script.bin
load mmc 0:1 0x42000000 uImage || load mmc 0:1 0x42000000 boot/uImage
bootm 0x42000000

et à le compiler par un

mkimage -C none -A arm -T script -d boot.cmd boot.scr

A noter que pour cet exemple, je n'ai rajouté aucun paramètre au kernel : on trouvera sur cette page quelques options qui peuvent libérer quelques mégas de RAM.

Installation sur la SD

Maintenant que nous avons les binaires, il est temps de graver notre SD.
Même si on a une confiance inébranlable dans la technique, il est évidemment beaucoup plus sûr d'utiliser une SD vierge : on garde ainsi sous la main le système qui fonctionne, sur la carte originale.

La nouvelle SD sera gravée sur un PC où elle est présentée en tant que sdb (ce qui apparait clairement dans /var/logs/messages à son insertion).

Installation du boot loader

Effacement de ce qui pourrait s'y trouver précédemment :

dd if=/dev/zero of=/dev/sdb bs=1M count=1

Installation de l'image que nous venons de compiler

dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1024 seek=8

Et enfin création des 2 partitions :

sfdisk -R ${card}
cat <<EOT | sfdisk --i-order -L -uM /dev/sdb
1,32,c
,,L
EOT

Et leur formatage

mkfs.vfat /dev/sdb1
mkfs.ext4 /dev/sd2

La partition de boot (sdb1)

Comme nous l'avons vu plus haut, 2 partitions ont été créées sur la SD. Dans la première, nous allons y placer ce qui permet au système de charger son noyau, à savoir :

La partition root (sdb2)

La 2nd partition doit contenir le stage3 du système ... que nous allons récupérer lui-aussi de notre SD originale. Combien de fois ai-je lu sur les forums qu'il fallait passer par une copie de bas niveau par dd ou outils du même genre. Mouai, quelle perte de temps : ce n'est qu'un file system comme un autre et un simple tar est suffisant (et beaucoup plus rapide).
Genre

tar cvf /pt_montage_sdb2 /dir_ou_il_y_a_de_la_place/root.tar

puis, après avoir inséré la nouvelle carte

tar xvf /dir_ou_il_y_a_de_la_place/root.tar /pt_montage_sdb2

On passe par tar, car les PC n'ont généralement qu'un emplacement pour les cartes SD. De plus, le tar préserve les droits particuliers que peuvent avoir les fichiers.

Il ne reste plus qu'à booter

On éjecte proprement la carte du PC, on l'insère délicatement dans le BananaPI, on l'alimente et ... RIEN ! Seule la LED rouge s'éclaire, mais la verte reste désespérément éteinte et la machine n'apparaît pas sur le réseau.

Heureusement, vous avez attaché un câble de console où on voit qu'U-Boot a bien tenté quelque chose mais n'est pas content :

Error: unrecognized/unsupported machine ID (r1 = 0x100010bb).

Si c'est le cas, c'est que le kernel 3.4 était trop vieux et il existe une configuration pour U-Boot pour corriger la situation. Retour dans le répertoire des sources de ce dernier

Configuration d'U-Boot

Comme je le disais précédemment, U-Boot reprend plus ou moins la même philosophie que celle du kernel pour sa configuration, qui se fait par un

make CC="distcc" -j4 menuconfig

pour se retrouver dans le même genre de menu

 .config - U-Boot 2017.05-rc2 Configuration
 ─────────────────────────────────────────────────────────────────────────────────────────────────────────────
  ┌─────────────────────────────────── U-Boot 2017.05-rc2 Configuration ───────────────────────────────────┐
  │  Arrow keys navigate the menu.  <Enter> selects submenus ---> (or empty submenus ----).  Highlighted   │ 
  │  letters are hotkeys.  Pressing <Y> includes, <N> excludes, <M> modularizes features.  Press           │ 
  │  <Esc><Esc> to exit, <?> for Help, </> for Search.  Legend: [*] built-in  [ ] excluded  <M> module     │ 
  │  < > module capable                                                                                    │ 
  │ ┌────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ 
  │ │                   Architecture select (ARM architecture)  --->                                     │ │ 
  │ │                   ARM architecture  --->                                                           │ │ 
  │ │                   General setup  --->                                                              │ │ 
  │ │                   Boot images  --->                                                                │ │ 
  │ │                   API  --->                                                                        │ │ 
  │ │                   Boot timing  --->                                                                │ │ 
  │ │                   Boot media  --->                                                                 │ │ 
  │ │                   Environment  --->                                                                │ │ 
  │ │               (2) delay in seconds before automatically booting                                    │ │ 
  │ │                   Console  --->                                                                    │ │ 
  │ │               ()  Default fdt file                                                                 │ │ 
  │ │               [ ] add U-Boot environment variable vers                                             │ │ 
  │ │               [*] Display information about the CPU during start up                                │ │ 
  │ │               [*] Display information about the board during start up                              │ │ 
  │ │                   Start-up hooks  --->                                                             │ │ 
  │ │                   SPL / TPL  --->                                                                  │ │ 
  │ │                   Command line interface  --->                                                     │ │ 
  │ └───────────────↓(+)─────────────────────────────────────────────────────────────────────────────────┘ │ 
  ├────────────────────────────────────────────────────────────────────────────────────────────────────────┤ 
  │                        <Select>    < Exit >    < Help >    < Save >    < Load >                        │ 
  └────────────────────────────────────────────────────────────────────────────────────────────────────────┘ 
   


La page du Wiki de SunXI liste quelques problèmes qui peuvent survenir : dans mon cas, j'ai activé l'option "Enable workarounds for booting old kernels" qui se trouve sous "ARM architecture". Ils indiquent aussi que j'aurai pu mettre-à-jour mon kernel vers la dernière version de leur repo pour 3.4, mais je n'allais pas m'acharner alors que mon but est justement de passer à une version 4.x.

On recompile U-Boot, on l'installe sur la SD et zou, problème résolu !


Visitez :
La liste de nos voyages
Nos sorties Ski et rando
Copyright Laurent Faillie 2001-2024
N'oubliez pas d'entrer le mot de passe pour voir aussi les photos perso.
Contactez moi si vous souhaitez réutiliser ces photos et pour les obtenir avec une plus grande résolution.
Visites durant les 7 derniers jours Nombre de visites au total.

Vous pouvez laissez un commentaire sur cette page.

  Le Mardi 20 Juin 2017,"Jean-Marc" a écrit à propos de cette page  

Bonjour,


J'essaye de compiler la version actuelle de U-Boot (2017.07-rc2) mais j'ai l'erreur suivante:


"ImportError: No module named _libfdt"


Avez-vous rencontre ce probleme?


Merci,


JM