LoginSignup
1
0

Milk-V Duoのすゝめ

Last updated at Posted at 2024-06-30

Milk-V Duoについて

Milk-V DuoはShenzhen MilkV Technology Co., Ltd.が販売するRISC-V CPUを搭載する小型のシングルボードコンピュータ。

Milk-V DuoはCV1800Bをベースにした超小型の組み込みプラットフォームです。LinuxとRTOSが実行可能で、プロフェッショナル、産業用ODM、AIoT、DIY、クリエイターに、高信頼で高費用対効果なプラットフォームを提供します。Duo 256MはSG2002をメインコントローラーに据えたDuoのアップグレードで、256MBのメモリーを備えており、スタンダードなLinuxシステムとアプリケーション、さらにより多くのメモリを必要とするアプリケーションに対応できます。

Raspberry Pi Picoと同じサイズです。が、Linuxが動作します。Kawaii🥰
片面基盤なのもミソですね。

メモリ64MBと256MBバージョン、フォームファクタや機能が全く違いますがDuo Sという形で512MBバージョンがあります。

国内では(Duo Sを除いて)秋月電子通商で取り扱いがあります。

筆者は64MBバージョンしか使っていないので、主には64MBバージョンの情報を記述しています。
256MBや512MBバージョンを入手したら追記するかもしれません。

スペック

Milk-V Duo 64M(クリックで展開) (milkv.ioより引用)
Milk-V Duo 64M
名称 備考
SoC CVITEK CV1800B
CPU T-Head Xuantie C906 1GHz駆動
CPU T-Head Xuantie C906 700MHz駆動 RTOS用
RAM 64MB DDR SoCに内蔵
MCU 8051 8KB SRAM
TPU 0.5TOPS INT8
GPU なし
ストレージ MicroSD/SPI NAND
ネットワーク Ethernet パッドから100Mbpsが1系統
オーディオ なし
映像出力 なし
GPIO 26ピン
カメラ MIPI CSI 16pin FPCコネクタ/2レーン 1系統
Milk-V Duo 256M(クリックで展開) (milkv.ioより引用)
Milk-V Duo 256M
名称 備考
SoC SOPHGO SG2002
CPU T-Head Xuantie C906 1GHz駆動
CPU T-Head Xuantie C906 700MHz駆動 RTOS用
CPU ARM Cortex-A53 C906@1GHzとは排他利用
RAM 256MB DDR SoCに内蔵
MCU 8051 6KB SRAM
TPU 1TOPS INT8
GPU なし
ストレージ MicroSD/SPI NAND
ネットワーク Ethernet パッドから100Mbpsが1系統
オーディオ GPIO経由で対応
映像出力 なし
GPIO 26ピン
カメラ MIPI CSI 16pin FPCコネクタ/2レーン 1系統
Milk-V Duo S(クリックで展開) (milkv.ioより引用)
Milk-V Duo S
名称 備考
SoC SOPHGO SG2000
CPU T-Head Xuantie C906 1GHz駆動
CPU T-Head Xuantie C906 700MHz駆動 RTOS用
CPU ARM Cortex-A53 C906@1GHzとは排他利用
RAM 512MB DDR SoCに内蔵
MCU 8051 6KB SRAM
TPU 0.5TOPS INT8
GPU なし
ストレージ MicroSD/eMMC
ネットワーク Ethernet/WiFi6/Bluetooth 5.4(オプション) RJ45対応
オーディオ 3.5mmジャック経由で対応
映像出力 GPIO経由で対応 MIPI DSI 4レーン
GPIO 39ピン 26ピン×2中 一部ディスプレイに使用
カメラ MIPI CSI 16pin FPCコネクタ/2レーン 1系統

めちゃくちゃヘテロジニアス。
組み込み向けを謳っているだけあり、8051を内蔵しています。電力状況次第でC906を寝かせておき、8051に動いてもらうこともできそう。
エッジAIを意識してか、TPUも搭載しています。SG2002のが一番つよい。
残念なことにC906はコア間連携には対応しておらず、Linuxから扱えるのは1GHz(C906B)の方のみになります。
追記:
小さい方のコア(C906L)にはMMUがないようです。
なので通常のLinuxカーネルは動作しませんが、もし仮にμCLinuxをC906Lで動かせたら面白いことになりそう...
Duo 256MとDuo SのA53は本当に必要なんだろうか...

ちょこっとベンチマーク/消費電力測定

