Начало работы с Bus Pirate и примеры его использования

9 апреля 2018

Bus Pirate — это широко известная в узких кругах плата от Dangerous Prototypes, предназначенная для решения большого спектра задач. Например, плату можно использовать в качестве сниффера I2C, SPI, UART и других шин. Также Bus Pirate может быть использован для получения дампа flash-памяти. А еще им можно программировать микроконтроллеры AVR через avrdude. И это не полный список. Далее будут рассмотрены примеры использования Bus Pirate, а также некоторые неочевидные тонкости работы с ним.

Примечание: Если вас интересует Bus Pirate, вам также могут понравиться посты Превращаем плату iCEstick в логический анализатор и Первые эксперименты с осциллографом Rigol DS1054Z, если вдруг вы их пропустили.

Какую версию Bus Pirate выбрать и где ее купить

Существует несколько версий платы Bus Pirate. Сейчас наиболее часто можно встретить версии 3.6 и 4.0. Я бы крайне советовал брать версию 4.0.

Bus Pirate v4 несколько мощнее по железу, что, помимо прочего, позволяет разрабатывать под него более интересные прошивки. И похоже, что новые версии прошивок (>= 7.0) разрабатываются только под Bus Pirate v4, банально потому что у разработчиков на руках нет версии 3.6, чтобы протестировать код. Да и не ясно, зачем тратить ресурсы на поддержку второго, более слабого, устройства. Плюс к этому, многие покупатели сообщают, что полученные ими платы версии 3.6 оказываются бракованными, даже при покупке через официальных продавцов. Были озвучены некие версии происшествия, но достоверно причину брака так и не установили. Если вас интересует более детальное сравнение двух версий устройства, его можно найти в статье Bus Pirate v4 vs v3 comparison. В целом, мне не известно ни одной причины, по которой стоило бы брать более старую версию Bus Pirate.

Отличить Bus Pirate v4 от других версий можно по использованию разъема IDC-12 вместо IDC-10, наличию двух кнопок, а также по расположению и форме чипов:

Внешний вид Bus Pirate v4

Ну и, конечно же, шелкографии «BPv4.0» на обратной стороне платы :)

Bus Pirate v4 можно купить в магазине Seeed Studio за 37.15$. Лично я покупал именно у них. Bus Pirate v4 доступен и в других магазинах, например, на AliExpress. Но там он стоит дороже, плюс есть шанс купить клон неизвестного качества. Также вас могут заинтересовать некоторые аксессуары к Bus Pirate, в частности, корпус из оргстекла и комплект пробов.

Поскольку Bus Pirate является полностью открытым проектом, можно пойти более сложным путем, и собрать его самостоятельно. EAGLE-проект платы, а также исходники прошивки доступны на GitHub. Плату можно заказать на OSH Park. Что куда впаивать и как прошивать можно прочитать в статье Bus Pirate v4 design overview.

Обновление прошивки

Полученный мной Bus Pirate v4 шел с какой-то древней прошивкой, которая работала абы как. Например, при попытке подать питание на соответствующие пины командой W, возникала ошибка:

VREG too low, is there a short?

В общем, пользоваться такой прошивкой было не слишком приятно. Для обновления прошивки требуется набор утилит, который в Arch Linux собран в пакет bus-pirate:

yaourt -S bus-pirate

В других операционных системах и дистрибутивах Linux, вероятно, есть аналогичный пакет. В крайнем случае, можно собрать все из исходников.

Для обновления прошивки нужно поговорить с бутлоадером. Для получения доступа к нему нужно, чтобы в момент подачи питания на Bus Pirate были соединены пины PGC и GND. Пробуем поздороваться с бутлоадером:

$ pirate-loader --dev=/dev/ttyACM0 --hello
+++++++++++++++++++++++++++++++++++++++++++
  Pirate-Loader for BP with Bootloader v4+  
  Loader version: 1.0.2  OS: Linux
+++++++++++++++++++++++++++++++++++++++++++

