Présentation du bus pirate

Le bus pirate est un outil de communication open source et open hardware proposé par dangerous prototypes et développé par Ian Lesnet. Il permet le dialogue entre un PC et une cible (1-wire, 2-wire, 3-wire, UART, I2C, SPI, et HD44780), permet de fournir des alimentations 5V ou 3.3V, de lire des tensions (0-6V), de générer un PWM, de mesurer des fréquences jusqu’à 40MHz, d’activer des résistances de pull-up… Il est donc le compagnon idéal de l’ingénieur en phase de prototypage ou du hacker.

Besoin de dialoguer avec un nouveau composant ou de sniffer un réseau I2C ? En quelques minutes, avec son interface USB-série il permet d’envoyer des commandes depuis un PC via un simple terminal (type Tera Term ou PuTTY). Les commandes reçues seront analysées syntaxiquement (parsing) par le logiciel du bus pirate et traduites en instructions machines (opcodes) afin de programmer les périphériques concernés (timers, I/O, ADC, …). Le bus pirate rend transparentes pour l’utilisateur les étapes habituellement nécessaires depuis la couche application jusqu’à la couche physique. Tous les détails sont sur le lien suivant : [1] Bus_Pirate.

Prise en main

Pour pouvoir commencer à utiliser le bus pirate, il faut le relier à un port USB à l’aide d’un câble mini USB type B mâle / USB type A mâle.

Sur Windows, il faut télécharger un driver FTDI et un émulateur de terminal. Le détail de la procédure est disponible sur [2] Prise en main du bus pirate sur Windows.

Sur Linux, pas besoin d’installer de driver FTDI ni d’émulateur de terminal, ils sont nativement présent !

Brancher le bus pirate et dans un terminal taper :

dmesg | tail

Voci le résultat pour ma part :

[ 598.515122] usb 5-2: Manufacturer: FTDI

[ 598.515124] usb 5-2: SerialNumber: A603XY9B

[ 598.522140] ftdi_sio 5-2:1.0: FTDI USB Serial Device converter detected

[ 598.522178] usb 5-2: Detected FT232RL

[ 598.522181] usb 5-2: Number of endpoints 2

[ 598.522183] usb 5-2: Endpoint 1 MaxPacketSize 64

[ 598.522186] usb 5-2: Endpoint 2 MaxPacketSize 64

[ 598.522188] usb 5-2: Setting MaxPacketSize 64

[ 598.524175] usb 5-2: FTDI USB Serial Device converter now attached to ttyUSB0

[ 879.391003] perf interrupt took too long (2503 > 2500), lowering kernel.perf_event_max_sample_rate to 50000

Sur l’avant-dernière ligne on en déduit que le bus pirate est attaché sur ttyUSB0 (peut être variable, selon les devices USB déjà connectés).

A l’aide de cet identifiant on peut se connecter au bus pirate à l’aide de minicom (un émulateur de terminal sur linux).

Pour cela, dans un terminal, lancer :

sudo minicom -b 115200 -D /dev/ttyUSB0
 

Une fois minicom lancé, appuyer sur Entrée et vous devriez avoir le prompt du bus pirate :

HiZ>

HiZ signifie que l’on est à l’état haute impédance (ou tri-state). La sortie n’est ni à l’état haut ni à l’état bas (circuit ouvert).

Pour aller plus loin, il est possible de fixer le nom du device détecté lors du branchement du bus pirate à l’aide de UDev.

Pour cela, suivre les indications sur ce lien : [3] Fixer le device sur Linux.

Maintenant que l’on peut communiquer avec notre bus pirate on peut commencer à s’amuser.

Dans un premier temps, taper « ? » pour avoir la liste des commandes disponibles :

HiZ>?

General                                 Protocol interaction

—————————————————————————

?       This help                       (0)     List current macros

=X/|X   Converts X/reverse X            (x)     Macro x