EEMBC Coremarkを回してみました。
結果はだいたい2500Coremarkくらいになり、駆動周波数の1000MHzで割るとだいたい2.5Coremark/MHzくらいです。
この値がどれくらいかで言えば、同周波数の初代ラズパイ/初代ラズパイZeroくらいですね。
まあ、このサイズ感でこの性能なら十分でしょう。
消費電力については単体の場合で最大500mW程度、アイドル時200mW程度でした。マイコンとして見れば高いですが、メインラインのLinuxが動作するSBCであることを考えれば低いと思います。(当然、周辺機器を接続すればその分増えます)
近年作られたチップだけあり、消費電力性能に関しては秀でているといえるでしょう。

起動してみる

用意するもの

・PC(Ubuntuの22.04LTS以降を推奨)
・MicroSDカード
・SDカードリーダー
・Milk-V Duo

起動させるだけなら公式のGithubリポジトリから完成済みのBuildroot Linuxのイメージがダウンロードできるのでそれを使います。

使用するハードウェアにあったイメージファイルをダウンロードします。

MicroSDカードに書き込む

DDコマンドやRaspberry Pi ImagerないしEtcherのような書き込みツールを用います。

SDカードリーダーにカードを挿入し、書き込みます。

ドライブの指定には十二分に注意しましょう

起動して接続する

Duoに先ほど書き込んだMicroSDカードを挿入し、Type-Cケーブルを接続します。
Linuxが正常に起動すると、USB-Cポート付近の青色のLEDが点滅します。

LEDが点滅しない場合

LEDが点滅しない場合、Linuxが正常に起動していません。
MicroSDカードに正常にイメージが書き込まれているか確認してください。
一部カードでの相性問題も確認しています。後者に関しては諦めて別のSDカードを使うが吉です。
私の確認した限りでは、SanDisk製カードは安定して利用できることを確認しています。

RNDISを使用しての接続

RNDISはUSB経由のネットワークアダプター用の規格です。
Windowsの場合デバイスマネージャ経由でRNDISドライバのインストールが必要になります。
MacOSに関してはかなり面倒くさいので説明を省きます。
圧倒的Linux推奨。

用意するもの

・先ほど書き込んだSDカード
・Type-C↔Type-A USBケーブル(電源・通信用)

Linuxの場合、特別な設定は必要ありません。
ネットワークアダプターとして認識されるので、SSHで接続します。

root@192.168.42.1

(途中、ホストが正しいか聞かれるのでyesと入力します。)
パスワードはmilkvです。

問題なく接続できれば、shのプロンプトが表示されます。

[root@milkv-duo]~#

/proc/cpuinfoでも覗いてみましょう。

root@192.168.42.1
[root@milkv-duo]~# cat /proc/cpuinfo
processor	: 0
hart		: 0
isa		: rv64imafdvcsu
mmu		: sv39

[root@milkv-duo]~#

ちゃんとRISC-Vプロセッサが手元で動いています。MMUも居座っています。

UARTを使用しての接続

こっちのほうがオススメです。
起動時のログなどもすべて確認できるので、起動しない場合の問題の切り分けにも役立つでしょう。

用意するもの

・先ほど書き込んだSDカード
・Type-C↔Type-A USBケーブル(電源用)
・USB↔UART 変換モジュール
・ピンヘッダ

ピンヘッダはハンダ付けしてください。
DuoのRXチャネルは17番ピン、TXチャネルは16番ピンです。(内側の灰色の数字)
これに従って、USB↔UART 変換モジュールと接続します。(TXチャネルとRXチャネルはクロスさせます。)

Duoのピンアサイン 左上から数えてPin 1, 2, 3... 16番, 17番は左下。 (milkv.ioより引用)

ターミナルからならpicocomやscreenが便利です。GUIのツールはGTKTermやTera Termが有名どころでしょう。

ttyUSB0などの形で認識されるはずなので、それに接続します。パーミッションの設定が必要な場合もあるので、sudo chmod 666 /dev/ttyUSB0のように書き換えておきます。
シリアルなのでログインはいりません。

/dev/ttyUSB0
[root@milkv-duo]~# cat /proc/cpuinfo
processor	: 0
hart		: 0
isa		: rv64imafdvcsu
mmu		: sv39

[root@milkv-duo]~#

RAMが28MBしか認識されていないのは一部がカメラのアルゴリズム用のメモリに割り当てられているためです。すべてのメモリをLinuxで使いたい場合はイメージをビルドしてみるセクションのメモリをフル活用するの項目に従って変更します。

イメージをビルドしてみる

アプリケーションパッケージなどを同梱してBuildrootイメージをビルドすることができます。

用意するもの