Opening serial device /dev/ttyACM0...OK
Configuring serial port settings...OK
Sending Hello to the Bootloader...OK

Bootloader version: 4,06
Device ID [f1]:PIC24FJ256GB106

Для корректного обновления прошивки версия бутлоадера должна быть 4 или выше. Иначе велика вероятность «окирпичить» ваш Bus Pirate. Если версия бутлоадера меньше, то сначала нужно обновить сам бутлоадер. Думаю, что все Bus Pirate v4 идут с бутлоадером нужной версии, поэтому проходить процедуру обновления бутлоадера вряд ли придется.

Наиболее свежая прошивка на момент написания этих строк имела версию 7.0. Скачиваем и прошиваем:

$ pirate-loader --dev=/dev/ttyACM0 --hex=/path/to/bp4.0-fw-7.0.hex

Если все было сделано правильно, в конце вывода вы увидите:

Firmware updated successfully :)

Перед переходом к следующим шагам убедитесь, что пины PGC и GND разъединены.

Пример работы в роли SPI master

В качестве первого примера использования Bus Pirate попробуем поговрить через него с каким-нибудь SPI-устройством. Например, уже знакомым нам чипом flash-памяти AT45DB161E.

Следующая иллюстрация (источник) показывает, как следует подключать Bus Pirate в зависимости от шины, с которой он работает:

Подключение Bus Pirate к различным шинам

Даже если у вас нет шлейфа с разноцветными проводами и крючками, все пины на плате подписаны (к сожалению, только с обратной стороны платы), как в столбце SPI. Поэтому, разобраться, что куда подключается, в любом случае не трудно.

Итак, к чипу подсоединились (напоминаю, что AT45DB161E питается от 3.3В, не от 5В!), а сам Bus Pirate подключили к компьютеру по USB. Цепляемся к нему по UART, например, при помощи screen:

screen /dev/ttyACM0

Должны увидеть следующее приглашение:

HiZ>

В любой момент можно посмотреть подсказку по доступным командам, введя ?. Ответ довольно размашистый, поэтому здесь я его не привожу. Иногда на самую первую команду Bus Pirate отвечает:

Syntax error at char 1

Это не страшно, все последующие команды выполняются нормально. Так как это наше первое подключение, не лишним будет проверить версию прошивки:

HiZ>i
Bus Pirate v4
Community Firmware v7.0 - goo.gl/gCzQnW
DEVID:0x1019 REVID:0x0004 (24FJ256GB106 UNK)
http://dangerousprototypes.com

Вроде, все правильно. Теперь нам нужно перейти в режим SPI. Смена режима осуществляется командой m:

HiZ>m
1. HiZ
2. 1-WIRE
3. UART
4. I2C
5. SPI
6. 2WIRE
7. 3WIRE
8. KEYB
9. LCD
10. PIC
11. DIO
x. exit(without change)

Выбираем SPI, после чего отвечаем на серию незамысловатых вопросов, в большинстве из которых нас устроят настройки по умолчанию:

(1)>5
Set speed:
 1. 30KHz
 2. 125KHz
 3. 250KHz
 4. 1MHz

(1)>4
Clock polarity:
 1. Idle low *default
 2. Idle high

(1)>
Output clock edge:
 1. Idle to active
 2. Active to idle *default

(2)>
Input sample phase:
 1. Middle *default
 2. End

(1)>
CS:
 1. CS
 2. /CS *default

(2)>
Select output type:
 1. Open drain (H=Hi-Z, L=GND)
 2. Normal (H=3.3V, L=GND)

(1)>2
Clutch disengaged!!!
To finish setup, start up the power supplies with command 'W'

Ready

В этот момент загорится зеленый светодиод Mode. Подаем питание на SPI-устройство:

SPI>W
POWER SUPPLIES ON
Clutch engaged!!!

Заметьте, что приглашение уже сменилось на SPI>. После включения питания загорается красный светодиод VREG. Наконец, можно попробовать послать простую команду:

SPI>[0x9F r:5]
/CS ENABLED
WRITE: 0x9F
READ: 0x1F 0x26 0x00 0x01 0x00
/CS DISABLED
SPI>

