OpenOCD ( http://openocd.org/ ) - это программа On-Chip Debugger. Позволяет вести отладку микроконтроллеров и микропроцессоров, программировать микросхемы флеш памяти, загружать ПЛИС. Поддерживает множество аппаратных программаторов и интерфейсов: STLink, Altera UsbBlaster, J-Link, SWD, OpenJTAG, FTDI.. Поддерживает большое число различных плат, кстати, даже и платы Марсоход/ Марсоход2/ Марсоход3!
Сейчас я расскажу, как можно загрузить ПЛИС платы Марсоход2RPI из микрокомпьютера Raspberry Pi3 с помощью OpenOCD.
Итак, плата Марсоход2RPI соединена с Raspberry Pi3.
Смотрим схему нашей платы Марсоход2RPI:
По схеме платы сигналы JTAG с ПЛИС идут на разъем GPIO платы Raspberry Pi3:
- tck -> GPIO7
- tms -> GPIO0
- tdi -> GPIO11
- tdo <- GPIO1
Нам нужна программа, которая будет загружать ПЛИС управляя сигналами GPIO как сигналами JTAG. OpenOCD версии 0.10.0 умеет это делать.
В принципе, я пробовал установить OpenOCD в raspberry обычным способом:
>sudo apt-get install openocd
Он замечательно ставится, но так это не работает. На момент написания статьи распбери поставил мне openocd версии 0.8.0.
Маловато будет. Пришлось сносить эту версию и компилировать и устанавливать из исходных текстов.
Но, на самом деле - это не трудно. В терминале распбери выполняем несколько команд:
>sudo apt-get install git autoconf libtool make pkg-config libusb-1.0-0 libusb-1.0-0-dev
>git clone https://git.code.sf.net/p/openocd/code openocd-code
>cd openocd-code
>./bootstrap
>./configure --enable-sysfsgpio --enable-bcm2835gpio
>make
>sudo make install
Теперь нужно кое что поправить в конфигурационных файлах.
Добавлю скрипт m2rpi.cfg в папку /usr/share/openocd/scripts/boards
source [find interface/m2rpi-jtag.cfg]
adapter_khz 2000
transport select jtag
source [find fpga/altera-ep3c10.cfg]
И второй скрипт m2rpi-jtag.cfg в папку /usr/share/openocd/scripts/interface
#
# Config for using RaspberryPi's expansion header
#
# This is best used with a fast enough buffer but also
# is suitable for direct connection if the target voltage
# matches RPi's 3.3V
#
# Do not forget the GND connection, pin 6 of the expansion header.
#
interface sysfsgpio
# Each of the JTAG lines need a gpio number set: tck tms tdi tdo
# Header pin numbers: 23 22 19 21
sysfsgpio_jtag_nums 7 0 11 1
#11 25 10 9
# At least one of srst or trst needs to be specified
# Header pin numbers: TRST - 26, SRST - 18
sysfsgpio_trst_num 5
# sysfsgpio_srst_num 24
На самом деле OpenOCD сам по себе поддерживает Raspberry Pi3, но он использует другие пины для JTAG.
Именно поэтому я взял оригинальный конфигурационный файл, скопировал его себе и заменил пины "11 25 10 9" на наши "7 0 11 1", которые соответствуют плате Марсоход2RPI.
Еще, для чего-то (не знаю для чего), OpenOCD хочет иметь сигнал trst.
Я в своем конфигурационном файле взял от фонаря и назначил пятый пин: sysfsgpio_trst_num 5.
Теперь, когда конфигурационные файл есть, можно запускать сервер OpenOCD:
> sudo openocd -f board/m2rpi.cfg
Сервер запускается и далее ничего не происходит, но сервер ждет команды по сетевому подключению. Можно подключиться по сети, например, телнетом. Я использую программу Putty - она поддерживает режим telnet.
Подключаться нужно на порт 4444.
После подключения телнетом можно выполнить команду "svf" - она берет из командной строки имя файла SVF и воспроизводит его на интерфейсе JTAG.
SVF (Serial Vector File) создается при компиляции проекта ПЛИС в среде Intel Quartus Prime, но нужно в настройках проекта указать, что требуется создавать SVF. Для этого в среде Quartus выберите пункт меню Assignments => Device... Далее из диалогового окна кнопка Device and Pin Options. В следующем появившемся диалоговом окне слева выбираем Programming Files и затем справа в том же диалоге ставим галочку в чекбоксе Serial Vector Format File (*.svf). Теперь при компиляции проекта появится SVF файл.
Ну пробуем, в окне телнета запускаем команду svf и через несколько секунд видим, что проект загрузился в ПЛИС без ошибок и сама плата заработала:
Мой проект в плате Марсоход2RPI теперь мигает светодиодиками.
Вот здесь видеодемонстрация:
Подробнее...