POWERボタンを使ったシャットダウン

製品ではPOWERボタンの長押しでシャットダウンできるが、いまのところまでの環境ではシェルからshutdownコマンドを発行する必要がある。これは不便なので何とかしたい。
基板上には、R8マイコンがあり、これがボタンやLEDなどの外部IOを握っているようだ。CPUとの通信はシリアルだろうか?特に変わったバスを使うドライバはなさそう。
ボタンなどを押してみると、制御ソフトがなにもなくても音が出たりLEDが変化したりしている。R8では割り込みがあるとブザーやLEDなどにプリセットされた処理を自動で行っているのだろう。
ソフト面では、"/usr/local/sbin/R8contd"にR8への割り込み監視用のデーモンがある。名前からしても、これが割り込みを検知しているのだろう。
R8contdは、その結果に応じて引数を付けて"/usr/local/bin/R8event"を呼び出している。呼び出しプログラムのパスはR8contdの中でハードコードされているようだ。R8eventは単純なシェルスクリプトになっている。中を読めば引数と機能の推測はできるが、可能なものは実際に動きを見ておきたい。
R8contdについては、今回はバイナリを流用することにして、"/usr/local/sbin/R8contd"をユーザーランドにコピーし、デーモンを起動した。

# /usr/local/sbin/R8contd

新しくR8eventファイルを作っておく。

# vi /usr/local/bin/R8event
	#!/bin/sh
	# /usr/local/bin/R8event
	echo $1 > /dev/pts/0

これで、イベントが出来ると、R8contdが付けた引数がリモートログインした端末に表示される。
結果、以下のことがわかった。

P: POWERボタン長押し。1sec以上かな。同時にピット鳴り、STATUS LEDが緑点滅。
C: COPY ボタン長押し。1sec以上かな。同時にピット鳴り、STATUS LEDが緑点滅。
R: RESETボタン長押し。1sec以上かな。同時にピット鳴り、STATUS LEDが緑点滅。
w: DRIVE0 ボタン外し。
W: DRIVE0 ボタン押し。同時にDRIVE0 LEDが青点滅。
x: DRIVE1 ボタン外し。
X: DRIVE1 ボタン押し。同時にDRIVE1 LEDが青点滅。
y: DRIVE2 ボタン外し。
Y: DRIVE2 ボタン押し。同時にDRIVE2 LEDが青点滅。
z: DRIVE3 ボタン外し。
Z: DRIVE3 ボタン押し。同時にDRIVE3 LEDが青点滅。
F: RAID ファン停止。4sec以上かな。同時に長くピーッ・ピーッ、と鳴り、STATUS LEDが赤点滅。
T: 未確認。たぶん基板上の温度センサで閾値を超えると出る。反応はFANと同じではないか。

ファンの停止は、指を突っ込むのは危険なのでやらないこと。内側からベイにドライブがない状態だとスピンドル部に触れることができるので、ここを指でさわることで回転数を制御できる。回転数を半速くらいにしても特にエラーは出なかった。速度低下はソフトのほうでやる必要があるようだ。
手元にドライヤーがなかったので、温度センサでの出力は未確認。


R8eventを以下のように変更しておくと、ボタンの長押しでシャットダウンが可能になった。

#!/bin/sh
#
case $1 in
        P)
            /sbin/shutdown -h now
        ;;
        *)
            /bin/echo $1 > /dev/pts/0
        ;;
esac


R8contdはバイナリであるので、これを自由に使うには代替物の作成が必要になる。

# ls -al /usr/local/sbin/R8contd
-rwxr-xr-x  1 root staff 12544 Apr 25 14:33 /usr/local/sbin/R8contd

小さなプログラムなので、シリアル通信とデーモン化くらいでほとんどではないかと思う。誰かクローンを作らないだろうか。
シリアル通信だとすれば、ttyS0がシリアルコンソールなので、ttyS1あたりが怪しいところだ。