NetBSD
x68k
NetBSDDay 14

RaSCSI のEtherNetをNetBSD/X68kでつかえるようにしてみた。

はじめに

この記事は一応かいてみましたというものです。で、こんなことをしました、という、メモみたいなものになります。
ちなみに、最終結果のソースはこちら(Github)になります。

RaSCSIについて

RaSCSIとは、ここ(Geocities)で紹介されている「RaspberryPIをSCSIデバイスにしてしまう」というものです。作者は GIMONSさんです。自分が最初にこれを見たときは、なんて面白いんだ! とおもいました。古いPCやWSには、外部記憶装置を接続するインタフェースとして、SCSI(Wikiペディア)というインタフェースが付いていました。そのインタフェースにつながるデバイスを、RaspPIのGPIOで実現する、というものです。ここでエミュレーションを行うのは主にSCSIディスクとSCSI-CDROMになります。

RaSEtherについて

RaSCSIには、最初に述べたSCSIディスクやCDROMデバイスをエミュレーションする機能の他に、SCSI接続のイーサネットをエミュレーションする機能もあります。これを使うと、イーサネットのないPCにも、SCSI経由でイーサネットをつけることができます。

X68000/X68030について

X68000/X68030は、はるか昔のPCです。最初の機種は30年以上前に発売されたました。(Wikiペディア)。自分は古い人間ですので、強いあこがれがありました。今は、このシリーズの最終機種であるX68030と、要修理となるX68000ACE-HDを持っています。もちろん、今のPCと比べると、性能はとんでもなく低いです。(メモリが12MB! までしか増やせられない) しかし、X68030環境でCPUを交換すると、NetBSDが動作します。 しかし、NetBSDが動作するにもかかわらず、X68000/X68030のネットワーク環境は弱いものでした。この機種が発売された当時は、イーサネットはとても高価なインタフェースでしたし、X68000もネットワーク接続は昔のシリアルポートだけしか考慮されてないものでした。そして、ネットワークインタフェースは今では入手困難となっています。

X68000/X68030のネットワーク参加

ということで、X680x0をネットワークに参加させるには、ちょっと苦労します。ハードもない、ソフトも、、、しかし、そんな中で、RaSCSIが登場し、ネットワーク参加がやりやすくなりました。とはいっても、ドライバはHuman68Kのみ。 じゃぁ、、NetBSDで参加しようではないか、ということで、かいてみることにしました。

元ネタドライバ探し

ドライバを書くといっても、さすがに0から作る実力はありません。ですので、使えそうなドライバをNetBSDのソースからさがしてみました。 で、みつけたのがif-se.c。これは「Cabletron EA41x scsi ethernet adaptor.」というSCSI接続のイーサネットアダプタ用のドライバです。 SCSI接続のイーサネットアダプタということで、ではこれをちょこっといじればできるかなぁ、、とおもったのですが、ことはさすがに簡単ではありませんでした。

どうやって認識するの?

デバイスドライバである以上、最初のハードルは「認識する」ということになります。SCSIデバイスでは、接続する、という動作で認識します。そのとき、SCSIのホスト側(この場合はX68030本体)は「△△という名前のデバイスありますか?」と質問し、それぞれのデバイスは「自分は○○である」ということを SCSIホストに返します。それによって、ホスト側はデバイスが接続されていることを認識します。ということで、RaSCSIでイーサネットがどのように返事をしているかをRaSCSIのソースから見てみました。そして、それをもとにデバイスドライバの名前の部分を書き換えました。その結果、まずは、dmesgにあらわれるようになりました。

認識したらつぎは初期化だよね?

さて、認識はしました。次は、初期化ということになります。初期化は、これまた一筋縄ではいかないものでした。attach()で行うのですが、最初のうちはなにをどうすればいいのかさっぱり、でした。が、ソースを何度もよんで、なにしてるかなぁ、というのがなんとなくわかってきた気がしました。具体的にしてたのはこんなことでした。
 1.ベースドライバへの登録。ようするに、親玉に「自分はこれこれこういう者です」と名乗ることです。
 2.デバイスの初期化。RaSCSIは、エミュレータといえど、ホストから見たら実際のデバイスですので、初期化する必要があります。SCSIデバイスなので、SCSIコマンドで初期化します。
 3.作業領域の確保と情報の取得。デバイス用のバッファとかを確保し、デバイスの情報、ここではMACアドレスを取得します。
 4.上位への登録。上位ドライバに自分を登録します。

さて、データのやりとりはどうするの?

初期化はできました。次は、データのやり取りです。今回のSCSIデバイスは、一定時間ごとにポーリングするような動きになっています。で、データがあったらとってくる。ということを繰り返します。データのやりとりの仕方はSCSIデバイスのお作法に従うようにしています。

ということでつくってみました。。。実用性という意味では、じつは「X68030が遅すぎて」あまりないかもしれませんが、デバイスドライバをでっちあげるというのはいい経験になったと思います。
ちなみに、NetBSDでつくってる、ということでハードウエア独立で作っています。なので、 X680x0以外でもうごく、、、、かもしれません。たぶん。 でも、 X680x0以外のNetBSDが動くマシンで、 SCSIはあるけどイーサネットはない、というマシンはたぶんないと思います。

さいごに

自分のX68030には、040turboがつんであります。ですので、実際の動作は、040turbo上でおこないました。しかし、040turboは、「メモリを増設できない」という問題があります。ですので、「メモリが増設できる」060Turboがほしかったりもします。しかし、たまにヤフオクとかででると、それこそ、「Xeonマシンがかえるような」値段になったりします。
あと、X68000の筐体だけ、というのがあるので、その中に異機種改造で、Ryzenか、XeonDを入れたマシンを作りたいなぁ、とも思っています。しかし、まずは先立つものが、、です。