Compilation du noyau Linux pour DE10nano

introduction

Pour une carte à bas prix Terasic DE10 nano avec FPGA intégré au processeur ARM J'écrirai sur la façon de construire et de mettre à jour le noyau Linux.

Plusieurs images de carte SD Linux pour cette carte ont été téléchargées sur le site Terasic, et si vous vous enregistrez en tant qu'utilisateur, vous pouvez télécharger et démarrer Linux immédiatement. En jouant avec cette carte, si vous essayez d'ajouter un pilote de noyau ou de configurer FPGA avec la superposition de l'arborescence des périphériques, vous voudrez créer le noyau vous-même.

emballer

Si vous avez l'habitude de créer un Linux embarqué, ces informations devraient être suffisantes.

--Souce au noyau - https://github.com/altera-opensource/linux-socfpga

Les choses nécessaires

--PC pour le développement. Le système d'exploitation est Ubuntu Linux. Ce sera OK même s'il fonctionne dans l'environnement suivant. - Virtual Machine - Windows SubSystem for Linux(WSL) - Docker container

Contenu du travail

Le contenu de la carte SD nécessaire pour faire fonctionner Linux peut être divisé en deux types: lié au noyau et système de fichiers racine. Seuls les fichiers liés au noyau sont générés ici, et les fichiers du système de fichiers racine sont utilisés tels quels.

procédure

Reportez-vous à la documentation sur le site du portail Linux RocketBoards.org pour les FPGA Intel SoC. https://rocketboards.org/foswiki/Documentation/GSRDCompilingLinux Vous exécuterez la partie Construction du noyau Linux de «5. Construction du noyau et de l'U-Boot séparément à partir des arbres Git» dans.

Préparation environnementale

Tout d'abord, téléchargez le compilateur croisé et préparez les commandes requises pour la construction du noyau. Par exemple, si le PC de développement est Ubuntu 18.04 (64 bits) dans son état d'origine, les packages suivants sont requis au minimum.

$ sudo apt update
$ sudo apt install -y wget git build-essential bc kmod libncursesw5-dev
$ sudo apt install -y lib32stdc++6 lib32ncurses5 lib32z1 

Téléchargement du compilateur croisé

Téléchargez le compilateur croisé et définissez la variable d'environnement CROSS_COMPILE. Je travaille sous le répertoire personnel ici, mais vous pouvez aller dans n'importe quel répertoire que vous aimez (dans ce cas, changez le PATH défini dans CROSS_COMPILE en conséquence).

$ cd ~
$ wget https://releases.linaro.org/archive/14.04/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.bz2 --no-check-certificate
$ tar xjf gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.bz2
$ export CROSS_COMPILE=~/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/bin/arm-linux-gnueabihf-

Télécharger la source du noyau

Clonez la source du noyau à partir du référentiel Git. Ensuite, consultez votre branche ou étiquette préférée. Dans l'exemple, la branche socfpga-4.14.130-ltsi est extraite. Encore une fois, je commence à travailler dans mon répertoire personnel, mais faites-le où vous voulez. Vous pouvez changer le "test_branch" après -b en n'importe quel nom que vous voulez.

$ cd ~
$ git clone https://github.com/altera-opensource/linux-socfpga
$ cd linux-socfpga
$ git checkout -b test_branch origin/socfpga-4.14.130-ltsi 

construire zImage, .dtb

Enfin, créez le corps du noyau cible final, zImage et l'arborescence des périphériques. (En supposant que l'exportation CROSS_COMPILE = ... est déjà définie)

$ export ARCH=arm 
$ make socfpga_defconfig
$ make zImage
$ make socfpga_cyclone5_de0_sockit.dtb

Ce qui précède générera zImage sous arch / arm / boot / et socfpga_cyclone5_de0_sockit.dtb sous arch / arm / boot / dts /. D'ailleurs, socfpga_cyclone5_de0_sockit.dtb est un fichier d'arborescence de périphériques pour DE10 nano. Remplacez-les par les fichiers zImage, .dtb dans la partition FAT de votre carte SD.

Exemple d'écriture sur une carte SD

Tout d'abord, vous devez vérifier le contenu de la partition de la carte SD à réécrire (une carte qui peut démarrer DE10nano sous Linux). Insérez la carte SD dans le PC de développement et affichez les informations de partition. Si le nom de périphérique de la carte SD sur votre PC est / dev / mmcblk0 La commande est sudo fdisk -l / dev / mmcblk0.

