從原始碼建置 BSP
自行建置 Modalix Linux 核心、U-Boot 與 device tree,然後將結果安裝到電路板上。本頁使用的全部都是公開儲存庫,不需要簽署 NDA,也不需要洽詢業務。
開始之前
-
一台用於建置的 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
# 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> 替換為版本相容性中您所用版本的核心 commit。建置 master 會得到最新版本,可能與電路板上的映像檔不相符。
建置結果如下:
| 成品 | 路徑 |
|---|---|
| 核心映像檔 | arch/arm64/boot/Image |
| Device tree | arch/arm64/boot/dts/simaai/*.dtb |
建置 Device Tree Overlay(選用 )
撰寫 overlay 原始檔(.dtso),然後將其編譯為二進位檔(.dtbo):
root@sdk:/data$ dtc -@ -I dts -O dtb -o imx415.dtbo imx415.dtso
如果 overlay 使用 #include(核心原始碼樹中的部分相機 overlay 即是如此),必須先經過 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 commit。產生的映像檔為 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
核心、Device Tree 與 Overlay
請先找出目前使用中的開機目錄,它會是 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
如果您新增了 overlay,請在 U-Boot 的 dtbos 變數中註冊它。中斷自動開機,然後執行:
sima$ env set dtbos $dtbos imx415.dtbo
sima$ saveenv
sima$ boot
部署您的建置
將自訂建置安裝到電路板上有兩種方式,分別適用於不同的工作階段。
在執行中的電路板上反覆修改。 開發期間,請依照安裝建置成品的步驟,將核心映像檔、device tree、overlay 與模組複製到已能開機的電路板上,然後重新開機。這是最快速的迭代方式,但它是以手動方式修改單一電路板,不會留下可重現的映像檔。
燒錄完整映像檔。 若要將相同的建置安裝到多塊電路板上(包括量產環境),請讓每塊電路板從網路或 SD 卡開機,並將完整映像檔寫入其 eMMC。請參閱將映像檔燒錄到 eMMC,完整的量產流程則請參閱工廠組裝與測試。
平台版本 2.x 與 3.0 使用不同的更新機制:3.0 改用 swupdate。若要從原始碼建置完整映像檔,請參閱使用 Yocto 建置完整映像檔。目前尚未提供組裝完整 eLxr 映像檔的說明。若要為 Yocto 映像檔封裝更新,請參閱建置與套用更新套件。
韌體更新會安裝 SiMa.ai 的標準映像檔。請用它將電路板還原到已知版本,而不是用來部署您自己的建置:它會覆寫您先前安裝的內容。
參考資料
| 參考資料 | 位置 |
|---|---|
| 版本與原始碼 commit 對應 | 版本相容性 |
| 建置容器 | Dockerfile.modalix |
| 核心原始碼 | simaai-linux |
| 核心 defconfig | simaai_modalix_defconfig |
| U-Boot 原始碼 | sima-ai-uboot |
| Device tree 與 overlay | dts/simaai |