© 2026 DiyTronic

Пробую запустить Bus Pirate под Linux

«Не знала баба горя, купила баба порося»

Не так давно узнал про Bus Pirate - устройство для эмуляции и анализа различных протоколов управления электронными устройствами. Ну типа там SPI, I2C и прочих. Решил пощупать, что за зверь такой и купил у братьев-китайцев это устройство. Сегодня получил на почте заветную посылку и решил проверить как оно работает.

Для начала должен отметить, что в данный момент есть 2 версии этого устройства 3-я и 4-я. Третья версия является стабильной и наиболее отлаженной, но я купился на магию циферок и купил 4-ю, которая обладает более продвинутым железом и потенциально имеет больше возможностей.

Изначально хотел купить на старом добром AliExpress-е. Там есть как Bus Pirate v3.6 так и 4-й bus pirate, но что-то не захотелось покупать голую плату и в итоге приобрёл на ebay.com Bus Pirate v4

Вот такую штуку я в итоге получил:

Подключение

Эта штука работает через USB->COM порт, поэтому, чтобы не разбираться с номером порта, который ему присвоит система я традиционно задействую классическую линуксовую методику по созданию именованной ссылки на нужное мне устройство. Для этого нужно прописать определённые правила в udev.

Итак для начала посмотрим как же у нас подключилась эта штуковина. Для этого подключим её по USB и выполнима команду:

$ lsusb
...
Bus 003 Device 029: ID 04d8:f7ea Microchip Technology, Inc.
...

Как мы видим устройство в списке появилось под именем Microchip Technology, Inc. С помощью команды dmesg посмотрим какое имя присвоилось устройству:

$ dmesg
...
[139614.971483] usb 3-1: new full-speed USB device number 29 using xhci_hcd
[139615.686208] cdc_acm 3-1:1.0: ttyACM0: USB ACM device
[139615.686526] usbcore: registered new interface driver cdc_acm
[139615.686527] cdc_acm: USB Abstract Control Model driver for USB modems

И запросим у udev для этого устройства подробную информацию:

$ udevadm info --attribute-walk -n /dev/ttyACM0
    looking at parent device '/devices/pci0000:00/0000:00:14.0/usb3/3-1':
    KERNELS=="3-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="02"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{bMaxPower}=="200mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 2"
    ATTRS{bcdDevice}=="0002"
    ATTRS{bmAttributes}=="80"
    ATTRS{busnum}=="3"
    ATTRS{configuration}==""
    ATTRS{devnum}=="29"
    ATTRS{devpath}=="1"
    ATTRS{idProduct}=="f7ea"
    ATTRS{idVendor}=="04d8"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="Dangerous Prototypes"
    ATTRS{maxchild}=="0"
    ATTRS{product}=="CDC Test"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="removable"
    ATTRS{serial}=="00000001"
    ATTRS{speed}=="12"
    ATTRS{urbnum}=="78"
    ATTRS{version}==" 1.10"

на основе которой создадим файл с правилами для udev

$ sudo nvim /etc/udev/rules.d/99-bus-pirate.rules

Добавляем туда правило которое для заданного набора аттрибутов создаст нам ссылку на созданное устройство.

SUBSYSTEM=="tty", ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="f7ea", ATTRS{serial}=="00000001" GROUP="users", MODE="0666", SYMLINK+="buspirate"

Вытаскиваем устройство и вставляем обратно - в папке /dev/ у нас теперь появилась ссылка на устройство /dev/buspirate, которую мы и будем использовать для доступа к устройству.

Ещё раз повторюсь - нужно это, чтобы не гадать какое устройство использовать для подключения, а чётко знать что воткнув именно это устройство я получу конкретное уникальное для него имя в /dev/.

Работа с устройством

Убедившись, что устройство распознано системой попробуем поиграться с ним. Для подключения буду использовать программу screen, хотя подойдёт любой эмулятор терминала. Фактически мы просто подключаемся по RS232 терминалу к bus pirate через COM-порт /dev/buspirate

$ screen /dev/buspirate 115200 8N1
HiZ>

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

Тестирование

Запустим процедуру самотестирования устройства

HiZ>~
Disconnect any devices
Connect (ADC to +3.3V)
Space to continue
<жмём любую клавишу и получаем>
AUX OK
MODE LED OK
PULLUP H OK
PULLUP L OK
VREG OK
EEPROM
SCL OK
SDA OK
...

