メインコンテンツまでスキップ

BSP をソースからビルドする

Modalix の Linux カーネル、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 は、リリース 2.1.0 用の SDK をセットアップします。

Dockerfile.modalix
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 のレイアウト​

パーティション内容
mmcblk0p1U-Boot(プライマリー)
mmcblk0p2U-Boot(バックアップ)
mmcblk0p3ブートパーティション:boot-0 と boot-1 の 2 つのディレクトリがあり、一方がプライマリー、もう一方がバックアップです
mmcblk0p4ルートファイルシステム
警告

パーティションへの書き込みには cp ではなく dd を使用し、ボードへのコピーは 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

ビルドをデプロイする​

カスタムビルドをボードに導入する方法は 2 つあり、作業の段階に応じて使い分けます。

稼働中のボードで反復作業を行う。 開発中は、アーティファクトをインストールするの 手順のとおりに、カーネルイメージ、デバイスツリー、オーバーレイ、モジュールをすでに起動できるボードにコピーし、 再起動します。これは最も速いサイクルですが、1 台のボードを手作業で変更するため、再現可能なイメージは残りません。

完全なイメージを書き込む。 量産を含め、多数のボードに同じビルドを導入するには、各ボードを ネットワークまたは SD カードから起動し、完全なイメージを eMMC に書き込みます。 イメージを eMMC に書き込むを参照してください。量産の全体的な流れについては、 工場でのビルドとテストを参照してください。

3.0 でアップデート形式が変わります

プラットフォームリリース 2.x と 3.0 では、アップデートの仕組みが異なります。3.0 では swupdate に移行します。ソースから完全なイメージをビルドするには、 Yocto で完全なイメージをビルドするを参照してください。完全な eLxr イメージを 組み立てる方法は、まだ文書化されていません。Yocto イメージ用のアップデートをパッケージ化するには、 アップデートパッケージのビルドと適用を参照してください。

ファームウェアのアップデートは、SiMa.ai の標準イメージを インストールします。ボードを既知のリリースに戻す目的で使用し、独自のビルドのデプロイには使用しないでください。 インストールした内容が上書きされます。

参考資料​

参考資料場所
リリースとソースコミットの対応リリースの互換性
ビルドコンテナーDockerfile.modalix
カーネルソースsimaai-linux
カーネル defconfigsimaai_modalix_defconfig
U-Boot ソースsima-ai-uboot
デバイスツリーとオーバーレイdts/simaai

次のステップ​