Превращаем BlackIce II в Arduino-совместимую RISC-V отладочную плату (гостевой пост Олега Бахарева)

10 июня 2019

Здравствуйте, уважаемые читатели! Сегодня я, aquaratixc, автор блога LightHouse Software, покажу, как можно практически безболезненно погрузиться в мир архитектуры RISC-V и начать использовать микроконтроллер на ее базе. Оговорюсь сразу, что мы будем использовать не аппаратный микроконтроллер. Вместо этого мы возьмем уже готовое soft-ядро и загрузим его в FPGA-плату BlackIce II, уже знакомую читателям данного блога.

Для начала необходимо скачать свежую среду Arduino IDE под Linux. Поскольку я сам часто использую Linux (а именно, Manjaro Linux i3), то вся инструкция по сборке будет описываться для системы на базе Arch Linux. Однако при необходимости она может быть доработана и для любой другой Linux-системы.

После скачивания Arduino IDE требуется поставить в нее ряд расширений, для чего переходим в меню File → Preferences… В открывшемся диалоге находим пункт Additional Board Manager URL’s и вставляем туда следующие репозитории:

http://www.hamnavoe.com/package_millerresearch_mystorm_index.json
https://raw.githubusercontent.com/lawrie/MuraxArduino/master/package_⏎
    murax_core_index.json
https://grumpyoldpizza.github.io/arduino-STM32L4/package_STM32L4_boar⏎
    ds_index.json
https://raw.githubusercontent.com/f32c/fpgarduino/master/package_f32c⏎
    _core_index.json

После внесения настроек, нужно установить необходимые пакеты расширенной поддержки плат. Для этого переходим в Tools → Boards manager… В появившемся перед нами диалоге в строке поиска последовательно один за другим вбиваем следующие названия: STM32L4, MyStorm, FPGArduino, MuraxArduino — и устанавливаем найденное нажатием кнопки Install.

Данным действием мы поставили поддержку микроконтроллера STM32L4, компилятор C/C++ для RISC-V, а также поддержку Arduino-совместимого soft-микроконтроллера MuraxArduino. Автором проекта MuraxArduino является Lawrie Griffiths с форума forum.mystorm.uk.

В комплекте поддержки STM32L4 присутствует программа перепрошивки DFU-устройств (Device Firmware Upgrade) под названием dfu-util. С ее помощью можно модифицировать стандартный iceboot, зашитый в плату BlackIce II. Модификация iceboot нужна для того, чтобы использовать в проектах встроенный в STM32 АЦП, а то в FPGA на BlackIce II АЦП отсутствует.

Fun fact! Механизм, позволяющий использовать АЦП STM32 из FPGA, очень прост. STM32 непрерывно пересылает по QSPI данные со всех каналов АЦП. Вы же, как и авторы Arduino-библиотек, просто используете analogRead, не думая о том, что существует какой-то мост между FPGA и микроконтроллером.

Однако поставляемая в пакете MyStorm утилита dfu-util не умеет правильно работать с BlackIce II. Дело в том, что она не имеет патча с исправлением сигнатур DFU-устройств. То есть, утилита не узнает микроконтроллер на плате. Для того, чтобы устранить этот недостаток, соберем dfu-util из исходников, которые возьмем из GitHub-репозитория создателей BlackIce II.

Fun fact! В AUR есть пакет dfu-util, но он также не имеет необходимого для BlackIce II патча.

Сборка dfu-util осуществляется серией команд:

# Примечание: для успешной сборки не забудьте поставить libusb.
git clone https://github.com/mystorm-org/dfu-util.git
cd dfu-util
./autogen.sh
./configure --prefix=/usr/local
make

Не спешите выполнять команду make install — она не приведет ни к чему хорошему. Дело в том, что пакет MyStorm обращается к dfu-util, установленному в скрытый каталог Arduino IDE. Поэтому необходимо перенести собранную утилиту в этот каталог:

cp <местоположение папки dfu-util>/src/dfu-util \
  ~/.arduino15/packages/millerresearch/tools/dfu-util/0.9.0-mystorm

После этого требуется создать правило udev для dfu-util, для чего в терминале набираем команду:

sudo nano /etc/udev/rules.d/40-dfuse.rules

… и в открывшийся редакторе вставляем следующее:

ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProd⏎
    uct}=="df11", TAG+="uaccess"

# On older systems, a user group like "plugdev" can be given access:
# ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idPr⏎
    oduct}=="df11", MODE="664", GROUP="plugdev"

Также добавляем пользователя в группу uucp:

sudo usermod -a -G uucp <имя_текущего_пользователя>

После этого сохраняем файл и осуществляем повторный вход в систему. Ну или перезагружаем компьютер.

Полдела сделано. Теперь необходимо склонировать репозиторий MuraxArduino, содержащий уже синтезированную версию soft-ядра RISC-V со всей периферией. Для этого необходимо выполнить в терминале следующую команду:

git clone https://github.com/lawrie/MuraxArduino.git
cd MuraxArduino

Берем в руки BlackIce II. Вынимаем из платы джампер, стоящий между 14 и 16 пином, тем самым переключая плату в режим DFU. Затем подключаем оба выхода USB к компьютеру.

Запускаем Arduino IDE. В меню File → Open… открываем файл <местоположение папки MuraxArduino>/MuraxArduino/firmware/QSPIAnalog/QSPIanalog/QSPIanalog.ino. Далее открываем пункт Tools → Boards и находим там плату myStorm BlackIce, нажимаем кнопку Upload.

Теперь, если все было сделано правильно, произойдет прошивка обновленного iceboot. После этого отключаем плату от компьютера и возвращаем джампер на его законное место. Снова подключаем оба USB-выхода к компьютеру.

Заливаем в плату синтезированное ядро. Для этого, находясь в каталоге MuraxArduino, выполняем серию команд:

cd fpga/Blackice/bin
sudo stty -F /dev/ttyACM0 raw
cat toplevel.bin > /dev/ttyACM0

На этом мучения с установкой и настройкой soft-микроконтроллера закончены и можно приступать к самому интересному: использованию полученного RISC-V микроконтроллера в Arduino.

Запускаем среду Arduino и открываем простейший пример Blink. Переменную LED_BUILTIN заменяем на значение 3. Это пин, к которому подключен третий светодиод на плате. Полную распиновку вы можете увидеть в README проекта MuraxArduino на GitHub. Затем в меню Tools → Boards выбираем BlackIce Murax FPGA Board.

А теперь неочевидный момент. Чтобы загрузить скомпилированный проект из Arduino IDE в BlackIce II надо нажать кнопку RESET на плате, после чего запустить загрузку на плату кнопкой Upload самой среды.

Если данная инструкция вас не утомила и вы все проделали грамотно, то после нажатия заветной кнопки Upload вы увидите мигание зеленого светодиода. Теперь у вас под рукой самый настоящий RISC-V процессор частотой 50 МГц с аппаратно ускоренной периферией и программируемый из Arduino IDE!

Интересно, что бы вы реализовали на MuraxArduino?

Метки: , .

Понравился пост? Узнайте, как можно поддержать развитие этого блога.

Также подпишитесь на RSS, Facebook, ВКонтакте, Twitter или Telegram.