46610

[i] Компиляция OpenOCD из исходных данных

Автор статьи: Лампадов Илья Александрович (Инженер)
Дата последнего изменения: 18.07.2024 12:31:22
В этой статье будет разобран алгоритм сборки OpenOCD из исходных данных в среде Linux. Отдельно будет затронута сборка OpenOCD для внедрения поддержки микроконтроллеров MDR1206FI, MDR1206AFI, К1986ВК025 и К1986ВК01GI.

OpenOCD - это ПО с открытым исходным кодом для программирования и отладки различных микросхем. Программа реализует транспортный уровень доступа к микросхемам, вводя поддержку различных программаторов-отладчиков (J-Link, ST-Link, CMSIS-DAP, FTDI и др.), а также различного рода конфигурационных файлов для поддержки большого числа микросхем сторонних производителей. Последние, а именно конфигурационные файлы для поддержки микросхем, разрабатываются самими разработчиками микросхем (на деле это связка файлов, содержащая в себе алгоритм доступа к памяти микросхемы, то есть загрузочную программу, а также конфигурационный файл для конкретной микросхемы, на которую распространяется данный загрузчик, и он описывает, с каких адресов можно работать с данным загрузчиком в рамках микросхемы).

Заслуга программы OpenOCD именно в том, что она является бесплатной и предоставляет удобные механизмы для работы с микросхемами при помощи популярных отладочных средств - это, в том числе, позволяет легко интегрировать OpenOCD в IDE Eclipse, которая также является бесплатной, что позволяет создать полноценную связку для работы вне коммерческих предложений наподобие IDE Keil, IAR и пр. К популярности OpenOCD в кругу разработчиков также можно отнести факт того, что компания Apple в основную ветку программы добавила файлы поддержки для своего процессора M1, построенного на архитектуре ARM.

Официальный репозиторий OpenOCD располагается как на GitHub, так и на SourceForge. В рамках этой статьи работа будет вестись с GitHub.

Как таковых официальных выпускаемых версий OpenOCD нет (в частности, нет никаких версий для Windows, предоставляемые файлы .exe со стороны компании Миландр собираются также из исходных кодов OpenOCD с параметрами кросс-компиляции средствами MinGW), разработчики предоставляют исходные данные для самостоятельной сборки, вводя в том числе инструкцию для этого. Статья является надстройкой над этой инструкцией, поясняя механизмы системы сборки GNU Autotools в системе Linux. При этом разработчики OpenOCD предоставляют отдельный алгоритм для сторонних разработчиков, чтобы внедрить файлы поддержки своих микросхем в основную ветку OpenOCD. Процесс внедрения сложен, а модерацией занимается группа ведущих разработчиков, которая проверяет поступающие изменения на чистоту кода и совместимость с основной веткой программы. Тем не менее, в составе официального репозитория OpenOCD имеется загрузочная программа mdr.c для работы с микроконтроллерами из семейства К1986ВЕ9хI, а также конфигурационный файл mdr32f9q2i.cfg, чтобы иметь возможность подключаться к микроконтроллеру при помощи различных программаторов. В будущем в основную ветку будут добавляться и другие микроконтроллеры компании Миландр, в частности, MDR1206FI, MDR1206AFI, К1986ВК025 и К1986ВК01GI, но на данный момент вся поддержка ведётся локально на уровне разработанных исходных файлов. Эти файлы расположены в архиве в конце статьи, раздел "Программное обеспечение", "OpenOCD", с ними же и будет вестись работа в рамках статьи. 

Важность статьи заключается в том, что созданные на стороне Миландр пользовательские пакеты RPM/DEB OpenOCD с уже добавленной поддержкой нужных микроконтроллеров в свой состав могут не запуститься на пользовательском дистрибутиве Linux, либо могут возникнуть проблемы с зависимостями (например, библиотек GCC), которые не могут быть решены при помощи стандартных средств.

