Zephyr sur Longan Nano

Zephyr est un système d’exploitation temps réel pour microcontrôleur. Parler d’OS peut parfois faire réagir puisqu’il n’y a pas vraiment de noyau (kernel) et que tout est compilé en un seul firmware que l’on télécharge dans la mémoire du micro.

Ce n’est pas le seul RTOS existant pour microcontrôleur. Il a le gros avantage cependant d’être soutenu par la fondation Linux. Les deux grandes forces de ce système sont sa documentation et le support de nombreux protocoles réseaux (avec ou sans fils).

C’est le parfait OS à tester sur le GD32VF de gigadevice. Cependant, le portage n’est pas terminé. Le processeur n’apparaît donc pas dans la documentation officielle. Le seul tutoriel (en japonais) que j’ai trouvé se trouve là. J’en ai fait une traduction semi-automatique ici.

La version de Zephyr patché correspondante se trouve ici.

Essayons ici d’appliquer ce tutoriel.

On vérifiera sur le site officiel que nous avons bien installé toutes les dépendances sur notre machine.

Zephyr a besoin d’un outils python nommé west, c’est un projet à part mais qui reste dans le giron de Zephyr.

$ python -m pip install west
$ west init ~/zephyrproject 
$ cd ~/zephyrproject west update
$ python -m pip install -r ~/zephyrproject/zephyr/scripts/requirements.txt

On supprime le git officiel de zephyr téléchargé avec west Puis puis on clone le fork Zephyr de Soburi:

$ rm -rf zephyr
$ git clone https://github.com/soburi/zephyr.git
$ cd zephyr
$ git checkout longan_nano_2_5_0

Notez la branche remotes/origin/longan_nano_2_5_0 qui contient le travail de portage sur la longan_nano.

On installe le SDK (attention ~1Go)

$ cd ~/zephyrproject
$ wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.12.4/zephyr-sdk-0.12.4-x86_64-linux-setup.run
$ chmod +x zephyr-sdk-0.12.4-x86_64-linux-setup.run
$ ./zephyr-sdk-0.12.4-x86_64-linux-setup.run -- -d ~/zephyr-sdk-0.12.4
$ export ZEPHYR_SDK_INSTALL_DIR=~/zephyr-sdk-0.12.4/

Manque plus qu’à mettre à jour avec le nouveau zephyr (de soburi) patché :

$ cd ~/zephyrproject
$ west update

Puis nous pouvons compiler le hello world :

$ cd ~/zephyrproject/zephyr/
$ west build -p auto -b sipeed_longan_nano samples/basic/blinky

Flashage sur la longan nano

Avec le jtag

Si tout s’est bien passé on doit pouvoir maintenant flasher le binaire sur la carte. J’utilise pour cela l’adaptateur jtag de sipeed.

$ pip3 install pyelftools

Pour le moment j’ai pas encore réussi. Mais ça doit pouvoir se faire puisque ça marche avec openocd.

Avec l’usb par dfu-util

Pour avoir un fonctionnement correct il faut utiliser une version à jour du git du projet :

$ cd ~/zephyrproject
$ git clone git://git.code.sf.net/p/dfu-util/dfu-util
$ cd dfu-util
$ ./autogen.sh 
$ ./configure
$ make
$ sudo make install

J’ai suivi les conseils d’un lecteur.

$ git clone https://github.com/riscv-mcu/gd32-dfu-utils.git
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
$ dfu-util -V
 dfu-util 0.10-dev
 Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
 Copyright 2010-2021 Tormod Volden and Stefan Schmidt
 This program is Free Software and has ABSOLUTELY NO WARRANTY
 Please report bugs to http://sourceforge.net/p/dfu-util/tickets/

Puis, pour télécharger le binaire, taper la commande :

$ dfu-util -d,28e9:0189 -s 0x8000000:leave -a 0 -D build/zephyr/zephyr.bin
dfu-util 0.10-dev
 Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
 Copyright 2010-2021 Tormod Volden and Stefan Schmidt
 This program is Free Software and has ABSOLUTELY NO WARRANTY
 Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
 dfu-util: Warning: Invalid DFU suffix signature
 dfu-util: A valid DFU suffix will be required in a future dfu-util release
 Opening DFU capable USB device…
 Device ID 28e9:0189
 Device DFU version 011a
 Claiming USB DFU Interface…
 Setting Alternate Interface #0 …
 Determining device status…
 DFU state(2) = dfuIDLE, status(0) = No error condition is present
 DFU mode device DFU version 011a
 Device returned transfer size 2048
 DfuSe interface name: "Internal Flash  "
 Found GD32VF103, which reports a bad page size and count for its internal memory.
 Fixed layout based on part number: page size 1024, count 128.
 Downloading element to address = 0x08000000, size = 19308
 Erase       [=========================] 100%        19308 bytes
 Erase    done.
 Download    [=========================] 100%        19308 bytes
 Download done.
 File downloaded successfully

Qui télécharge bien le binaire visiblement, et fait clignoter la led.

Pour s’assurer que c’est bien notre programme qui clignote, on peut changer la couleur de clignotement en modifiant la ligne suivante dans le fichier samples/basic/blinky/src/main.c:

# Ligne 16:
- define LED0_NODE DT_ALIAS(led0)
+ define LED0_NODE DT_ALIAS(led1)

Et relancer la compilation avec west:

$ west build -p auto -b longan_nano samples/basic/blinky
[3/9] Linking C executable zephyr/zephyr_prebuilt.elf
 [9/9] Linking C executable zephyr/zephyr.elf
 Memory region         Used Size  Region Size  %age Used
              ROM:       19308 B       128 KB     14.73%
              RAM:        4740 B        32 KB     14.47%
         IDT_LIST:          0 GB         2 KB      0.00%

Puis retélécharger pour voir la led verte clignoter.

Utilisation de la toolchain Platformio

La toolchain se trouve ici.

Le sdk nuclei se trouve ici et peut être téléchargé .

export ZEPHYR_TOOLCHAIN_VARIANT=cross-compile
export CROSS_COMPILE=/home/fabien/zephyrproject/nuclei/gcc/bin/riscv-nuclei-elf-

Ce contenu a été publié dans Non classé, avec comme mot(s)-clé(s) , , , . Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *