====== 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.\\ {{:wiki:menu_config_1.png?400|}} 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 ////. A la question //Do you wish to save your new configuration?//, répondre ////. 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 images((voir cette présentation [[http://elinux.org/images/f/f4/Elc2013_Fernandes.pdf]])). ===== 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 m( 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/.// m( 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 ((voir cette discussion [[https://forums.xilinx.com/t5/Embedded-Linux/petalinux-boot-jtag-prebuilt-3-fails-to-program-bitstream/m-p/593609/highlight/true#M12667]])) $ 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 dialout(([[linux_en_general:quelques_commandes#autoriser_l_acces_aux_ports_series_sous_ubuntu_debian|Autoriser l'accès aux ports séries]]))\\ m( 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//. ===== Démarrage à partir d'une carte SD ===== ==== Configuration de la carte SD avec un système de fichier EXT ==== La carte doit comporter 2 partitions. Il est possible de préparer la carte au moyen d'un logiciel tel que GPARTED ou avec plusieurs utilitaires en ligne de commande. - 4 MB d'espace libre en premier - 40 MB au moins formatés en FAT32, étiqueté //BOOT//. Cette partition comportera les images du programme de démarrage initial, du "devicetree" et du noyau. - Le reste formaté en ext4, étiqueté //rootfs//. Cette partition contiendra le système de fichiers. ==== Configuration de Petalinux ==== - Aller dans la racine du répertoire du projet Petalinux\\ $ cd - Éditer la configuration du projet\\ $ petalinux-config - Sélectionner //Image Packaging Configuration//. - Sélectionner //Root filesystem type//. - Sélectionner //SD card// comme "RootFS" type. - Sortir de "menuconfig" (//Exit -> Exit//) et sauvegarder la configuration. Cela va mettre à jour les arguments de démarrage dans le fichier de "device-tree" //system-conf.dtsi// pour charger le système de fichiers depuis la carte SD. Vous pouvez consulter ce fichier ici : //subsystems/linux/configs/device-tree/system-conf.dtsi// - Si nécessaire, générer les images Petalinux. \\ $ petalinux-build - Si nécessaire, générer l'image de //BOOT.BIN// $ petalinux-package --boot --fsbl images/linux/zynq_fsbl.elf --fpga --u-boot \\ Si besoin, on utiliser l'option //[[--]]force// pour ré-générer l'image.\\ //// se trouve dans le répertoire : // images/linux/ //. \\ //// est un un fichier //.bit// et il se trouve dans le répertoire : // images/linux/ //. - Générer l'image //rootfs.cpio//. en sélectionnant //SD card// comme //RootFS type//, la commande //petalinux-build// ne la génère pas automatiquement. \\ $ petalinux-package --image -c rootfs --format initramfs Le fichier se trouvera dans le répertoire //images/linux//. ==== Installation des images sur la carte SD ==== - S'assurer que la partition //BOOT// de la carte SD est bien montée et la repérer dans le système de fichiers. Par exemple, taper la commande \\ $ mount | grep BOOT /dev/mmcblk0p1 on /media/BOOT type vfat rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0077,codepage=437,iocharset=utf8,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks2) \\ Dans ce cas, la partition est montée ici : ///media/BOOT//. - Copier //BOOT.BIN// et //image.ub// dans la partition //BOOT// de la carte SD. Le fichier //image.ub// contient les images du "device tree" et du noyau.\\ $ cp images/linux/BOOT.BIN /media/BOOT/ $ cp images/linux/image.ub /media/BOOT/ - S'assurer que la partition //rootfs// de la carte SD est bien montée et la repérer dans le système de fichiers. Par exemple, taper la commande \\ $ mount | grep rootfs /dev/mmcblk0p2 on /media/rootfs type ext4 (rw,nosuid,nodev,relatime,data=ordered,uhelper=udisks2) - Copier //rootfs.cpio// dans la partition //rootfs// de la carte SD. sudo cp images/linux/rootfs.cpio /media/rootfs/ [sudo] password for : L'utilisation de //sudo// permet de se positionner en administrateur pour cette commande, si le système le permet pour cet . En effet, la partition //rootfs// a des droits d'accès, il faut les respecter pour copier un fichier. - Extraire le système de fichier de son image \\ $ cd /media/rootfs $ sudo pax -rvf rootfs.cpio ===== Et maintenant ... ===== Le système semble fonctionner correctement avec cette procédure par défaut. Il va falloir en faire quelque-chose maintenant. On pourra par exemple [[wiki:linux_pour_zynq_de_xilinx:acces_dels_via_sysfs|accéder aux entrées/sorties depuis l'espace utilisateur via SysFs]].