メインコンテンツにスキップ

はじめに

Duoシリーズボードの標準SDKはBuildrootベースで構築されており、Duoのファームウェア生成に使用されます。現在、SDKにはV1とV2の2つのバージョンがあります。

ヒント
  • SDK V1はRISC-Vコアのみ対応(Duo 64Mに推奨)
  • SDK V2はRISC-VとARMコア両方に対応(Duo256MとDuoSに推奨)

Duo 64Mはメモリが少ないため、SDK V1の利用を推奨します。SDK V2のAI関連アプリは現状Duo 64Mでは正常動作しません。

Buildroot SDK V1

SDKの主な構成:

  • u-boot: 2021.10
  • linux kernel: 5.10.4
  • buildroot: 2021.05
  • opensbi: 89182b2

ソースコード:https://github.com/milkv-duo/duo-buildroot-sdk

SDKディレクトリ構成:

├── build                ビルドスクリプトとボード設定
├── build.sh ワンクリックビルドスクリプト
├── buildroot-2021.05 buildrootソース
├── freertos freertosシステム
├── fsbl プリビルドfsblファームウェア
├── install 一時イメージ保存
├── isp_tuning カメラパラメータ
├── linux_5.10 Linuxカーネル
├── middleware 独自マルチメディアフレームワーク
├── device milkv設定ファイル
├── opensbi opensbiライブラリ
├── out Milk-V生成イメージ
├── ramdisk プリビルドramdisk
└── u-boot-2021.10 u-bootソース

Buildroot SDK V2

SDKの主な構成:

  • u-boot: 2021.10
  • linux kernel: 5.10.4
  • buildroot: 2025.02
  • opensbi: 89182b2

ソースコード:https://github.com/milkv-duo/duo-buildroot-sdk-v2

SDKディレクトリ構成:

├── build                ビルドスクリプトとボード設定
├── build.sh ワンクリックビルドスクリプト
├── buildroot buildrootソース
├── cvi_mpi sophgoマルチメディアフレームワーク
├── device milkv設定ファイル
├── freertos freertosシステム
├── fsbl プリビルドfsblファームウェア
├── install 一時イメージ保存
├── isp_tuning カメラパラメータ
├── linux_5.10 Linuxカーネル
├── osdrv 周辺ドライバソース
├── opensbi opensbiライブラリ
├── out Milk-V生成イメージ
├── tdl_sdk sophgoディープラーニングSDK
└── u-boot-2021.10 u-bootソース

イメージのビルド

コンパイル環境の準備。公式サポートは Ubuntu Jammy 22.04.x amd64 のみです。

他のLinuxディストリビューションの場合はDocker環境でのコンパイルを推奨します。

以下、2つの環境でのコンパイル方法を説明します。SDK V1/V2の手順はほぼ同じです。以下はV2 SDKの例です。

1. Ubuntu 22.04でのコンパイル

必要パッケージのインストール

依存パッケージをインストール:

sudo apt install -y pkg-config build-essential ninja-build automake autoconf libtool wget curl git gcc libssl-dev bc slib squashfs-tools android-sdk-libsparse-utils jq python3-distutils scons parallel tree python3-dev python3-pip device-tree-compiler ssh cpio fakeroot libncurses5 flex bison libncurses5-dev genext2fs rsync unzip dosfstools mtools tcl openssh-client cmake expect python-is-python3

duo-buildroot-sdk-v2では以下も必要です:

sudo pip install jinja2

SDKソースコード取得

git clone https://github.com/milkv-duo/duo-buildroot-sdk-v2.git --depth=1

SDK V2ではネットワーク問題回避のため、dl.tarを事前にダウンロードしbuildrootに展開します:

wget https://github.com/milkv-duo/duo-buildroot-sdk-v2/releases/download/dl/dl.tar
tar xvf ./dl.tar -C ./duo-buildroot-sdk-v2/buildroot/

展開後のdlディレクトリ例:

