RPiLinuxKernelBuild
Il se peut que vous ayez besoin de recompiler un noyau linux sur la RPI, pour le fun, pour porter vos propres modules kernel,... Voici un petit tuto pas trop compliqué (mais un peu long...). En résumé:
- Configurer et cross-compiler le noyau linux pour le SoC Broadcom RPI
- Cross-compiler les modules noyau tiers
- Installer le nouveau noyau sur la RPI
- Installer les modules noyau sur la RPI
- Copier le nouveau firwmare sur la RPI
En cross compilation (Pas sur la RPI !!!)
La compilation sous linux i386 ou amd64
export WORKDIR=directory de travail # genre /home/pi/kernel_build cd $WORKDIR
Récupérez les compilateurs précompilés (32bits)
git clone https://github.com/raspberrypi/tools.git
On a 3 compilos différents :
arm-bcm2708-linux-gnueabi arm-bcm2708hardfp-linux-gnueabi gcc-linaro-arm-linux-gnueabihf-raspbian
Le 3eme est le plus performant (utilisation du FPU hardware)
NB : si vous êtes en 64bits, installez ia32-libs.
PATH=$PATH:$WORKDIR/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin
Récupérez le code source du noyau (branche 2.2.27 ou 3.6.y)
git clone https://github.com/raspberrypi/linux.git
Préparez l'environnemetn de compilation:
mkdir -p $WORKDIR/kernel_output mkdir -p $WORKDIR/kernel_modules_output cd $WORKDIR/linux
Sélectionnez la configuration du noyau pour raspberry pi:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=$WORKDIR/kernel_output bcmrpi_defconfig
C'est une bonne idée de mettre un "nom" perso à ce noyau (pour éviter que le répertoire des modules soit le mêmes que celui du noyau par défaut de la distrib)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=$WORKDIR/kernel_output menuconfig
Dans "General Setup", selectionnez "Local version - append to kernel release" et mettez par exemple votre nom.
En même temps cochez "Automatically append version information to the version string". Ca permet d'ajouter le SHA1 git utilisé dans le nom du kernel.
Compilez le kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=$WORKDIR/kernel_output
Copiez les modules
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=$WORKDIR/kernel_output INSTALL_MOD_PATH=kernel_modules_output' modules_install
la compilation de modules noyau tiers
Exemple: Compilation de Directfb fusion
cd $WORKDIR git clone git://git.directfb.org/git/directfb/core/linux-fusion.git cd linux_fusion make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNELDIR=$WORKDIR/kernel_output
Installez les modules
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNELDIR=$WORKDIR/kernel_output INSTALL_MOD_PATH=$WORKDIR/kernel_modules_output modules_install
Installez le nouveau noyau sur la RPI
Préparez une carte SD
- Récupérez une image de la distribution cible (genre Raspbian)
- Flashez l'image sur la carte SD
Le noyau
- Création de l'image noyau attendu par le bootloader
cd $WORKDIR/tools/mkimage ./imagetool-uncompressed.py $WORKDIR/kernel_output/arch/arm/boot/zImage
- Bootez la RPI avec l'ancien noyau
- Copier l'image sur la RPI
scp $WORKDIR/tools/mkimage/kernel.img pi@<rpi_ip>:/boot/my_kernel.img (ou depuis la partition FAT sous windows, ajoutez le fichier my_kernel.img à la racine)
- Copier les modules noyau dans /lib
cd <modules_path> tar cpf - * | ssh pi@<rpi_ip> "sudo tar xpf - -C /"
Le firmware
- Récupérez le firmware (compatible!)
git clone https://github.com/raspberrypi/firmware git archive master | bzip2 >firmware.tar.bz2 scp $WORKDIR/firmware.tar.bz2 pi@<rpi_ip>:/tmp/
- Copiez le firmware dans /opt sur la RPI
cd /tmp bunzip2 firmware.tar.bz2 tar -xvf firmware.tar sudo cp -R firmware/hardfp/opt/* /opt/ sudo cp -R firmware/boot/* /boot/
La config
- Sur la raspberry pi dans le /boot/config.txt (ou le fichier config.txt de la partition 1 en fat) dire qu'on veut booter avec le noyau my_kernel.img
kernel=my_kernel.img
- Rebootez
sources
http://airlab.elet.polimi.it/index.php/Cross-compiling_for_the_RaspberryPi