© 2018 DiyTronic

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

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

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

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

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

Bus Pirate распаковка

Подключение

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

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

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

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

1
2
3
4
5
6
$ 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 для этого устройства подробную информацию:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$ 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

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

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

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

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

Bus Pirate в списке устройств

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

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

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

1
2
$ screen /dev/buspirate 115200 8N1
HiZ>

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 из чего я делаю вывод, что самодиагностика работает и устройство не имеет каких-либо проблем.

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

1
2
3
4
5
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 необязательно

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

Подключение микроконтроллера к Bus Pirate

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ 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 и типа всё должно заработать. Итак пробуем:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ 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 в этом плане работает стабильно и таких проблем не имеет.

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

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

Источники

Комментарии