Download: buspirate.v0c.zip
A few weeks ago we wrote about our Bus Pirate universal serial interface tool. We used the recent holiday to add some new features, like a JTAG programmer, macros, frequency measurement, and more. A major code reorganization makes everything simpler to read and update.
Check out the a demonstration of the new features below. We’re compiling a roadmap and wish list, so share your ideas in the comments. You can also see how we used the Bus Pirate to read a smart card and test-drive an I2C crystal oscillator.
New protocols
I2C>m <–setup mode
1. HiZ <– high impedance pins (safe mode)
2. 1-WIRE <– not ready for this release
3. UART
4. I2C
5. SPI
6. JTAG <– interface and programmer
7. RAW2WIRE
8. RAW3WIRE
MODE>1
900 MODE SET
HiZ>
This firmware release lists three new protocols.
Hi-Z makes all pins high impedance/input, a safe state that won’t damage an attached circuit. To be safe, the Bus Pirate now starts in this mode.
1-Wire is listed, but we couldn’t include it in this release because we still don’t have any parts to test with our library. This is just a placeholder for now, but it will be added as soon as we get a 1-Wire part to test.
We wrote a simplified JTAG interface that includes a XSVF player for programming JTAG device chains.
**We included a hardware I2C library, but according to the device errata there’s a bug in the 24FJ64GA002 rev3 I2C module. This will work with a different chip (e.g. a 28pin dsPIC33).
Connection table
PIN
1-Wire
I2C*
SPI**
RS232
JTAG
B9
SDA
SDA
MOSI
–
TDI
B8
–
SCL
CLK
–
TCK
B7
–
–
MISO
RX
TDO
B6
–
–
CS
TX
TMS
B5
Aux
Aux
Aux
Aux
Aux
Grond
GND
GND
GND
GND
GND
*also raw 2 wire. **also raw 3 wire.
The new modes connect to the Bus Pirate as described in the table.
New features and settings
Frequency measurement
HiZ>F <– do a frequency count 9xx FREQ count ON AUX: 22199552Hz (22MHz) HiZ>
As seen in the DS1077 demonstration, we added a frequency counter to the Bus Pirate’s AUX pin. ‘F’ steps frequency, maximum of about 50MHz.
Assign axillary control
HiZ>c <– menu c AUX PIN 1. AUX (DEFAULT) 2. CS/TMS MODE>1 <– set AUX control mode 9xx AUX: DEFAULT setting (AUX PIN) HiZ>
Sometimes we need to control the chip select (CS) /JTAG state device (TMS) pins manually. ‘c’ toggles the pin control between the axillary pin and the chip select pin.
Set terminal speed
HiZ>b <– menu b Set serial port speed: (bps) 1. 300 ... 9. 115200 SPEED>9 <– set speed Adjust your terminal and press space to continue HiZ>
‘b’ adjusts the PC-side serial port speed.
Macros
A new syntax addition, ‘(#)’, triggers protocol dependent macros.
JTAG>(0) <–macro 0 0.macro-menu 1.Reset chain 2.Probe chain 3.XSVF player JTAG>
In any mode, use the macro (0) to display a menu of available macros.
I2C address search
I2C>(1) <–scan I2C addresses macro XXX ZOEKENDE 7BIT I2C-adresruimte. Gevonden apparaten op: 0xB0 0xB1 <–DS1077 responds to write and read address I2c>
The I2C library includes a macro to automatically search the I2C address range for devices. helpful when you work with an unknown chip.
Raw2wire smart card ISO 7813-3 ATR
RAW2WIRE>(1)<–ATR and decode macro ISO 7813-3 ATR 950 AUX LOW 951 AUX HIGH 4xx RAW2Wire 0x01 kloktickets 950 AUX LOW ISO 7813-3 reply: 0xA2 0x13 0x10 0x91<–ATR bytes Protocol: 2 wire <–decoded ATR data Read type: to end<– Data units: 256 <– Data unit length: 8 bits <– RAW2Wire>
Macro 1 resets and identifies a smart card. For much more about the ISO7813-3 ATR, see how we used the Bus Pirate to read a smart card.
JTAG
JTAG is a debugging and programming interface for all kinds of electronics. The raw hardware interface can be accessed with the Bus Pirate’s raw 3 wire library, but we added a few features to make it much easier.
JTAG has different modes where data entry does different things. Modes are navigated with the JTAG TMS signal; there are a bunch of JTAG modes, called states.The Bus Pirate’s JTAG library is just the raw 3 wire library, enhanced to help with JTAG state changes.
We only implemented the JTAG states we need to get data in and out of a JTAG device chain: reset, idle, data register, and instruction register. Macro (1) issues a JTAG chain reset, and initializes the chain to the idle state. { puts the JTAG chain in data register mode. [ puts the chain in instruction register mode. ] or } return the chain to the idle state. The Bus Pirate has an internal state device tracker that is smart enough to manage the chain without explicitly returning the chain to idle; in other words, you don’t have to close your tags. The state device tracker reports every state change to help debug problems.
JTAG>[0xfe {rrrr} <– same as [0xfe]{rrrr}
xxx JTAGSM: already IDLE
xxx JTAGSM: IDLE->Instruction Register (DELAYED ONE bit FOR TMS)
610 JTAG ready TO write IR <– JTAG chain instruction register
620 JTAG WRITE: 0xFE <– request ID
xxx JTAGSM: (WROTe vertraagd bit) ir-> idle <-back to idle
XXX JTAGSM: Idle-> Data Register <-LELE NAAR GADISTER
611 JTAG klaar om te lezen / schrijven DR
630 JTAG Lees: 0x93 <-Device ID
630 JTAG Lees: 0x40
630 JTAG Lees: 0x60
630 JTAG Lees: 0x59
xxx jtagsm: dr-> inactief <-back to stationair
640 JTAG inactief
Jtag>
Hier is een korte interactie met een Xilinx XC9572 CPLD. We gaan naar het instructieregister ([) en verzenden de opdracht Apparaat-ID-aanvraag (0xFE). Vervolgens gaan we het gegevensregister ({), lees vier bytes (RRRR of R: 4-shorthand) en keert terug naar stationair (}).
Wat zijn vertraagd bitgeschreven?
JTAG vereist dat het laatste gegevensbit geschreven naar het instructieregister op hetzelfde moment als de statuswijziging wordt ingevoerd. Omdat de buspiraat geen manier heeft om te voorspellen wanneer we de staten daadwerkelijk zullen veranderen, vertraagt het het laatste bit van elke byte-schrijf totdat een van de drie dingen gebeurt:
Verlaat het instructieregister met een},] of {opdracht
Schrijf een andere byte-waarde
Een leesopdracht
In afwachting van bits worden niet gewist door bitwise-operaties (zoals! Of ^). Doe deze voordat u uw laatste byte schrijft of de code wijzigen. We hebben niet geïmplementeerd in afwachting van het gegevensregister, maar het is waarschijnlijk nodig. Mogelijk moet u dit uitvoeren als u het gegevensregister schrijft, liever alleen maar lezen, zoals wij.
Jtag macro’s
Jtag> (1) <-Macro 1
XXX JTAGSM: RESET
xxx jtagsm: reset-> inactief
Jtag>
JTAG Macro (1) reset de JTAG-keten en gaat vervolgens naar de inactieve toestand.
Jtag> (2) <-Macro 2
xxx jtag init chain
XXX JTAGSM: RESET
xxx jtagsm: reset-> inactief
XXX JTAGSM: Idle-> Instruction Register (vertraagd één bit voor TMS)
xxx jtagsm: ir-> inactief
xxx jtagsm: inactief-> gegevensregister
xxx jtagsm: dr-> inactief
XXX JTAGSM: RESET
xxx jtagsm: reset-> inactief
xxx jtagsm: inactief-> gegevensregister
XXX JTAG-ketenrapport: <-Start of Report
0x01-apparaat (s)
# 0x01: 0x93 0x40 0x60 0x59 <-device IDS
xxx jtagsm: dr-> inactief
Jtag>
Macro (2) reset de ketting, telt de apparaten en meldt alle apparaat-ID’s.
Jtag> (3) <-Macro 3 6xx JTAG XSVF-speler XXX XON / XOFF-flow-besturing vereist <-required! XXX Druk op Z om door te gaan <- Druk op Z XXX BEGIN XSVF Verzenden <- Dien het bestand in 6 × 0 XSVF OK <- Resultaat of fout Uw pc dribbelde MAX 0x05 bytes na XOFF (dat is OK) 6xx Druk 5 keer op z om door te gaan - Ga door Jtag>
Macro 3 is een XSVF-speler / -programmeur met code van Xilinx. XSVF is byte-formaat SVF, zoals beschreven door Xilinx (PDF). XSVF-bestanden kunnen voor elke ketting worden gecompileerd met de juiste generieke JTAG-definitiebestanden, zelfs niet-Xilinx-apparaten. We gebruikten met succes de binaire overdrachtsfuncties in Hercules en Tera-term om XSVF-bestanden naar de programmeur te verzenden.
Jtag in sommige gevallen pauzeert langer dan het nodig is om de pc aan te gaan om een byte van gegevens over te dragen, dus hebben we Xon / XOFF-softwarebloemcontrole voor de XSVF-speler geïmplementeerd. Uw terminal moet in XON / XOFF-flow-besturingsmodus staan voordat u het XSVF-bestand indient, of de programmeur zal falen. Zelfs met softwarestroomregeling heeft een moderne pc al verschillende bytes verzonden via de lagen van het besturingssysteem voordat deze de stroomregelsignalen ontvangt. We behandelen hiermee door deze bytes te vangen voordat we verder gaan, dit wordt gerapporteerd als het maximale aantal bytes “dribbelden”.
Als er een fout is in het uploaden, blijft de pc waarschijnlijk bytes spuwen bij de buspiraat. Om foutmeldingen zichtbaar te houden en afval in de terminal te voorkomen, wacht de XSVF-speler op vijf kleine letters Z’s voordat het terugkeert naar de prompt. We kozen deze sequentie omdat het nooit zal voorkomen in een XSVF-bestand.
* Merk op dat de XSVF-speler de JTAG HI-Z PIN-instelling niet respecteert. Ging het, het faalt. Wees voorzichtig met het mengen van spanningen zonder een buffer.
Betere codestructuur
Het belangrijkste verschil tussen de versie 0B en 0C-firmware is een enorme verbetering in de codestructuur. De buspiraat bestond in talrijke incarnaties voordat we het verpakken voor het oorspronkelijke artikel. V.0C harmoniseert de codebibliotheken en maakt het eenvoudiger om nieuwe protocollen toe te voegen.
Hoe een aangepast protocol toe te voegen
De Bus Pirate Code verwerkt de gebruikersinterface en passeert twee variabelen naar de Active Protocol-bibliotheek. De eerste variabele is een opdracht, zoals cmd_read, cmd_readbulk of cmd_write. De volledige opdrachtset is gedefinieerd in basis.h. De tweede variabele is een optionele waarde. Een gemakkelijke cmd_read-opdracht geeft geen waarde, een bulk-leescommando passeert het aantal bytes om te lezen, een schrijfopdracht geeft de waarde door om naar de bus te schrijven, enz. Minimaal heeft een aangepast protocol een functie nodig om deze variabelen te ontvangen en deze variabelen te ontvangen en deze variabelen te ontvangen. naar busacties.
We gebruikten drie verschillende technieken om opdrachten aan busacties te koppelen. Eenvoudige code kan direct gaan in een enorme schakelinstantie, zoals Spi.c. Externe bibliotheken gebruiken een enkele koppelingsfunctie, zoals I2C.C en M_I2C_1.C. Veel ingewikkelder protocollen gebruiken de schakelaaroverzicht om functies in de bibliotheek (Raw2Wire.c, Raw3Wire.c, JTAG.C UART.C) te gebruiken. Handige functies voor terminal io zijn opgenomen in basis.h / c.
Vanwege massieve codeverbeteringen is het nu slechts licht verwarend om een nieuw protocol te registreren met de buspiraat:
basis.h – maak een deFinition voor het protocol. Het laatste item is momenteel “#define raw3wire 7”, dus de volgende invoer zou kunnen zijn “#define mycustomwire 8”.
buspirate.c – Voeg een header-bestand toe met dat toegang geeft tot de verwerkingsfunctie. Voeg een menu-item toe in de modus CHAR * [] = variabele lijst. Het menu-item moet in dezelfde positie staan in de lijst als het nummer dat is toegewezen in de basis. Het definieert. Als MyCustomWire nummer 8 is, moet het de achting in de modusvariabele zijn. Voeg ten slotte een extra schakelaar toe aan de BPPROCESS () -functie die de op maat gemaakte bibliotheekverwerking routine noemt wanneer de modus is ingesteld op “MyCustomwire”.
NAADSCHAPPELIJK: een Hack A Day Wish-lijst
We hebben de feedback gecompileerd die we hebben gekregen in drie verlanglijstjes: protocollen, functies en macro’s.
Protocollen
1-draads, met opsomming (* klaar zodra we onderdelen hebben om het te testen)
OBD-II (bedankt [Shadyman])
KAN
MIDI (Wikipedia)
DMX512-A
Irda, rc5x, etc.
Sommige protocollen vereisen een externe transceiver.
Functies
Pulse-width-modulator, frequentiegenerator
“Wacht tot onderbreking” Commando
Converteer frequentiemeting om perifeer in te voeren
Laat frequentiemeting op elke pincode toe
Toon een rapport van de huidige configuratie-instellingen en PIN-staten.
Integer herhaalwaarden voor bulk lezen, klokteken, vertragingen, etc.
Een CRC-generator
Macro’s
Transparante UART-brug
SD-kaartinitialisatie, meta-gegevens-extract en dump
EEPROM-programma / Dump (I2C / SPI)
Nokia 6100 LCD-initialisatie, controle
NMEA GPS Data-decoder
Heb je iets om toe te voegen aan de lijst?
Firmware Download: buspirate.v0c.zip