Работа будет вестись в рамках дистрибутива Ubuntu 16.04 LTS (загрузка дополнительных пакетов в рамках инструментария apt с официальных репозиториев). Сборка программы будет производиться из исходных данных при помощи системы сборки GNU Autotools с компилятором GCC. Зачастую в дистрибутивах Linux уже установлены стандартные пакеты GNU Autotools (make, pkg-config, automake и т.д), но компилятор GCC может отсутствовать. Проверить наличие компилятора в составе Linux можно в терминале при помощи команды (см. фрагмент кода 1):

Фрагмент кода 1 - Проверка версии GCC
gcc --version
Если командная строка не вернула никакого результата, то необходимо установить стандартный пакет GNU Autotools (не будут загружаться имеющиеся модули, но загрузится компилятор GCC - по возможности установить требуется даже тем, у кого есть компилятор GCC, дабы избежать проблем с возможными зависимостями, которые не могут быть охвачены в рамках данной статьи). Сделать это можно при помощи следующей команды из фрагмента кода 2, выполнение команды производить от имени администратора:

Фрагмент кода 2 - Запуск установки пакета GNU Autotools
sudo apt-get install build-essential
Выполнение команды приведет к полной установке компилятора GCC со всеми зависимостями, которые представляют из себя множество библиотек для корректной работы. После этого можно вновь проверить наличие компилятора при помощи команды gcc --version и двигаться далее.

После того, как решены базовые вопросы касательно компилятора и средств сборки, необходимо перейти к выгрузке репозитория с исходными файлами OpenOCD из репозитория GitHub (при дальнейших манипуляциях потребуется интернет, соответственно, если его нет, необходимо самостоятельно выгружать и распаковывать архив с исходными данными на ПК). Перед этим, если пакет Git не установлен на Linux, а именно он будет использоваться при дальнейшей работе, то это необходимо сделать командой во фрагменте кода 3, выполнение команды производить от имени администратора:

Фрагмент кода 3 - Запуск установки пакета Git
sudo apt-get install git
Прежде, чем перейти к дальнейшим действиям, необходимо установить зависимости для OpenOCD. Дело в том, что первостепенно работа OpenOCD зависит от работы интерпретатора JIM-TCL. Также для процесса дальнейшей сборки необходимо доустановить, если это не сделано, следующие пакеты в соответствии с фрагментом кода 4 (часть из них входит в состав GNU Autotools, но лучше убедиться, что они есть в системе), выполнение команды производить от имени администратора:

Фрагмент кода 4 - Запуск установки требуемых для сборки программы пакетов в системе Linux
sudo apt-get install make
sudo apt-get install libtool
sudo apt-get install pkg-config
sudo apt-get install autoconf
sudo apt-get install automake
sudo apt-get install texinfo
sudo apt-get install libusb-1.0-0-dev
sudo apt-get install libhidapi-dev
sudo apt-get install libftdi-dev

Если какие-то пакеты из установленного списка невозможно установить средствами инструментария apt из официальных репозиториев, необходимо проверить, что ссылки на официальные репозитории прописаны в системе Linux, а также выполнено обновление каталога пакетов, как минимум, для доступа к более новым версиям путем исполнения поочередно sudo apt-get update и sudo apt-get upgrade. В противном случае устанавливать недостающие пакеты средствами PPA-репозиториев, например, LaunchPad, но это может быть сопряжено с трудностями по установке всех необходимых зависимостей. Библиотека libusb-1.0-0-dev позволяет работать со всеми USB-программаторами (к таким относятся J-Link, ST-Link и пр. - здесь как раз и может потребоваться смена драйвера у программаторов средствами Zadig на работу с libusb, как это описывается в одной из статей по работе с К1986ВК025), библиотека libhidapi-dev позволяет работать по стандарту CMSIS-DAP (именно на этом стандарте построен один из программаторов производства компании Миландр), а библиотека libftdi-dev разрешает работать с продуктами Future Technology Devices International (FTDI-микросхемы - на основе FTDI выполнен встроенный в демонстрационную плату К1986ВК025 отладчик).

