Raspberry Pi + NetBSD + RaSCSI 関連エントリ
- Raspberry Pi 3 + NetBSD/evbarm で RaSCSI
- NetBSD + RaspberryPi を動かしてみたメモ
- RaSCSI NetBSD用カーネルドライバ
- NetBSD + RaspberryPi + RaSCSI 補足メモ
Raspberry Pi Zero + NetBSD + RaSCSI
Raspberry Pi 3 + NetBSD/evbarm で RaSCSI のエントリで Raspberry Pi 3 Model B と NetBSD/evbarm の組み合わせで RaSCSI を動かす記事を書きましたが、今度は Raspberry Pi Zero + NetBSD/evbarm + RaSCSI を試してみた、というメモです。
発端
RaSCSI + RPI3B はどちらもかなり発熱するので、電源容量も合わせて考えると RPI Zero で動かしたほうが楽なのかもしれない
— Izumi Tsutsui (@tsutsuii) 2018年5月1日
発熱と電源の問題も気になっていたのですが、 Raspberry Pi 3B で pkgsrc のパッケージバイナリビルドをしていると RaSCSI の検証ができない、という問題もあり、せっかくだからと Amazon お急ぎ便で Raspberry Pi Zero WH のセットをポチりました。
RaSCSI テスト用に 雑に Raspberry Pi Zero WH をポチった(軟弱に KSYの Amazon お急ぎ便) https://t.co/6Vk7hsQdoa
— Izumi Tsutsui (@tsutsuii) 2018年5月11日
Zero だと ARMv6 なんですね
Raspberry Pi Zero と NetBSD
そもそも NetBSD/evbarm 8.0_RC1 は Raspberry Pi Zero WH で起動するのかという問題。-current は大丈夫そうな気がするけど
— Izumi Tsutsui (@tsutsuii) 2018年5月11日
とりあえずポチったものの、その時点では Raspberry Pi Zero が NetBSD 8.0_RC1 で起動するのかどうかは確認できていませんでした。
なお、えびじゅんさんが作成されている -current の Raspberry Pi用イメージでは Zero での動作確認もされています。
"RPI0W initial support" https://t.co/C3KuFLh6fn
— Izumi Tsutsui (@tsutsuii) 2018年5月11日
これは FDT サポートがある -current でないとダメということなのか -current だと FDT依存というだけで netbsd-8 系でも基本的なデバイスは認識するということなのか
上記の通りえびじゅんさんのイメージでは Zero W のサポートも入っているのですが、大きな違いとして -current では FDT (Flat Device Tree) の対応が Raspberry Pi にも追加されており、 Zero 用の FDT定義の .dts
ファイルが必要だったりするようです。
本来は -current でテストしたほうがカーネル的にはスムーズだったかもしれませんが、今回の NetBSD + RaSCSI のテストではカーネルモジュールの関連でカーネルのバージョンをある程度固定させたかったので、あえて 8.0_RC1 でテストしています。
Raspberry Pi Zero 無印と W の違いは無線LAN関連らしいというのは聞いていて、とりあえず RaSCSI には無線LANは直接必要ないので問題ないであろうと判断していました。 W と WH の違いというのもよく把握していなかったのですが、
Raspberry Pi Zero W と WH の違いも調べていない(手抜き)
— Izumi Tsutsui (@tsutsuii) 2018年5月11日
単に GPIO の 40ピンのピンヘッダが予めはんだ付けされているかどうかの違い、ということでした。急ぐなら WH を買っとけというところですね。
Raspberry Pi 3 vs Raspberry Pi Zero
Amazon の Raspberry Pi Zero WH セットのページ の説明にあるとおり、 Zero の CPUは ARMv6 ということなので初代 Raspberry Pi と同じということになります。同じ CPUというか同じ SoCなら基本的なデバイスはどちらも同じはずで、初代用の RPIで起動するのではないかという予想はありました。
たとえば、初代および Zero の BCM2835 と RPI2,3 の BCM2836 ではデバイスのアドレス配置が src/sys/arch/arm/broadcom/bcm2835reg.h
に定義されているように異なります。これは RaSCSI の NetBSD対応時にも課題として挙がっており、現状は sysctl(3)
関数で CPU種別を見てアドレスを切り替える処理が入っています。
RaSCSI には直接関係ないけど Raspberry Pi の GPIO レジスタ関連メモ:
— Izumi Tsutsui (@tsutsuii) 2018年5月12日
BCM2835 (RPI0,1) と BCM2836 (RPI2,3) とでは SoC のペリフェラル(内蔵デバイス)のアドレスが異なる
https://t.co/XYh72BaD6B
#define BCM2836_PERIPHERALS_BASE 0x3f000000
#define BCM2835_PERIPHERALS_BASE 0x20000000
オリジナルの raspbian 等ではほかに何か知見がないだろうか、ということでマストドンでそれっぽくつぶやいてみたところ、
Izumi Tsutsui @tsutsuii
ラズパイ3Bで一通り動かしてみた後にラズパイ0をいじる時にハマりポイントってあるんですかね。ARMv7とARMv6の違いとか消費電流とかコネクタの違いとかはわかっているつもりだけれど
2018年5月12日 13:59
あっきぃさんから以下の反応をいただきました。
あっきぃ @akkiesoft遅いってだけですかね
2018年5月12日 13:59
あっきぃ @akkiesoftZeroでOTGモード有効にすると、USB-Ethernetデバイスに見せられるように鳴ったりしますが、その状態で3Bに持ってくとUSBとLANが使えなくてテンパる(設定をキレば使えるようになる)。
2018年5月12日 14:01
OTGモードについてググって調べてみると、とりあえず以下の Qiita の @chromabox さんのページの説明がわかりやすい感じでした。
要は、以下のような感じだと思います。
- ラズパイ側のカーネルのドライバに細工してラズパイ側のUSBを相手側から USB-Ethernet に見せかけるようにしてデバッグをする手法
- Zero は本体上に Ethernet が無いのでデフォルトでそういう手段が提供されている?
- NetBSDだとそんなものはサポートしていないので cmdline.txt でパラメータを渡されるカーネル側はあまり関係ないはず?
- config.txt の設定で start.elf がデバイスを変に設定するとハマるかもしれない?
とりあえず Linux を起動することもないので OTGに関しては明示的に変更しない限りは問題ないかな、と判断しました。
Raspberry Pi Zero の GPIO
初代 Raspberry Pi と 2以降ではGPIO のピンヘッダのピン数が違う、という話は聞いていたのですが、 Raspberry Pi Zero では GPIOピンヘッダは 2 および 3 と同じ 40ピンになっています。これも何か違いがあったりするのだろうか、と聞いてみると
だんだん引用がめんどくさくなったので 対象トゥートスレッド をスクショ貼り付け
というわけで、GPIO も (すでに対応済みのアドレスの差を除けば) 特に気を使う必要はなさそうでした。
Raspberry Pi Zero + NetBSD + RaSCSI 検証開始
土曜日の深夜というか日曜日の早朝 3:20 にポチってその日の 15時前に届く、というお急ぎ便パワーを存分なく発揮してテストを開始。
Izumi Tsutsui @tsutsuii昨日の深夜にポチった Raspberry Pi Zero WH セット届いた。アマゾンプライム力。
2018年5月12日 14:48
Raspberry Pi Zero WH + NetBSD/evbarm + RaSCSI をテストします pic.twitter.com/aHfUp2M1Z8
— Izumi Tsutsui (@tsutsuii) 2018年5月12日
Raspberry Pi 3 でテストしていた SDにも Raspberry Pi 1用の ARMv6 のカーネルは入っていたので安直にそれをそのまま起動すると、あっさり起動してきました。
エラーが出ているのは RPI3 で外付けUSBメモリを mount するようにしていた設定が残っていたためです
dmesg はこんな感じです。
NetBSD/evbarm 8.0_RC1 on Raspberry Pi Zero WH 普通に起動します https://t.co/4E4bBv38Av
— Izumi Tsutsui (@tsutsuii) 2018年5月12日
とりあえずでデフォルトの RPI
の GENERIC的カーネルだったため、まずカーネルモジュールロードで以下の問題が発生。
(2) の確認結果:
— Izumi Tsutsui (@tsutsuii) 2018年5月12日
module をロードする場合、マルチユーザー時に modload(8) するためには options INSECURE が必要。起動時に /etc/rc.d/module を使って /etc/modules.conf に記載したモジュールを読むようにすれば options INSECURE は無くてもよい。
が、起動時にカーネルモジュールをロードするようにしても rascsi
コマンドの起動ではエラーに。
うーん。一発動作とはいかず。 pic.twitter.com/9VJysKJyiW
— Izumi Tsutsui (@tsutsuii) 2018年5月12日
要は、カーネルモジュールを使う使わないに関わらず、 /dev/mem
経由での GPIOレジスタ操作は必須で、結果として NetBSD で RaSCSI を使用する場合はカーネルに options INSECURE
の設定はほぼ必須、という結論でした。
カーネルモジュールを使わない場合も mmap(2) するから結局 options INSECURE がないと失敗するということかな
— Izumi Tsutsui (@tsutsuii) 2018年5月12日
options INSECURE をつけたカーネルにすると RPI0 でも rascsi の起動はした。次はターゲットとして動作しているかどうかだけど…… pic.twitter.com/nbaUNYwEa2
— Izumi Tsutsui (@tsutsuii) 2018年5月12日
RaSCSI on Raspberry Pi Zero
NetBSD的に options INSECURE
の問題はあったものの、カーネルを入れ替えると Zero でも RaSCSI はあっさり動作しました。
RaSCSI + Raspberry Pi Zero + NetBSD/evbarm 8.0_RC1 のテスト結果。普通に動いてます。速度の差もわずかなので、組み込むだけなら電源的にも Zero 有利ですね…… pic.twitter.com/4UZY715kem
— Izumi Tsutsui (@tsutsuii) 2018年5月12日
Raspberry Pi 3 Model B での転送速度は 1.6MB/s 弱といったところでしたが、 Zero ではやや下がって 1.4MB/s 程度。ただ、速度的にはこれでも十分だと思います。
Raspberry Pi Zero での留意点
NetBSD 固有の話でもないですが、 Zeroを使う場合の留意点をメモ。
USBインターフェース
んー。 Raspberry Pi Zero 用に USB hub 買わないとキーボードとEthernet同時に使えなくてめんどいな
— Izumi Tsutsui (@tsutsuii) 2018年5月12日
仕様としてわかっている話ですが、Ethernetは USB外付けになるので、HUBがないと Ethernetとコンソールが同時に使えません。また、後述の電源関連その他で Ethernetがトラブるとキーボードを挿し直す必要があったり、トラブった状態でUSBを抜き差しするとカーネルがパニックしたり、といろいろ面倒でした。トラブルを避けるにはセルフパワーなUSBハブをつないだほうが無難かも。
電源容量
Raspberry Pi 3 Model B は 2.1A以上の電源が要求されるのに対し、 Raspberry Pi Zero は 1.0A程度という仕様のようです。が、 RaSCSI の変換アダプタもそれなりに電流を消費するせいなのか、 Androidタブレット付属の 1500mA を謳うアダプタと適当な micro USB ケーブルの組み合わせだといろいろトラブルがありました。
Raspberry Pi Zero でも 1500mA と書いてある怪しい電源アダプタだとこんな感じでSDカードの書き込みエラーがポロポロ出る。外付け USB Ethernetがキツイのかもしれないけど pic.twitter.com/Txxbv29ZnO
— Izumi Tsutsui (@tsutsuii) 2018年5月13日
対策として Owltech の 4口合計 5.1Aのアダプタと ELECOMの 2A対応を謳ったケーブルにしたら USB HUB + Ethernet + USBキーボード + RaSCSI でも明示的なエラーは出なくなった。
— Izumi Tsutsui (@tsutsuii) 2018年5月13日
上記の SD書き込み以外にも、 RaSCSI での書き込みを行うと Ethernet の通信がおかしくなるという事例があったのですが、これは完全には解消しませんでした。これが電源の問題なのかドライバの問題なのかは検証できていませんが、セルフパワーのUSBハブで動作が変わるかまた検証してみようと思います。
まとめ
Raspberry Pi Zero であっても、性能的には RaSCSI の動作に特に支障はないようです。Ethernetなしで SDカード単独で組み込むのであれば Zeroで十分 という気はします。
Ethernet を使う場合は、外付けインターフェースの関係で消費電流的メリットが相殺されてしまう可能性があること、接続する USB NICによってはドライバの安定性から検証する必要があること、キーボード(コンソール)との同時使用ができなくなることなどから、トータルで判断する必要がありそうです。