~       Selftest                        [       Start

#       Reset                           ]       Stop

$       Jump to bootloader              {       Start with read

&/%     Delay 1 us/ms                   }       Stop

a/A/@   AUXPIN (low/HI/READ)            « abc »   Send string

b       Set baudrate                    123

c/C     AUX assignment (aux/CS)         0x123

d/D     Measure ADC (once/CONT.)        0b110   Send value

f       Measure frequency               r       Read

g/S     Generate PWM/Servo              /       CLK hi

h       Commandhistory                  \       CLK lo

i       Versioninfo/statusinfo          ^       CLK tick

l/L     Bitorder (msb/LSB)              –       DAT hi

m       Change mode                     _       DAT lo

o       Set output type                 .       DAT read

p/P     Pullup resistors (off/ON)       !       Bit read

s       Script engine                   :       Repeat e.g. r:10

v       Show volts/states               .       Bits to read/write e.g. 0x55.2

w/W     PSU (off/ON)            <x>/<x= >/<0>   Usermacro x/assign x/list all

Puis taper « i » et vous aurez les informations de version de votre bus pirate :

Bus Pirate v3b

Firmware v5.10 (r559) Bootloader v4.4

DEVID:0x0447 REVID:0x3046 (24FJ64GA002 B8)

http://dangerousprototypes.com

Nous allons maintenant passer en revue les parties Hardware/Software qui composent le bus pirate.

Hardware

Le bus pirate se présente comme une carte de taille réduite :

Les deux principaux composants du bus pirate sont :

  • (1) Une interface de conversion USB-série FT232RL ;
  • (2) Un PIC24FJ64GA002 (microcontrôleur 16 bits, 64Ko de mémoire programme et 8Ko de RAM).

Le bus pirate est open hardware. Le schématique et le PCB sont disponibles sur [4] Hardware Bus Pirate v3.6. Une version 4.x en cours de développement existe également mais de l’aveu même de dangerous prototypes la v3.x est plus stable pour le moment (lire [5] Bus_Pirate_v4_design_overview). Concernant la v4.x, les développeurs ont souhaité s’affranchir des limitations de mémoires du micro précédent en le remplaçant par un PIC24FJ256GB106 (microcontrôleur 16 bits, 256Ko de mémoire programme et 16Ko de RAM). En ce qui me concerne j’ai une version 3.x (vu dans le paragraphe précédent) et c’est largement suffisant !

Au niveau de la connectique il y a :

  • (3) Un connecteur mini USB type B, pour la communication série entre le PC et le bus pirate ;
  • (4) Un port ICSP (1x5pins) pour la programmation du PIC24FJ64GA002 à l’aide d’un programmeur de PIC type ICD2 ou PICKIT2 .

    Ce port n’est normalement pas utilisé car le bus pirate possède un bootloader permettant une mise à jour du firmware (voir plus bas). Néanmoins ce port permet une programmation de la mémoire programme du microcontrôleur. Il faudra juste au préalable souder un connecteur pin header 1×5 ;

  • (5) Un port I/O (2x5pins) qui permet la connexion entre un bus pirate et un composant externe (Figure 1) :

Figure 1 I/O pins du bus pirate (image: source)

Il existe plusieurs modèles de câbles disponibles pour relier un bus pirate à un composant. Pour ma part j’utilise un « probe kit ». C’est un câble qui se termine par des mini grippe-fils (Figure 2) :

Figure 2 Probe kit

Attention, le code couleur entre les grippe-fils et les fils identifiés à la Figure 1 ne correspondent pas ! Pour ne pas se tromper mieux vaut étiqueter ses mini grippe-fils.

Enfin, le bus pirate dispose de 4 LEDS (6) :

  • Un indicateur d’alimentation « PWR » (le bus pirate est relié à un port USB) ;
  • Un indicateur de trafic « USB » (bus pirate – PC) ;
  • Un indicateur d’activation d’un « MODE » parmi les 9 proposés (1-wire, I2C, SPI, …) ;
  • Un indicateur d’activation des alimentations externes 5V et 3.3V « VREG ».

Pour terminer ce premier contact avec le hardware du bus pirate on va s’assurer qu’il est en bon état de marche, à l’aide de la commande de selftest.

Au préalable il faut relier les pins Vpu et +5v ainsi que les pins +3.3V et ADC du connecteur (5). Par exemple à l’aide de cavaliers (voir ci-contre).

Puis lancer la commande de selftest : « ~ ». Si tout est en ordre vous devriez avoir le résultat suivant :

HiZ>~

Disconnect any devices

Connect (Vpu to +5V) and (ADC to +3.3V)

Space to continue

Ctrl

AUX OK

MODE LED OK

PULLUP H OK

PULLUP L OK

VREG OK

ADC and supply

5V(5.06) OK

VPU(4.98) OK

3.3V(3.28) OK

ADC(3.30) OK

Bus high

MOSI OK

CLK OK

MISO OK

CS OK

Bus Hi-Z 0

MOSI OK

CLK OK

MISO OK

CS OK

Bus Hi-Z 1

MOSI OK

CLK OK

MISO OK

CS OK

MODE and VREG LEDs should be on!

Any key to exit

Found 0 errors.

A la fin du selftest il doit y avoir 0 erreurs et les leds MODE et VREG sont allumées.

En cas de panne ou pour obtenir plus d’informations concernant ce selftest, rendez-vous à l’adresse suivante : [6] Bus pirate selftest.

Voyons maintenant la partie software du bus pirate.

Software

Cette partie identifie les composantes logicielles du bus pirate et n’est pas essentielle pour son utilisation.

Pour ceux qui ne s’intéressent pas au fonctionnement du bus pirate, sauter directement au paragraphe suivant !

Pour les autres, c’est parti.

S’agissant d’un projet open source, tout le code source est disponible sur [7] github – Bus_Pirate. L’archive fait environ 35Mo.

Il s’agit d’un fork du projet de dangerous prototype maintenu par la communauté suite à la décision de ne plus maintenir le firmware :

Unfortunately it seems that Dangerous Prototypes have abandoned the Bus Pirate firmware development (and the Bus Pirate v4 also), despite that their official firmware has never reached a truly stable state: the quantity of bug report threads at forums, especially regarding flashrom, is a direct proof of that.

Il y a tout un tas de chose sur ce gitub. Notamment :

  • Le code source du bootloader (dossier « BPv4-bootloader ») ;
  • Le code source du firmware (dossier « Firmware »).

Cela peut être intéressant de mettre à jour le firmware ou même y apporter ses modifications.

Pour cela il faut :

  1. Télécharger MPLAB.X et le compilateur XC16 et recompiler le projet (procédure : [8] Compilation du firmware ) ;
  2. Passer le bus pirate en mode bootloader (commande « $ ») et charger le nouveau firmware à l’aide de l’un des deux outils disponibles :

Pour les plus curieux l’historique des modifications du firmware est disponible ici : [11] Bus_Pirate_firmware_change_history.

Hello world

Voici pour terminer un cas simple d’utilisation du bus pirate, allumer une LED.

Le montage est très simple, il suffit de relier à la pin « AUX » du connecteur (5) une résistance en série avec une LED. La cathode de la LED est quant à elle reliée à la masse « GND » (Figure 3, 4):

pirate_led

Figure 3 Hello World, schéma

Figure 4 Hello World, IRL

Dans le terminal parmi les modes disponibles (« m ») :

HiZ>m

1. HiZ

2. 1-WIRE

3. UART

4. I2C

5. SPI

6. 2WIRE

7. 3WIRE

8. LCD

9. DIO

x. exit(without change)

Sélectionner le mode DIO (« 9 »).

(1)>9

Ready

DIO>

Note : il est possible de passer directement en mode DIO depuis le mode haute impédance en tapant directement « m 9 ».

A ce stade, on peut regarder le niveau des tensions de chaque pin à l’aide de la commande « v » :

DIO>v

Pinstates:

1.(BR) 2.(RD) 3.(OR) 4.(YW) 5.(GN) 6.(BL) 7.(PU) 8.(GR) 9.(WT) 0.(Blk)

GND 3.3V 5.0V ADC VPU AUX CLK MOSI CS MISO

P P P I I I I I I I

GND 0.00V 0.00V 0.00V 0.00V L L L L L

On peut vérifier le niveau de tension sur la pin 6 « AUX », il est à Low (« L »). La LED est éteinte pour le moment.

Puis taper « A » :

DIO>A

AUX HIGH

La LED doit s’allumer. On peut vérifier le niveau de tension sur la pin 6 « AUX », il est maintenant à High (« H ») :

DIO>v

Pinstates:

1.(BR) 2.(RD) 3.(OR) 4.(YW) 5.(GN) 6.(BL) 7.(PU) 8.(GR) 9.(WT) 0.(Blk)

GND 3.3V 5.0V ADC VPU AUX CLK MOSI CS MISO

P P P I I O I I I I

GND 0.00V 0.00V 0.00V 0.00V H L L L L

Pour éteindre la LED, taper « a ». Simple non ?

On peut aller plus loin et tenter de faire clignoter notre LED !

Pour cela le bus pirate propose un mode script très pratique pour l’automatisation de tâche.

Il est accessible par la commande « s ».

Une fois dans ce mode il est possible de :

  • Vider la mémoire : taper « new »
  • Lire le contenu de la mémoire : taper « list »
  • Lancer le programme en mémoire : taper « run »

Le langage de script interprété par le bus pirate est langage proche du BASIC. La spécification du langage se trouve sur [12] Spécification des scripts BASIC .

Voici un petit programme qui va afficher « Hello World! » au démarrage et faire changer l’état de la LED toutes les 500 ms :

10 PRINT "HELLO WORLD!"
20 AUX 0
30 LET A=AUX
40 PRINT "LED= ";A
50 IF A=0 THEN AUX 1 ELSE AUX 0
60 DELAY 500
70 GOTO 30

Chaque ligne commence par un numéro de ligne en mémoire.

Chaque ligne est à rentrer une par une.

A la fin on peut vérifier le contenu de la mémoire en envoyant la commande « list ». Si tout est en ordre on lance le programme avec la commande « run ». Voilà notre LED clignote indéfiniment !

Bien sûr cet exemple est élémentaire et ne justifie pas l’achat d’un bus pirate !

Les autres modes, notamment les modes I2C et SPI se révèlent bien plus intéressants !

Informations complémentaires

Pour acheter un bus pirate en version 3.6 et son câble, voici quelques possibilités :

Et pour terminer le lien vers le forum de la communauté : [17] Forum bus pirate

Amusez-vous bien avec votre bus pirate !

Edit : j’ai ajouté un article pour illustrer un cas concret d’utilisation !

Références :

[1] Bus_Pirate ;

[2] Prise en main du bus pirate sur Windows ;

[3] Fixer le device sur Linux ;

[4] Hardware Bus Pirate v3.6 ;

[5] Bus_Pirate_v4_design_overview ;

[6] Bus pirate selftest ;

[7] github – Bus_Pirate  ;

[8] Compilation du firmware ;

[9] Pirate-Loader_console_upgrade_application_(Linux,_Mac,_Windows)  ;

[10] Ds30_Loader_GUI ;

[11] Bus_Pirate_firmware_change_history  ;

[12] Spécification des scripts BASIC  ;

[13] Adafruit – Bus pirate v3.6 ;

[14] Adafruit – Bus pirate probe kit ;

[15] Amazon – Bus pirate v3.6 ;

[16] Amazon – Bus pirate probe kit ;

[17] Forum bus pirate.

Publicités