Ceci est une ancienne révision du document !
Table des matières
Projet Linux_LEDs, Linux avec PetaLinux pour allumer des DELs
Tout d'abord, si ce n'est déjà fait, il est nécessaire de “sourcer” les la chaine d'outils Vivado et PetaLinux
$ source /chemin_d_accès_Vivado/2015.2/settings64.sh $ source /chemin_d_accès_petalinux-v2015.2.1-final/settings.sh
Creation d'un projet PetaLinux
Aller dans le répertoire où l'on veut créer un projet PetaLinux correspondant à la partie matérielle créée avec Vivado. Exemple :
$ cd ~/projets_zync/Linux_LEDs
Créatoin du répertoire du projet contenant un canevas par défaut, avec la commade petalinux-create.
$ petalinux-create --type project --template zynq --name Petalinux_LEDs INFO: Create project: Petalinux_LEDs INFO: New project successfully created in /home/deneb/projets_zync/Linux_LEDs/Petalinux_LEDs
Les paramètres suivants servent à :
- –template zynq : crée un canevas spécifique au processeur type Zynq ;
- –name Petalinux_LEDs met le canvas dans un répertoire appelé Petalinux_LEDs.
Importation de la configuration matérielle
Cette étape permettra par la suite de construire un système Linux adapté à la configuration matérielle spécifique du projet Vivado voulu.
Aller dans le répertoire où l'on a créé le projet PetaLinux. Exemple :
$ cd ~/projets_zync/Linux_LEDs/Petalinux_LEDs
Importer le fichier de description du matériel (fichier .hdf) avec la commande petalinux-config en iduquant le répertoire où il se trouve. Par exemple :
$ petalinux-config --get-hw-description=~/projets_zync/Linux_LEDs/Linux_LEDs.sdk INFO: Checking component... INFO: Getting hardware description... INFO: Rename proc_et_LEDs_wrapper.hdf to system.hdf ****** hsi v (64-bit) **** SW Build --- on --- ** Copyright 1986-2015 Xilinx, Inc. All Rights Reserved. source /home/utilisateur/projets_zync/Linux_LEDs/Petalinux_LEDs/build/linux/hw-description/hw-description.tcl -notrace INFO: [Common 17-206] Exiting hsi at --- INFO: Config linux [INFO ] config linux
Quand petalinux-config –get-hw-description est exécuté pour la première fois pour le projet, le menu de configuration apparait.
Il est alors possible de personnaliser la configuration pour la contruction du noyau, de u-boot et des drivers. Laissons pour l'instant les valeurs par défaut. Acec les flèches du clavier, aller sur <Exit>. A la question Do you wish to save your new configuration?, répondre <Yes>.
configuration written to /home/utilisateur/projets_zync/Linux_LEDs/Petalinux_LEDs/subsystems/linux/config *** End of the configuration. *** Execute 'make' to start the build or try 'make help'. [INFO ] generate DTS to /home/deneb/projets_zync/Linux_LEDs/Petalinux_LEDs/subsy ... INFO: Config linux/kernel [INFO ] oldconfig linux/kernel INFO: Config linux/rootfs [INFO ] oldconfig linux/rootfs
Construction des images
Afin de construire les images du noyau, de u-boot et du système de fichiers lié au noyau, utiliser la commande :
$ petalinux-build INFO: Checking component... INFO: Generating make files and build linux INFO: Generating make files for the subcomponents of linux ... [INFO ] zImage linux/kernel [INFO ] install linux/kernel [INFO ] Package HDF bitstream
Les images seront sockées dans le répertoire PetaLinux du projet images/linux
$ ls images/linux/ image.elf system.dtb u-boot-s.elf zImage image.ub System.map.linux u-boot.srec zynq_fsbl.elf proc_et_LEDs_wrapper.bit u-boot.bin u-boot-s.srec rootfs.cpio u-boot.elf urootfs.cpio.gz rootfs.cpio.gz u-boot-s.bin vmlinux
Par défaut, petalinux-build génére une image FIT et une image RAM disk. L'image FIT (Flattened Image Tree) encapsule plusieurs images1).
Génération de l'image BOOT.BIN
L'image BOOT.BIN peut être mise dans la mémoire Flash ou une carte SD. Elle servira au démarrage lors de la mise sous tension de la carte. Elle contient généralement l'image du chargeur de premier niveau, le contenu du FPGA et u-boot.
$ petalinux-package --boot --fsbl images/linux/zynq_fsbl.elf --fpga /home/utilisateur/projets_zync/Linux_LEDs/Linux_LEDs.runs/impl_1/proc_et_LEDs_wrapper.bit INFO: Generating zynq binary package BOOT.BIN... INFO: Binary is ready. $ ls BOOT.BIN build components config.project hw-description images subsystems
Si on recrée une une image BOOT.BIN sur un projet existant, il faudra rajouter –force en option à la commande petalinux-package.
Empaquettage d'une image pré-construite
Cette étape n'est utilisée que pour démarrer avec JTAG/QEMU
$ petalinux-package --prebuilt --fpga /home/utilisateur/projets_zync/Linux_LEDs/Linux_LEDs.runs/impl_1/proc_et_LEDs_wrapper.bit INFO: Pre-built directory is updated. $ ls BOOT.BIN build components config.project hw-description images pre-built subsystems $ ls pre-built/ linux $ ls pre-built/linux/ etc images implementation $ ls pre-built/linux/images/ BOOT.BIN image.ub System.map.linux u-boot-s.bin zynq_fsbl.elf image.elf system.dtb u-boot.elf zImage $ ls pre-built/linux/implementation/ proc_et_LEDs_wrapper.bit
Les différentes images logicieles sont rassemblées dans le répertoire pre-built/linux/images/ et le fichier de programmation du FPGA est placé dans pre-built/linux/implementation/.
Si on recrée un empaquetage sur un projet existant, il faudra rajouter –force en option à la commande petalinux-package.
Démarrer à partir de la commande petalinux-boot
Pour démarrer l'exécution des images pré-construites, soit émulée par QEMU, soit téléchargée par JTAG, on utilise la commande petalinux-boot. Plusieurs niveaux sont possibles :
- télécharge la configuration de FPGA et le logiciel de chargement de premier niveau (FSBL - First Stage Boot Loader) ;
- télécharge la configuration de FPGA, le logiciel de chargement de premier niveau et démarre u-boot ;
- télécharge la configuration de FPGA, le logiciel de chargement de premier niveau, démarre u-boot et lance l'exécution du noyau pré-construit sur la cible.
Avant toutes choses, il va falloir renommer le fichier de programmation du FPGA en download.bit pour que le chargement puisse se faire 2)
$ cp pre-built/linux/implementation/proc_et_LEDs_wrapper.bit pre-built/linux/implementation/download.bit
Ici, au lieu de le renommer directement, on en fait une copie avec le nom download.bit. Ceci permet de le garder tel-quel, en cas de besoin.
Ensuite on peut charger les images sur la carte ZedBoard.
1) Télécharge la configuration de FPGA et le logiciel de chargement de premier niveau (FSBL - First Stage Boot Loader)
$ petalinux-boot --jtag --prebuilt 1 INFO: Launching XSDB for file download and boot. INFO: This may take a few minutes, depending on the size of your image. rlwrap: warning: your $TERM is 'xterm' but rlwrap couldn't find it in the terminfo database. Expect some problems.: Inappropriate ioctl for device INFO: Configuring the FPGA... INFO: Downloading bitstream to the target. INFO: Downloading ELF file to the target. INFO: SOC Silicon version is 3.1.
Interaction avec un terminal sériel
Si on veut voir ce qui se passe et pouvoir interagir avec u-boot lors du chargement de ce dernier puis avec Linux, il faut utiliser l'UART1 configuré par défaut lors de la création du Zynq. Avec la ZedBoard, cette liaison série est renvoyée sur un port USB via un circuit Cypress. Elle est accessible sur le PC via l'interface /dev/ttyACM0 . On peut alors lancer un terminal de type minicom en vérifiant la configuration du port (115200 8N1) :
- 115200 bauds
- 8 bits
- pas de parité
- 1 bit de stop
Pour lancer minicom, ouvrir une nouvelle console de commande puis taper :
$ minicom -D /dev/ttyACM0 Bienvenue avec minicom 2.7 OPTIONS: I18n Compilé le Jan 1 2014, 09:30:18. Port /dev/ttyACM0, 09:26:16 Tapez CTRL-A Z pour voir l'aide concernant les touches spéciales
L'utilisateur doit être membre du groupe dialout3)
Si la carte a déjà été utilisée pour d'autres usages au préalable, il est préférable de faire une remise à zéro soit en utilisant le bouton BTN7 - PS-RST, soit en éteignant-rallumant la carte.
2) 1 + démarre u-boot
Pour un téléchargement jusqu'à l'exécution de u-boot, sur la console de commandes taper :
$ petalinux-boot --jtag --prebuilt 2 INFO: Launching XSDB for file download and boot. INFO: This may take a few minutes, depending on the size of your image. rlwrap: warning: your $TERM is 'xterm' but rlwrap couldn't find it in the terminfo database. Expect some problems.: Inappropriate ioctl for device INFO: Configuring the FPGA... INFO: Downloading bitstream to the target. INFO: Downloading ELF file to the target. INFO: Downloading ELF file to the target. INFO: SOC Silicon version is 3.1.
Dans le terminal série, on peut alors voir quelque-chose de ce type :
U-Boot 2015.04 (Nov 17 2015 - 13:56:21) DRAM: ECC disabled 512 MiB MMC: zynq_sdhci: 0 SF: Detected S25FL256S_64K with page size 256 Bytes, erase size 64 KiB, total 3B *** Warning - bad CRC, using default environment In: serial Out: serial Err: serial Net: Gem.e000b000 U-BOOT for Petalinux_LEDs Gem.e000b000 Waiting for PHY auto negotiation to complete......... TIMEOUT ! Gem.e000b000: No link. Hit any key to stop autoboot: 0 U-Boot-PetaLinux>
3) 2 + démarre le noyau Linux
Pour un téléchargement jusqu'à l'exécution du noyau Linux et l'installation du système de fichiers, sur la console de commandes taper :
$ petalinux-boot --jtag --prebuilt 3 INFO: Append dtb - /home/deneb/projets_zync/Linux_LEDs/Petalinux_LEDs/pre-built/linux/images/system.dtb and other options to boot zImage INFO: Launching XSDB for file download and boot. INFO: This may take a few minutes, depending on the size of your image. rlwrap: warning: your $TERM is 'xterm' but rlwrap couldn't find it in the terminfo database. Expect some problems.: Inappropriate ioctl for device INFO: Configuring the FPGA... INFO: Downloading bitstream to the target. INFO: Downloading ELF file to the target. INFO: Downloading ELF file to the target. INFO: SOC Silicon version is 3.1.
Dans le terminal série, on peut alors voir quelque-chose de ce type :
U-Boot 2015.04 (Nov 17 2015 - 13:56:21) DRAM: ECC disabled 512 MiB MMC: zynq_sdhci: 0 SF: Detected S25FL256S_64K with page size 256 Bytes, erase size 64 KiB, total 32 B *** Warning - bad CRC, using default environment In: serial Out: serial Err: serial Net: Gem.e000b000 U-BOOT for Petalinux_LEDs Gem.e000b000 Waiting for PHY auto negotiation to complete....Uncompressing Linux.. Booting Linux on physical CPU 0x0 Linux version 3.19.0-xilinx (deneb@deneb) (gcc version 4.9.1 (Sourcery CodeBench 5 CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=18c5387d CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache Machine model: Petalinux_LEDs bootconsole [earlycon0] enabled cma: Reserved 16 MiB at 0x1f000000 Memory policy: Data cache writealloc PERCPU: Embedded 9 pages/cpu @5ebd3000 s8128 r8192 d20544 u36864 Built 1 zonelists in Zone order, mobility grouping on. Total pages: 130048 Kernel command line: console=ttyPS0,115200 earlyprintk PID hash table entries: 2048 (order: 1, 8192 bytes) Dentry cache hash table entries: 65536 (order: 6, 262144 bytes) Inode-cache hash table entries: 32768 (order: 5, 131072 bytes) Memory: 492808K/524288K available (4696K kernel code, 250K rwdata, 1640K rodata, ) Virtual kernel memory layout: vector : 0xffff0000 - 0xffff1000 ( 4 kB) fixmap : 0xffc00000 - 0xfff00000 (3072 kB) vmalloc : 0x60800000 - 0xff000000 (2536 MB) lowmem : 0x40000000 - 0x60000000 ( 512 MB) pkmap : 0x3fe00000 - 0x40000000 ( 2 MB) modules : 0x3f000000 - 0x3fe00000 ( 14 MB) .text : 0x40008000 - 0x40638514 (6338 kB) .init : 0x40639000 - 0x409ba000 (3588 kB) .data : 0x409ba000 - 0x409f8ba0 ( 251 kB) .bss : 0x409f8ba0 - 0x40a2cab8 ( 208 kB) Preemptible hierarchical RCU implementation. ... Built with PetaLinux v2015.2.1 (Yocto 1.8) Petalinux_LEDs /dev/ttyPS0 Petalinux_LEDs login:
On peut alors s'identifier avec l'utilisateur root et le mot de passe root.
Accéder aux DELs via l'espace utilisateur
4)Par défaut, le système de fichiers est configuré pour accéder aux GPIO via le procédé SysFs. Il s'agit d'un procédé de fichiers avec une arborescence spécifique accessible depuis /sys/. On peut retenir ces ces points importants :
- Les contrôleurs de GPIO sont visibles depuis /sys/class/gpio. Chaque contrôleur contrôle quelques GPIO.
root@Petalinux_LEDs:~# ls /sys/class/gpio export gpiochip890 gpiochip898 gpiochip906 unexport
Ici nous pouvons voir trois contrôleurs gpiochip890, gpiochip898 et gpiochip906. Des informations sont disponibles pour chacun d'eux.
root@Petalinux_LEDs:~# ls /sys/class/gpio/gpiochip890 base label ngpio power subsystem uevent root@Petalinux_LEDs:~# cat /sys/class/gpio/gpiochip890/base 890 root@Petalinux_LEDs:~# cat /sys/class/gpio/gpiochip890/label /amba_pl/gpio@41200000 root@Petalinux_LEDs:~# cat /sys/class/gpio/gpiochip890/ngpio 8
root@Petalinux_LEDs:~# ls /sys/class/gpio/gpiochip898 base label ngpio power subsystem uevent root@Petalinux_LEDs:~# cat /sys/class/gpio/gpiochip898/base 898 root@Petalinux_LEDs:~# cat /sys/class/gpio/gpiochip898/label /amba_pl/gpio@41200000 root@Petalinux_LEDs:~# cat /sys/class/gpio/gpiochip898/ngpio 8
root@Petalinux_LEDs:~# ls /sys/class/gpio/gpiochip906/ base device label ngpio power subsystem uevent root@Petalinux_LEDs:~# cat /sys/class/gpio/gpiochip906/base 906 root@Petalinux_LEDs:~# cat /sys/class/gpio/gpiochip906/label zynq_gpio root@Petalinux_LEDs:~# cat /sys/class/gpio/gpiochip906/ngpio 118
Le premier contrôleur est réservé pour le port des interrupteurs, le second pour le port des DELs que nous avons configurés lors de la création du projet Vivado (il y en a 8 interrupteurs et 8 DELs au total) et le troisième correspond à l'ensemble des GPIOs qui sont accessibles par le Zynq. Les numéro indiqués dans le fichier base correspondent aux numéros de la première GPIO accessible sur le port correspondant. Les GPIO suivantes sont accessibles aux numéros suivants, jusqu'à base + ngpio.
- Les GPIOs à utiliser doivent être configurées. Il faut les déclarer dans le fichier export. Cela crée un répertoire du nom de la GPIO.
root@Petalinux_LEDs:~# echo 898 > /sys/class/gpio/export root@Petalinux_LEDs:~# ls /sys/class/gpio/ export gpio898 gpiochip898 gpiochip906 unexport root@Petalinux_LEDs:~# ls /sys/class/gpio/gpio898 active_low direction power subsystem uevent value
Une fois créée, il est nécessaire d'indiquer sa direction (entrée ou sortie), dans le fichier direction.
root@Petalinux_LEDs:~# echo out > /sys/class/gpio/gpio898/direction
Idem pour la les autres DELs et interrupteurs :
root@Petalinux_LEDs:~# echo 905 > /sys/class/gpio/export root@Petalinux_LEDs:~# echo out > /sys/class/gpio/gpio905/direction root@Petalinux_LEDs:~# echo 890 > /sys/class/gpio/export root@Petalinux_LEDs:~# echo 897 > /sys/class/gpio/export root@Petalinux_LEDs:~# echo in > /sys/class/gpio/gpio890/direction root@Petalinux_LEDs:~# echo in > /sys/class/gpio/gpio897/direction
- Pour affecter un état à la sortie, on utilise le fichier value
root@Petalinux_LEDs:~# echo 1 > /sys/class/gpio/gpio898/value root@Petalinux_LEDs:~# echo 1 > /sys/class/gpio/gpio905/value
Les DELs LD0 et LD7 s'allument.
root@Petalinux_LEDs:~# echo 0 > /sys/class/gpio/gpio898/value root@Petalinux_LEDs:~# echo 0 > /sys/class/gpio/gpio905/value
Les DELs LD0 et LD7 s'éteignent.
- Pour contrôler l'état d'une entrée, on utilise aussi le fichier value
root@Petalinux_LEDs:~# cat /sys/class/gpio/gpio890/value 0 root@Petalinux_LEDs:~# cat /sys/class/gpio/gpio897/value 0
Lorsque les interrupteurs SW0 et SW7 sont ouverts.
root@Petalinux_LEDs:~# cat /sys/class/gpio/gpio890/value 1 root@Petalinux_LEDs:~# cat /sys/class/gpio/gpio897/value 1
Lorsque les interrupteurs SW0 et SW7 sont fermés. <code>