RaSCSIを応用したUSBメモリアクセス

 GIMONSさんが開発されたRaSCSIにはラズパイのファイルシステムをX68000のドライブとして認識できる機能が あります。これを利用したUSBメモリの読み書きやRaSCSIのCPUであるラズパイの電源管理が簡単にできるようUSB延長器を再改造しまし た。

はじめに

 以下は、RaSCSI導入計画時から、また運用開始して感じた課題です。
  1.  RaSCSIの機能の一つのファイルシステムの見える化を応用して、X68000からのUSBメモリの読み書きを実現したい。
  2.  USBメモリ読み書き前後のマウント・アンマウントが手軽にできるようにしたい。
  3.  自動シャットダウン機構は設けたが、ラズパイの電源の入り切りは必要なので、手が届く所にスイッチがほしい。
  4.  ラズパイの電源を切る前に、シャットダウンが本当に完了したのか、外からわかるようにしたい。
今回は以上の課題解決に向けて、RaSCSIのラズパイ再設定や以前製作したUSB延長器の改造に取り組みました。


設定
 まずは、ラズパイのファイルシステムのX68000からの見える化の設定です。前回同様、以下のHirofumi Iwasakiさん制作のサ イトを参照しながら作業を進めました。 設定要領をまとめていただいたHirofumi Iwasakiさんには改めて感謝いたします。

SCSIデバイス エミュレーターRaSCSIの設定方法

  1. RaSCSIの配布ファイル“bin/x68k/RASDRV.SYS”をラズパイ内の
    "X68SCSI1.HDS"の中(Bドライブ)の“\SYS”にMO経由でコピー
  2. RaSCSIを停止 $  sudo systemctl stop rascsi 
  3. ブリッジデバイスをSCSI ID:6で追加登録
     $ sudo nano /etc/systemd/system/rascsi.service
    [Unit]
    ・・・
    ExecStart=/usr/bin/sudo standard/rascsi -ID1 X68SCSI1.HDS -ID6 BRIDGE
    ・・・
    
  4. UNIXデーモンのリロード $ sudo systemctl daemon-reload
  5. RaSCSIを起動 $  sudo systemctl start rascsi 
  6. X68000のconfig.sysファイルに DEVICE = \SYS\RASDRV.SYS
    を追加して再起動
  7. DIR F: でラズパイのファイルシステムが見えることを確認
X68000にて DIR F: の実行画面

 次はUSBメモリの自動マウントです。

  1. usbmountをインストール。 $ sudo apt-get install usbmount
  2. ファイル /lib/systemd/system/systemd-udevd.service の書き換え。
     MountFlags=slave → shared

 これで、ラズパイのUSB端子に接続したUSBメモリへのアクセスができました(USB端子がマイクロですので標準への変換が必要ですが) 。USBメモリは ラズパイの/media/usb0に自動的にマウントされ、アンマウントはWifi接続された他のPCのSSHクライアントからumountコマンドを 送出することで指示できます。以下はその様子をX68000側から見た様子です。

USBメモリ自動マウント後
ラズパイにて umount /media/usb0 実行後

 もちろん、X68000側からのUSBメモリへのコピーやED.XによるUSBメモリ上のファイルの編集もできました。ただ、やはりSSHでの アンマウントは面倒なので、次節のように、LED付き押しボタンスイッチを使ってマウント状態の表示とマウント解除指示ができるよう にしました。

USB延長器の再改造

 タワー間の隙間に設置していたUSB延長器(元はエレコムのセルフパワーUSBハブ)を以下のように再改造しました。

  1. ラズパイのマイクロUSB端子から延長器のUSBコネクタの一つの裏側へ接続し、ラズパイ専用USB端子とする(Nereid用USB端子は 位置を変えて存続)。

  2. 接触・接続不良を起こしていた電源スイッチやACアダプタのソケットを交換するとともに、給電用USBケーブルをRaSCSIに接続し、セルフパワー延長器をラズパイ の電源パネルとする(ACアダプタは従来どおり、向かって左側タワーの背面コンセントに設置)。

  3. 丸穴をあけて、LED付きタクトスイッチを取り付け、プルアップ抵抗、LED保護抵抗と共に、上記給電用USBケーブルの電源以外の芯線(緑と白)と細工したRaSCSIの4P電源コネクタを通してラズパイのGPIOに追加接続する。


 下図が再改造をした延長器の様子と使用したLED付きタクトスイッチ、および最終的なGPIO廻りの追加配線図です。LEDの色は迷いましたが、最終的にラズパイのACTランプに合わせて緑色とし、保護抵抗を大きくして少し暗めにしました。



