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
Set mode 900.
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
–
–
SUP KEDELAI JEPANG
RX
TDO
B6
–
–
CS
TX
TMS
B5
AUX
AUX
AUX
AUX
AUX
Tanah
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 mencari ruang alamat 7bit i2c. Perangkat yang ditemukan di: 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 CLOCK TICKS 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 (tertunda satu bit untuk TMS)
610 JTAG ready TO write IR <– JTAG chain instruction register
620 JTAG WRITE: 0xFE <– request ID
xxx JTAGSM: (WROTe tertunda bit) ir-> idle <-back to idle
XXX JTAGSM: Idle-> Data Register <-idle ke Data Register
611 jtag siap membaca / menulis dr
630 jtag Baca: 0x93 <-Device ID
630 jtag Baca: 0x40
630 JTAG Baca: 0x60
630 JTAG Baca: 0x59
xxx jtagsm: dr-> idle <-back to idle
640 JTAG Idle.
JTAG>
Berikut ini adalah interaksi singkat dengan Xilinx XC9572 CPLD. Kami pergi ke daftar instruksi ([), dan kirim perintah permintaan ID perangkat (0xfe). Kemudian, kita pergi daftar data ({), membaca empat byte (RRRR, atau R: 4 singkatan), dan kembali ke Idle (}).
Apa yang ditunda bit menulis?
JTAG mensyaratkan bahwa data terakhir yang ditulis ke register instruksi dimasukkan pada saat yang sama dengan perubahan keadaan. Karena bajak laut bus tidak memiliki cara untuk memprediksi ketika kita akan benar-benar mengubah negara, itu menunda bit terakhir dari setiap byte menulis sampai salah satu dari tiga hal terjadi:
Keluar dari daftar instruksi dengan},], atau {perintah
Tulis nilai byte lain
Perintah baca
Bit yang tertunda tidak dihapus oleh operasi bitwise (seperti! Atau ^). Lakukan ini sebelum menulis byte terakhir Anda, atau ubah kode. Kami belum menerapkan tertunda menulis ke daftar data, tetapi mungkin diperlukan. Anda mungkin perlu mengeksekusi ini jika Anda menulis daftar data, agak hanya membaca, seperti yang kami lakukan.
JTAG MACROS.
Jtag> (1) <-macro 1
xxx jtagsm: reset
xxx jtagsm: reset-> idle
JTAG>
JTAG MACRO (1) Mereset rantai JTAG dan kemudian memajukan ke kondisi idle.
JTAG> (2) <-macro 2
XXX JTAG rantai init
xxx jtagsm: reset
xxx jtagsm: reset-> idle
XXX JTAGSM: Idle-> Instruction Register (tertunda satu bit untuk TMS)
xxx jtagsm: ir-> idle
xxx jtagsm: idle-> register data
xxx jtagsm: dr-> idle
xxx jtagsm: reset
xxx jtagsm: reset-> idle
xxx jtagsm: idle-> register data
Laporan Rantai XXX JTAG: <-start of Laporan
Perangkat 0x01 (s)
# 0x01: 0x93 0x40 0x60 0x59 <-device IDS
xxx jtagsm: dr-> idle
JTAG>
Makro (2) mengatur ulang rantai, menghitung perangkat, dan melaporkan semua ID perangkat.
JTAG> (3) <-macro 3 6xx jtag xsvf player XXX XON / XOFF Kontrol aliran diperlukan <-Required! XXX Tekan Z untuk melanjutkan <- Tekan Z xxx mulai xsvf kirim <- kirimkan file 6 × 0 xsvf ok <- hasil atau kesalahan PC Anda menggiring bola Max 0x05 byte setelah Xoff (tidak apa-apa) 6xx Tekan Z 5 kali untuk melanjutkan <- Lanjutkan JTAG>
Macro 3 adalah pemutar XSVF / programmer menggunakan kode dari xilinx. XSVF adalah byte format SVF, seperti yang dijelaskan oleh xilinx (PDF). File XSVF dapat dikompilasi untuk setiap rantai dengan file definisi jtag generik yang sesuai, bahkan perangkat non-xilinx. Kami berhasil menggunakan fitur transfer biner dalam istilah Hercules dan Tera untuk mengirim file XSVF ke programmer.
JTAG Dalam beberapa kasus berhenti lebih lama daripada yang dibutuhkan PC untuk mentransfer byte data, jadi kami menerapkan kontrol aliran perangkat lunak Xon / Xoff untuk pemutar XSVF. Terminal Anda harus dalam mode kontrol aliran Xon / Xoff sebelum Anda mengirimkan file XSVF, atau programmer akan gagal. Bahkan dengan kontrol aliran perangkat lunak, PC modern telah mengirim beberapa byte melalui lapisan sistem operasi sebelum menerima sinyal kontrol aliran. Kami berurusan dengan ini dengan menangkap byte ini sebelum melanjutkan, ini dilaporkan sebagai jumlah maksimum byte “dribbled”.
Jika ada kesalahan dalam unggahan, PC mungkin akan terus meludah byte di bajak laut bus. Untuk menjaga pesan kesalahan terlihat, dan hindari sampah di terminal, pemain XSVF menunggu lima huruf kecil sebelum kembali ke prompt. Kami memilih urutan ini karena tidak akan pernah terjadi dalam file XSVF.
* Perhatikan bahwa pemutar XSVF tidak menghormati pengaturan JTAG Hi-Z PIN. Pergi, itu gagal. Berhati-hatilah dengan mampang voltase tanpa buffer.
Struktur kode yang lebih baik
Perbedaan paling signifikan antara firmware versi 0b dan 0c adalah peningkatan besar dalam struktur kode. Bus bajak laut ada di banyak inkarnasi sebelum kami mengemasnya untuk artikel awal. V.0C Harmonisasi Perpustakaan Kode dan membuatnya lebih sederhana untuk menambahkan protokol baru.
Cara Menambahkan Protokol yang Disesuaikan
Kode bajak laut bus menangani antarmuka pengguna, dan melewati dua variabel ke pustaka protokol aktif. Variabel pertama adalah perintah, seperti cmd_read, cmd_readbulk, atau cmd_write. Seluruh set perintah didefinisikan dalam base.h. Variabel kedua adalah nilai opsional. Perintah CMD_Read yang mudah lulus tidak ada nilai, perintah baca massal melewati jumlah byte untuk dibaca, perintah tulis melewati nilai untuk menulis ke bus, dll. Minimal, protokol khusus membutuhkan fungsi untuk menerima variabel-variabel ini dan menerjemahkannya untuk tindakan bus.
Kami menggunakan tiga teknik berbeda untuk menautkan perintah ke tindakan bus. Kode mudah dapat langsung dalam pernyataan sakelar besar, seperti SPI.C. Perpustakaan eksternal menggunakan fungsi tautan tunggal, seperti i2c.c, dan m_i2c_1.c. Protokol yang jauh lebih rumit menggunakan pernyataan saklar untuk memanggil fungsi-fungsi yang termasuk dalam perpustakaan (Raw2Wire.c, Raw3Wire.c, jtag.c uart.c). Fungsi yang bermanfaat untuk terminal IO dimasukkan dalam pangkalan.h / c.
Karena peningkatan kode besar, sekarang hanya sedikit membingungkan untuk mendaftarkan protokol baru dengan bajak laut bus:
base.h – buat definisi untuk protokol. Entri terakhir saat ini “#define Raw3Wire 7”, jadi entri berikutnya bisa menjadi “#define mycustomwire 8”.
Buspirate.c – Sertakan file header dengan yang memberikan akses ke fungsi pemrosesan. Tambahkan entri menu dalam mode char * [] = daftar variabel. Entri menu harus berada di posisi yang sama pada daftar sebagai angka yang ditetapkan di pangkalan. Definisikan. Jika MyCustomwire adalah nomor 8, itu harus delapan entri dalam variabel mode. Akhirnya, tambahkan sakelar tambahan ke fungsi BPPROCESS () yang memanggil rutin pemrosesan pustaka yang disesuaikan ketika mode diatur ke “MyCustomwire”.
Ikuti lebih lanjut: Daftar keinginan hack sehari
Kami menyusun umpan balik yang kami dapatkan ke dalam tiga daftar keinginan: protokol, fitur, dan makro.
Protokol
1-kawat, dengan enumerasi (* siap segera setelah kami memiliki bagian untuk mengujinya)
OBD-II (Terima kasih [Shadyman])
BISA
Midi (wikipedia)
DMX512-A.
IRDA, RC5X, dll.
Beberapa protokol akan membutuhkan transceiver eksternal.
Fitur
Modulator lebar pulsa, generator frekuensi
“Tunggu sampai perintah” interupsi ”
Konversi pengukuran frekuensi ke periferal tangkapan input
Izinkan pengukuran frekuensi pada pin apa pun
Tampilkan laporan pengaturan konfigurasi saat ini dan status pin.
Nilai berulang integer untuk baca massal, centang jam, keterlambatan, dll.
Generator CRC.
MACROS.
Jembatan UART transparan
Inisialisasi kartu SD, ekstrak data meta, dan dump
Program / Dump EEPROM (I2C / SPI)
Nokia 6100 LCD inisialisasi, kontrol
Dekoder Data GPS NMEA
Apakah Anda punya sesuatu untuk ditambahkan ke daftar?
Unduh firmware: buspirate.v0c.zip