Адаптеры JTAG с поддержкой SWD Печать
Добавил(а) microsin   

Технология JTAG широко применяется для тестирования электронных устройств, чаще всего основанные на микроконтроллерах, CPU, CPLD и/или FPGA. JTAG также позволяет аппаратную отладку, чтение/запись памяти, управление ножками I/O, анализ на производительность работающего кода (здесь приведен перевод статьи [1]).

Технология SWD (расшифровывается как Serial Wire Debug) это более современная версия JTAG, требующая для работы только 2 сигнальных выводов вместо как минимум 4 у стандартного JTAG (иногда добавляется еще один сигнал, что доводит количество сигнальных проводников до 5). SWJ это комбинация SWD и традиционного JTAG. Однако на высшем уровне оба этих интерфейса предоставляют аналогичные функции с разными вариациями, зависящими от управляющего ПО и от аппаратного обеспечения.

С одной стороны эта функциональность должна поддерживаться в целевом устройстве (target device). Порт отладки (Debug Port) часто называют JTAG-DP для JTAG и SW-DP для SWD. Устройство с поддержкой SWJ часто комбинирует в себе оба этих стандарта, при этом SWD-сигналы SWDIO и SWCLK повторно используются как JTAG-сигналы JTMS и JTCK (таким образом, SWJ обеспечивает обратную совместимость с традиционным JTAG). Большинство 32-битых микроконтроллеров и чипов SoC имеют на борту один из таких интерфейсов (или оба).

С другой стороны Вам нужен SWJ-адаптер, который может обмениваться данными с устройством по протоколу JTAG и/или SWD. SWJ могут стоить недорого (< 5$) и очень дорого (> 1000$), в зависимости от качества аппаратуры и ПО (и от бренда производителя). Ниже перечислены несколько описаний SWJ-адаптеров.

[ST-Link v2]

ST-LINK/V2 это адаптер от STMicroelectronics, очень удобный для прошивки микроконтроллеров STM8 и STM32 этой компании, таких как серия STM32 F1. Адаптер поддерживает интерфейсы JTAG, SWD и SWIM (последний применяется для STM8).

Эти SWJ-адаптеры основаны на микроконтроллерах STM32F1xx ARM Cortex M3. Любопытно, что адаптер на основе микроконтроллера STM32F1xx применяется для программирования и отладки таких же микроконтроллеров STM32F1xx.

Использование ST-LINK/V2 на Linux. Для нормального использования сначала добавьте правила для обычного пользователя, чтобы можно было получить доступ к этому устройству (правило udev, основанное на идентификаторах VID и PID адаптера, показываемых lsusb). Это делается только один раз перед тем, как адаптер подключается для непосредственного использования:

echo -n 'ST-Link V2 SWJ adapter' | sudo tee -a /etc/udev/rules.d/60-st-linkv2.rules
echo -n 'ATTR{idVendor}=="0483", ATTR{idProduct}=="3748", MODE="0666"' | sudo tee
 -a /etc/udev/rules.d/60-st-linkv2.rules
sudo udevadm control --reload-rules

Для подключения к микроконтроллерам STM32F1xx ARM Cortex M3 используется OpenOCD [9]:

openocd --file interface/stlink-v2.cfg --file target/stm32f1x.cfg
 
Open On-Chip Debugger 0.10.0-dev-00189-g554313b (2016-01-12-10:52)
Licensed under GNU GPL v2
For bug reports, read
   http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "hla_swd". To override
 use 'transport select < transport >'.
Info : The selected transport took over low-level target control. The results
 might differ compared to plain JTAG/SWD
adapter speed: 1000 kHz
adapter_nsrst_delay: 100
none separate
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : clock speed 950 kHz
Info : STLINK v2 JTAG v17 API v2 SWIM v4 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 3.534945
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints

[Клон ST-LINK/V2]

