tsutsuiの作業記録置き場

NetBSDとかPC-6001とかの作業記録のうち、Twitterの140字では収まらない内容や記事としてまとめるべき内容をとりあえず置いてみる予定

Raspberry Pi 3 + NetBSD/evbarm で RaSCSI

RaSCSI version 1.34

4/26 にリリースされた RaSCSI version 1.34 では NetBSD対応パッチがマージされました。
2019/2/13追記: RaSCSI のページが http://retropc.net/gimons/rascsi/ に移転したのでリンク更新しました

実は去年の 6月ぐらいに Raspberry Pi 3 MODEL B を買ってからずっと放置していたのですが、NetBSD対応が入ったということで GW中の課題として試してみました。

結論からいうと NetBSD/evbarm 上でもあっさり動きました。

手順まとめ

手順としては以下(わざわざ NetBSD で動かそうと思うようなある程度わかっている人向け)

  • どうにかして Raspberry PiNetBSD/evbarm が起動するSDカードを用意する
     えびじゅんさんのSDイメージを使うのがとりあえず簡単です
  • カーネルコンフィグに options INSECURE を追加してカーネルを作り直す
  • options INSECURE 付きで作り直したカーネルで再起動
    起動用DOSパーティションに .bin なカーネルを入れるとか手順がありますがそのへんは別途
  • RaSCSI version 1.34 をダウンロードして展開
    標準の /usr/bin/unzip でも解凍可能
  • rascsi134/doc/rascsi.txt の説明をちゃんと読む
  • 使用する接続方法(直結 or 各種変換基板)に合わせて rascsi134/src/raspberrypi/gpiobus.h の「接続方法定義の選択」のコメントアウトを適宜修正
  • make によりビルド
  • 生ディスクイメージを拡張子 .hds で用意
  • ./rascsi -id0 [ディスクイメージファイル].hds で起動

options INSECURE

options INSECURE が必要というのは @LabDrunker さんの情報です。

options INSECURE が無いカーネル (NetBSD/evbarm のデフォルトではついていない) で rascsi を起動すると以下のように怒られます。

Error : Initializing

options INSECURE が指定されると、カーネルとしてはグローバル変数 securelevel の値が変化します。securelevel の値とデバイスアクセス関連については src/sys/secmodel/securelevel/secmodel_securelevel.c あたりのコードを参照してください(手抜き)

RaSCSI コマンド起動オプション

デーモン本体として rascsi コマンドと、外部からの制御用の rasctl コマンドとでは SCSI ID指定やイメージファイル指定のオプション体系が異なります。ちゃんとドキュメントを読んでから試さないとオプションを間違えていろいろ怒られることになるので注意しましょう……。

RaSCSI on OMRON LUNA

とりあえずのテストで RaSCSI + GAMERnium版変換基板(初版 GMN-03)を初代LUNAにつないでテストするとこれもあっさり動きました。

SCSI mode selece コマンド

初代LUNAのブートPROM(というか、内蔵のファームウェア)は SCSI起動時に mode select コマンドを発行するのですが、よくある IDE-SCSI 変換内蔵の HDDではこの mode select コマンドをサポートしておらず、結果として初代LUNAでは起動できない、という問題がありました。

一方、 RaSCSI はちゃんと mode select コマンドにも対応しているようで、 LUNAのファームウェアからの起動も問題なく可能でした。

rascsi-DDISK_LOG のオプション付きでビルドすると、ホスト側から飛んできた SCSIコマンドのログが一通り表示されるようになります。なので、「謎マシンが謎コマンドを送ってくる!」という場合も RaSCSI があれば調査可能です。

LUNA のブートPROM の "x" コマンドでブートローダーを読み出した時に飛んできたコマンドの RaSCSI のログ出力はこんな感じです。

SCSI Target Emulator RaSCSI(*^..^*) version 1.34
Powered by XM6 TypeG Technology / Copyright (C) 2016-2018 GIMONS
Connect type : GAMERnium.com version
Peripheral address : 0x3f000000

---+------+---------------------------------------
ID | TYPE | DEVICE STATUS
---+------+---------------------------------------
5 | SCHD | DK312-1-BSD.hds
---+------+---------------------------------------
セレクションフェーズ ID=5 (デバイスあり)
コマンドフェーズ
コマンド $00
コマンド $00
コマンド $00
コマンド $00
コマンド $00
コマンド $00
実行フェーズ コマンド$00
TEST UNIT READYコマンド
ステータスフェーズ
メッセージインフェーズ
バスフリーフェーズ
セレクションフェーズ ID=5 (デバイスあり)
コマンドフェーズ
コマンド $12
コマンド $00
コマンド $00
コマンド $00
コマンド $24
コマンド $00
実行フェーズ コマンド$12
INQUIRYコマンド
データインフェーズ
ステータスフェーズ
メッセージインフェーズ
バスフリーフェーズ
セレクションフェーズ ID=5 (デバイスあり)
コマンドフェーズ
コマンド $15
コマンド $00
コマンド $00
コマンド $00
コマンド $0C
コマンド $00
実行フェーズ コマンド$15
MODE SELECTコマンド
データアウトフェーズ
ステータスフェーズ
メッセージインフェーズ
バスフリーフェーズ
セレクションフェーズ ID=5 (デバイスあり)
コマンドフェーズ
コマンド $08
コマンド $00
コマンド $00
コマンド $00
コマンド $01
コマンド $00
実行フェーズ コマンド$08
READ(6)コマンド レコード=000000 ブロック=1
データインフェーズ
ステータスフェーズ
メッセージインフェーズ
バスフリーフェーズ
セレクションフェーズ ID=5 (デバイスあり)
コマンドフェーズ
コマンド $08
コマンド $00
コマンド $00
コマンド $10
コマンド $03
コマンド $00
実行フェーズ コマンド$08
READ(6)コマンド レコード=000010 ブロック=3
データインフェーズ
ステータスフェーズ
メッセージインフェーズ
バスフリーフェーズ

[... 以下 READ(6)コマンドの繰り返し ...]

おまけ

ちなみに、イニシエータモードが無い変換基板であっても、USB-SCSI 変換があれば実HDDからイメージ吸い出しも RPI 上で完結できますが、今となっては実HDD並みに入手が難しいかも。

なお、USB-SCSI変換の SCSI側を RaSCSIにつないで USB側を Raspberry Pi 自身につなぐという哲学的な操作も特に問題なく動くようです。



なお、GAMERnium版の変換基板の場合は TERM POWER は供給されない (パターンはあるが FUSEダイオードが実装されていない) ようなので、 USB-SCSI変換を使用する場合は TERM POWER 用の 5V電源をつないでやる必要があります。

あいぼむ版の変換基板では TERM POWER 用の部品も実装されていて TERM POWER ON/OFF のスイッチもついていますが、ラズパイの 5V電源容量的には外から 5V供給したほうがよいかも? (あいぼむ版の細かい動作については未確認です)

おまけ 2

LUNA の SCSIチップは実は富士通SPC (MB89352) で X680x0 と同じです。なので、テストとしてはあまりうれしくないかな、ということで SPARCstation20 (SCSI チップは NCR53C94系) でもざっとテストしてみました。が、こちらは問題ありのようでした。

このあたりはまたぼちぼち調べたいと思います。