Збирання BSP з вихідного коду
Зберіть ядро Linux для Modalix, U-Boot і дерева пристроїв самостійно, а потім установіть результати на плату. Усе описане тут використовує загальнодоступні репозиторії — без NDA і без звернення до відділу продажів.
Збирайте з коміту вихідного коду, який відповідає випуску, що працює на вашій платі. У розділі Сумісність випусків кожному випуску платформи зіставлено відповідні коміти ядра та U-Boot. Що містить BSP і де розміщено кожен репозиторій, див. у розділі Пакет підтримки плати.
Перед початком роботи
-
Хост з Ubuntu 22.04 для збирання.
-
Установлений Docker Engine.
-
Установлений
qemu-user-static:sima-user@sima-user-machine:~$ sudo apt install qemu-user-static
Щоб установити зібране, вам також потрібна плата, на якій уже працює образ eLxr
із доступом root, яка доступна з контейнера через мережу та завантажена з
eMMC (визначається як mmcblk0).
Налаштування контейнера збирання
Контейнер SDK містить набір інструментів, заголовкові файли та бібліотеки для цільової платформи.
Збережіть наведений нижче Dockerfile як Dockerfile.modalix, а потім зберіть образ із
каталогу, у якому він розташований. Цей Dockerfile налаштовує SDK для випуску 2.1.0.
Dockerfile.modalix
# Generated Dockerfile for modalix Build:release[2.1.0]
FROM debian:bookworm
# List of additional packages that are to be deployed in SDK sysroot
ARG SDK_PKG_LIST
ENV SDK_PKG_LIST="\
libgrpc-dev,\
protobuf-compiler-grpc,\
python3-pybind11,\
${SDK_PKG_LIST}"
RUN dpkg --add-architecture arm64
RUN dpkg --add-architecture arc
RUN dpkg --add-architecture armhf
RUN apt-get clean && \
apt-get update --allow-releaseinfo-change && \
apt-get install -y wget pip
RUN wget -qO - https://mirror.elxr.dev/elxr/public.gpg | gpg --dearmor -o /etc/apt/trusted.gpg.d/elxr.gpg
RUN wget -qO - https://packages.fluentbit.io/fluentbit.key | gpg --dearmor > /etc/apt/trusted.gpg.d/fluentbit.gpg
RUN wget --no-check-certificate -O - https://repo.sima.ai/elxr/deb/simaai.gpg | gpg --dearmor > /etc/apt/trusted.gpg.d/simaai.gpg
RUN chmod 644 /etc/apt/trusted.gpg.d/elxr.gpg
RUN chmod 644 /etc/apt/trusted.gpg.d/fluentbit.gpg
RUN echo "deb [signed-by=/etc/apt/trusted.gpg.d/elxr.gpg] https://mirror.elxr.dev/elxr aria main" > /etc/apt/sources.list.d/elxr.list
RUN echo "deb [signed-by=/etc/apt/trusted.gpg.d/fluentbit.gpg] https://packages.fluentbit.io/debian/bookworm bookworm main" >> /etc/apt/sources.list.d/elxr.list
RUN echo "deb [trusted=yes] https://repo.sima.ai/elxr/deb/release bookworm non-free #simaai repo" >> /etc/apt/sources.list.d/elxr.list
RUN apt-get update --allow-releaseinfo-change && \
apt-get install -y --no-install-recommends \
python3-apt-ostree \
vim \
make \
cmake \
gcc-aarch64-linux-gnu \
g++-aarch64-linux-gnu \
device-tree-compiler \
bison \
flex \
quilt \
zlib1g-dev \
bzip2 \
bc \
rsync \
kmod \
cpio \
git \
curl \
libssl-dev \
libgnutls28-dev \
openssh-client \
simaai-sdk-tools
RUN echo "Package: *" > /etc/apt/preferences.d/stable.pref
RUN echo "Pin: origin \"repo.sima.ai/elxr\"" >> /etc/apt/preferences.d/stable.pref
RUN echo "Pin-Priority: 999" >> /etc/apt/preferences.d/stable.pref
RUN export RUSTUP_HOME=/opt/toolchain/rust && export CARGO_HOME=/opt/toolchain/rust && \
mkdir -p ${RUSTUP_HOME} && curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs > /tmp/rustup.sh && \
chmod 755 /tmp/rustup.sh && /tmp/rustup.sh -y && \
echo "export RUSTUP_HOME=${RUSTUP_HOME}" >> ${CARGO_HOME}/env && \
echo "export CARGO_HOME=${CARGO_HOME}" >> ${CARGO_HOME}/env && \
. ${CARGO_HOME}/env && rm /tmp/rustup.sh
RUN if uname -a | grep -q '#[0-9]*-Ubuntu'; then \
apt-get update --allow-releaseinfo-change; \
--privileged mount -t binfmt_misc binfmt_misc /proc/sys/fs/binfmt_misc || true; \
fi
RUN if [ "x86_64" = "x86_64" ]; then apt update --allow-releaseinfo-change && apt install \
arch-test -y; fi
RUN python3 /opt/bin/simaai_setup_sdk.py modalix 2.1.0 \
\
"${SDK_PKG_LIST}"
RUN echo "source /opt/bin/simaai-init-build-env modalix" >> /root/.bashrc
sima-user@sima-user-machine:~$ docker build -t modalix-sdk --file Dockerfile.modalix .
Щоб заздалегідь додати до sysroot додаткові пакети, передайте їх список через кому:
sima-user@sima-user-machine:~$ docker build --build-arg SDK_PKG_LIST=libzix-dev,vxi-dev -t modalix-sdk --file Dockerfile.modalix .
Запустіть контейнер із каталогу, у який у вас є права на запис:
sima-user@sima-user-machine:~$ docker run -it --privileged -v $(pwd):/data -w /data -v /dev:/dev --pid=host modalix-sdk
Sysroot розташований у /opt/toolchain/aarch64/<platform>. Середовище збирання
налаштовується автоматично під час запуску; щоб налаштувати його вручну, виконайте
source /opt/bin/simaai-init-build-env modalix.
Збирання ядра
Усередині контейнера:
root@sdk:/data$ git clone https://github.com/SiMa-ai/simaai-linux.git && cd simaai-linux
root@sdk:/data/simaai-linux$ git checkout <kernel-commit>
root@sdk:/data/simaai-linux$ make ARCH=arm64 simaai_modalix_defconfig
root@sdk:/data/simaai-linux$ make all -j8 ARCH=arm64 LOCALVERSION="-modalix" DTC_FLAGS=-@
Замініть <kernel-commit> на коміт ядра для вашого випуску з розділу
Сумісність випусків. Збирання master дає вам
найновіший випуск, який може не відповідати образу на вашій платі.
У результаті буде створено:
| Артефакт | Шлях |
|---|---|
| Образ ядра | arch/arm64/boot/Image |
| Дерева пристроїв | arch/arm64/boot/dts/simaai/*.dtb |
Збирання оверлея дерева пристроїв (необов’язково)
Напишіть вихідний файл оверлея (.dtso), а потім скомпілюйте його у двійковий файл (.dtbo):
root@sdk:/data$ dtc -@ -I dts -O dtb -o imx415.dtbo imx415.dtso
Оверлей, який використовує #include, як деякі оверлеї камер у дереві ядра, спочатку
має пройти через препроцесор C. Виконайте в дереві ядра:
root@sdk:/data/simaai-linux$ aarch64-linux-gnu-cpp -nostdinc -I include -I arch/arm64/boot/dts/simaai/overlays -undef -x assembler-with-cpp my-overlay.dtso | dtc -@ -I dts -O dtb -o my-overlay.dtbo -
Збирання U-Boot
root@sdk:/data$ git clone https://github.com/SiMa-ai/sima-ai-uboot.git && cd sima-ai-uboot
root@sdk:/data/sima-ai-uboot$ git checkout <u-boot-commit>
root@sdk:/data/sima-ai-uboot$ make ARCH=arm64 simaai_modalix_debug_defconfig
root@sdk:/data/sima-ai-uboot$ make all u-boot-initial-env V=1
Замініть <u-boot-commit> на коміт U-Boot для вашого випуску з розділу
Сумісність випусків. Образ — це u-boot.bin.
Встановлення артефактів
Структура розділів eMMC
| Розділ | Вміст |
|---|---|
mmcblk0p1 | U-Boot, основний |
mmcblk0p2 | U-Boot, резервний |
mmcblk0p3 | Завантажувальний розділ — містить два каталоги, boot-0 і boot-1, основний і резервний |
mmcblk0p4 | Коренева файлова система |
Записуйте розділи за допомогою dd, а не cp, і копіюйте файли на плату від імені root. Щоб дізнатися
адресу плати, виконайте на ній hostname -I або ip route get 1.1.1.1.
U-Boot
Скопіюйте образ, визначте розділ, який зараз використовується, і запишіть образ:
root@sdk:/data$ scp sima-ai-uboot/u-boot.bin root@<board-ip>:/tmp/
root@modalix:~# parted /dev/mmcblk0 print | grep legacy_boot | cut -f2 -d" "
1
root@modalix:~# dd if=/tmp/u-boot.bin of=/dev/mmcblk0p1 status=progress # use the partition number printed above
root@modalix:~# sync
Ядро, дерева пристроїв і оверлеї
Спершу визначте активний каталог завантаження — це або boot-0, або boot-1:
root@modalix:~# strings /boot/uboot.env | grep boot_path= | cut -f2 -d"="
/boot-0/
Скопіюйте артефакти в цей каталог:
root@sdk:/data$ scp simaai-linux/arch/arm64/boot/Image root@<board-ip>:/boot/boot-0/
root@sdk:/data$ scp simaai-linux/arch/arm64/boot/dts/simaai/modalix*.dtb root@<board-ip>:/boot/boot-0/
root@sdk:/data$ scp imx415.dtbo root@<board-ip>:/boot/boot-0/
Модулі ядра
Модулі розміщуються в дереві модулів ядра, що працює. Команда uname -r на платі показує
рядок версії:
root@sdk:/data$ scp simaai-linux/drivers/net/phy/marvell10g.ko root@<board-ip>:/lib/modules/6.18.3-modalix/kernel/drivers/net/phy/
Завершення
root@modalix:~# depmod -a 6.18.3-modalix
root@modalix:~# sync
root@modalix:~# reboot
Якщо ви додали новий оверлей, зареєструйте його у змінній U-Boot dtbos. Перервіть
автоматичне завантаження, а потім виконайте:
sima$ env set dtbos $dtbos imx415.dtbo
sima$ saveenv
sima$ boot
Розгортання власної збірки
Є два способи перенести власну збірку на плату, і вони підходять для різних етапів роботи.
Ітерації на працюючій платі. Під час розробки копіюйте образ ядра, дерева пристроїв, оверлеї та модулі на плату, яка вже завантажується, як описано в розділі Встановлення артефактів, а потім перезавантажте її. Це найшвидший цикл, але він змінює одну плату вручну й не залишає відтворюваного образу.
Прошивання повного образу. Щоб установити ту саму збірку на багато плат, зокрема на виробництві, завантажте кожну плату з мережі або з SD-карти та запишіть повний образ на її eMMC. Див. Прошивання образу на eMMC, а повний виробничий процес описано в розділі Заводське збирання та тестування.
Випуски платформи 2.x і 3.0 використовують різні механізми оновлення: у 3.0 відбувається перехід на swupdate. Щоб зібрати повний образ із вихідного коду, див. розділ Збирання повного образу за допомогою Yocto. Складання повного образу eLxr ще не задокументовано. Щоб запакувати оновлення для образу Yocto, див. розділ Збирання та застосування пакета оновлення.
Оновлення прошивки встановлює стандартний образ SiMa.ai. Використовуйте його, щоб повернути плату до відомого випуску, а не для розгортання власної збірки: воно перезаписує те, що ви встановили.
Довідкові матеріали
| Довідковий матеріал | Де |
|---|---|
| Відповідність випусків комітам вихідного коду | Сумісність випусків |
| Контейнер збирання | Dockerfile.modalix |
| Вихідний код ядра | simaai-linux |
| Defconfig ядра | simaai_modalix_defconfig |
| Вихідний код U-Boot | sima-ai-uboot |
| Дерева пристроїв і оверлеї | dts/simaai |
Наступні кроки
- Сумісність випусків — який коміт вихідного коду відповідає кожному випуску платформи.
- Запуск плати-носія — адаптація дерева пристроїв для власної плати-носія.
- Перехід на eLxr — переведення Yocto DevKit на eLxr.