$ sudo fdisk -l /dev/mmcblk0
...Abréviation...
Device         Boot  Start     End Sectors  Size Id Type
/dev/mmcblk0p1        2048  206848  204801  100M  b W95 FAT32
/dev/mmcblk0p2      227331 7395332 7168002  3.4G 83 Linux
/dev/mmcblk0p3      206849  227330   20482   10M a2 unknown

À partir de ces informations, vous pouvez voir que la partition FAT est Partition1 (/ dev / mmcblk0p1) et la partition Linux est Partition2 (/ dev / mmcblk0p2).

Réécrivez zImage et .dtb dans la partition1 (/ dev / mmcblk0p1) de la partition FAT avec la vôtre. Par exemple, sur le site Terasic Page de ressources du kit DE10-Nano Si vous utilisiez l'image de la carte MicroSD de "Linux LXDE Desktop (noyau 4.5)", le fichier correspondant dans la partition FAT est nommé zImage, soc_system.dtb, remplacez-les.

$ sudo mount /dev/mmcblk0p1 /mnt
$ cp /mnt/zImage /mnt/zImage.org
$ cp /mnt/soc_system.dtb /mnt/soc_system.dtb.org
$ cp arch/arm/boot/zImage /mnt 
$ cp arch/arm/boot/dts/socfpga_cyclone5_de0_sockit.dtb /mnt/soc_system.dtb
$ sudo umount /mnt

(En supposant que le nom de périphérique de la carte SD est / dev / mmcblk0 et que le répertoire vide / mnt existe déjà)

Modules de noyau aussi

Les paramètres du noyau sont définis à la fois avec le make socfpga_defconfig ci-dessus, mais ceux définis ici incluent également le module avec le paramètre [M] qui n'est pas inclus dans zImage et est défini sur un fichier séparé (.ko) en tant que module. Il y a plusieurs. Comme ce sont également des fichiers liés au noyau, écrivez-les à l'emplacement spécifié sur la carte SD. Ceci est également nécessaire si vous souhaitez utiliser le module sélectionné comme [M] dans le paramètre Kernel (bien que je ne pense pas que ce soit nécessaire dans la plage où vous utilisez normalement DE10 nano).

$ make modules
$ mkdir /tmp/kmod
$ make modules_install INSTALL_MOD_PATH=/tmp/kmod
$ cd /tmp/kmod
$ tar cvzf /tmp/mod.tgz *
$ sudo mount /dev/mmcblk0p2 /mnt
$ sudo tar xf /tmp/mod.tgz -C /mnt
$ sudo umount /mnt
$ rm -rf /tmp/mod.tgz /tmp/kmod

(Ceci est un exemple lorsque le nom de périphérique de la carte SD est / dev / mmcblk0 et la partition Linux de la carte SD est / dev / mmcblk0p2) (Dans cet exemple, / tmp / kmod / lib / modules / \ * / build, / tmp / kmod / lib / modules / \ * / source est un lien symbolique vers le répertoire Kernel Source sur votre PC de développement. Dans ce cas, copiez-le dans un autre environnement avec, je pense que c'est correct de les supprimer puis de tar cvzf .. Parce que c'est un lien symbolique qui sera nécessaire lors de la construction du module à l'avenir sur l'environnement côté ARM. )

Pilote FrameBuffer bonus ajouté

L'image de la carte SD fournie par Terasic a une image qui vous permet d'utiliser l'interface graphique du moniteur HDMI (comme l'image "Linux LXDE Desktop" ci-dessus), mais si vous la réécrivez dans le noyau créé dans la procédure ci-dessus, Il n'y a pas de sortie moniteur. Le pilote pour la sortie du moniteur (pilote de tampon de trame) n'est pas inclus dans le socfpga_defconfig par défaut. Afin d'activer la sortie du moniteur, il est nécessaire de créer un noyau contenant un pilote de tampon de trame. Entre make socfpga_defconfig et make zImage mentionné ci-dessus

$ make menuconfig 

Veuillez exécuter le. Cela lancera l'interface graphique pour définir les paramètres du noyau, utilisez donc pleinement les touches de curseur et la touche Entrée. Allez sur la ligne Device Drivers-> Graphics support-> Frame buffer Devices-> Altera VIP Frame Reader framebuffer support et marquez-la comme <*> (avec la touche Espace). Sélectionnez enregistrer dans le menu en bas et enregistrer dans .config pour quitter. Ensuite, vous devez également ajouter un fichier d'arborescence de périphériques pour lancer le tampon d'images que vous venez d'activer. Copiez socfpga_cyclone5_de0_sockit.dts comme socfpga_cyclone5_de10nano_FB.dts et utilisez votre éditeur préféré pour modifier socffpga_cyclone5_de10nano_FB.dts.