При использовании отладчика J-Link совместно с OpenOCD необходимо скачать и установить библиотеку libjaylink. На момент июля 2024 года актуальная версия библиотеки 0.3.1. Клонирование репозитория приведено во фрагменте кода 5.

Фрагмент кода 5 - Клонирование репозитория libjaylink на рабочий компьютер
git clone -b 0.3.1 https://gitlab.zapb.de/libjaylink/libjaylink.git
cd libjaylink

Согласно описанию в репозитории libjaylink сборка и установка библиотеки выполняется, как приведено во фрагменте кода 6.

Фрагмент кода 6 - Сборка и установка библиотеки libjaylink
./autogen.sh
./configure
make

Теперь можно производить загрузку исходных файлов OpenOCD из репозитория. Средствами Git это делается при помощи команды git clone, а выгрузку из интернета можно производить по двум протоколам: либо SSH, либо HTTPS - воспользуемся протоколом HTTPS, при этом ссылка на репозиторий для работы с Git может быть взята на странице репозитория в соответствии c приведенными инструкциями на рисунке 1 (выделено красным):

Рисунок 1 - Копирование ссылки на репозиторий OpenOCD

Для удобства ссылка на репозиторий OpenOCD по протоколу HTTPS дублируется: https://github.com/openocd-org/openocd.git

Теперь необходимо вызвать терминал в папке, которая будет удобна для работы и поставить на выполнение следующую команду из фрагмента кода 7:

Фрагмент кода 7 - Клонирование официального репозитория OpenOCD на рабочий компьютер
git clone https://github.com/openocd-org/openocd.git
cd openocd

Первая команда выгружает в текущую папку последнюю версию репозитория OpenOCD. Вторая команда служит для перехода в директорию с ранее выгруженным репозиторием.

Патч с поддержкой МК Миландр создается для определенной версии OpenOCD (коммита), которая указывается в архиве, файл "openocd_mdr_patch/readme.txt". В связи с этим для корректного применения патча необходимо перейти на требуемый коммит с помощью команды, приведенной во фрагменте кода 8:

Фрагмент кода 8 - Создание новой ветки openocd_mdr из коммита 9659a9b и переключение на неё
git checkout -b openocd_mdr 9659a9b
Все ключевые первичные зависимости для работы сборки проверяются и выполняются при помощи скрипта Bootstrap. Чтобы его выполнить, необходимо в текущей папке с репозиторием выполнить команду из фрагмента кода 9 (если возникают ошибки, можно произвести выполнение от имени администратора):

Фрагмент кода 9 - Запуск в работу скрипта Bootstrap
./bootstrap
Если выполнение скрипта первичной инициализации не привело к автоматической установке файлов JIM-TCL и файлов библиотеки libjaylink в репозиторий OpenOCD (можно увидеть из результатов исполнения скрипта Bootstrap), то необходимо самостоятельно средствами Git подгрузить зависимые модули при помощи команд из фрагмента кода 10:

Фрагмент кода 10 - Установка зависимых модулей в рамках рабочего репозитория
git submodule init
git submodule update

После этого репозиторий OpenOCD готов к сборке, однако, новых файлов в репозиторий не добавлялось, а значит, что если далее начать компилировать программу, то она соберется с текущими файлами и ни о какой дополнительной поддержке, например, микроконтроллеров MDR1206FI, MDR1206AFI, К1986ВК025 и К1986ВК01GI речи быть не может. Необходимо обратиться к архиву в конце статьи и любыми удобными средствами разместить в корневую папку с репозиторием OpenOCD файл openocd_mdr.patch. Это созданный патч на уровне работы репозиториев в Git, фактически, это текстовый файл, который содержит в себе исходные коды всех файлов и пути, куда их необходимо разместить в рамках репозитория. Активация патча производится следующей терминальной командой из фрагмента кода 11, при этом вызов команды должен быть из корневой папки с репозиторием:

