Création d'une application Bare-Metal sur Intel Cyclone V pour les débutants absolus

La configuration de Linux sur la carte de développement comme SocKit avec un ARM Cortex A9 double cœur n'est pas sorcière. Un fabricant de la carte prend en charge l'image prête à l'emploi, appropriée pour l'installation sur une carte SD ou un autre support. Mais que se passe-t-il si vous avez envie de toucher au métal nu, approchant une vitesse de code révolutionnaire non limitée par un noyau de système d'exploitation? Eh bien, c'est possible, mais pas si facile et évident. Dans ce court essai, je vais vous donner des instructions étape par étape, comment créer et exécuter votre première application bare-metal sur Cyclone V SoC, qui utilise le noyau ARM Cortex A9 du sous-système HPS du SoC.

Vous devez avoir la carte de développement avec Intel (Altera) Cyclone V SoC. J'ai utilisé la carte SoCKit:



J'ai fait toutes les choses décrites dans cet article dans Debian Jessie. Vous pouvez utiliser un autre système Linux ou Windows avec les modifications correspondantes.

Et vous avez besoin de l'IDE DS-5. Et, malheureusement, l'édition gratuite ne vous permet pas de compiler un code bare-metal. Vous avez besoin de la version complète.

1. Préparation

Bien que vous ayez la version complète de DS-5, vous devez installer la version gratuite DS-5 Altera Edition. Les deux versions doivent être installées en mode sudo , dans des répertoires différents, par exemple: / home / user / intelFPGA pour DS-5 Altera Edition, et / home / user / DS-5 pour la version complète de DS-5. Vous devez saisir les chemins à la main pendant le processus d'installation.

2. IDE en cours d'exécution

2.1. Tout d'abord, exécutez le script /home/user/intelFPGA/16.1/embedded/embedded_command_shell.sh , puis changez un répertoire en / home / user / DS-5 / bin et exécutez IDE:

$ ./eclipse & 


Variables d'environnement de l'ensemble de scripts. Pour définir les variables au démarrage d'un système, vous devez ajouter la ligne suivante au fichier /home/user/.profile :

 QUARTUS_ROOTDIR=/home/user/intelFPGA/16.1/qprogrammer export PATH=$PATH:/usr/local/gcc-arm-none-eabi-5_4-2016q3/bin/:/home/user/intelFPGA/16.1/embedded/host_tools/mentor/gnu/arm/baremetal/bin/ 


Si nécessaire, ajoutez une ligne similaire pour les variables obligatoires de la loutre, telles que QSYS_ROOTDIR.

Vous devez également installer et exécuter Quartus Prime. Considérons que le répertoire d'installation de Quartus est /home/user/intelFPGA/16.1/quartus/ .

Exécutez Quartus Prime, qui se trouve dans /home/user/intelFPGA/16.1/quartus/bin/quartus , et c'est l'utilitaire de programmation JTAG, situé dans /home/user/intelFPGA/16.1/qprogrammer/bin/quartus_pgmw .

3. Connexion du SoCkit

3.1. Connectez la carte SoCkit à un ordinateur. Connectez les câbles microUSB aux ports de la carte, nommés «USB Blaster (JTAG)» et «USB to UART».

3.2. Allumez la carte et entrez:

 $ ls /dev/bus/usb/001 001 002 003 


Le dernier numéro (003) est une interface JTAG. Définissez les autorisations d'écriture:

  $ sudo chmod 666 /dev/bus/usb/001/003 


Vous devez le faire Ă  chaque fois que vous allumez la carte.

3.3. Paramètres du terminal TTY

Vous pouvez utiliser cette commande:
 screen /dev/ttyUSB0 115200 


4. Construction du préchargeur (u-boot-spl)

4.1. Téléchargez le fichier sockit_ghrd_16.0.tar.gz et décompressez-le. Par exemple, décompressez-le dans / home / user / ghrd-16 / sockit_ghrd .

4.2. Exécutez Quartus Prime et ouvrez le fichier /home/user/ghrd-16/sockit_ghrd/soc_system.qpf.

4.3. Exécutez Qsys (Tools / Qsys). Ouvrez le fichier /home/user/ghrd-16/sockit_ghrd/soc_system.qsys. Générez / Générez HDL et quittez Qsys.

4.4. Exécutez Assembler dans Quartus Prime.

4.5. Exécutez bsp-editor: /home/user/intelFPGA/16.1/embedded/host_tools/altera/preloadergen/bsp-editor . Créez un nouveau projet: Fichier / Nouveau HPS BSP. Dans le champ " Répertoire des paramètres du préchargeur ", écrivez " / home / user / ghrd-16 / sockit_ghrd / hps_isw_handoff / soc_system_hps_0. "

4.6. Configurez le préchargeur. Accédez à l'onglet Avancé. Désactivez Watchdog_enable . Si vous souhaitez voir les messages de débogage via JTAG, vous pouvez activer Semihosting . Après cela, appuyez sur Générer et quittez.

