CM4Stack headless setup
CM4Stackって?
CM4Stackは、Raspberry Pi Compute Module 4 を組み込んだ M5Stack みたいなやつで、本家のサイト では$199で販売している。日本国内だとスイッチサイエンス で31537円で販売していたので買ってみた。4/4に購入して翌日4/5に届いた。
早速セットアップ
CM4Stack Setup and Configuration を見ると、モニターとUSBキーボードを接続してセットアップするようだが、自宅にHDMIモニターがないのでheadless setupに挑戦した。
セットアップ時に使ったホストPCはMacBook Pro 14, macOS Ventura 13.3。
rpibootの準備
Compute Module 4 (CM4) はeMMCを採用しているのでRaspberry Pi 4のようにMicroSDを外してPCに挿してheadless setup用のファイルを書き込むことができないが、USB Device Boot Code を使うことでCM4のeMMCをUSBストレージとして扱うことができるようになる。
(macOSの場合はlibusbとpkg-configのインストールが必要)
$ git clone https://github.com/raspberrypi/usbboot
$ cd usbboot
$ brew install libusb
$ brew install pkg-config
$ make
$ sudo ./rpiboot
RPIBOOT: build-date Apr 5 2023 version 20221215~105525 ea2b2dec
Waiting for BCM2835/6/7/2711...
rpibootを起動すると上のように待ち状態になる。この状態でCM4StackのBOOTスイッチを押しながら、CM4のUSB 2.0 OTGと書かれたUSB-C端子とPCとをUSB-Cケーブルで接続する(付属のACアダプタは使わない)。
下のようなメッセージが表示されるとCM4がUSBストレージとして認識される。
Loading embedded: bootcode4.bin
Sending bootcode.bin
Successful read 4 bytes
Waiting for BCM2835/6/7/2711...
Loading embedded: bootcode4.bin
Second stage boot server
Cannot open file config.txt
Cannot open file pieeprom.sig
Loading embedded: start4.elf
File read: start4.elf
Cannot open file fixup4.dat
Second stage boot server done
$
diskutilコマンドで確認できる。(私のPCだとdisk7として認識されていた)
$ diskutil list
:
/dev/disk7 (external, physical):
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme *31.3 GB disk7
1: Windows_FAT_32 bootfs 268.4 MB disk7s1
2: Linux 31.0 GB disk7s2
イメージの書き込み
CM4Stackは専用のイメージが書き込み済みで出荷されるようなので、上のようにUSBストレージとして認識されればすぐにセットアップ可能だと思われるが、私はセットアップを何度もやり直したりして上書きしてしまった。
CM4Stack Setup and Configuration の最初の方のDownload the custom image of cm4stackに書かれている、CM4Stack用のカスタムイメージをダウンロードする。
CM4のFATパーティションがmountされているので、書き込み前にumountする。
$ diskutil umountDisk disk7
ダウンロードしたイメージをddで書き込む。
$ gzcat 2023-03-08-CM4StackOS-canary-2023-02-21-raspios-bullseye-armhf.gz | sudo dd of=/dev/rdisk7 bs=1M
headless setup用ファイルを準備する
イメージの書き込みが終了すると新しく書き込んだイメージのFATパーティションがmountされているので、headless setup用のファイルを準備する。
パスワードの設定にopensslが必要だが、macOS標準のopensslは -6
オプションに対応していないのでhomebrewでopensslをインストールしておく。
$ brew install openssl
$ touch /Volumes/bootfs/ssh
$ echo -n "USERNAME:" > /Volumes/bootfs/userconf
$ /opt/homebrew/opt/openssl/bin/openssl passwd -6 >> /Volumes/bootfs/userconf
Password: PASSWORD
Verifying - Password: PASSWORD
これで準備完了。umountして電源を入れ直すとuserconf
で指定したアカウントが自動的に作成されsshサーバーが有効になる。
$ diskutil umountDisk disk7
Wi-Fiの設定
ここまでくればPCとCM4を接続するUSB-Cケーブルは不要。次はWi-Fiの設定を行うがこれはPCとCM4をイーサネットケーブルで接続し、PCからCM4にsshでloginして設定する。
raspberrypi.local
で名前解決できるようであればこんな感じでloginできる。
$ ssh USERNAME@raspberrypi.local
USERNAME@raspberrypi.local's password: PASSWORD
名前解決できない時は私はIPv6のリンクローカルアドレスを使ってloginしている。
リンクローカルマルチキャストアドレスにping6すると、PCとCM4を直結しているのでCM4からreplyが来る。
$ ping6 -I en9 ff02::1
PING6(56=40+8+8 bytes) fe80::1c27:f810:b0e4:8936%en9 --> ff02::1
16 bytes from fe80::1c27:f810:b0e4:8936%en9, icmp_seq=0 hlim=64 time=0.230 ms
16 bytes from fe80::1c27:f810:b0e4:8936%en9, icmp_seq=1 hlim=64 time=0.419 ms
16 bytes from fe80::9b:d10:a520:cb57%en9, icmp_seq=1 hlim=64 time=1.567 ms
16 bytes from fe80::1c27:f810:b0e4:8936%en9, icmp_seq=2 hlim=64 time=0.321 ms
16 bytes from fe80::9b:d10:a520:cb57%en9, icmp_seq=2 hlim=64 time=0.763 ms
^C
--- ff02::1 ping6 statistics ---
3 packets transmitted, 3 packets received, +2 duplicates, 0.0% packet loss
round-trip min/avg/max/std-dev = 0.230/0.660/1.567/0.488 ms
これでCM4のリンクローカルアドレスがわかったのでそのアドレスにsshでloginする。
$ ssh USERNAME@fe80::9b:d10:a520:cb57%en9
sshでloginすると下のようにWi-Fiがrfkillでblockされているというメッセージが表示される。
:
Wi-Fi is currently blocked by rfkill.
Use raspi-config to set the country before use.
USERNAME@raspberrypi:~ $
raspi-configコマンドでWi-FiのcountryとSSID, PSKを設定して再起動すると、CM4をWi-Fiに接続することができる。
USERNAME@raspberrypi:~ $ raspi-config
1 System Options
, S1 Wireless LAN
, JP Japan
を選び、SSIDとPSKを入力する。
raspi-config終了時に再起動の確認があるので Yes
を選んで再起動する。
FANがうるさいのでなんとかする
CM4を起動するとFANが回り始めて結構うるさい。
/boot/config.txt
にFANの制御について書かれている(コメントアウトされている)ので、行頭の#
を削除し、tempをFANを回したい温度 (mC°) に設定しておくと、設定温度まではFANは停止していて、設定温度を超えると回るようになる。
試しに下のように50C°に設定してみたところ、起動時はFANは停止していて、ヒートシンクを手で触って少し熱いと感じるくらいで回るようになった。
[all]
dtoverlay=gpio-fan,gpiopin=13,temp=50000
apt upgradeは自己責任で
セットアップできたのでapt update && apt upgrade
したところ、液晶表示がおかしくなり、起動音が鳴らなくなった。(これがあったのでイメージの再書き込みを実施した)
おまけ
起動するとこんな画面。タッチパネル液晶らしいけどまだ使えていない。使い方はこれから調べてゆく予定。
Pi Zeroにrasberrypi
という名前を使っているので、CM4Stackのホスト名はcm4stack
に変えてみた。その下の0.0.0.0
の部分はイーサネット (eth0) のIPアドレスが表示されるみたい。
Discussion