Это полностью содранный с оригинала ST-LINK/V2. Он поставляется в таком же корпусе, с такими же кабелями, выглядит так же, сохранено даже название печатной платы (MB936). Но сама плата не такая же, список деталей (BOM) не совпадает с оригинальным.

mb936 case front mb936 case back
mb936 internal front2 mb936 internal back

Оригинальный адаптер снабжен дополнительной защитой от статического электричества, защитными резисторами и трансивером, позволяющим работать с уровнями сигнала от 1.65V до 5.5V. В клоне это полностью отсутствует, поскольку сигналы интерфейса напрямую подключены к микроконтроллеру. Таким образом, поддерживаются только уровни сигналов 3.3V на отлаживаемой/программируемой системе, и иногда 5V, потому что выводы микроконтроллера допускают по входу уровни 5V (5V tolerant).

Этот адаптер стоит $9, что довольно много. Если не нужен JTAG, то есть более дешевый адаптер, описанный ниже.

[ST-LINK V2 aluminium]

Эти адаптеры поставляются в маленьком алюминиевом корпусе, стоит порядка $2.5. Они поддерживают SWD и SWIM (для STM8), но не поддерживают JTAG. Это вероятно самый дешевый клон, который можно найти. Вероятно, такая низкая цена обусловлена тем, что в адаптере используются STM32F101. В сравнении с STM32F103 возможности у STM32F101 меньше, но все-таки это адаптер USB! Вероятно, что у STM32F101 тот же самый кристалл, что и STM32F103, и тот же самый корпус, просто STM32F101 получают в результате отбраковки STM32F103. Подобным образом декларируется, что у STM32F103C8 только 64 килобайта памяти flash, потому что полный тест они не прошли, в сравнении с 128 килобайтами STM32F103CB, но на борту STM32F103C8 часто есть больше памяти (Вы можете проверить эту память на ошибки путем чтения/записи).

Существует несколько версий плат этого варианта адаптера, и может также отличаться цоколевка.

2014-06-22 ST-LINK V2. Ниже показана схема и внешний вид этих адаптеров.

2014 06 22 ST LINK V2

alu dongle front

alu board front

alu board back

В адаптере используется интересный трюк для подключения двух светодиодов (LED) на одной ножке порта (PA9):

• Когда ножка выхода порта установлена в лог. 1, зажигается один светодиод
• Когда эта же ножка переводится в лог. 0, зажигается другой светодиод
• Когда ножка переводится в состояние висящего входа, оба светодиода выключается
• Когда выход работает в режиме ШИМ (PWM), Вы можете смешивать эти 2 цвета светодиодов (красный и синий). Это происходит потому, что глаз не замечает быстрых мерцаний, светодиоды находятся рядом и светят в маленькую дырку по центру.

Тот же самый адаптер, но с другой цоколевкой. Выглядит очень похоже на вышеописанный адаптер, но цоколевка сигналов разъема сильно отличается (кроме питания), и используется только один светодиод. На плате нет никакой маркировки сигналов.

reverse gnd case front

reverse gnd internal front

reverse gnd internal back

2016-01-18 MX-LINK V2. У этого адаптера логотип "M" вместо логотипа ST, что возможно соответствует маркировке "MX-LINK V2" на плате.

mx link case front

mx link internal front

mx link internal back

[Baite]

Это аналог ST-Link V2 с поддержкой JTAG, SWD и SWIM (для STM8) [2].

baite dongle front baite dongle back
baite board front baite board back

Автор статьи [1] сделал для этого адаптера стикер с цоколевкой сигналов.

st link v2 baite

Автор также перерисовал по плате схему. Все выводы коннектора защищены резисторами 220 ом.

baite

Baite-V2A. Более новая версия промаркирована "V2A" (под кварцем), но схема почти такая же, со следующими изменениями:

• Присутствуют все ножки микроконтроллера (есть даже маска пайки между ними).
• Добавлен порт SWD.
• STM32F103C8 заменен на STM32F101CB, но используется как STM32F103 (так же, как в других дешевых адаптерах).
• Используются пассивные элементы меньшего размера.
• Некачественная разводка платы.