4.7. Il est possible de modifier le message de démarrage. Par exemple, dans le fichier software / spl_bsp / uboot-socfpga / board / altera / socfpga / socfpga_cyclone5.c, changez la chaîne " BOARD: Altera SOCFPGA Cyclone V Board " sur une autre:
 /* * Print Board information */ int checkboard(void) { #ifdef CONFIG_SOCFPGA_VIRTUAL_TARGET puts("BOARD : Altera VTDEV5XS1 Virtual Board\n"); #else //puts("BOARD : Altera SOCFPGA Cyclone V Board\n"); puts("ARM preloader build by 32-bit.me\n"); #endif return 0; } 


4.8. La variable d'environnement SOCEDS_DEST_ROOT doit être définie sur /home/user/intelFPGA/16.1/embedded :
 export SOCEDS_DEST_ROOT=/home/user/intelFPGA/16.1/embedded 

Maintenant, allez dans le répertoire
 /home/user/ghrd-16/sockit_ghrd/software/spl_bsp 
et faites. Make peut échouer avec une erreur "make: mkpimage: Command not found", mais il doit créer le fichier u-boot-spl dans le chemin / home / user / ghrd-16 / sockit_ghrd / software / spl_bsp / uboot-socfpga / spl / u-boot-spl .

4.9. Test du préchargeur

4.9.1. Vous n'avez pas besoin d'une image FPGA (qui a une extension ".sof") pour exécuter le préchargeur. Exécutez DS-5 et ouvrez «Configurations d'exécution / débogage».

4.9.2. Dans le champ Connexion, définissez l'option CV SoCKit 1-1 . Si ce n'est pas le cas, appuyez sur le bouton "Parcourir" et définissez cette option. Si une erreur apparaît, faites 3.1-3.2.

4.9.3. Définissez le fichier u-boot-spl sur l'onglet Fichiers, dans le champ «Application sur l'hôte à télécharger»: / home / user / ghrd-16 / sockit_ghrd / software / spl_bsp / uboot-socfpga / spl / u-boot-spl . Réglez le drapeau "Charger symboles". Restez le champ "Fichiers" vide.

4.9.4. Désactivez le lancement d'un script de débogage dans l'onglet Débogage.

4.9.5. Exécutez l'utilitaire de terminal (par exemple, l' écran ) et appuyez sur le bouton "Déboguer". Le préchargeur est chargé en mémoire et un débogueur est prêt à être lancé. Appuyez sur le bouton "Continuer" (ou F8) et voyez le message:

 U-Boot SPL 2013.01.01 (Jun 24 2017 - 19:49:33) ARM preloader build by 32-bit.me CLOCK: EOSC1 clock 25000 KHz CLOCK: EOSC2 clock 25000 KHz CLOCK: F2S_SDR_REF clock 0 KHz CLOCK: F2S_PER_REF clock 0 KHz CLOCK: MPU clock 925 MHz CLOCK: DDR clock 400 MHz CLOCK: UART clock 100000 KHz CLOCK: MMC clock 50000 KHz CLOCK: QSPI clock 370000 KHz RESET: COLD SDRAM: Initializing MMR registers SDRAM: Calibrating PHY SEQ.C: Preparing to start memory calibration SEQ.C: CALIBRATION PASSED SDRAM: 1024 MiB ALTERA DWMMC: 0 Card did not respond to voltage select! spl: mmc init failed: err - -17 ### ERROR ### Please RESET the board ### 


Cela signifie que le préchargeur a démarré avec succès.

4.9.6. Après la session de débogage, appuyez sur les boutons "Déconnecter de la cible" et "Supprimer la connexion".

5. Écrivez un Hello World pour le mode bare-metal.

5.1. Téléchargez le projet ArrowSocKit_BareMetal_GNU.zip. Définissez les variables d'environnement comme dans 2.1., Exécutez DS-5, importez le projet à partir de l'archive ( Fichier / Importer / Projet existant dans Workspace , Sélectionnez le fichier archile ). Le projet décompressé apparaît dans le répertoire / home / user / DS-5-Workspace / BareMetalBoot-GNU.

5.2. Vous pouvez essayer de construire le projet avec make , mais il ne peut pas encore être construit. Pour générer le projet, procédez comme suit.

5.3. Copiez le répertoire /home/user/intelFPGA/16.1/embedded/ip/altera/hps/altera_hps/hwlib dans / home / user / DS-5-Workspace / . Voici les dossiers src et include , et dans chacun d'eux il y a les répertoires soc_cv_av et soc_a10 . Vous pouvez supprimer les répertoires nommés soc_a10 . Copiez ensuite les fichiers libcs3.a, libcs3arm.a, libcs3unhosted.a depuis /home/user/intelFPGA/16.1/embedded/host_tools/mentor/gnu/arm/baremetal/arm-altera-eabi/lib. dans le répertoire du projet (/ home / user / DS-5-Workspace / BareMetalBoot-GNU). Copiez le fichier arm-names.inc de /home/user/intelFPGA/16.1/embedded/host_tools/mentor/gnu/arm/baremetal/arm-altera-eabi/lib/cortex-a9/ vers / home / user / DS- 5-Espace de travail / BareMetalBoot-GNU / .