└── buildroot
└── dl
├── acl
├── alsa-lib
├── alsa-utils
├── attr
├── ...

1). ワンクリックコンパイル

build.shスクリプトを実行:

cd duo-buildroot-sdk/
./build.sh

使用方法が表示されます:

$ ./build.sh
Usage:
./build.sh - Show this menu
./build.sh lunch - Select a board to build
./build.sh [board] - Build [board] directly, supported boards as follows:
milkv-duo-musl-riscv64-sd
milkv-duo256m-glibc-arm64-sd
milkv-duo256m-musl-riscv64-sd
milkv-duos-glibc-arm64-emmc
milkv-duos-glibc-arm64-sd
milkv-duos-musl-riscv64-emmc
milkv-duos-musl-riscv64-sd

2通りのビルド方法があります。

1つ目は ./build.sh lunch で対話メニューを表示し、番号選択:

$ ./build.sh lunch
Select a target to build:
1. milkv-duo-musl-riscv64-sd
2. milkv-duo256m-glibc-arm64-sd
3. milkv-duo256m-musl-riscv64-sd
4. milkv-duos-glibc-arm64-emmc
5. milkv-duos-glibc-arm64-sd
6. milkv-duos-musl-riscv64-emmc
7. milkv-duos-musl-riscv64-sd
Which would you like:
ヒント
  • Duo (64M-DDR)はRISC-Vコアのみ、musl libcベースSDカードイメージ
  • Duo256MはRISC-V/ARM両対応(musl/GLIBC)、SDカードイメージのみ
  • DuoSはRISC-V/ARM両対応(musl/GLIBC)、SD/eMMCイメージ対応

2つ目はスクリプトにターゲット名を指定して直接ビルド:

$ ./build.sh milkv-duos-musl-riscv64-sd

ビルド成功後、outディレクトリに*.img(SDカード用)、*.zip(eMMC用)イメージが生成されます。

初回ビルド時は約840MBのツールチェーンが自動DL・展開されます。2回目以降はhost-toolsディレクトリがあれば再DL不要です。

2). 手動ステップビルド

ワンクリックスクリプト未使用の場合、ツールチェーンhost-toolsを手動DLしSDKルートに配置:

git clone https://github.com/milkv-duo/host-tools.git
cp -a host-tools duo-buildroot-sdk-v2/

環境変数設定:

source build/envsetup_milkv.sh

初回はターゲット選択が表示されます。

ターゲット選択後、環境変数ロード完了で情報が表示されます。

環境ロード後、deviceディレクトリにtargetリンクが作成されます。ターゲット変更はlunchパラメータ追加で再選択可能:

source build/envsetup_milkv.sh lunch

環境ロード後、以下コマンドでビルド:

clean_all
build_all

SDカードイメージ生成には追加で:

pack_sd_image

例:milkv-duos-musl-riscv64-sdの場合

source build/envsetup_milkv.sh milkv-duos-musl-riscv64-sd

clean_all
build_all
pack_sd_image

生成ファームウェア例:

install/soc_sg2000_milkv_duos_musl_riscv64_sd/milkv-duos-musl-riscv64-sd.img

SDカードイメージは*.img、eMMCはupgrade.zipです。

ヒント

build_all以外にも個別モジュールビルド可能。clean_xxxで中間ファイル削除後、build_xxxで再ビルド。tabキーで補完可能。例:

  • fsbl: clean_fsblbuild_fsbl
  • uboot: clean_ubootbuild_uboot
  • kernel: clean_kernelbuild_kernel
  • osdrv: clean_osdrvbuild_osdrv
  • cvi_mpi: clean_middlewarebuild_middleware
  • tdl-sdk: clean_tdl_sdkbuild_tdl_sdk

2. Dockerでのコンパイル

LinuxホストでDockerサポートが必要です。Dockerの使い方は公式ドキュメント参照。

SDKソースをLinuxホストに配置し、Milk-V提供のDockerイメージ環境でビルドします。

LinuxホストでSDKコード取得