baite v2a

baite v2a board front

baite v2a board back

[Black Magic Probe]

Адаптер Black Magic Probe [3] (известный как BMP) очень интересный SWJ-адаптер, потому что в него встроен сервер GDB. Таким образом, не нужно запускать сервер OpenOCD, чтобы управлять адаптером SWJ. Вы можете напрямую подключить GDB к этому адаптеру (через драйвер USB CDC ACM).

В этом адаптере также есть порт UART (через второй канал USB CDC ACM). Это очень полезно для отладки в реальном времени, без точек останова (для обмена сообщениями printf).

Поставляемая аппаратура имеет следующие недостатки:

• Используется не очень удобный коннектор ARM Cortex SWJ с маленьким шагом.
• Отдельный UART используется не всегда (UART также доступен на коннекторе SWJ).
• Дорогой (> $50), но эта цена относительно разумная, поскольку есть поддержка проекта.

Из-за того, что firmware этого адаптера открыто (open source), его можно портировать на другую аппаратуру, и народ реально этим пользуется [4]. Проект был портирован [5] на blue pill [6]. Также он был портирован и на клон ST-Link V2 [7], но на нем больше нет дополнительного UART. Автор решил сделать порт на baite [2]. На коннекторе используется меньше выводов питания, но зато получается достаточно функциональных выводов для добавления UART (и SRST).

Сборка firmware (ожидается интегрирование патча):

git clone https://github.com/tsaitgaist/blackmagic.git
cd blackmagic
git submodule init
git submodule update
git checkout baite-platform
# if you are usgin GCC >= 7
git cherry-pick 2ebcffa2a4911090b43c36594dae6b58d4bb2f27
make
cd src
make clean
make PROBE_HOST=baite

После получения двоичного кода нужно перепрошить им адаптер Baite. Как Вы можете видеть по схеме, выводы JTAG и SWD микроконтроллера не подключены (на плате нет контактных площадок, куда эти выводы припаяны). Но на обратной стороне платы можно найти контрольные точки, чтобы запрограммировать микроконтроллер через serial bootloader:

Вывод Сигнал
1 (квадратный) RX
2 TX
3 BOOT0
4 +5V
5 GND

Для подключения используйте любой конвертер USB - TTL UART, и подключите соответствующие выводы к этому порту. Не подавайте питание на адаптер Baite через USB, потому что это может привести к его загрузке в нормальном режиме (не в режиме serial bootloader). Вместо этого подайте питание через конвертер USB - UART. Для запуска serial bootloader в момент подачи питания на адаптер нужно перевести сигнал BOOT0 в лог. 1 путем подключения его к +3.3V или к DTR (или к любому другому сигналу, который находится в лог. 1 на конвертере USB - UART).

Чтобы прошить Black Magic firmware автор использовал stm32flash. Поскольку flash защищена от чтения/записи, сначала нужно очистить эти биты опций.

# disable flash read protection
stm32flash -k /dev/ttyUSB0
# disable flash write protection
stm32flash -u /dev/ttyUSB0
# erase flash
stm32flash -o /dev/ttyUSB0
# flash the DFU bootloader
stm32flash -w src/blackmagic_dfu.bin -v /dev/ttyUSB0
# flash the main firmware
stm32flash -w src/blackmagic.bin -v -S 0x08002000 /dev/ttyUSB0

Поскольку этот адаптер основан на микроконтроллере STM32F103C8 с 64 килобайтами flash, DFU bootloader дает возможность использовать только 56 килобайт памяти flash для основного приложения. Blackmagic firmware превышает этот размер, поэтому его нельзя прошить, если программное обеспечение DFU не игнорирует это ограничение. У микроконтроллера STM32F103C8 часто есть 128 килобайт flash, так что все еще можно прошить blackmagic firmware, используя serial bootloader (по адресу 0x08002000). Проверка во время прошивки (verification) гарантирует, что весь код firmware был успешно записан.

