Longan Nano avec le JTAG et openocd

Dans l’article précédent sur le sujet j’utilisai exclusivement le connecteur USB-C de la longan nano pour tout faire : alimenter la carte, communiquer et télécharger le firmware via le dfu.

Ça permet de faire beaucoup de choses, mais il serait intéressant de pouvoir poser des points d’arrêt dans son code pendant le développement au moyen d’une sonde JTAG par exemple. Or la carte possède un header avec les signaux JTAG. C’est le moment de rentabiliser la sonde Sipeed USB-JTag commandée en même temps que la longan.

Le branchement de la sonde sur la longannano est très simple il suffit de brancher les signaux du même nom entre eux avec des câbles dupont femelle:

L’adaptateur jtag de sipeed sipeed-rv-debugger branché sur la longan nano

Tout d’abord, installons et compilons openocd pour le riscv :

$ git clone https://github.com/bukinr/riscv-openocd
$ cd riscv-openocd
$ ./bootstrap
$ ./configure
$ makeLangage du code : PHP (php)

Pour la suite de mes tests je me suis inspiré du projet riscv-rust, même si l’objectif premier n’est pas de faire du rust (c’est juste l’objectif second), le projet donne toutes les configurations utiles pour openocd.

$ cd ..
$ git clone https://github.com/riscv-rust/longan-nano
$ cd longan-nano
$ ../riscv-openocd/src/openocd -f sipeed-jtag.cfg -f openocd.cfg &
Open On-Chip Debugger 0.10.0+dev-00924-g03cde8a0b (2021-01-14-21:26)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
adapter speed: 8000 kHz

Info : clock speed 8000 kHz
Error: Can't run cJTAG reset escape sequences: TCK signal is not defined
Error: Can't run cJTAG reset escape sequences: TCK signal is not defined
Error: Can't run cJTAG reset escape sequences: TCK signal is not defined
Info : JTAG tap: riscv.cpu tap/device found: 0x1e200a6d (mfg: 0x536 (Nuclei System Technology Co.,Ltd.), part: 0xe200, ver: 0x1)
Info : JTAG tap: auto0.tap tap/device found: 0x790007a3 (mfg: 0x3d1 (GigaDevice Semiconductor (Beijing)), part: 0x9000, ver: 0x7)
Warn : AUTO auto0.tap - use "jtag newtap auto0 tap -irlen 5 -expected-id 0x790007a3"
Info : datacount=4 progbufsize=2
Info : Examined RISC-V core; found 1 harts
Info :  hart 0: XLEN=32, misa=0x40901105
Info : Listening on port 3333 for gdb connections
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Langage du code : PHP (php)

Une fois le serveur openocd lancé on peu s’y connecter avec telnet par exemple :

$ telnet localhost 4444
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Info : accepting 'telnet' connection on tcp/4444
Open On-Chip Debugger
> riscv.cpu curstate
halted
> scan_chain
   TapName             Enabled  IdCode     Expected   IrLen IrCap IrMask
-- ------------------- -------- ---------- ---------- ----- ----- ------
 0 riscv.cpu              Y     0x1e200a6d 0x1e200a6d     5 0x01  0x03
 1 auto0.tap              Y     0x790007a3 0x00000000     5 0x01  0x03

Langage du code : JavaScript (javascript)

Voila ça semble marcher sur l’ordinateur. Mais pour aller plus loin j’ai préféré faire avec vscode.

Pour l’utiliser avec VScode il y a quelques tricks à savoir.

Tout d’abord les dépendances :

sudo apt install libhidapi-dev

Puis le problème de la librairies manquante :

 <em>cd /usr/lib/x86_64-linux-gnu; sudo ln -s libmpfr.so libmpfr.so.6</em>Langage du code : HTML, XML (xml)

Et voila, vous devriez pouvoir faire de l’exécution pas à pas de votre programme sur la Longan Nano désormais.

Publié dans électronique, embarqué, informatique, Non classé | Marqué avec , , , , | Laisser un commentaire