Здесь [0x9F r:5] говорит «записать байт 0x9F, а затем прочитать 5 байт». Как вы можете помнить из заметки Микроконтроллеры STM32: работа с SPI на примере флеш-памяти AT45DB161E, команда 0x9F отвечает за получение device id. Ответ на нее совпадает с ожидаемым, то есть, полученным в прошлый раз, и описанным в даташите устройства. Так что, похоже, все работает!

Само собой разумеется, общение по другим протоколами, например, I2C или UART, будет очень мало чем отличаться.

Дампим флеш-память с помощью Flashrom

Flashrom — это утилита для чтения и записи flash-памяти. Она поддерживает много чипов, не только с SPI интерфейсом. Но чтобы поговорить с памятью по какому-либо протоколу, flashrom’у нужно какое-то устройство, способное передавать команды и данные. Одним из подходящих для этой задачи устройств как раз является Bus Pirate. Раз уж у нас все равно подключен чип AT45DB161E, давайте попробуем сдампить все, что в нем хранится!

Устанавливаем flashrom:

yaourt -S flashrom

… и, собственно, дампим:

flashrom -p buspirate_spi:dev=/dev/ttyACM0,spispeed=1M \
  --read flash.dump -VV

Должны получить примерно такой вывод:

...
Probing for Sanyo unknown Sanyo SPI chip, 0 kB: probe_spi_rdid_gene...
Probing for Winbond unknown Winbond (ex Nexcom) SPI chip, 0 kB: pro...
Probing for Generic unknown SPI chip (RDID), 0 kB: probe_spi_rdid_g...
Probing for Generic unknown SPI chip (REMS), 0 kB: probe_spi_rems: ...
Found Atmel flash chip "AT45DB161D" (2112 kB, SPI).
This chip may contain one-time programmable memory. flashrom cannot
read and may never be able to write it, hence it may not be able to
completely clone the contents of this chip (see man page for details).
Reading flash... done.
Raw bitbang mode version 1
Bus Pirate shutdown completed.

Как видите, flashrom смог автоматически распознать чип безо всяких подсказок с нашей стороны. Такой функционал может пригодится, если когда-нибудь придется сдампить чип без маркировки. Сама же процедура считывания чипа занимает несколько секунд.

Теперь можно посмотреть на полученный файл, например, hexdump’ом, и увидеть в нем что-то такое:

25830 54 68 69 73 20 69 73 20 61 20 74 65 73 74 20 6d This is a test m
25840 65 73 73 61 67 65 00 00 00 00 00 00 00 00 00 00 essage..........
25850 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

Вы можете помнить, что именно это сообщение мы записывали в страницу с адресом 0x123, когда знакомились с чипом AT45DB161E. Также нам известно, что размер страницы составляет 528 байт, а значит сообщение должно быть записано по абсолютному смещению:

>>> "0x{:x}".format(0x123 * 528)
'0x25830'

Все сходится!

Bus Pirate в качестве сниффера

Последний на сегодня пример. Bus Pirate можно использовать, как сниффер. Должен отметить, что для этой конкретной задачи он подходит не очень хорошо, так как способен надежно перехватывать данные, передаваемые со скоростью не более сотни Кбит/cек. В случае со все тем же примером использования SPI-флэш памяти, мы передавали данные со скоростью 42 Мбит/сек. Осциллограф DS1054Z или логический анализатор на базе iCEstick справляются с такой скоростью без труда, а вот Bus Pirate она не по зубам. Так что, сниффать с его помощью можно только медленные шины, коими обычно являются I2C и UART.

Впрочем, SPI можно искусственно замедлить специально для отладочных целей. Например, для микроконтроллеров STM32 код в файле main.c, сгенерированном программой STM32CubeMX, можно временно отредактировать таким образом:

// RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV8;

/* ... */

// hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;

Данные при этом будут передаваться со скоростью:

>>> (42*2) / 256 / 8
0.041015625

