La première chose à savoir, c'est qu'un programme est fait pour s'exécuter sur un type de processeur donné. Pour l'utiliser avec un autre type de processeur, il faut le recompiler. Sauf que toutes les plateformes cibles ne permettent pas de compiler directement un programme. C'est là qu'intervient la cross compilation.

Qu'est ce que la cross compilation ? C'est le fait de compiler les sources d'un programme sur une autre plateforme informatique que celle pour laquelle se destine le programme compilé.

Dans notre cas, nous allons compiler sur notre PC des drivers pour notre NAS Synology, afin de pouvoir y brancher un périphérique USB permettant de suivre la consommation électrique de la maison.

Pré-requis

Pour cross-compiler les drivers de votre Syno, nous avons besoin d'un PC tournant sous Linux. Si vous n'avez pas ça sous la main ou si vous n'y connaissez rien, pas de panique, tout est expliqué.

Si vous n'avez pas de PC sous linux, vous allez devoir télécharger (c'est gratuit et légal) :

  1. VMware Player : ce logiciel permet de créer une machine virtuel sur votre PC sous Windows
  2. Une distribution linux. J'ai choisi une des plus simples : Ubuntu.

Ensuite, il faut télécharger des fichiers fournis gratuitement par Synology :

  1. La toolchain Synology, dans notre cas gcc421_glibc25_88f6281-GPL.tgz
  2. Les sources du DSM qui contiennent les drivers, dans notre cas synogpl-3776-6281

Attention : Les fichiers Synology doivent être adaptés à votre modèle de NAS (en fonction du processeur) et à la version du DSM que vous utilisez. Dans mon cas c'est un DS212 avec DSM 4.3.

Installer un système linux

Si vous êtes déjà sur un PC avec Linux, passez à l'étape suivante, sinon c'est très simple :

  1. Installez VMware Player en lançant l'installateur et en suivant les consignes
  2. Exécutez VMWare Player, et cliquez sur Create a new virtual machine.
  3. VMWare_Player demande alors de sélectionner le lecteur ou l'ISO contenant le système d'exploitation à installer : Installez Ubuntu en sélectionnant le fichier d'installation que vous avez téléchargé.

Après cette étape, votre système Ubuntu doit se lancer dans une fenêtre Windows classique.

Cross compilation des drivers

Décompresser la toolchain

Attention, dans le texte qui suit, remplacez "monuser" par votre user sous linux (sans les guillemets).

  1. Copiez le fichier gcc421_glibc25_88f6281-GPL.tgz dans /home/"monuser"
  2. Ouvrez un terminal
  3. Pour obtenir les droits root, tapez :
sudo -i
  1. Allez dans le répertoire du fichier gcc421_glibc25_88f6281-GPL.tgz
  2. Tapez la commande suivante :
tar zxpf gcc421_glibc25_88f6281-GPL.tgz -C /usr/local/

Positionner des variables d'environnements

Ensuite il faut préparer l’environnement de compilation en positionnant différentes variables avec ces commandes.

Attention, il faut adapter ces valeurs en fonction de la toolchain que vous avez téléchargée. Si votre NAS est basé sur une architecture PowerPC, il faudra remplacer arm-none-linux-gnueabi par powerpc-linux-gnuspe par exemple.

  1. Tapez les commandes suivantes:
export CFLAGS="-I/usr/local/arm-none-linux-gnueabi/include"
export LDFLAGS="-L/usr/local/arm-none-linux-gnueabi/lib"
export RANLIB=/usr/local/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-ranlib
export LD=/usr/local/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-ld
export CC=/usr/local/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-gcc
export LD_LIBRARY_PATH=/usr/local/arm-none-linux-gnueabi/lib
export ARCH=arm

Préparer les sources du DSM

Il faut décompresser les fichiers :

  1. Copiez l'archive contenant les sources du DSM dans le même répertoire que gcc421_glibc25_88f6281-GPL.tgz
  2. Décompressez les fichiers avec la commande :
tar -xjvf synogpl-3776-6281 -C /usr/local/arm-none-linux-gnueabi/

Ensuite, il faut configurer le kernel pour le processeur de votre Nas Synology. Pour ça il faut copier le fichier de configuration de votre processeur à la racine de la source du kernel :

cp /usr/local/arm-none-linux-gnueabi/source/linux-2.6.32/synoconfigs/88f6281 /usr/local/arm-none-linux-gnueabi/source/linux-2.6.32/.config

Pour vérifier la configuration du kernel, tapez les commandes suivantes :

cd /usr/local/arm-none-linux-gnueabi/source/linux-2.6.32/
make oldconfig

Ensuite vous pouvez modifier la configuration avec la commande :

make menuconfig

Attention, vous pouvez parfois rencontrer l'erreur suivante :

 *** Unable to find the ncurses libraries or the
 *** required header files.

Il suffit de taper cette commande :

sudo apt-get install libncurses5-dev

Grace à menuconfig, vous pouvez très facilement choisir quels drivers vous souhaitez compiler.

Ici je veux compiler les drivers usb/séries. Ils se trouvent dans Device Drivers > USB Support > USB serial converter.

Il faut mettre un M en fasse des drivers qui vous intéressent.

Pour info, les drivers pour les webcams ce trouve dans Device Drivers > Multimédia support > Video For Linux.

Après avoir sauvegarder le .config modifié (faire exit jusqu’à ce que le programme demande si vous souhaitez enregistrer vos modification), vous pouvez lancer la compilation des drivers avec la commande :

make modules

Attention, vous allez peut être rencontrer l'erreur suivante :

make: /usr/local/powerpc-none-linux-gnuspe/bin/powerpc-none-linux-gnuspe-gcc: Command not found
scripts/kconfig/conf -s arch/arm/Kconfig

Pour passer cette étape, vous devez modifier le fichier Makefile. Dans ce fichier, recherchez ARCH et CROSS_COMPILE, et indiquez les valeurs adaptées à votre NAS.

Par exemple :

ARCH=arm
CROSS_COMPILE=/usr/local/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-

La compilation est longue, pas de panique, c'est normal.

Une fois terminée, les drivers que vous avez compilés sont dans ce répertoire :

drivers/usb/serial/