git clone https://github.com/milkv-duo/duo-buildroot-sdk-v2.git --depth=1

SDK V2ではdl.tarを事前DLしbuildrootに展開:

wget https://github.com/milkv-duo/duo-buildroot-sdk-v2/releases/download/dl/dl.tar
tar xvf ./dl.tar -C ./duo-buildroot-sdk-v2/buildroot/

展開後のdlディレクトリ例:

└── buildroot
└── dl
├── acl
├── alsa-lib
├── alsa-utils
├── attr
├── ...

SDKコードディレクトリへ移動

cd duo-buildroot-sdk-v2

Dockerイメージ取得・起動

docker run --privileged -itd --name duodocker -v "$(pwd)":/home/work milkvtech/milkv-duo:latest /bin/bash

コマンドパラメータ説明:

  • --privileged:特権モード
  • duodocker:Docker名
  • $(pwd):現在ディレクトリ
  • -v $(pwd):/home/work:ホストのコードディレクトリをDockerの/home/workにバインド
  • milkvtech/milkv-duo:latest:Milk-V提供Dockerイメージ

Docker起動後、docker ps -aで状態確認:

$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8edea33c2239 milkvtech/milkv-duo:latest "/bin/bash" 2 hours ago Up 2 hours duodocker
ヒント

Dockerイメージ更新時はdocker pull milkvtech/milkv-duo:latestで最新取得可能。

1). Dockerでワンクリックビルド

docker exec -it duodocker /bin/bash -c "cd /home/work && cat /etc/issue && export FORCE_UNSAFE_CONFIGURE=1 && ./build.sh [board]"

./build.sh [board]はUbuntuでのワンクリックビルドと同様です。lunchで対話選択も可能。

例:milkv-duos-musl-riscv64-sdの場合

docker exec -it duodocker /bin/bash -c "cd /home/work && cat /etc/issue && export FORCE_UNSAFE_CONFIGURE=1 && ./build.sh milkv-duos-musl-riscv64-sd"

ビルド成功後、outディレクトリにSDカード用*.imgが生成されます。

2). Dockerで手動ステップビルド

ワンクリック未使用の場合、ツールチェーンhost-toolsを手動DLしSDKルートに配置:

git clone https://github.com/milkv-duo/host-tools.git
cp -a host-tools duo-buildroot-sdk-v2/