Rhaaa les listes en python !

Parfois python laisse dubitatif :

In [1]: alist = [{"pouet": 0, "prout":1},]*12                                                                                                                                                                      

In [2]: alist                                                                                                                                                                                                      
Out[2]: 
[{'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1}]

In [3]: alist[4]["pouet"] = 12                                                                                                                                                                                     

In [4]: alist                                                                                                                                                                                                      
Out[4]: 
[{'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1}]
Langage du code : JavaScript (javascript)

Donc quand on crée une liste par multiplication, ([1]*12) l’objet n’est pas dupliqué, juste le pointeur vers l’objet.

Cette méthode résout le problème:

In [5]: alist = [{"pouet": 0, "prout":1} for _ in range(12)]                                                                                                                                                       

In [6]: alist                                                                                                                                                                                                      
Out[6]: 
[{'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1}]

In [7]:  alist[4]["pouet"] = 12                                                                                                                                                                                    

In [8]: alist                                                                                                                                                                                                      
Out[8]: 
[{'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1}]
Langage du code : JavaScript (javascript)

Voila c’est tout, mais ça m’a bouffé une heure.

Publié dans programmation | Marqué avec , , , , | 2 commentaires

Réseau de micros de la MaixGo

Après avoir reçu la MaixGo et l’avoir montée, il faudrait commencer à faire quelque chose avec.

Tout d’abord, comme ça fait un an et demi qu’elle traine sur mon étagère, une bonne idée serait de la mettre à jour.

Mise à Jour

Les commandes brutes :

$ git clone https://github.com/sipeed/MaixPy
$ cd MaixPy
$ wget http://dl.cdn.sipeed.com/kendryte-toolchain-ubuntu-amd64-8.2.0-20190409.tar.xz
$ sudo tar -Jxvf kendryte-toolchain-ubuntu-amd64-8.2.0-20190409.tar.xz -C /opt
$ cd projects/hello_world
$ python3 project.py menuconfig
$ python3 project.py build
$ python3 project.py flash -B dan -b 1500000 -p /dev/ttyACM0 -t
Langage du code : PHP (php)

6+1 micros

Mais à quoi peuvent bien servir autant de micros sur une même carte électronique ?

À faire de la localisation de source sonore pardi. Pour faire cela, je n’invente rien. Il suffit de reprendre le script proposé par chegewara sur son github (avec quelques suppressions de lignes inutiles dans le cas du MaixGo):

from Maix import MIC_ARRAY as mic
import lcd

lcd.init()
mic.init()

while True:
    imga = mic.get_map()
    b = mic.get_dir(imga)
    a = mic.set_led(b,(0,0,255))
    imgb = imga.resize(240,160)
    imgc = imgb.to_rainbow(1)
    a = lcd.display(imgc)
mic.deinit()Langage du code : JavaScript (javascript)

Pour reproduire la manipulation, on se connecte à la carte via le script proposé dans mon intro:

$ python sipeedcom.py 
--- forcing DTR inactive
--- forcing RTS inactive
--- Miniterm on /dev/ttyACM0  115200,8,N,1 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---

[MAIXPY]Pll0:freq:832000000
[MAIXPY]Pll1:freq:398666666
[MAIXPY]Pll2:freq:45066666
[MAIXPY]cpu:freq:416000000
[MAIXPY]kpu:freq:398666666
[MAIXPY]Flash:0xc8:0x17
open second core...
gc heap=0x802ee440-0x8036e440(524288)
[MaixPy] init end

 __  __              _____  __   __  _____   __     __
|  \/  |     /\     |_   _| \ \ / / |  __ \  \ \   / /
| \  / |    /  \      | |    \ V /  | |__) |  \ \_/ /
| |\/| |   / /\ \     | |     > <   |  ___/    \   /
| |  | |  / ____ \   _| |_   / . \  | |         | |
|_|  |_| /_/    \_\ |_____| /_/ \_\ |_|         |_|

Official Site : https://www.sipeed.com
Wiki          : https://maixpy.sipeed.com

MicroPython v0.5.0-104-gbbd4c9880 on 2020-07-26; Sipeed_M1 with kendryte-k210
Type "help()" for more information.
>>> 
Langage du code : PHP (php)

On peut bien sur copier/coller les lignes du script une par une. Mais c’est très pénible, surtout que la moindre erreur de frappe ne peut pas être corrigée.

Non pour se simplifier la vie on peut passer en mode «paste» avec Ctrl+e. un peu comme dans vim, il ne prendra le texte que de manière «brute» sans mise en forme. On termine sa session de collage avec la touche Ctrl+d.

>>> 
paste mode; Ctrl-C to cancel, Ctrl-D to finish
=== from Maix import MIC_ARRAY as mic
=== 
import lcd
=== 

=== 
lcd.init()
=== 
mic.init()
=== 

=== 
while True:
=== 
    imga = mic.get_map()
=== 
    b = mic.get_dir(imga)
=== 
    a = mic.set_led(b,(0,0,255))
=== 
    imgb = imga.resize(240,160)
=== 
    imgc = imgb.to_rainbow(1)
=== 
    a = lcd.display(imgc)
=== 
mic.deinit()
=== 

Microphone Array Arithmetic, Developed by Canaan, Port by Sipeed
TrueLangage du code : JavaScript (javascript)

Ce qui donne ça :

Le programme s’arrête avec un simple Ctrl+C

Microphone Array Arithmetic, Developed by Canaan, Port by Sipeed
True
Traceback (most recent call last):
File "", line 13, in
KeyboardInterrupt:Langage du code : PHP (php)

Publié dans Non classé | Laisser un commentaire

À fond sur la marche arrière !

Pour fêter l’arrêt de la centrale de Fessenheim en Alsace, l’Allemagne met en service une centrale à charbon.

Le tout à peu près au même moment puisque la mise en service de cette centrale à charbon a été faite le 30 mai 2020 et l’arrêt de Fessenheim le 28 juin 2020.

Donc on arrête une centrale qui fait de l’électricité (presque) sans CO2 pour la remplacer par la pire source fossile pour produire de l’électricité : le charbon.

Quel beau modèle écologique allemand ! Mais que fait Greenpeace ?

Publié dans Non classé | Laisser un commentaire

Clavier orthogonal Monster2, le fail !

Suite à mon article sur les claviers orthogonaux et ma bafouille sur LinuxFR, je pensais avoir trouvé LE clavier orthogonal à tarif raisonnable (40€ avec les frais de port) chez LDLC

Sauf que je ne m’étais pas méfié du nom.

Ça m’apprendra à ne pas lire les dimensions avant d’acheter 😉

Il porte bien son nom en effet: C’est un monstre ! Et donc d’un intérêt discutable pour une utilisation «normal».

Dommage, je croyais avoir enfin trouvé un clavier avec les touches alignés.

Publié dans Non classé | Laisser un commentaire

QrOfLife

Mon article de LinuxFR sur la libération des FPGA en 2020 m’ayant fait gagner le livre de C.Delannoy «Programmer en C++ moderne», il me fallait un projet «bac à sable» pour mettre en œuvre un peu de C++.

Le décès de John Conway et mon activité actuelle chez Armadeus Systemm’ont donné un sujet tout trouvé : QrOfLife.

Petit aperçu de QrOfLife qui génère le QrCode du text «QrOfLife» puis le fait évoluer sur le thème du jeux de la vie

Le principe est simple, on prend un texte en argument de la commande. On génère le QrCode correspondant puis on le fait évoluer avec les règles du jeu de la vie.

… application totalement inutile.

Mais à l’image du blinking led project pour les FPGA; Le QrOfLife permet de mettre en pratique tout un tas d’outils pour développer en C++. Il permet également de prendre en mains certaines bibliothèques ainsi que des outils de compilation comme cmake.

Dans un futur plus ou moins proche j’essayerais d’ajouter la génération de GIF animé ainsi que la lecture des QrCode via la camera.

Publié dans Non classé | Laisser un commentaire

Alignez les touches !

Savez vous pourquoi la disposition des touches de votre clavier est toute biscornue ?

Je ne parle pas ici de l’organisation des lettres – il y a beaucoup à dire aussi là dessus – , mais juste de la disposition physique des touches.

Exemple de clavier pris au pif sur le net (ici un clavier apple)

Pourquoi sont-elles disposées en quinconce ?

Le célèbre clavier «clic» d’IBM

Vu l’âge du concept de clavier qui remonte à la fin XIXème début XXème, on pourrait se dire que c’est bien étudié. Qu’on a atteint la perfection niveau optimisation des touches pour le confort de frappes.

Vous noterez que ça n’a rien à voir avec la langue, c’est toujours en quinconce !

Hein, n’est-ce pas ?

Et bien non, cette stupide disposition des touches nous vient des machines à écrire mécaniques. En effet, si on veut garder droite la tige reliant le marteau à la touche, il est nécessaire de décaler les rangées. Si on avait voulu aligner les touches il aurait fallu tordre ces tiges à chaque rangée. Ce qui aurait sans doute été faisable, mais aurait affaibli la mécanique et complexifié la fabrication.

Les touches doivent être décalées à chaque rangée pour garder les tiges droites

Cette disposition, qui était bien commode pour les machines à écrire mécanique, a été gardée pour le passage à l’électrique. Alors qu’il n’y avait aucune raison de rester comme ça. Et l’habitude a été gardé sur les claviers d’ordinateur.

Pourtant, non seulement ça n’est pas ergonomique, mais en plus ça n’est pas optimum pour le placement des touches. On met moins de touches dans une même surface avec un clavier quinconce. Pour les appareils portable c’est une très mauvaise idée…

Tiens c’est marrant, quand il a fallu rajouter un pavé numérique les concepteurs n’ont pas poussé le masochisme jusqu’à les mettre en quinconce 🙂

Malgré ça, il n’existe pas d’ordinateur portable avec un clavier orthogonale (ortholinear). Tous ont gardé cette antique disposition anti-ergonomique et complexe à mettre en œuvre en production …

Est-ce que l’alignement des rangées révolutionnerait les habitudes des utilisateurs ?

Non.

Est-ce que ça implique un surcoût en fabrication ?

Non.

Est-ce qu’on y perd en utilisabilité ?

Non. Au contraire !

Est-ce qu’on y perd en compatibilité ?

Bin non un clavier orthogonale pourrait être exactement identique à un clavier «quinconce» d’un point de vue électronique.

Alors pourquoi on trouve pas de p#*$! de clavier orthogonal sur le marché bordel ?

Il n’est pas tout à fait vrai de dire qu’on n’en trouve pas. Il en existe très peu et très cher. Voici une petite liste :

  • Typematrix: C’est celui que j’utilise personnellement. Il est cher ($110) et un peu fragile. J’ai du en racheter quelques uns pour ne pas tomber en rade. Pour le confort d’utilisation par contre il est bien. Pour la compatibilité je n’ai pas de problème, mais ça n’est pas tout à fait un clavier standard.
  • Thingiverse: Lui l’a bricolé en reprenant les touches d’un clavier standard pour les aligner.
  • Ergodox: celui là est orthogonal en colonnes, mais les lignes ont été changées pour s’adapter aux mains. Cependant on est pas du tout dans le low cost (J’ai acheté le miens plus de 200€) et la compatibilité n’est pas géniale dans la mesure où il faut se coltiner un programme de configuration. Perso j’ai du mal avec certaines touches de fonctions.
  • Plank: Là on n’est plus dans le clavier classique, et il y a une phase d’apprentissage. Mais ça semble intéressant, l’idée est de virer 60% des touches d’un clavier classique pour se concentrer sur l’essentiel et réduire la taille du clavier sans perdre en fonctionnalités.
  • Atomic Keyboard: Je crois qu’il n’est plus possible de le trouver en commande sur le web celui là.

Tous ces exemples sont réservés à une élite (dont moi bien sûr:). Mais pourquoi aucun constructeurs n’osent simplement sortir un clavier classique à 20€ en alignant les touches ?

Il n’y aurait rien à changer. Et je suis convaincu que même l’utilisateur moyen ne serait pas contre. Ça ne changerait pas fondamentalement son expérience.

Et pourtant ça fait des dizaines d’années que tout le monde sait que c’est mieux mais qu’on ne voit toujours rien venir …

[Edit 10 mai 2020]

J’ai peut être trouvé le clavier orthogonal à moins de 40€ avec ce clavier USB pour enfant :

Clavier orthogonal à 34€ chez LDLC : Le Accuratus Monster 2

On le trouve décliné pour vieux et pour handicapés sur le site LDLC pour 34€. Les frais de ports sont un peu élevé par contre, mais ça reste moins cher que amazon.

Publié dans Non classé | Laisser un commentaire

Sos ordi & consoles = Arnaques ?

Le site de vente en ligne nommé Sos Ordi & Consoles vend des pièces détachées de différentes consoles rétro.

J’y ai commandé des connecteurs de manettes super nes à souder le 9 novembre 2019. Et depuis, je n’ai aucune nouvelles … impossible de les appeler puisqu’il n’y a pas de numéro de téléphone. L’adresse donnée sur la page des mentions légales est celle de l’hébergeur 1&1.

Et le mail de contact ne donne évidement aucune réponse …

Pourtant le payement fonctionne puisque j’ai été débité de la facture !

Si quelqu’un a des infos sur ce site ?

[Edit]

Je n’ai toujours pas réussi à contacter quelqu’un, par contre j’ai pu obtenir l’adresse postale via les coordonnées de payement :

4 lieu dit Coulin, 33690 Lavazan

Les mentions légales parle d’un certain Stéphane Bernier pourtant l’adresse semble correspondre à un dénommé Jérome Laurent. Personne qui semble avoir ouvert plusieurs entreprises fermées aujourd’hui.

L’adresse postale semble correspondre également à une entreprise nommée Studio-Sha creation. Une entreprise de création de site internet, mais que les mentions légales situe hors de France (à HongKong).

Faire attention également : le site enregistre votre carte bleue ! J’ai voulu faire une nouvelle simulation d’achat (câble HDMI) et la commande est partie.

[Edit2 (9 décembre 2019)]

À force de râler sur tous les canaux possibles que j’ai pu trouver, il y a eu une modification de ma commande sur mon «compte» disant qu’ils m’envoient la commande … il y a une semaine et demi. Et je n’ai toujours rien reçu.

Et toujours personne pour répondre à leur mail de contact.

[Edit3 (6 janvier 2020)]

Je viens de recevoir les commandes passées. Les connecteurs ainsi que la seconde commande dont j’avais demandé l’annulation et le remboursement.

Mon adresse est écrite à la main avec des ronds sur les i … Et la facture comporte tout un tas de fôtes de participe passé. Bref, visiblement ce site est une coquille vide très mal maintenu par une personne unique.

Trois mois pour être livré (alors que le site annonce fièrement 48h) et toujours personne pour répondre à leur mail de contact.

Publié dans Non classé | Laisser un commentaire

Il est possible d’utiliser libreoffice en ligne de commande pour convertir un dessin en pdf.

$ libreoffice --headless --convert-to pdf mondessin.odp

Pratique pour mettre dans un makefile quand on fait du markdown, sphinx ou latex.

Publié le par admin | Laisser un commentaire

Longan Nano, le kit RISC-V à moins de 5$

[PUB: Pour un guide complet sur la Longan Nano, courrez acheter le Hackable 33 pour lire l’article «Un RISC-V à bas coût pour monitorer votre PC avec LCDproc»]

Je viens de recevoir mon kit, voici donc une petite description du déballage du kit basé sur un microcontrôleur RISC-V GD32VF nommé Longan Nano.

Le kit est tout petit mais comporte quand même une LED tricolore, un écran LCD, des boutons, …

Pour accéder à l’usb (mode DFU) il faut laisser le bouton boot0 appuyé tout en branchant le kit. On obtient le message suivant :

$ dmesg
[896404.667425] usb 3-2: new full-speed USB device number 59 using xhci_hcd
[896404.808892] usb 3-2: New USB device found, idVendor=28e9, idProduct=0189
[896404.808895] usb 3-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[896404.808896] usb 3-2: Product: GD32 0x418 DFU Bootloade
[896404.808897] usb 3-2: Manufacturer: GDMicroelectronics
[896404.808898] usb 3-2: SerialNumber: 䌳䩂

Surtout retenez bien le numéro de série 😉

Outils et développement

SiPeed indique comment développer sur son kit avec Visual Studio (Hé oui le truc tourne sous Linux !) et la plate-forme platform.io.

Il faut donc commencer par installer les outils Microsoft qui, à ma grande surprise, fonctionnent très bien sur debian (64bits) ! Ça me vexe un peu d’ailleurs, mais passons.

$ sudo dpkg -i /home/fabien/Téléchargements/code_1.39.2-1571154070_amd64.deb

  • Visual Studio se lance simplement avec la commande code (pas du tout prétentieux):

$ code

  • Pour installer le greffon platformio (pio pour les intimes) il faut faire une recherche dans les extensions et installer PlatformIO IDE. Et patienter un peu (1 à 2 minutes chez moi).
  • Pour configurer le bouzin pour la Longan Nano il suffit d’ouvrir une console dans l’outils (symbole platformio fourmi -> quick access -> New Terminal) puis de lancer la commande :
$ platformio platform install gd32v
 PlatformManager: Installing gd32v
 gd32v @ 1.1.0 has been successfully installed!
 PackageManager: Installing toolchain-gd32v @ ~9.2.0
 Downloading  [####################################]  100%          
 Unpacking  [####################################]  100%          
 toolchain-gd32v @ 9.2.0 has been successfully installed!
 The platform 'gd32v' has been successfully installed!
 The rest of packages will be installed automatically depending on your build environment.
  • Perso j’ai plutôt pris la version «à jour» github :
$ platformio platform install https://github.com/sipeed/platform-gd32vLangage du code : JavaScript (javascript)
  • Un guide est donné également pour faire clignoter la LED en rouge. Il faut néanmoins faire quelques modifications pour le téléchargement du programme dans le micro comme nous allons le voir.
  • Lancer l’exemple longan-nano-blink
  • Modifier le fichier platform.ini comme suivant :
[env:sipeed-longan-nano]
platform = gd32v
framework = gd32vf103-sdk
board = sipeed-longan-nano
monitor_speed = 115200

; change microcontroller
board_build.mcu = GD32VF103CBT6

; change MCU frequency
board_build.f_cpu = 108000000L

; upload_protocol = sipeed-rv-debugger

upload_protocol = dfu
  • Ajouter les règles udev pour l’usb :

$ sudo vim /etc/udev/rules.d/90-longan-nano.rules

  • Avec la règle suivante (en supposant que votre utilisateur fait parti du groupe dialout depuis longtemps déjà).

ATTRS{idVendor}=="28e9", ATTRS{idProduct}=="0189", MODE="0666"

  • Installer les outils DFU :

$ sudo apt-get install dfu-util

  • (Re-)Démarrer le kit en mode «bootstrap» en le branchant à l’USB du pc tout en restant appuyé sur le bouton «boot0». Une fois branché vous avez l’autorisation de lâcher le bouton 😉 Constater que le kit est bien présent sur l’usb :

$ sudo dfu-util -l
dfu-util 0.9

Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 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/

Found DFU: [28e9:0189] ver=1000, devnum=62, cfg=1, intf=0, path="3-1", alt=1, name="@Option Bytes /0x1FFFF800/01016 g", serial="??" Found DFU: [28e9:0189] ver=1000, devnum=62, cfg=1, intf=0, path="3-1", alt=0, name="@Internal Flash /0x08000000/512002Kg", serial="??"

$  sudo dfu-util -l
 dfu-util 0.9

Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
 Copyright 2010-2016 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/

Found DFU: [28e9:0189] ver=1000, devnum=62, cfg=1, intf=0, path="3-1", alt=1, name="@Option Bytes  /0x1FFFF800/01016 g", serial="??" Found DFU: [28e9:0189] ver=1000, devnum=62, cfg=1, intf=0, path="3-1", alt=0, name="@Internal Flash  /0x08000000/512002Kg", serial="??"Langage du code : JavaScript (javascript)
  • Compiler (le minuscule symbole de check en V en bas à gauche)
  • Télécharger (le minuscule symbole flèche juste à coté du minuscule symbole de compile)
> Executing task: platformio run --target upload <

Processing sipeed-longan-nano (platform: gd32v; framework: gd32vf103-sdk; board: sipeed-longan-nano)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PackageManager: Installing tool-openocd-gd32v @ ~0.1.1
Downloading  [####################################]  100%          
tool-openocd-gd32v @ 0.1.1 has been successfully installed!
PackageManager: Installing tool-gd32vflash @ ~0.1.0
tool-gd32vflash @ 0.1.0 has been successfully installed!
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/gd32v/sipeed-longan-nano.html
PLATFORM: GigaDevice GD32V 1.1.0 > Sipeed Longan Nano
HARDWARE: GD32VF103CBT6 108MHz, 32KB RAM, 128KB Flash
DEBUG: Current (altera-usb-blaster) External (altera-usb-blaster, gd-link, jlink, rv-link, sipeed-rv-debugger, um232h)
PACKAGES: tool-openocd-gd32v 0.1.1, framework-gd32vf103-sdk 1.0.0, tool-gd32vflash 0.1.0, toolchain-gd32v 9.2.0
LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 0 compatible libraries
Scanning dependencies...
No dependencies
Compiling .pio/build/sipeed-longan-nano/src/main.o
Compiling .pio/build/sipeed-longan-nano/src/systick.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_adc.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_bkp.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_can.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_crc.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_dac.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_dbg.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_dma.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_eclic.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_exmc.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_exti.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_fmc.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_fwdgt.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_gpio.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_i2c.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_pmu.o
/home/fabien/.platformio/packages/framework-gd32vf103-sdk/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c: In function 'i2c_flag_clear':
/home/fabien/.platformio/packages/framework-gd32vf103-sdk/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c:610:14: warning: variable 'temp' set but not used [-Wunused-but-set-variable]
  610 |     uint32_t temp;
      |              ^~~~
/home/fabien/.platformio/packages/framework-gd32vf103-sdk/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c: In function 'i2c_interrupt_flag_clear':
/home/fabien/.platformio/packages/framework-gd32vf103-sdk/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c:718:14: warning: variable 'temp' set but not used [-Wunused-but-set-variable]
  718 |     uint32_t temp;
      |              ^~~~
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_rcu.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_rtc.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_spi.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_timer.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_usart.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_wwdgt.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/system_gd32vf103.o
Compiling .pio/build/sipeed-longan-nano/RISCV/drivers/n200_func.o
Compiling .pio/build/sipeed-longan-nano/RISCV/env_Eclipse/entry.o
Compiling .pio/build/sipeed-longan-nano/RISCV/env_Eclipse/handlers.o
Compiling .pio/build/sipeed-longan-nano/RISCV/env_Eclipse/init.o
Compiling .pio/build/sipeed-longan-nano/RISCV/env_Eclipse/start.o
Compiling .pio/build/sipeed-longan-nano/RISCV/env_Eclipse/your_printf.o
Compiling .pio/build/sipeed-longan-nano/RISCV/stubs/_exit.o
/home/fabien/.platformio/packages/framework-gd32vf103-sdk/RISCV/env_Eclipse/your_printf.c: In function '__wrap_printf':
/home/fabien/.platformio/packages/framework-gd32vf103-sdk/RISCV/env_Eclipse/your_printf.c:4:1: warning: control reaches end of non-void function [-Wreturn-type]
    4 | }
      | ^
Compiling .pio/build/sipeed-longan-nano/RISCV/stubs/close.o
Compiling .pio/build/sipeed-longan-nano/RISCV/stubs/fstat.o
Compiling .pio/build/sipeed-longan-nano/RISCV/stubs/isatty.o
Compiling .pio/build/sipeed-longan-nano/RISCV/stubs/lseek.o
Compiling .pio/build/sipeed-longan-nano/RISCV/stubs/read.o
Archiving .pio/build/sipeed-longan-nano/libstandard_peripheral.a
Indexing .pio/build/sipeed-longan-nano/libstandard_peripheral.a
Compiling .pio/build/sipeed-longan-nano/RISCV/stubs/sbrk.o
Compiling .pio/build/sipeed-longan-nano/RISCV/stubs/write.o
Compiling .pio/build/sipeed-longan-nano/RISCV/stubs/write_hex.o
Archiving .pio/build/sipeed-longan-nano/libRISCV.a
Indexing .pio/build/sipeed-longan-nano/libRISCV.a
Linking .pio/build/sipeed-longan-nano/firmware.elf
Checking size .pio/build/sipeed-longan-nano/firmware.elf
Building .pio/build/sipeed-longan-nano/firmware.bin
Memory Usage -> http://bit.ly/pio-memory-usage
DATA:    [=         ]   7.0% (used 2310 bytes from 32768 bytes)
PROGRAM: [=         ]   5.0% (used 6572 bytes from 131072 bytes)
Configuring upload protocol...
AVAILABLE: altera-usb-blaster, dfu, gd-link, jlink, rv-link, serial, sipeed-rv-debugger, um232h
CURRENT: upload_protocol = dfu
Uploading .pio/build/sipeed-longan-nano/firmware.bin
dfu-util: Invalid DFU suffix signature
dfu-util: A valid DFU suffix will be required in a future dfu-util release!!!
dfu-util 0.9

Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 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/

Opening DFU capable USB device...
ID 28e9:0189
Run-time device DFU version 011a
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status: state = dfuERROR, status = 10
dfuERROR, clearing status
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 011a
Device returned transfer size 2048
GD32 flash memory access detected
Device model: GD32VF103CB
Memory segment (0x08000000 - 0801ffff)(rew)
Erase size 1024, page count 128
Downloading to address = 0x08000000, size = 6584

Download        [                         ]   0%            0 bytes
Download        [=======                  ]  31%         2048 bytes
Download        [===============          ]  62%         4096 bytes
Download        [=======================  ]  93%         6144 bytes
Download        [=========================] 100%         6584 bytes
Download done.
File downloaded successfully
Transitioning to dfuMANIFEST stateLangage du code : HTML, XML (xml)
  • Et voilà ! La led clignote en rouge. Pour la passer en vert (par exemple) il faut changer le code de main.c:
/* BUILTIN LED OF LONGAN BOARDS IS PIN PC13
#define LED_PIN GPIO_PIN_13
#define LED_GPIO_PORT GPIOC
#define LED_GPIO_CLK RCU_GPIOC
*/

/* BUILTIN LED GREEN*/
#define LED_PIN BIT(1)
#define LED_GPIO_PORT GPIOA
#define LED_GPIO_CLK RCU_GPIOALangage du code : CSS (css)

Le pinout de la LED RGB n’apparaît pas sur ce schéma

Publié dans électronique, Non classé | Marqué avec , , | 10 commentaires