5.4. Dans le Makefile, changez "CROSS_COMPILE: = arm-none-eabi-" en "CROSS_COMPILE: = arm-altera-eabi-". Modifiez également le chemin d'accès à hlib : HWLIBS_ROOT: = / home / user / DS-5-Workspace / hwlib

5.5. Maintenant lancez make . et lire tous les messages d'erreur. Si make ne trouve pas de symbole, vous devez le trouver dans les répertoires hwlib / src / soc_cv_av et hwlib / include / soc_cv_av, et faire une copie dans hwlib / src et hwlib / include en conséquence. Après avoir trouvé tous les fules, make échoue avec l'erreur "mkimage: not found", mais ce n'est pas important, car nous n'avons besoin que du fichier test.axf .

5.6. Exécuter une application

5.6.1. Pour exécuter une application, il est nécessaire de charger une image FPGA (fichier .sof), qui a été générée lors de la construction du préchargeur. Exécutez le programmeur comme nous l'avons fait en 2.1. Il doit y avoir le texte "CV SoCKit [1-1]" à droite de la partie inférieure "Configuration matérielle". Si ce n'est pas le cas, vous devez définir l'autorisation d'écriture pour le port JTAG (voir ci-dessus) et cliquez sur le bouton Configuration du matériel.

5.6.2. Cliquez sur "Détection automatique" et sélectionnez une option arbitraire dans une liste. Vous voyez une configuration de deux appareils: l'un est ce que vous avez sélectionné (par exemple, 5CSEBA6) et le second est SOCVHPS. Retirez le premier appareil: sélectionnez-le et appuyez sur Supprimer. Appuyez sur "Ajouter un fichier" et ouvrez le fichier image (/home/user/ghrd-16/sockit_ghrd/output_files/soc_system.sof). Un nouvel appareil est apparu à droite de SOCVHPS. Déplacez-le avec une souris à la première place de la chaîne. Après cela, appuyez sur Démarrer et téléchargez l'image.

5.6.3. Dans DS-5, ouvrez "Debug Configuration" dans l'onglet "Files". Définissez le fichier u-boot-spl sur la ligne "Application sur l'hôte à télécharger". Supprimez une marque dans "Charger les symboles". Définissez le fichier "test.axf" sur la ligne "Fichiers". Dans l'onglet Débogueur, cochez la case "Exécuter le script de débogage d'initialisation cible" et définissez le fichier de script "debug-unhosted.ds", situé dans le répertoire du projet. Dans le fichier, modifiez le chemin d'accès au préchargeur:
# Load the SPL preloader into memory.
#
loadfile "/home/user/ghrd-16/sockit_ghrd/software/spl_bsp/uboot-socfpga/spl/u-boot-spl" 0x0


Exécutez l' écran du terminal TTY et appuyez sur Déboguer. Ensuite, le préchargeur démarre, une application est téléchargée et un débogueur est défini sur un point de départ du programme. Appuyez sur le bouton "Continuer". Dans une fenêtre d'un terminal, vous verrez la sortie du préchargeur, comme indiqué ci-dessus, puis ce qui suit:

 Disabled interrupts because preloader enabled ECC interrupts. Global Timer value at startup = 0x000000005A10B609 CPU frequency is 925000000 hertz. DDR frequency is 400000000 hertz. MPU peripheral frequency is 231250000 hertz. MB ZERO remapped to SDRAM. L3 interconnect remapped as inaccessible and SDRAM. Interrupt controller system API initialized. MMU initialized and enabled. L1 and L2 cache system initialized and enabled. GIC interrupts enabled. PIT started. PIT interrupt registered and enabled. GPIOs initialized. UART0 initialized. L3 interconnect remapped as accessible and SDRAM. Bridges initialized. Boot completed. Boot milestones: New buffer !ESTONE : GT TICKCOUNT : INCREMENTAL : CUMULATIVE initial GT : 0x000000005A10B609 : 0.000us : 0.000us frequency capture : 0x000000005A119D58 : 256.065us : 256.065us initial remapping : 0x000000005A11C936 : 48.562us : 304.627us interrupt sys init : 0x000000005A139FED : 521.094us : 825.721us mmu init : 0x000000005A62D774 : 22449.985us : 23275.706us cache init : 0x000000005A65CF96 : 841.488us : 24117.194us interrupts enabled : 0x000000005A65D0D7 : 1.388us : 24118.582us pit start : 0x000000005A65DD2E : 13.661us : 24132.242us pit enabled : 0x000000005A65DF67 : 2.461us : 24134.703us gpio init : 0x000000005A65FC12 : 31.736us : 24166.439us uart0 init : 0x000000005A66084D : 13.539us : 24179.978us fpga config : 0x0000000000000000 : 79769704095969360.000us : 79769704095993552.000us last remapping : 0x000000005A660981 : 6558428.303us : 24181.310us bridge init : 0x000000005A6611B6 : 9.085us : 24190.396us complete : 0x000000005A661222 : 0.467us : 24190.863us Hello world, 32bit-me! 


Félicitations! Vous venez d'exécuter votre première application bare-metal sur le cœur Cortex-A9.

Source: https://habr.com/ru/post/fr463717/


All Articles