Отключите Baite, и снова подключите его через USB. В нем должно запуститься основное программное обеспечение, и операционная система хоста должна обнаружить два порта USB CDC ACM.

Вы можете перепрошить устройство из основного приложения, используя dfu-util (если Вы сможете перевести dfu-util в состояние игнорирования ограничения по размеру памяти):

dfu-util -d 1d50:6018 -s 0x08002000:leave -D blackmagic.bin

Цоколевка нового "BMP Baite":

Сигнал Вывод Вывод  Сигнал
               SRTST 1 2 +3.3V
+5V 3 4 JTCK/SWCLK
RX 5 (ключ) 6 JTMS/SWDIO
GND 7 8 JTDO/TRACESWO
TX 9 10 JTDI

Примечание: вывод RX подтягивается к лог. 1 с помощью резистора 620 ом. Таким образом TX, подключенный к BMP Baite, должен иметь достаточную нагрузочную способность, чтобы подтянуть сигнал к лог. 0 (скорее всего, USB - UART адаптер наподобие CH340 это сделать не сможет).

Если Вы подключите SRST к сигналу NRST целевой отлаживаемой системы, то можно будет подавать на неё сброс без нажатия кнопки сброса на плате отлаживаемой системы (если конечно такая кнопка есть). Сигнал сброса генерируется следующей командой:

gdb --eval-command="target extended-remote /dev/ttyACM0"
 --eval-command="monitor hard_srst" --eval-command="quit"

[Altera USB-Blaster]

USB-Blaster это адаптер от компании Altera. Он часто используется для прошивки FPGA, но по сути это обычный адаптер JTAG.

Free Shipping New Mini Usb Blaster Cable For ALTERA CPLD FPGA NIOS JTAG Altera Programmer

Внимание:  вывод VCC{TARGET} подключается к опорному напряжению, используемому для обмена JTAG, обычно предоставляемому печатной платой целевого отлаживаемого устройства (часто это напряжение 3.3V или 1.8V). Иначе сигналы не смогут определиться адаптером JTAG.

Сначала добавьте правила для обычного пользователя, чтобы он мог получить доступ к устройству (правило udev на основе идентификаторов VID и PID, показываемых lsusb). Это делается только один раз, перед тем как устройство подключается для непосредственного использования:

echo -n 'Altera USB-Blaster JTAG adatper' | sudo tee
 -a /etc/udev/rules.d/60-altera-usb-blaster.rules
echo -n 'ATTR{idVendor}=="09fb", ATTR{idProduct}=="6001", MODE="666"'
 | sudo tee -a /etc/udev/rules.d/60-altera-usb-blaster.rules
sudo udevadm control --reload-rules

Чтобы можно было использовать этот адаптер, нужно перекомпилировать OpenOCD для USB-Blaster, чтобы использовалась библиотека libftdi (наверное потому что это клон).

git clone http://git.code.sf.net/p/openocd/code openocd-code
cd openocd-code
./bootstrap
./configure --enable-usb_blaster_libftdi
make
sudo make install
cd ..

Иначе OpenOCD зависает, загружая на 100% CPU, и его нужно прибить используя -KILL.

openocd --file interface/altera-usb-blaster.cfg
 
Open On-Chip Debugger 0.10.0-dev-00189-g554313b (2016-01-12-11:26)
Licensed under GNU GPL v2
For bug reports, read
   http://openocd.org/doc/doxygen/bugs.html
Warn : Adapter driver 'usb_blaster' did not declare which transports it allows;
 assuming legacy JTAG-only
Info : only one transport option; autoselect 'jtag'
adapter speed: 1000 kHz
adapter_nsrst_delay: 100
jtag_ntrst_delay: 100
none separate
cortex_m reset_config sysresetreq
Info : No lowlevel driver configured, will try them all
Info : Altera USB-Blaster II found (Firm. rev. = 6??)
Info : This adapter doesn't support configurable speed
openocd --debug 3 --file interface/altera-usb-blaster.cfg
 