Фрагмент кода 11 - Активация патча в рамках репозитория Git
git apply --verbose openocd_mdr.patch
Из статуса Git (git status) будет видно, что за файлы будут внедрены в репозиторий или изменены. Для читателей, которые не имеют возможности работать с Git в составе Linux (например, нет интернета для загрузки соответствующего пакета), в составе архива по отдельным папкам для микроконтроллеров расположены те же самые файлы, которые внедряются патчем openocd_mdr.patch. Их необходимо разместить в соответствующих директориях, прежде чем переходить к сборке программы. После того, как все файлы были подготовлены, необходимо задать правила сборки для GNU Autotools при помощи GCC. Традиционно это делается вызовом команды ./configure из корневой папки с репозиториемЭта команда устанавливает зависимости для всех исходных файлов в составе репозитория, где на выходе во всех папках с исходными данными будут располагаться файлы Makefile*, которые содержат в себе правила, с которыми необходимо производить компиляцию. При этом стандартные ключи регламентированы общим пакетом GNU, а их состав можно узнать при задании ./configure с ключом --help (к стандартным, например, относится то, для какого пути собирать данный пакет - традиционно /usr/local, то есть если ключ на изменение папки не будет задан, то установка будет произведена по этому пути).

Однако, OpenOCD для параметров сборки вводит новые директивы для ключа --enable, такие как: ftdi, jlink, ulink, stlink, usb-blaster, dummy, cmsis-dap и др. Из названий можно сделать вывод, что они отвечают за активацию работы исполняемого файла OpenOCD, который получится на выходе, с разными отладчиками. Произведем подготовку к сборке программы следующей командой, разрешив работу всех выше перечисленных программаторов при помощи ключа --enable - вызов согласно команде из фрагмента кода 12 (если возникают ошибки, можно произвести выполнение от имени администратора):

Фрагмент кода 12 - Установка параметров компиляции для OpenOCD
./configure --enable-ftdi --enable-jlink --enable-ulink --enable-stlink --enable-usb-blaster --enable-dummy --enable-cmsis-dap
Команда запустит подготовку к компиляции исходных файлов и установит все необходимые зависимости. Именно на этом этапе, если он не будет завершен до конца, всплывет факт отсутствия пакетов со всеми зависимостями, которые необходимо было установить из замечаний выше по статье (библиотеки libftdi-dev, libhidapi-dev, libusb-1.0-0-dev и др). По логам в терминале с указанием на ошибку можно будет понять, какого пакета или библиотеки недостаточно для дальнейшей установки. Однако, такой вариант развития событий маловероятен, а регламентированный список пакетов в рамках статьи должен покрывать процесс компиляции OpenOCD для работы со всеми распространенными типами отладчиков. В процессе успешной подготовки будут строки в терминале, указывающие на выход из процедуры.

Теперь, когда все зависимости для исходных файлов установлены, можно переходить к сборке исполняемого файла. Делается это программой make из состава GNU Autotools. Важно отметить, что проект OpenOCD достаточно большой, и его сборка может занять длительное время, однако, в параметрах make можно задать количество потоков (по одному на ядро процессора), в рамках которых производить сборку программы. Делается это при помощи ключа -j при выполнении make с указанием количества ядер для работы.

Произведем запуск сборки программы OpenOCD на восьми потоках в соответствии с командой из фрагмента кода 13 (если возникают ошибки, можно произвести выполнение от имени администратора):

Фрагмент кода 13 - Запуск сборки OpenOCD из исходных файлов
make -j 8
Если ошибок в ходе сборки зафиксировано не будет, то по пути ./src появится объектный файл openocd, который был получен при сборке из исходных файлов. Теперь необходимо завершить процесс правильной установки и, фактически, перенести этот исполняемый файл со всеми зависимыми файлами (в данном случае папки с конфигурациями) по адресам, которые были установлены правилами в файлах Makefile*. Делается это при помощи вызова следующей команды из фрагмента кода 14 от имени администратора:

