Введение
Начать работу с Nvidia Jetson можно как с обычным персональным компьютером, подключив к нему монитор и мышку, однако это не всегда удобно. В случае, если Jetson является частью некоторого устройства и доступ к нему ограничен, то смена прошивки может превратиться в проблему. В таком случае помогает кроссплатформенная сборка. Если проект написан на C++, то кросскомпиляцию можно организовать с помощью cmake. Файл toolchain.cmake легко можно найти на просторах интернета. Однако, если проект написан на Qt, то приведенные в интернете инструкции оказываются неполными и информацию приходится собирать с различных источников, попутно исправляя ошибки в них. Поэтому, мы постарались собрать в одной статье полную и достоверную инструкцию по кроссплатформенной сборке Qt5 для Nvidia Jetson TX2 на момент февраля 2023 года.
Образ для Jetson
На сайте Nvidia https://developer.nvidia.com/drive/sdk-manager скачиваем утилиту под названием sdkmanager. На момент написания статьи в sdkmanager не было поддержки ubuntu версий выше 18й. Однако это ограничение можно обойти. Для этого на хосте необходимо изменить значение поля VERSION_ID на 18.04 в файле /usr/lib/os-release:sudo vi /usr/lib/os-release
NAME="Ubuntu"
VERSION="20.04.5 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.5 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
После замены: NAME="Ubuntu"
VERSION="20.04.5 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.5 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
Для Jetson TX2 существует множество плат-носителей (carrier board) и, как правило, производители плат предоставляют инструкцию по осуществлению патча образа для работы с их платой, поскольку образы из sdkmanager из коробки работают только с платами от Nvidia. В нашем случае используется плата носитель Auvidea J120. На сайте https://auvidea.eu/firmware/ находим подходящий патч образа (рисунок 1) и скачиваем архив. Позже он понадобится для внесения изменений в образ.
Вообще есть более свежий патч образа от декабря 2021 года, однако после прошивки этого образа USB порты на плате не работают, поэтому был выбран патч от февраля 2020 года.
Далее запускаем sdkmanager:sdkmanager --archivedversions
Ключ archivedversions нужен для того, чтобы в списке версий можно было выбрать нужную нам версию JetPack 4.3. Иначе она не будет представлена в списке.
После запуска sdkmanager появится меню с просьбой ввести логин и пароль от аккаунта Nvidia (Рисунок 2). Если аккаунта нет, то можно бесплатно зарегистрироваться на сайте nvidia.com.
После регистрации появится возможность выбора версии JetPack и тип Jetson (Рисунок 3). Выбрать нужно так же как на рисунке 3.
Далее переходим ко второму шагу (рисунок 4).На этом шаге скачивается образ и устанавливаются компоненты на хост.
Следующий шаг пропускаем, поскольку необходимо пропатчить образ джетсона для работы с платой auvidea j120. Допустим, что директория для установки была выбрана "/tools/nvidia/". Архив с патчем, загруженный с сайта auvidea распаковываем и вносим необходимые изменения в образ в соответствии с инструкцией:cp -r kernel_out/* /tools/nvidia/JetPack_4.3_Linux_JETSON_TX2/Linux_for_Tegra/
cd /tools/nvidia/JetPack_4.3_Linux_JETSON_TX2/Linux_for_Tegra/
sudo ./apply_binaries.sh
После подключаем jetson к ПК и переводим его в recovery mode, для этого зажимаем кнопку Force recovery, затем нажимаем кнопку reset и отпускаем Force recovery. Далее прошиваем Jetson:cd /tools/nvidia/JetPack_4.3_Linux_JETSON_TX2/Linux_for_Tegra/
sudo ./flash.sh jetson-tx2 mmcblk0p1
К Jetson подключаем клавиатуру, мышку и монитор. Необходимо настроить сеть и рекомендуется выставить корректное время. Далее будем полагать, что адрес настроен такой: 192.168.0.160, пользователь - nvidia и пароль - nvidia.
Сборка Qt
На хосте переходим в директорию "rootfs" и чиним символьные ссылки:cd /tools/nvidia/JetPack_4.3_Linux_JETSON_TX2/Linux_for_Tegra/rootfs
sudo ln -sf lib/aarch64-linux-gnu/libz.so.1 usr/lib/aarch64-linux-gnu/libz.so
sudo ln -sf lib/aarch64-linux-gnu/libm.so.6 usr/lib/aarch64-linux-gnu/libm.so
sudo ln -sf lib/aarch64-linux-gnu/libdl.so.2 usr/lib/aarch64-linux-gnu/libdl.so
sudo ln -sf lib/aarch64-linux-gnu/libpng12.so.0.54.0 usr/lib/aarch64-linux-gnu/libpng.so
Клонируем репозиторий и выбираем рабочую ветку:git clone git://code.qt.io/qt/qtbase.git -b dev
cd qtbase
git checkout v5.12.10
Переходим в папку с репозиторием и конфигурируем сборку Qt:./configure -opensource --confirm-license -no-pkg-config -device linux-jetson-tx1-g++
-device-option CROSS_COMPILE=aarch64-linux-gnu-
-sysroot /tools/tx2/nvidia/JetPack_4.3_Linux_JETSON_TX2/Linux_for_Tegra/rootfs/ -prefix
/usr/local/qt5 -extprefix /tools/tx2/qt5 -hostprefix /tools/tx2/qt5-host
-nomake examples -nomake tests -no-opengl
Далее собираем Qt:make -j8
make install
Собранные версии Qt для хоста и для девайса будут лежать по адресу, указанному при конфигурации сборки, в данном случае по адресу "/tools/tx2/". На джетсоне создаём папку и назначаем ей права пользователя:mkdir /usr/local/qt5
sudo chown nvidia:nvidia qt5
Затем синхронизируем папки с хоста:rsync -e ssh -avz qt5 nvidia@192.168.0.160:/usr/local
Настройка сборки в Qt Creator
После сборки Qt рекомендуется настроить Qt Creator. Для сборки в QT Creator нужно указать компилятор, сборку Qt и связать их в один комплект (Kit). В качестве компилятора мы использовали компилятор Linaro, скачать который можно на сайте https://releases.linaro.org/components/toolchain/binaries/.
На рисунке 5 изображен добавленный компилятор Linaro версии 4.9. После выбора компилятора, указываем путь до qmake (рисунок 6).
Далее объединяем добавленные инструменты в один комплект под названием "JetsonTx2" (Рисунок 7).
Теперь можно собирать проекты под Jetson в Qt Creator!
Комментарии (6)
AndronNSK
06.04.2023 06:49Qt5 нельзя установить через apt-get в убунте на джетсоне???
Aelentux Автор
06.04.2023 06:49+1Можно, но собранные программы на вашем пк не запустятся на Jetson
AndronNSK
06.04.2023 06:49Ну, это сигнализирует о том, что Rootfs "не очень".
Aelentux Автор
06.04.2023 06:49rootfs "из коробки"). Если есть способы лучше, то я бы с удовольствием послушал как это реализовать)
AndronNSK
06.04.2023 06:49В мануалах к кросс компиляции для распберри pi в 2017м году я видел пункт, как использовать Rootfs с устройства клонирование диска через dd и потом монтированием к системе сборки. Думаю, примерно так можно сделать свой Rootfs с более актуальными компонентами.
Aelentux Автор
Можно, но собранные программы на вашем пк не запустятся на Jetson