...
Debug: 385 845 tcl.c:497 handle_nand_init_command(): Initializing NAND devices...
Debug: 386 845 command.c:145 script_debug(): command - ocd_command ocd_command type ocd_pld init
Debug: 387 845 command.c:145 script_debug(): command - ocd_pld ocd_pld init
Debug: 389 846 pld.c:207 handle_pld_init_command(): Initializing PLDs...

Теперь Вы можете использовать адаптер, пример с микроконтроллером STM32F1:

openocd --file interface/altera-usb-blaster.cfg --file target/stm32f1x.cfg
 
Open On-Chip Debugger 0.10.0-dev-00189-g554313b (2016-01-12-16:26)
Licensed under GNU GPL v2
For bug reports, read
   http://openocd.org/doc/doxygen/bugs.html
Warn : Adapter driver 'usb_blaster' did not declare which transports it allows;
 assuming legacy JTAG-only
Info : only one transport option; autoselect 'jtag'
adapter speed: 1000 kHz
adapter_nsrst_delay: 100
jtag_ntrst_delay: 100
none separate
cortex_m reset_config sysresetreq
Info : No lowlevel driver configured, will try them all
Info : usb blaster interface using libftdi
Error: unable to get latency timer
Info : This adapter doesn't support configurable speed
Info : JTAG tap: stm32f1x.cpu tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3)
Info : JTAG tap: stm32f1x.bs tap/device found: 0x16410041 (mfg: 0x020, part: 0x6410, ver: 0x1)
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints

Оригинальный адаптер Altera USB-Blaster использует чипы FTDI FT245 и MAX CPLD. Имеется множество его клонов разного качества и разной поддержкой диапазонов напряжения.

[SiLabs USB-Blaster]

Здесь используется микроконтроллер C8051F321 от Silicon Labs и 4-канальный буфер 74LVC125 (для преобразования уровней сигналов в пределах от 1.65V до 3.6V).

mini silabs front

mini silabs back

[PIC USB-Blaster]

Этот адаптер использует микроконтроллер PIC18F14 компании Microchip, без каких-либо буферов (поддерживаются только сигналы с уровнями 5V).

mini pic front

mini pic back

[ARMJISHU USB-Blaster]

Здесь используется STM32F101 от ST (как STM32F103 с поддержкой USB) и 8-канальный буфер 74HC244 (для преобразования уровней от 2.0V до 6.0V).

mini stm32 front mini stm32 front board
mini stm32 back mini stm32 back board

bus blaster stm32

На схеме видно, что аппаратура может также управлять сигналами (на 3.3V) в случае, когда Vcc_target не подключен, и Вы можете добавить слот карт uSD или память SPI flash. Не известно, поддерживается ли этот функционал в программном обеспечении.

[SEGGER J-Link]

O-Link-ARM V8 [8], клон SEGGER J-Link.

O Link ARM V8 dongle

O Link ARM V8 board top

Поддерживает JTAG, SWD, SWO, RTCK и опорное напряжение для регулировки уровней, что делает этот JTAG-адаптер наиболее полным.

[Цепочка сканирования JTAG]

Микросхемы с поддержкой JTAG имеют точки тестирования, которые называются Test Access Points (TAP). Один микроконтроллер может иметь несколько TAP, соединяемых в цепочку (scan chain). Несколько микросхем с TAP-ми также могут быть соединены (сигналами на печатной плате) в цепочку, это позволяет опрашивать все устройства на плате через одно подключение JTAG. Каждый TAP имеет идентификатор (IDCODE) и он может быть выбран индивидуально.

Иногда полезно перечислить все доступные TAP-ы на цепочке, чтобы узнать, какие есть устройства в системе. Это можно просто осуществить с помощью ПО urJTAG [10]. Пример с USB Blaster:

jtag
 