После чего видим кучу самопроверок, оканчивающихся на OK из чего я делаю вывод, что самодиагностика работает и устройство не имеет каких-либо проблем.

Ну и посмотрим, что у нас за прошивка:

HiZ>i
Bus Pirate v4
Firmware v6.1 r1676
DEVID:0x1019 REVID:0x0004 (24FJ256GB106 UNK)
http://dangerousprototypes.com

Увы - не самое новьё, но и не совсем уж старая. Похоже на последнюю официальную, в то время как есть уже Community Edition 7-й версии. Будет время - прошьюсь на что-то более новое, а пока и так сойдёт.

Подробнее о командах Bus Pirate можно почитать тут
По прошивке можно почитать тут

AVR программатор

Тесты это конечно здорово, но хотелось бы каких-то более конкретных примеров. Поэтому решил попробовать bus pirate в качестве AVR программатора - тем более, что под рукой как раз есть проект на attiny13a.

Итак для начала подсоединяем bus pirate к контроллеру согласно таблице:

Bus Pirate Attiny13A Примечение
CS NRST
+5V Vcc
GND GND
MOSI MOSI
MISO MISO
CLK SCK
AUX XTAL1 необязательно

У меня в итоге получился вот такой франкенштейн. Нужно будт конечно на будущее сделать более подходящий шнурок и разъём.

В качестве софта для прошивки используем старый добрый avrdude …. а собственно под linux у нас вроде как больше-то вариантов и нет. По счастью avrdude прекрасно умеет работать с bus pirate. Пробуем:

$ avrdude -c buspirate -P /dev/buspirate -p t13 -v

avrdude: Version 6.3-20171130
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "/etc/avrdude.conf"
         User configuration file is "/home/roman/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : /dev/buspirate
         Using Programmer              : buspirate
         AVR Part                      : ATtiny13
         ...
         Programmer Type : BusPirate
         Description     : The Bus Pirate

Attempting to initiate BusPirate binary mode...
BusPirate binmode version: 1
BusPirate SPI version: 1
avrdude: Paged flash write enabled.
AVR Extended Commands version 20553
avrdude: initialization failed, rc=-2
         Double check connections and try again, or use -F to override
         this check.

BusPirate reset failed. You may need to powercycle it.

В общем получили фигу - ничего не работает. По счастью нашлись страдальцы, которые поимели похожую проблему, но в отличие от меня смогли решить её. Я лишь воспользуюсь чужим опытом. Какой-то индонезийский умелец предложил решение, которое действительно работает. Нужно лишь добавить несколько ключей к avrdude, а именно - -x ascii -x nopagedread -x nopagedwrite и типа всё должно заработать. Итак пробуем:

$ avrdude -c buspirate -P /dev/buspirate -p t13 -v -x ascii -x nopagedread -x nopagedwrite
avrdude: Version 6.3-20171130
...
         Programmer Type : BusPirate
         Description     : The Bus Pirate

Attempting to initiate BusPirate ASCII mode...
BusPirate: using ASCII mode
BusPirate is now configured for SPI
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e9007 (probably t13)
avrdude: safemode: lfuse reads as 6A
avrdude: safemode: hfuse reads as FF

avrdude: safemode: lfuse reads as 6A
avrdude: safemode: hfuse reads as FF
avrdude: safemode: Fuses OK (E:FF, H:FF, L:6A)

Всё получилось! Я так-же попробовал заливать в контроллер настоящую прошивку и всё получилось тоже без проблем.

Более подробно про использование bus pirate в качестве программатора vожно почитать тут

Первые итоги

Ну во первых как минимум я получил живое и работающее устройство с относительно новой прошивкой - братья китайцы не обманули и это уже хорошо.

Как минимум я могу использовать его в качестве программатора для атмеловских контроллеров. Пока что он работает стабильнее, чем китайский usbasp (у меня вот такой), который периодически не может прошить фьюзы, пока не выполнишь стирание чипа, в результате чего в моём Makefile-е для прошивки используется 2 команды - очистка, а потом прошивка. Bus pirate в этом плане работает стабильно и таких проблем не имеет.

Правда в качестве программатора он имеет нюанс - питание подаётся только на время прошивки и в остальное время выключается. Я как-то привык запитывать контроллер прямо от программатора и такое поведение немного необычно, но может оно и к лучшему - отучусь от этой дурацкой привычки.

В общем в дальнейшем попробую использовать эту эту железяку в различных применениях о чём конечно же отпишусь в очередной статье.

Источники

Комментарии