🔰

Milk-V Duo をLinux box(?)としてちょっとチェック

2023/12/09に公開

https://milkv.io/duo

RISC-Vのチップをのせた非力なLinuxのSBCだとおもってもらえればOKなMilk-V Duoをちょっと触ったメモ。

前提

私はLinuxを普段使いしているので、これが「Linux box」としてどんなもんじゃい?というのを一旦みてみたいとおもいます。
つまりはラズパイとにたような見方ですね。

外装

小さいです、ラズパイゼロの半分くらいの面積かな…。裏面に部品がないので、そのまま基板にベタ付けできそうなのもプラスですね!

Document

https://milkv.io/docs/duo
https://community.milkv.io/c/duo/5

公式と公式フォーラム、この二つが基本的なのかなと思います。中国のプロダクトあるあるですが、QQやWeChatもあるらしいですが、あれはかなりゲーテッドなので(とはいえ、中国ではデファクトなので問題ないんでしょうが)ググれなくて辛いっすね。

ログイン

さて、Linux boxにするならログインができないといけない。概ね以下三つが選択肢となる。

  • UART(シリアル)でつなぐ
  • USB-gadgetのNICとして認識させ、ログインする
  • EtherのPHYがついているのでネットワークログインする

今回は三つ目をメインにしたいと思っています。なぜなら上二つは(基本)Milk-V Duoからインターネットに出られないので。

とはいえ、シリアルはあった方が良いですね、ハングアップしたときに状況がわからないとつらい。私はケーブルがどっかいっちゃって今回はやらなかったです。

ROM焼き

Milk-V Duoはなんと、SDKでちゃんとイメージを作りやすい環境が提供されていますが、一旦は公式イメージとかだけで遊んでみます。

まあ、ラズパイと同じです。

このあたりをたどり、最後から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をつなぐ

https://milkv.io/docs/duo/io-board/usb-ethernet-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で配布されていたのでためしてみます。

https://community.milkv.io/t/milkv-duo-duo-debian-full-7z-519m-download/862

焼いて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