$ cd arch/arm/boot/dts
$ cp socfpga_cyclone5_de0_sockit.dts socfpga_cyclone5_de10nano_FB.dts
$ vi socfpga_cyclone5_de10nano_FB.dts #Éditer
$ cd ../../../..

La modification consiste à ajouter ce qui suit à la fin du fichier.

&base_fpga_region {
        ranges =  <0x00000000 0xff200000 0x00200000>;

        alt_vip_vfr_hdmi: vip@0x100031000 {
		compatible = "ALTR,vip-frame-reader-14.0", "ALTR,vip-frame-reader-9.1";
		reg = <0x00031000 0x00000080>;
		max-width = <1024>;
		max-height = <768>;
		bits-per-color = <8>;
		colors-per-beat = <4>;
		beats-per-pixel = <1>;
		mem-word-width = <128>;
	};
};

Créez ensuite une arborescence de périphériques .dtb avec la zImage renommée et remplacez-les par les fichiers de la carte SD.

$ make zImage
$ make socfpga_cyclone5_de10nano_FB.dtb

Résumé

J'ai écrit comment construire et mettre à jour uniquement le noyau Linux de la carte SD DE10 nano Linux. En fait, il y a un aspect que j'ai écrit ce contenu parce qu'il était nécessaire dans "FPGA Config with Device Tree Overlay" écrit dans un autre article. Dans l'exemple de commande de travail ci-dessus, la carte SD du DE10nano est insérée dans le PC de développement, montée et le contenu est réécrit, mais j'ai connecté le DE10nano et le PC de développement avec Ethernet et je l'ai généré avec le PC de développement. Je travaille en envoyant le binaire à DE10nano avec scp et en réécrivant le fichier avec DE10nano (car il est difficile d'insérer et de retirer la carte SD).

Matériel de référence

Référence: Compiling Linux du site portail Linux pour Intel SoC FPGA

Recommended Posts

Compilation du noyau Linux pour DE10nano
pyenv pour linux
Créer un environnement de développement mruby pour ESP32 (édition Linux)
À propos des paramètres du noyau Linux
Version du noyau Linux 5.x (2/4)
[Pour mémoire] Linux Partie 2
Vérifiez la version du noyau Linux
Version du noyau Linux 5.x (3/4)
À quoi sert Linux?
Votre propre Koredake est une commande Linux
Version du noyau Linux 5.x (4/4)
Version du noyau Linux 5.x (1/4)
[Linux] [module de noyau] Construire et charger un module de noyau chargeable simple
[Linux] WSL2 Créer un environnement pour laravel7 avec Ubuntu 20.04
Noyau Linux auto-construit avec clang
Distribution Linux recommandée pour les débutants
Canaux de plateforme Flutter pour Linux
Dictionnaire de commande Linux (pour moi-même)
Mémorandum de commande Linux [pour les débutants]
[Reconstruction du noyau LINUX] Mise à jour (4.18.0 → 5.8.8)
Raccourci Linux pratique (pour les débutants)
Jusqu'à ce que diverses implémentations de cryptage dans Linux Kernel for ARM soient appelées
Documentation relative au modèle de mémoire du noyau Linux
[Pour mémoire] Éditeur Linux Partie 1 vi
Essayez le mécanisme de verrouillage du noyau Linux
[Note] Construction et utilisation du noyau WSL2
[Linux] [module du noyau] Créer kthread dans le module du noyau
Touche de raccourci pratique pour les commandes Linux! !! !!
Commandes Linux fréquemment utilisées (pour les débutants)
[À voir pour les débutants] Bases de Linux
analyse de la source linux (noyau): appel système
Procédure d'installation de Teamviewer pour Linux (CentOS)
pykintone sur le sous-système Windows pour Linux
Formation de base Linux pour l'ingénieur front-end
Utiliser Azure AD pour l'authentification Linux
Remarques sur l'utilisation de KUnit, le mécanisme de test unitaire du noyau Linux
Exécutez XRT (Xilinx Runtime) sur Debian GNU / Linux pour Ultra96 / Ultra96-V2 (Build)