Фрагмент кода 14 - Установка программы OpenOCD (1-й вариант)
sudo make install
После вызова этой программы в системе Linux будет доступен вызов программы OpenOCD для работы, однако, этот метод установки достаточно плох, поскольку он принудительно разместит файлы в рамках ОС, но не даст возможности открыто в системе при желании произвести удаление программы. Чтобы удалить программу, которая была установлена таким образом, необходимо обязательно открывать папку с местом сборки проекта (вполне может быть удалена в процессе работы), и уже оттуда вызывать следующую команду из фрагмента кода 15 от имени администратора:

Фрагмент кода 15 - Удаление программы OpenOCD (1-й вариант)
sudo make uninstall
Чтобы этого избежать, после команды sudo make желательно прибегнуть к процессу создания пакета в рамках работы репозитория. Фактически, это файлы с расширением .exe для Windows, но в Ubuntu они имеют расширение .deb (в CentOS и других зависимых дистрибутивах по типу RedHat это .rpm). Пакеты готовятся по достаточно сложному алгоритму, например, так они готовятся на уровне работы Debian. Однако, погружаться в тонкости создания пакетов необязательно, можно прибегнуть к работе с удобным пакетом checkinstall, который делает все те же операции, но автоматически. Перед работой с данным пакетом необходимо его установить в соответствии с командой из фрагмента кода 16, выполнение команды производить от имени администратора:

Фрагмент кода 16 - Запуск установки пакета checkinstall
sudo apt-get install checkinstall
После этого в корневой папке с репозиторием OpenOCD (соответственно, до установки make install, то есть после сборки путем make) необходимо вызвать исполнение checkinstal с ключом -D (создание пакета .deb), как это приведено во фрагменте кода 17 - вызов обязательно от имени администратора:

Фрагмент кода 17 - Установка программы OpenOCD (2-й вариант)
sudo checkinstall -D
После этого необходимо следовать достаточно дружественным инструкциям и дойти до процесса сборки .deb пакета, который появится в корневой папке с репозиторием OpenOCD. В процессе сборки обязательно необходимо указать номер версии Вашего пакета. Полученный пакет устанавливается из стандартного графического менеджера пакетов и может в ходе работы быть удален также из этого менеджера.

Сборка исходных файлов OpenOCD под ОС Linux завершена. Теперь можно производить интеграцию в Eclipse и работать с микроконтроллерами не только компании Миландр, но и с любыми другими, поддержка которых официально заявлена. 

В заключении важно отметить, что для корректной работы OpenOCD с любыми USB-программаторами в Linux, необходимо разрешить им работать, как доверенному источнику. Для этого создаются правила в каталоге ./etc/udev/rules.d (механика проста: указывается тип соединения, то есть USB, а также даются указания на VID и PID указанного программатора, чтобы при фиксации его в системе, ему были даны все необходимые права для работы). OpenOCD рекомендует назвать файл для удобства 60-openocd.rules, но, фактически, файл может иметь любое другое название. Для J-Link, например, содержание файла следующее (файл также имеется в составе архива source.zip после статьи):

# SEGGER JLINK USB DEVICE 1366:0101
BUS!="usb", ACTION!="add", SUBSYSTEM!=="usb_device", GOTO="kcontrol_rules_end"
SYSFS{idProduct}=="0101", SYSFS{idVendor}=="1366", MODE="664", GROUP="plugdev"
LABEL="kcontrol_rules_end"

Здесь видна основная структура файла, соответственно, при подключении другого USB-отладчика необходимо произвести мониторинг его VID/PID в терминале средствами lsusb, а далее внести правило в файл формата .rules.

После этого необходимо добавить текущего пользователя Linux в группу доверенных пользователей (по умолчанию уже установлено) командой из фрагмента кода 18, при этом команда должна выполняться от имени администратора:

Фрагмент кода 18 - Команда для добавления текущего пользователя Linux в группу доверенных пользователей
sudo adduser user plugdev
После этого требуется произвести перезагрузку системы командой из фрагмента кода 19:

Фрагмент кода 19 - Команда для перезагрузки системы
sudo reboot
Настройка завершена.
Сохранить статью в PDF

Программное обеспечение

Теги

Была ли статья полезной?