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 BCM2835 de la 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 amd64, 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 3.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/rpi_rootfs cd $WORKDIR/linux
- Sélectionnez la configuration du noyau pour raspberry pi (bcmrpi pour le SoC broadcom):
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 (Attention ! Cela crée des liens symboliques vers build et sources dans rpi_rootfs, ne pas les transferer vers la RPI !)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=$WORKDIR/kernel_output INSTALL_MOD_PATH=$WORKDIR/rpi_rootfs 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 dans un repertoire intermediaire $WORKDIR/rpi_rootfs
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNELDIR=$WORKDIR/kernel_output INSTALL_MOD_PATH=$WORKDIR/rpi_rootfs modules_install
Installez les headers (toujours dans le repertoire intermediaire $WORKDIR/rpi_rootfs)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNELDIR=$WORKDIR/kernel_output INSTALL_MOD_PATH=$WORKDIR/rpi_rootfs headers_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 nouveaux fichiers dans le vrai root filesystem de la rpi (ici les modules noyau et des nouveau .h)
cd $WORKDIR/rpi_rootfs 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 tar xjvf firmware.tar.bz2 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
- script qui fait tout (à customiser pour le ftp) : http://openwrt.metaverse.fr/rpi/makeKernel.sh
- Derniers builds : http://openwrt.metaverse.fr/rpi/
- http://airlab.elet.polimi.it/index.php/Cross-compiling_for_the_RaspberryPi
- http://elinux.org/RPi_Kernel_Compilation