Milk-V Duo をLinux box(?)としてちょっとチェック
RISC-Vのチップをのせた非力なLinuxのSBCだとおもってもらえればOKなMilk-V Duoをちょっと触ったメモ。
前提
私はLinuxを普段使いしているので、これが「Linux box」としてどんなもんじゃい?というのを一旦みてみたいとおもいます。
つまりはラズパイとにたような見方ですね。
外装
小さいです、ラズパイゼロの半分くらいの面積かな…。裏面に部品がないので、そのまま基板にベタ付けできそうなのもプラスですね!
Document
公式と公式フォーラム、この二つが基本的なのかなと思います。中国のプロダクトあるあるですが、QQやWeChatもあるらしいですが、あれはかなりゲーテッドなので(とはいえ、中国ではデファクトなので問題ないんでしょうが)ググれなくて辛いっすね。
ログイン
さて、Linux boxにするならログインができないといけない。概ね以下三つが選択肢となる。
- UART(シリアル)でつなぐ
- USB-gadgetのNICとして認識させ、ログインする
- EtherのPHYがついているのでネットワークログインする
今回は三つ目をメインにしたいと思っています。なぜなら上二つは(基本)Milk-V Duoからインターネットに出られないので。
とはいえ、シリアルはあった方が良いですね、ハングアップしたときに状況がわからないとつらい。私はケーブルがどっかいっちゃって今回はやらなかったです。
ROM焼き
Milk-V Duoはなんと、SDKでちゃんとイメージを作りやすい環境が提供されていますが、一旦は公式イメージとかだけで遊んでみます。
まあ、ラズパイと同じです。
- https://milkv.io/docs/duo
- https://milkv.io/docs/duo/getting-started/boot
- https://milkv.io/docs/duo/resources/image-sdk
- https://github.com/milkv-duo/duo-buildroot-sdk/releases/
このあたりをたどり、最後からImageをDLして、Etcherとかで焼きます。1GBくらいのイメージです。
Bootしてみる
今回私はEther+USBのブレイクアウトボードを使いたいのですが、一旦本体だけにしてUSB接続をします。母艦はLinuxです、なぜならUSB接続でNICと認識させるためのRNDISのドライバをPCに入れるのが面倒だからです。
Linuxだと単純につなぐと接続出来ます。
以下ホスト側につないだときの認識状況
[3136509.962060] usb 1-6: new high-speed USB device number 4 using xhci_hcd
[3136510.298106] usb 1-6: device descriptor read/64, error -71
[3136510.555096] usb 1-6: New USB device found, idVendor=3346, idProduct=1009, bcdDevice= 5.10
[3136510.555123] usb 1-6: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[3136510.555132] usb 1-6: Product: RNDIS
[3136510.555139] usb 1-6: Manufacturer: Cvitek
[3136510.555144] usb 1-6: SerialNumber: 0123456789
[3136510.586529] usbcore: registered new interface driver cdc_ether
[3136510.590864] rndis_host 1-6:1.0 usb0: register 'rndis_host' at usb-0000:00:15.0-6, RNDIS device, ae:aa:61:2b:34:46
[3136510.590956] usbcore: registered new interface driver rndis_host
[3136510.599568] usbcore: registered new interface driver rndis_wlan
[3136510.613639] rndis_host 1-6:1.0 enxaeaa612b3446: renamed from usb0
ホスト側からpingしてssh
$ ping 192.168.42.1
PING 192.168.42.1 (192.168.42.1) 56(84) bytes of data.
64 bytes from 192.168.42.1: icmp_seq=1 ttl=64 time=0.555 ms
$ ssh root@192.168.42.1
The authenticity of host '192.168.42.1 (192.168.42.1)' can't be established.
ED25519 key fingerprint is SHA256:o5xCz/esy405yh3ntUUhRp84uEDHA/0mgg7H4xPgnZo.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.42.1' (ED25519) to the list of known hosts.
root@192.168.42.1's password:
[root@milkv-duo]~#
デフォルトパスワードはDocに書いてあります
公式イメージでBootした様子
[root@milkv-duo]~# uname -a
Linux milkv-duo 5.10.4-tag- #1 PREEMPT Fri Dec 1 10:41:42 CST 2023 riscv64 GNU/Linux
[root@milkv-duo]/etc# cat os-release
NAME=Buildroot
VERSION=20231201-1057
ID=buildroot
VERSION_ID=2021.05
PRETTY_NAME="Buildroot 2021.05"
実に組み込みっぽいLinuxです、archが32bitでなく、riscv64なのがうれしいですね。
[root@milkv-duo]/bin# ls -al
total 1056
drwxr-xr-x 2 root root 3072 Dec 1 2023 .
drwxr-xr-x 18 root root 1024 Dec 1 2023 ..
lrwxrwxrwx 1 root root 7 Dec 1 2023 arch -> busybox
lrwxrwxrwx 1 root root 7 Dec 1 2023 ash -> busybox
lrwxrwxrwx 1 root root 7 Dec 1 2023 base32 -> busybox
lrwxrwxrwx 1 root root 7 Dec 1 2023 base64 -> busybox
<snip>
BusyBoxですねー
[root@milkv-duo]/bin# ifconfig
eth0 Link encap:Ethernet HWaddr B2:6D:D7:C6:C6:AA
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:22
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:323 errors:0 dropped:0 overruns:0 frame:0
TX packets:323 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:19495 (19.0 KiB) TX bytes:19495 (19.0 KiB)
usb0 Link encap:Ethernet HWaddr E6:E7:44:55:16:4C
inet addr:192.168.42.1 Bcast:192.168.42.255 Mask:255.255.255.0
inet6 addr: fe80::e4e7:44ff:fe55:164c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:385 errors:0 dropped:0 overruns:0 frame:0
TX packets:279 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:29674 (28.9 KiB) TX bytes:52840 (51.6 KiB)
とりあえずEth0はデフォルトで生きてるんだな
デバイス 起動 開始位置 最後から セクタ サイズ Id タイプ
/dev/sdc1 * 1 262144 262144 128M c W95 FAT32 (LBA)
/dev/sdc2 262145 1835008 1572864 768M 83 Linux
/dev/sdc3 1835009 2359296 524288 256M 0 空
2GBくらいのSDがあればいけますね。256は多分swap用につくってあるんでしょうが、SwapOnされてはいません。
[root@milkv-duo]/bin# shutdown -h now
-sh: shutdown: not found
[root@milkv-duo]/bin# halt
[root@milkv-duo]/bin# Connection to 192.168.42.1 closed by remote host.
Connection to 192.168.42.1 closed.
shutdownもなかったので、haltで止めました
IOBをつなぐ
ラズパイっぽい感じになるやつです。USB Hub、Etherのポート、UARTのピンがあります。
色々パッド、ランドはあるんですけどほとんどつながってないですね。
注意点として、USB Gadget(RNDIS)モードとUSB Host(つまり、このIOBのUSBハブを使う)モードは排他です。
あと、IOBをつないだ状態だと本体のUSBとIOBのUSB二つになりますが、本体のUSBに刺すとHost側からは(おそらくIOBの当たりの都合で?)USBハブに見えます、多分信号線が直結になるからですが…こわくね?w
さて、USBのモードを変更する設定ファイルは、/mnt/system
の中にあります。
これ、Linuxにちょっと詳しい人には罠で、mnt
だからどっか別のパーティションにあるかとおもったらそうでもなく、SDカードの第2パーティション(rootfs)に普通にファイルがあるだけでした。なんでや。(fstabをいじって。そこだけ別パに切り出しておくためなのか…?)
散々「どこかにパーティションはあるのか?」「なにかをloop backmountしてるのか?」ってさがしましたよ…。
編集方法ですが、ログインしてviしてもいいでしょうが、私は一回sdカードを抜いてかきかえました
# ホストにSDカードをつないで
$ sudo mkdir /mnt/sd
$ sudo mount /dev/sdc2 /mnt/sd
$ cd /mnt/sd/mnt/system
$ sudo rm usb.sh
$ sudo ln -s usb-host.sh usb.sh
/mnt/sd/mnt/system$ ls -al
-rwxr-xr-x 1 root root 67 Dec 1 11:38 usb-host.sh
-rwxr-xr-x 1 root root 392 Dec 1 11:38 usb-rndis.sh
lrwxrwxrwx 1 root root 11 Dec 9 20:08 usb.sh -> usb-host.sh
これの usb.sh
の中でmoduleをロードしていて、これのSymlinkを切り替えるなりして挙動を変える、ということらしいです
さてBoot
EtherつないでBootしましたが、注意点として以下があります。
- 自動のポート判断はないっぽいので、クロスケーブルかEther Hubにつなぐ必要がある(と思う)
- LANポートのランプはつかない(個体差かもしれない)
二個目は結構しんどい、最初わからなくてケーブルを交換した。
デフォルトでLANはDHCPを引いてくれるので、ご家庭のルーターの払い出し状況をみるとよいと思います。残念ながらMACアドレスはランダムらしく、リース時刻が新しいIPに片っ端からsshするとよいんじゃないですかね。
USBも認識し、USBメモリをさしたらちゃんと認識しました
[ 177.973644] usb 1-1.1: new high-speed USB device number 3 using dwc2
[ 178.078685] usb-storage 1-1.1:1.0: USB Mass Storage device detected
[ 178.079523] scsi host0: usb-storage 1-1.1:1.0
[ 179.091005] scsi 0:0:0:0: Direct-Access Generic STORAGE DEVICE 1532 PQ: 0 ANSI: 6
[ 179.430220] sd 0:0:0:0: [sda] 3920896 512-byte logical blocks: (2.01 GB/1.87 GiB)
[ 179.431181] sd 0:0:0:0: [sda] Write Protect is off
[ 179.431223] sd 0:0:0:0: [sda] Mode Sense: 21 00 00 00
[ 179.432058] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[ 179.441715] sda: sda1
[ 179.446603] sd 0:0:0:0: [sda] Attached SCSI removable disk
さて…?
とりあえず「Linux box」にはなりましたが、カーネルドライバをふやさないと色々はできないかなっておもいます。
とりあえず適当なWifiドングルを刺してみたんですが、何であるかを認識できず。まあカーネルビルドしなおさないとダメですね。
[ 697.508954] usb 1-1.1: new high-speed USB device number 4 using dwc2
メモリはこんなかんじ、32MBつんであって、Freeは8でした。
[root@milkv-duo]~# free -m
total used free shared buff/cache available
Mem: 29 14 8 0 6 12
Swap: 0 0 0
sshもDropbearですね、メモリたらんものね。
[root@milkv-duo]~# ssh -V
Dropbear v2020.81
消費電力はUSBワットチェッカーをみるかぎり、起動後は5V 0.13Aくらいでした(Ether接続状態)
USBデバイスをぬいたりさしたりするとたまに落ちます(LED Blinkが消える)。IOBには特にコンデンサが載ってるわけでもないので電源が安定的ではないです。USBデバイスはできるだけ刺してからBootするのがよいでしょうねー。
さて…まあここまでさわってみて「なんにもねえな!」となるわけで、さすがに公式イメージは組み込みっぽすぎます。ということでフォーラムをまわってみます。
よくわからないDebian image
フォーラムには色々なDistroをもってきてみようという話があり、Ubuntuまでうごくらしい(ちょっと面倒だったのでまだ未検証)です。
ただ、Debianのものがあり、これがimgで配布されていたのでためしてみます。
焼いてBootするだけです。USBもHostモードっぽいです。
root@milkv-duo:/etc# cat os-release
PRETTY_NAME="Debian GNU/Linux trixie/sid"
NAME="Debian GNU/Linux"
VERSION_CODENAME=trixie
root@milkv-duo:/bin# ls -al
total 84589
drwxr-xr-x 2 root root 31744 Oct 24 14:36 .
drwxr-xr-x 11 root root 1024 Oct 24 14:36 ..
-rwxr-xr-x 1 root root 10336 Oct 24 14:36 411toppm
-rwxr-xr-x 1 root root 18872 Oct 24 14:36 JxrDecApp
-rwxr-xr-x 1 root root 24336 Oct 24 14:36 JxrEncApp
lrwxrwxrwx 1 root root 1 Oct 24 14:36 X11 -> .
-rwxr-xr-x 1 root root 43904 Oct 24 14:36 '['
-rwxr-xr-x 1 root root 23240 Oct 24 14:36 addpart
lrwxrwxrwx 1 root root 27 Oct 24 14:36 addr2line -> riscv64-linux-gnu-addr2line
lrwxrwxrwx 1 root root 25 Oct 24 14:36 animate -> /etc/alternatives/animate
lrwxrwxrwx 1 root root 29 Oct 24 14:36 animate-im6 -> /etc/alternatives/animate-im6
-rwxr-xr-x 1 root root 6296 Oct 24 14:36 animate-im6.q16
-rwxr-xr-x 1 root root 12556 Oct 24 14:36 anytopnm
-rwxr-xr-x 1 root root 15032 Oct 24 14:36 apt
aptがありますね!
起動後のメモリの様子がこれです。さすがに公式のものよりメモリ食ってますね!
root@milkv-duo:/bin# free -h
total used free shared buff/cache available
Mem: 54Mi 25Mi 6.0Mi 92Ki 26Mi 29Mi
Swap: 255Mi 3.2Mi 252Mi
ということで…。…?…あれ、64Mbyteになったが?よくよくハードウェアスペックみたら64MBですね…。公式イメージはなんで32だったんだ…?オプションつけて制限してたのか。
とりあえずcronだし、systemdだし、かなり文明を感じます。これは結構すごいぞ。
aptの様子
おまけですが、このDebianはちゃんとaptも動きます、けど、riscv64のarchではさすがに全部のrepoが対応あるわけではないぽいですね?
root@milkv-duo:/bin# apt update
Get:1 https://mirror.sjtu.edu.cn/debian-ports sid InRelease [87.2 kB]
Get:2 https://mirror.sjtu.edu.cn/debian-ports unstable InRelease [87.2 kB]
Get:3 https://mirror.sjtu.edu.cn/debian-ports unreleased InRelease [58.8 kB]
Get:4 https://mirror.sjtu.edu.cn/debian-ports experimental InRelease [87.3 kB]
Fetched 321 kB in 19s (16.9 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.
N: Skipping acquire of configured file 'main/binary-riscv64/Packages' as repository 'http://mirror.sjtu.edu.cn/debian-ports sid InRelease' doesn't support architecture 'riscv64'
N: Skipping acquire of configured file 'main/binary-riscv64/Packages' as repository 'http://mirror.sjtu.edu.cn/debian-ports unstable InRelease' doesn't support architecture 'riscv64'
N: Skipping acquire of configured file 'main/binary-riscv64/Packages' as repository 'http://mirror.sjtu.edu.cn/debian-ports unreleased InRelease' doesn't support architecture 'riscv64'
N: Skipping acquire of configured file 'main/binary-riscv64/Packages' as repository 'http://mirror.sjtu.edu.cn/debian-ports experimental InRelease' doesn't support architecture 'riscv64'
愛すべきPHPはなかった
root@milkv-duo:/bin# apt search php
Sorting... Done
Full Text Search... Done
まあ、Perlはあるな
root@milkv-duo:/bin# perl -v
This is perl 5, version 36, subversion 0 (v5.36.0) built for riscv64-linux-gnu-thread-multi
まあ、パッケージがすくないですね。
root@milkv-duo:/bin# apt list |wc -l
396
とはいえ、ちゃんとできるんですね、ということはわかりました。
ということで
- Linux boxとしてうごくね!!!(当たり前でしょ)
この先については
- SDKをちゃんと見て、自前のイメージを作りたいね
- クロスコンパイル環境を整えたい
- ドライバをいれたい(Wifiとかほしい)
- SPI・I2C接続の液晶とキーボードをつなぎたい
- PHPを動かしたい(?)
- カメラモジュールがあるので、遊びたい
という感じですね。
しかしちょっといそがしいので、どこまでいけるかな〜〜〜。
似たようなハードウェアのLicheePi Nanoよりつかいやすいなとはおもいます。
とりあえずはHWの動作確認って感じでした。
Discussion