docker ps -aでコンテナID確認(例:8edea33c2239

コンテナ未起動の場合は再起動しID確認:

cd duo-buildroot-sdk-v2/
docker run --privileged -itd --name duodocker -v $(pwd):/home/work milkvtech/milkv-duo:latest /bin/bash
docker ps -a

Dockerに入る:

docker exec -it 8edea33c2239 /bin/bash

コードディレクトリへ移動:

root@8edea33c2239:/# cd /home/work/

環境変数設定(rootユーザー用):

export FORCE_UNSAFE_CONFIGURE=1

環境変数ロード:

source build/envsetup_milkv.sh

初回はターゲット選択が表示されます。

環境ロード後、以下コマンドでビルド:

clean_all
build_all

SDカードイメージ生成には追加で:

pack_sd_image

例:milkv-duos-musl-riscv64-sdの場合

source build/envsetup_milkv.sh milkv-duos-musl-riscv64-sd

clean_all
build_all
pack_sd_image

生成ファームウェア例:

install/soc_sg2000_milkv_duos_musl_riscv64_sd/milkv-duos-musl-riscv64-sd.img

SDカードイメージは*.img、eMMCはupgrade.zipです。

ヒント

build_all以外にも個別モジュールビルド可能。clean_xxxで中間ファイル削除後、build_xxxで再ビルド。tabキーで補完可能。例:

  • fsbl: clean_fsblbuild_fsbl
  • uboot: clean_ubootbuild_uboot
  • kernel: clean_kernelbuild_kernel
  • osdrv: clean_osdrvbuild_osdrv
  • cvi_mpi: clean_middlewarebuild_middleware
  • tdl-sdk: clean_tdl_sdkbuild_tdl_sdk

ビルド完了後はexitでDockerから退出可能:

root@8edea33c2239:/home/work# exit

生成ファームウェアはホスト側コードディレクトリにも出力されます。

Dockerの停止

不要になったDocker環境は停止・削除可能:

docker stop 8edea33c2239
docker rm 8edea33c2239

3. その他のコンパイル注意点

上記以外の環境でSDKをビルドする場合の注意点です。

cmakeバージョン

cmakeの最低バージョンは3.16.5です。

バージョン確認:

cmake --version

例:Ubuntu 20.04のapt版は3.16.3で要件未満。最新版3.27.6を手動インストール:

wget https://github.com/Kitware/CMake/releases/download/v3.27.6/cmake-3.27.6-linux-x86_64.sh
chmod +x cmake-3.27.6-linux-x86_64.sh
sudo sh cmake-3.27.6-linux-x86_64.sh --skip-license --prefix=/usr/local/

インストール後は/usr/local/binに配置され、cmake --versionで確認可能。

Windows Linux Subsystem (WSL)でのビルド

WSLでビルドする場合、$PATHにWindows環境変数が混在しスペースが含まれる問題があります。

/etc/wsl.confに以下を追加:

[interop]
appendWindowsPath = false

その後wsl.exe --rebootでWSL再起動。./build.shbuild_allが実行可能になります。元に戻す場合はappendWindowsPath = trueにし、PowerShellでwsl.exe --shutdownwsl.exeで再起動してください。

4. アプリケーションパッケージ追加

Buildrootは軽量な組み込みLinux構築ツールで、Ubuntuのようなaptはありません。Duo標準SDKにはよく使うツールが追加されていますが、独自アプリ追加にはSDK修正・再ビルドが必要です。

以下、Buildrootでアプリ追加の一般的な方法です。

Busyboxコマンド有効化

Buildrootシステムの基本コマンドはbusyboxが提供。必要コマンドがbusybox設定ファイルに含まれているか確認し、有効化して再ビルドします。

設定ファイル例:

buildroot/package/busybox/busybox.config

例:timeoutコマンド有効化

diff --git a/buildroot/package/busybox/busybox.config b/buildroot/package/busybox/busybox.config
index d7d58f064..b268cd6f8 100644
--- a/buildroot/package/busybox/busybox.config
+++ b/buildroot/package/busybox/busybox.config
@@ -304,7 +304,7 @@ CONFIG_TEST=y
CONFIG_TEST1=y
CONFIG_TEST2=y
CONFIG_FEATURE_TEST_64=y
-# CONFIG_TIMEOUT is not set
+CONFIG_TIMEOUT=y
CONFIG_TOUCH=y
# CONFIG_FEATURE_TOUCH_NODEREF is not set
CONFIG_FEATURE_TOUCH_SUSV3=y

参考コミット:busybox: add timeout command

Buildrootプリセットアプリパッケージ有効化

Buildrootには多数のプリセットアプリがあり、buildroot/packageで確認できます。

ターゲットボードの設定ファイルで有効化/無効化します。例:milkv-duos-musl-riscv64-sdの設定ファイル

buildroot/configs/milkv-duos-musl-riscv64-sd_defconfig

ホストでSDK全体をビルド後、Buildrootビルドディレクトリで対話メニュー設定可能。

  1. Buildrootビルドディレクトリへ移動

    cd buildroot/output/milkv-duos-musl-riscv64-sd/

    make show-targetsで使用中パッケージ確認

    $ make show-targets
    busybox coreutils dhcpcd dnsmasq dropbear ...
  2. Buildroot設定 make menuconfigで対話メニュー表示

    必要パッケージをTarget packagesから探し、/キーで検索も可能。例:tarコマンドはpackage_tarで検索、System toolsカテゴリにあり、スペースキーで有効化。

    ESCキーで終了、保存時はEnterでOK。

    make savedefconfigで設定保存、git statusで変更確認。

    ヒント

    設定ファイルの差分比較も可能:

    diff -u .config.old .config

    新イメージでDuo上でコマンド動作確認。not foundの場合は.mkファイルにgccパラメータ(TARGET_CFLAGSTARGET_LDFLAGS)追加が必要な場合あり。参考コミット:

    1. buildroot: enable fio
    2. buildroot: enable spidev_test
    3. buildroot: fix build parameter for coremark package

独自アプリパッケージ追加

独自アプリのビルド・テストはduo-examples方式推奨。

Buildrootパッケージとして組み込みたい場合はプリセットパッケージ設定を参考に追加。参考リンク:

  1. buildroot: add python-evdev required by the pinpong library
  2. buildroot: add python-freetype required by the pinpong library

主にbuildroot-2021.05/packageへの追加内容を参照。

5. アプリケーションパッケージ削除

不要なパッケージ削除でビルド高速化やファームウェア軽量化が可能です。

Buildroot設定ファイルから該当パッケージ名を削除して再ビルドします。例:Python関連ライブラリ不要の場合

buildroot/configs/milkv-duos-musl-riscv64-sd_defconfig
diff --git a/buildroot/configs/milkv-duos-musl-riscv64-sd_defconfig b/buildroot/configs/milkv-duos-musl-riscv64-sd_defconfig
index 2bc8cd5e3..e78901afb 100644
--- a/buildroot/configs/milkv-duos-musl-riscv64-sd_defconfig
+++ b/buildroot/configs/milkv-duos-musl-riscv64-sd_defconfig
@@ -330,25 +330,6 @@ BR2_PACKAGE_EVTEST=y
# BR2_PACKAGE_FCONFIG is not set
BR2_PACKAGE_FLASHROM_ARCH_SUPPORTS=y

-BR2_PACKAGE_PYTHON3=y
-BR2_PACKAGE_PYTHON3_PY_PYC=y
-BR2_PACKAGE_PYTHON_LXML=y
-BR2_PACKAGE_PYTHON_PIP=y
-BR2_PACKAGE_PYTHON_SETUPTOOLS=y
-BR2_PACKAGE_PYTHON3_SSL=y
-
-BR2_PACKAGE_PYTHON_SERIAL=y
-BR2_PACKAGE_PYTHON_PILLOW=y
-BR2_PACKAGE_PYTHON_SMBUS_CFFI=y
-BR2_PACKAGE_PYTHON_SPIDEV=y
-BR2_PACKAGE_PYTHON_MODBUS_TK=y
-BR2_PACKAGE_PYTHON_EVDEV=y
-BR2_PACKAGE_PYTHON_FREETYPE=y
-
-BR2_PACKAGE_PYTHON_PINPONG=y
-
-BR2_PACKAGE_PYTHON_PSUTIL=y
-
#
# Compression and decompression
#

6. よくある質問

Buildrootトラブルシューティング

SDKのBuildrootはデフォルトで並列ビルド有効ですが、エラー解析時は設定ファイルから削除し、buildroot/outputディレクトリ削除後再ビルドします。

例:milkv-duos-musl-riscv64-sdの設定ファイルから

buildroot/configs/milkv-duos-musl-riscv64-sd_defconfig
BR2_PER_PACKAGE_DIRECTORIES=y

エラー発生時はターミナルのエラー情報に加え、build/br.logの完全ログも確認してください。

BuildrootパッケージDL失敗

SDK V2ではネットワーク問題回避のため、dl.tarを事前DLしbuildrootに展開して再ビルドします:

rm -rf ./buildroot/output ./buildroot/dl
wget https://github.com/milkv-duo/duo-buildroot-sdk-v2/releases/download/dl/dl.tar
tar xvf ./dl.tar -C ./buildroot/

展開後のdlディレクトリ例:

└── buildroot
└── dl
├── acl
├── alsa-lib
├── alsa-utils
├── attr
├── ...