UrJTAG 0.10 #2007
Copyright (C) 2002, 2003 ETC s.r.o.
Copyright (C) 2007, 2008, 2009 Kolja Waschk and the respective authors
 
UrJTAG is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
There is absolutely no warranty for UrJTAG.
 
warning: UrJTAG may damage your hardware!
Type "quit" to exit, "help" for help.
 
jtag> cable UsbBlaster
Connected to libftdi driver.
jtag> detect
IR length: 9
Chain length: 2
Device Id: 00111011101000000000010001110111 (0x3BA00477)
  Unknown manufacturer! (01000111011) (/usr/share/urjtag/MANUFACTURERS)
Device Id: 00010110010000010000000001000001 (0x16410041)
  Unknown manufacturer! (00000100000) (/usr/share/urjtag/MANUFACTURERS)

OpenOCD также сканирует цепочку, если нет предоставленных target (какой используется адаптер, все-таки определить нужно):

openocd --file interface/altera-usb-blaster.cfg
 
Open On-Chip Debugger 0.10.0-dev-00189-g554313b (2016-01-12-16:26)
Licensed under GNU GPL v2
For bug reports, read
   http://openocd.org/doc/doxygen/bugs.html
Warn : Adapter driver 'usb_blaster' did not declare which transports it allows;
 assuming legacy JTAG-only
Info : only one transport option; autoselect 'jtag'
Info : No lowlevel driver configured, will try them all
Info : usb blaster interface using libftdi
Error: unable to get latency timer
Info : This adapter doesn't support configurable speed
Warn : There are no enabled taps.  AUTO PROBING MIGHT NOT WORK!!
Info : JTAG tap: auto0.tap tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3)
Info : JTAG tap: auto1.tap tap/device found: 0x16410041 (mfg: 0x020, part: 0x6410, ver: 0x1)
Warn : AUTO auto0.tap - use "jtag newtap auto0 tap -irlen 4 -expected-id 0x3ba00477"
Warn : AUTO auto1.tap - use "jtag newtap auto1 tap -irlen 5 -expected-id 0x16410041"
Warn : gdb services need one or more targets defined

0x3ba00477 соответствует Cortex-M3 TAP, и 0x16410041 boundary scan TAP, как указано в документации на STM32F1xx.

Хотя ST-Link v2 с микроконтроллерами ST главным образом используется как адаптер SWD, он также поддерживает обычный JTAG. Оба этих протокола реализованы драйвером High Level Adapter (HLA). Но все выглядит так, как будто scan chain не поддерживается драйвером HLA.

openocd --file interface/stlink-v2.cfg -c "transport select hla_jtag" -c "adapter_khz 100"
 
Open On-Chip Debugger 0.10.0-dev-00189-g554313b (2016-01-12-16:26)
Licensed under GNU GPL v2
For bug reports, read
   http://openocd.org/doc/doxygen/bugs.html
hla_jtag
adapter speed: 100 kHz
Info : clock speed 100 kHz
Error: BUG: current_target out of bounds

[Ссылки]

1. SWJ adapters site:wiki.cuvoodoo.info.
2. Best Quality~ST-Link stlink V2 for STM8S STM8L STM32 Cortex-M0 Cortex-M3 SWIM JTAG SWD interface Programmer site:aliexpress.com.
3. blacksphere/blackmagic site:github.com.
4. blacksphere/blackmagic Supported Hardware site:github.com.
5. Converting an STM32F103 board to a Black Magic Probe site:medium.com.
6. blue pill site:wiki.cuvoodoo.info.
7. Cheap Chinese ST-Link v.2 Programmer converted to Black Magic Probe Debugger site:blog.linuxbits.io.
8. FREE SHIPPING V8 ARM Emulator,supports ARM7,ARM9,ARM11,Cortex-M3 core,ADS,IAR,STM32 Emulator + Adapter converter site:aliexpress.com.
9OpenOCD: руководство пользователя, начало.
10. UrJTAG: бесплатный инструментарий JTAG.
11. Цоколевка интерфейсов JTAG.