USBケーブルの1本はNereid接続用、もう1本はラズパイ接続用。
パネル上部(写真では左側)の端子には給電用USBケーブルを接続

抵抗器を追加しACアダプタソケットを変更、
タクトSWは上部USB端子の背面に取り付け


延長器上部コネクタ接続の給電用USBケーブル内
芯線を使い、電源とSW,LEDを4Pコネクタに接続
(4Pコネクタ左2つ目の金具は基板から切り離し)


マウント制御

 とりあえず、USBメモリのマウント制御をUSB延長器で行えるよう、新たにシェルスクリプト usb_mount_ctrl.sh を作成 し、/etc/rc.local に登録してみました。以下は作成したスクリプトとUSBメモリの操作要領です。

#!/bin/sh
echo "6" > /sys/class/gpio/unexport
echo "6" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio6/direction

echo "8" > /sys/class/gpio/unexport
echo "8" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio8/direction

while :
do
  sleep 0.5s

  if df | grep "/media/usb0" ; then
    echo "out" > /sys/class/gpio/gpio8/direction
    echo "0" > /sys/class/gpio/gpio8/value  # "点灯"
    sw=$(/bin/cat /sys/class/gpio/gpio6/value)
    if [ $sw = 0 ]; then
      umount /media/usb*
    fi
  else
    echo "1" > /sys/class/gpio/gpio8/value  # "消灯"
  fi
done
USBメモリの操作要領
  1. USBメモリを延長器のラズパイ専用USB端子に挿入する。

  2. 自動的にUSBメモリがマウントされ、マウント中を示す緑LEDが点灯する。

  3. X68000のキーボード指示でUSBメモリの読み書きを行う。

  4. 読み書き終了後、LEDのタクトスイッチを1秒程度押す。

  5. スクリプトによりUSBメモリのアンマウントが行われ、緑LEDが消灯する。

  6. USBメモリを延長器から抜く。
 
 (補足) 一見無駄のように感じますが、シェルスクリプト 中のループの中でGPIO8の「out」への方向設定を点灯直前に毎回行うようにしています。GPIO8はRaSCSIのターゲットモードでは未使用 のはずですが、なぜか時々、特にあらかじめRaSCSIを起動・待機状態にしておいて、X68000の電源を入れHuman68kを起動した際は必ず「 in」に変わっていましたので、対処療法として入れました。ちなみにGPIO9に変えても症状は同じでした。RaSCSIのドライバが何かやっているのでしょう か・・・。


ラズパイのACTランプの見える化

 さて、設定の最終として、ラズパイshutdown動作の見える化機能の追加です。ラズパイは起動時やシャットダウン時にマイクロSDの アクセスに合わせてACTランプが点滅します。これを見てラズパイが起動しているか、シャットダウンが完了したか知ることができます が、その点滅をX68000の筐体の外からでも見えるようにマウント用の緑LEDに反映することにしました。

 最初はラズパイのACTランプからリード線を延ばして信号を取り、RaSCSIの74LS641の未使用オープンコレクタ出力バッファでマウント 制御の回路とワイヤードOR接続しようと考えました。しかし、加工の際にリード線を引っ張ってACT用LEDがラズパイZEROの基板からランドごと はがれてしまうトラブルがあり、この件、一時はあきらめようかと思いました。その後、ネットでACTランプの動作をGPIOの指定端子に割り 当てる方法があることを知りました。具体的には、ラズパイの /boot/config.txt で

dtparam=act_led_gpio=8