・Ubuntu 22.04 LTS以降をインストールしてあるPC
・MicroSDカード
・SDカードリーダー
・Milk-V Duo

ソースをクローンする

どこか適当なわかりやすいディレクトリに移動し、

git clone https://github.com/milkv-duo/duo-buildroot-sdk

でクローンします。(ちょっと時間がかかります)
cd duo-buildroot-sdkでディレクトリに入っておきます。

必要なパッケージ

公式ドキュメント曰く:
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
以上のパッケージ類が必要なようです(多いな)

sudo apt install 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

でもこれをコピペしてしまえば楽でしょう(依存関係を破壊しないように注意)。

ビルド

./build.shをそのまま実行するとヘルプが表示されます。
./build.shの引数にボードの名前を入力すればそれに適した設定でビルドされます。
または、引数にlunchと入れれば対話形式で選択できます。

ボード名一覧
milkv-duo
milkv-duo-spinand
milkv-duo-spinor
milkv-duo256m
milkv-duo256m-spinand
milkv-duo256m-spinor
milkv-duos-emmc
milkv-duos-sd

筆者はDuo(64MB)を使用しているので、引数にmilkv-duoをつけてコンパイルしました。

初回のコンパイル時にツールチェーン(800MBくらい)が自動でダウンロードされます。
ビルドには時間がかかります。

ビルドが完了すると./outディレクトリ直下にmilkv-****.imgのようなフォーマットでファイルが出てきます。
ファイル名の途中に日付と時刻が入るので、ビルド日時順で見分けがつきます。

出てきたファイルを起動してみるセクションと同様にSDカードに焼いて起動できたら成功です。
機能的には標準のイメージと全く変わりません。

メモリをフル活用する

起動してみるセクションで先述した通り、RAMの半分がカメラのアルゴリズム用に持っていかれており、Linuxでは28MBしか使えません。
使えるだけの全部のメモリを使いたいなら、duo-buildroot-sdk/build/boards/cv180x/cv1800b_milkv_duo_sd/memmap.pyの43行目にある

memmap.py
ION_SIZE = 26.80078125 * SIZE_1M

26.80078125を0に書き換えてビルドします。

Duo 256Mの場合 Duo 256Mの場合はパスが duo-buildroot-sdk/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/memmap.py になります。変更する場所は同様です。

パッケージを入れてみる

Buildrootには動的なパッケージ管理システムがありません。
なので、ビルド時にすべて同梱してしまう仕組みになっています。
BuildrootはTUIベースでの設定が可能になっており、難解な操作無しにパッケージを追加できます。
ただしBuildrootに関してはQiitaだけでもたくさんの記事が偉大なる先人たちによって書かれているので、ここで説明することは最低限、本質的なことについては割愛させてもらいます...

必要なファイル類を揃えるためにも、ビルドセクションを参考に一回ビルドを終わらせておきます。

設定ファイルのディレクトリに移動します。

cd buildroot-2021.05/output/milkv-duo_musl_riscv64/

設定画面を開きます。

make menuconfig



ここでは試しにCoremarkを入れてみます。(お好きなパッケージをどうぞ)

設定を保存します。(ちょっと時間がかかります)

make savedefconfig

cd /path/to/duo-buildroot-sdkでBuildroot SDKのディレクトリにもどり、./build.shを実行してビルドします。

出てきたファイルを起動してみるセクションと同様にSDカードに焼き、電源を投入します。

シェルにログインして先ほどビルドしたEEMBC Coremarkを走らせてみます。

[root@milkv-duo]~# coremark
2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 12782
Total time (secs): 12.782000
Iterations/Sec   : 2347.050540
Iterations       : 30000
Compiler version : GCC10.2.0
Compiler flags   : -O2   -lrt
Memory location  : Please put data memory location here
			(e.g. code in flash, data on heap etc)
seedcrc          : 0xe9f5
[0]crclist       : 0xe714
[0]crcmatrix     : 0x1fd7
[0]crcstate      : 0x8e3a
[0]crcfinal      : 0x5275
Correct operation validated. See readme.txt for run and reporting rules.
CoreMark 1.0 : 2347.050540 / GCC10.2.0 -O2   -lrt / Heap
[root@milkv-duo]~# 

動きました。
...ちょっと値が低いのはコンパイラのツメが甘いからです。多分。(別のコンパイラでビルドした際は2500程度出ました。)

なにわともあれ、パッケージを追加することができました。

いろいろ作ってみる

ネットワーク

ネットワークに関しては別で記事を書いてあります。

電子工作

時間と材料と体力があれば書きます...

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0