Введение

Начать работу с 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) и скачиваем архив. Позже он понадобится для внесения изменений в образ.

Рисунок 1: Патч ядра для платы Auvidea j120.
Рисунок 1: Патч ядра для платы Auvidea j120.

Вообще есть более свежий патч образа от декабря 2021 года, однако после прошивки этого образа USB порты на плате не работают, поэтому был выбран патч от февраля 2020 года.

Далее запускаем sdkmanager:
sdkmanager --archivedversions

Ключ archivedversions нужен для того, чтобы в списке версий можно было выбрать нужную нам версию JetPack 4.3. Иначе она не будет представлена в списке.

После запуска sdkmanager появится меню с просьбой ввести логин и пароль от аккаунта Nvidia (Рисунок 2). Если аккаунта нет, то можно бесплатно зарегистрироваться на сайте nvidia.com.

Рисунок 2: Начальное меню sdkmanager
Рисунок 2: Начальное меню sdkmanager

После регистрации появится возможность выбора версии JetPack и тип Jetson (Рисунок 3). Выбрать нужно так же как на рисунке 3.

Рисунок 3: Выбор версий JetPack и Jetson.
Рисунок 3: Выбор версий JetPack и Jetson.

Далее переходим ко второму шагу (рисунок 4).На этом шаге скачивается образ и устанавливаются компоненты на хост.

Рисунок 4: Выбор компонентов для установки.
Рисунок 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: Добавление компилятора в Qt Creator.
Рисунок 5: Добавление компилятора в Qt Creator.

На рисунке 5 изображен добавленный компилятор Linaro версии 4.9. После выбора компилятора, указываем путь до qmake (рисунок 6).

Рисунок 6: Добавление версии Qt в Qt Creator.
Рисунок 6: Добавление версии Qt в Qt Creator.

Далее объединяем добавленные инструменты в один комплект под названием "JetsonTx2" (Рисунок 7).

Рисунок 7: Создание комплекта в Qt Creator.
Рисунок 7: Создание комплекта в Qt Creator.

Теперь можно собирать проекты под Jetson в Qt Creator!

Комментарии (6)


  1. Aelentux Автор
    06.04.2023 06:49

    Можно, но собранные программы на вашем пк не запустятся на Jetson


  1. AndronNSK
    06.04.2023 06:49

    Qt5 нельзя установить через apt-get в убунте на джетсоне???


    1. Aelentux Автор
      06.04.2023 06:49
      +1

      Можно, но собранные программы на вашем пк не запустятся на Jetson


      1. AndronNSK
        06.04.2023 06:49

        Ну, это сигнализирует о том, что Rootfs "не очень".


        1. Aelentux Автор
          06.04.2023 06:49

          rootfs "из коробки"). Если есть способы лучше, то я бы с удовольствием послушал как это реализовать)


          1. AndronNSK
            06.04.2023 06:49

            В мануалах к кросс компиляции для распберри pi в 2017м году я видел пункт, как использовать Rootfs с устройства клонирование диска через dd и потом монтированием к системе сборки. Думаю, примерно так можно сделать свой Rootfs с более актуальными компонентами.