… или 41 Кбит/сек, с чем Bus Pirate должен справится. Давайте подключим AT45DB161E к отладочной плате Nucleo-F411RE, и проверим.

Важно! Так как flash-память теперь питается от отладочной платы, не забудьте отсоединить провод, идущий к пину 3.3V платы Bus Pirate.

В режиме SPI смотрим список доступных макросов, введя команду (0):

SPI>(0)
 0.Macro menu
 1.Sniff CS low
 2.Sniff all traffic

Учитывать состояние пина CS звучит как хорошая идея, поэтому выбираем первый варинант:

SPI>(1)
Sniffer
Any key to exit

Затем нажимаем кнопку Reset на плате Nucleo, чтобы перезапустить прошивку. Если все было сделано правильно, Bus Pirate покажет примерно такие данные:

[0x9F(0x00)0x0B(0x1F)0x04(0x26)0x8C(0x00)0x00(0x01)0x00(0x00)]
[0x82(0x00)0x04(0x00)0x8C(0x00)0x00(0x00)...(остальное пропущено)

Как видите, сначала была послана команда 0x9F, получающая device id, на которую приходит ответ 0x1F 0x26 0x00 0x01 0x00, как и ожидалось. Следом идет команда 0x82, соответствующая записи данных через буфер 1 с очисткой страницы. Следом за командой посылается три байта адреса. Посмотрим на адрес страницы:

>>> "0x{:x}".format((0x04 << 6) | (0x8C >> 2))
'0x123'

Именно в эту страницу мы и пишем. Кажется, все правильно!

Интересно, что то же самое можно сделать с помощью утилиты spi-sniffer:

$ spi-sniffer -d /dev/ttyACM0
(...)
Opening Bus Pirate on /dev/ttyACM0 at 115200bps...
Starting SPI sniffer...
Configuring Bus Pirate...
Entering binary mode...
(OK) Happy sniffing! Press ESC to stop.
Sync

Заметьте, что нужно дождаться вывода Sync, что обычно занимает несколько секунд. После этого можно сниффать. В отличие от ручного запуска макроса по UART, spi-sniffer продемонстрировал относительно стабильную работу при скорости передачи данных до 328 Кбит/сек. Это объясняется использованием бинарного протокола, а также передачей данных по UART на большей скорости.

Я называю работу «относительно стабильной», потому что в редких случаях оба метода могли наврать, например, показать одни нули в ответах. Конечно, это можно списать на не очень хорошее соединение. Так или иначе, я бы лично предпочел по возможности не использовать Bus Pirate в качестве сниффера, если только речь не идет о скоростях порядка пары десятков Кбит/сек.

Заключение

Несмотря на то, что заметка получилось довольно большой, многое все равно осталось за кадром. В качестве источников дополнительной информации я бы рекомендовал следующие:

Еще можно встретить информацию о том, что Bus Pirate якобы можно использовать в качестве логического анализатора. Я проверил, это даже работает. Но как логический анализатор Bus Pirate не поддается никакой критике (всего 4096 сэмплов, триггер срабатывает слишком поздно, когда интересные данные уже пролетели, и прочие ограничения). Поэтому я бы не советовал тратить время на изучение работы устройства в этом режиме, и уж тем более в режиме осциллографа (раз, два).

Что еще есть в теории, но не особо работает на практике — это возможность прошивки микроконтроллеров STM32. В 2010 году господин Will Donelly написал статью Serial Wire Debugging the STM32 via the Bus Pirate, в которой рассказал, как разрабатывал соответствующий скрипт на Python. За прошедшее время у него появилось множество форков (раз, два, …), но поддерживают они только небольшое подмножество отладочных плат. Ту же Blue Pill, к примеру, на практике эти скрипты прошить не в состоянии. С одной стороны, это грустно, но с другой, звучит как идея для проекта.

Дополнение: Вас также могут заинтересовать статьи Знакомимся с HydraBus и пытаемся понять, зачем он нужен и Знакомимся с Sigrok и логическим анализатором DSLogic.

Метки: .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.