のように、GPIO番号を指定して再起動すれば、そのGPIOに繋いだLEDは全くACTランプと同じ動作をします。また、

echo none > /sys/class/leds/led0/trigger

のように、triggerファイルに指示(triggerは単なるテキストファイルでなく、メニュー選択構造となっている)すれば、SDカードアク セスによる点滅は止まり、あとは、
echo "1" > /sys/class/leds/led0/brightness

の要領で指示すれば、そのLEDを点灯・消灯制御できるので、これを利用することにし、最終的に、マウント制御、自動シャットダウン の動作を統合した以下のようなスクリプト mount_shut.sh を作り、/etc/rc.local に登録し直しました。また、これにより、先の空き GPIOの方向設定が勝手に変わる問題も回避できました。

 mount_shut.sh
#!/bin/sh
echo "6" > /sys/class/gpio/unexport
echo "6" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio6/direction

echo "7" > /sys/class/gpio/unexport
echo "7" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio7/direction

sleep 20s  # 

while :
do
X68Vcc1=$(/bin/cat /sys/class/gpio/gpio7/value)
if [ $X68Vcc1 = 1 ]; then  # X68 ON
  break
fi
done

echo none > /sys/class/leds/led0/trigger # 点滅等なしにする

while :
do
  sleep 0.5s

  if df | grep "/media/usb0" ; then
    echo "0" > /sys/class/leds/led0/brightness  # 点灯
    sw=$(/bin/cat /sys/class/gpio/gpio6/value)
    if [ $sw = 0 ]; then
      umount /media/usb*
    fi
  else
    echo "1" > /sys/class/leds/led0/brightness  # 消灯
  fi

  X68Vcc1=$(/bin/cat /sys/class/gpio/gpio7/value) 
  if [ $X68Vcc1 = 0 ]; then  # X68 OFF
      break;    
  fi
done

echo mmc0 > /sys/class/leds/led0/trigger  # SDアクセス点滅に戻す
/sbin/shutdown -h now


 これで、緑LEDはRaSCSIの起動時、終了時には点滅を、X68000使用時にはUSBメモリのマウント済み表示をするようになりました。



 メモリカード

 最後に、試しにラズパイ延長USB端子にメモリカードリーダを接続し、他のラズパイ用マイクロSDカードを挿入してみました。以下が その 様子です。同時に2つのパーティションがマウントされ、F:\media\usb0でFAT16のパーティンション、F:\media\usb1でLinuxのEXTパーティションが読み取れました。

メモリカードリーダの接続 FAT16パーティション EXTパーティション

 さらに、試したところ、手持ちのWindowsでフォーマットしたSDカードやCF(コンパクトフラッシュ)にも読み書きができました。X68000起動用CFはさすがにNGでした。

おわりに

 今回の改造では、延長器の加工中の交換用電源スイッチの損傷、ACアダプタソケット破損、半田付けしたUSBケーブルのねじれによる芯線切れ、ラズパイのACT_LED剥離や果ては予備のラズパイZEROを通電中のRaSCSIコネクタに抜き差しして飛ばしたりとトラブル続きでした。ラズパイのGPIOの方向設定のふらつき問題にも惑わされ、完成まで思いの外時間がかかりましたが、最終的にはUSBメモリだけでなくSDを初めとするメモリカードの読み書きもできるようになりました。

 実は、RaSCSI設置の本当の目的はこのUSB接続メモリの読み書きであり、長年の願いがRaSCSIで成就しました。RaSCSIとともに久しぶりの改造でしたが、うまく動作したときの感動は忘れません。改めて開発者GIMONSさんに感謝します。さて、次はやはりGIMONSさんが開発されたFDX68に挑みます。まだ、キット基板を入手したばかりですので時間はかかりますが、レポートを乞うご期待。


改造にあたり、とても参考になったサイト

Raspberry PiでUSBメモリを自動マウント
Raspberry Piの基板上のLEDを別の用途に使う
Raspberry Pi 3 Model Bの本体に付いて いるLEDの点滅を自在に操作する