Renesas R8C/25シリーズ R5F21258SNXXXFP
64
KiB1
KiB x23
KiBI-O DATA LAN DISKシリーズ用としてカスタマイズされたファームウェアで搭載しているもの
電源管理
ボタン
LED
温度センサ
ファンコントローラ
ビープスピーカー
LAN DISKシリーズに搭載されるR8Cマイコンとは、UARTを介してテキストベースでのコマンド操作を行う。
プレフィクス | 種類 | 備考 |
---|---|---|
: |
送信コマンド (SoC -> R8C) |
SoC側 (OS)からR8Cマイコンに送信するコマンドの先頭に付加するプレフィクス。 |
; |
応答データ (R8C -> SoC) |
R8C側からSoC (OS)へ送信される受信データの先頭に付加されるプレフィクス。 上記送信コマンドへの返答に使用される。 |
@ |
イベントコード (R8C -> SoC) |
ボタン入力や温度異常等のイベント発生時に、自動的にR8C側からSoC (OS)へ送信されるコードの先頭に付加されるプレフィクス。 |
コード | 概要 | 備考 |
---|---|---|
P /p |
電源ボタン押下(大文字)/解放(小文字)検出 | 電源ボタンが押下または解放されたときに発行される |
R /r |
リセットボタン押下(大文字)/解放(小文字)検出 | リセットボタンが押下または解放されたときに発行される |
T |
温度異常検出 | R8Cに設定された閾値を現在の温度が上回った場合に発行される |
F |
ファン異常検出 | R8Cによって制御されるファンが切断されるなどの異常時に発行される |
操作 | フォーマット | 概要 |
---|---|---|
read | :<command> (一部): :<command> <param> |
プレフィクスとコマンド文字列のみを送信する。末尾はスペースを入れるとR8C側でコマンド解釈に失敗する為、付けないようにするintrp など一部コマンドは引数を付けるものもある |
write | :<command> <value> (一部) :<command> <param> <value> |
プレフィクスと値を送信する。thset など一部コマンドは2番目に引数を必要とするものがある |
上記2.1.2 メッセージ送信に対する応答
;<response>
57600
bps8
no
1
no
I-O DATA HDL-A/HDL2-Aに於いて、R8CマイコンはMarvell 88F6282 SoCの持つUARTのうち、2番目 (ttyS1)に接続されている。マイコンを使用するには、SoC側UARTを上記3.1の通りに構成することで、通信が可能となる。
例 (stty):
root@OpenWrt:/# stty -F /dev/ttyS1
speed 9600 baud; line = 0;
-brkint -imaxbel
root@OpenWrt:/# stty -F /dev/ttyS1 57600 # baudrate設定(他はデフォルトのまま)
root@OpenWrt:/# echo ":sts on" > /dev/ttyS1 # STATUS LED点灯(点滅停止)
root@OpenWrt:/# echo ":mml a" > /dev/ttyS1 # ブザー単音
root@OpenWrt:/# echo ":hdd 0 5" > /dev/ttyS1 # HDD1 赤点灯
操作 | コマンド | 戻り値 | 概要 |
---|---|---|---|
write | :poweroff |
(無し) | 即時にSoC (88F6282) をRESET状態にし、本体の電源ボタン押下を待ち受ける |
コマンド発行から実際にSoCがRESETに入るまでにわずかな時間があるようで、Linux Kernelの power_off_handler
として実行した場合、/kernel/reboot.c 内の SYSCALL_DEFINE4(reboot,...)
から do_kernel_poweroff()
でハンドラが呼ばれた後に do_exit()
に落ちてしまい、コアダンプが表示されるなどしてしまう。
R8Cにコマンド発行後、 NOTIFY_*
を返す前に多少のsleepを入れることで、これを回避できる。
操作 | コマンド | 戻り値 | 概要 |
---|---|---|---|
write | :reset |
(無し) | 即時にSoC (88F6282) をRESET状態にして続け様に脱し、ブートを開始する |
Linux Kernelの restart_handler
として実行する場合、単に上記コマンドを発行するだけでは何故か機能せず、 :sts
など適当なコマンドを先にワークアラウンドとして発行することで対処した。
操作 | コマンド | 戻り値 | 概要 |
---|---|---|---|
read | :wol_flag |
0 (無効)/1 (有効) |
現在のWoLの状態を取得する |
write | :wol_flag <set|remove> |
0 (成功)/1 (失敗) |
WoLの有効(set )/無効(remove )を設定する |
このコマンドで設定できるのはあくまでR8Cマイコン側における割り込み入力受信時の挙動だけであり、Ethernet PHY側で別途Magic Packet受信時に割り込みを発行するよう構成する必要がある。
このコマンドとは別に :wol
コマンドも存在するものの、常に w
(小文字)を返していて詳細不明。割り込み入力受信時に大文字が返る?
操作 | コマンド | 戻り値 | 概要 |
---|---|---|---|
read | :alarm |
a (未検出)/A (検出) |
RTC Alarmの受信状態を取得する |
RTC Alarmによる自動起動はデフォルトで有効になっており、有効/無効を操作できるコマンドは恐らく無し。
操作 | コマンド | 戻り値 | 概要 |
---|---|---|---|
read | :intrp 3 |
0 (無効)/1 (有効) |
現在のAC自動起動設定を取得する |
write | :intrp 3 <0|1> |
0 (成功)/1 (失敗) |
AC自動起動設定の有効(1 )/無効(0 )を設定する |
操作 | コマンド | 戻り値 | 概要 |
---|---|---|---|
read | :intrp |
0 : "POWER" ボタン1 : RTC Alarm2 : WoL4 : AC接続 |
システムが起動された理由を取得する |
システム再起動時(:reset
発行)は起動理由は保持され、再度電源OFF(:poweroff
発行)から起動されるまで変更されない
操作 | コマンド | 戻り値 | 概要 |
---|---|---|---|
read | :first |
0 (非該当)/1 (該当) |
現在がAC接続後最初に起動されたものであるかどうかを取得する |
操作 | コマンド | 戻り値 | 概要 |
---|---|---|---|
read | :btn |
crpwxyz |
現在のボタンの状況を取得する。1文字が1つのキーに対応しており、小文字は解放状態、大文字は押下状態を示す。c : "FUNC." ボタン(HDL-A/HDL2-A非搭載)r : "RESET" ボタンp : "POWER" ボタンw : HDD1検出(HDL-A/HDL2-A非搭載)x : HDD2検出(HDL-A/HDL2-A非搭載)y : HDD3検出(HDL-A/HDL2-A非搭載)z : HDD4検出(HDL-A/HDL2-A非搭載) |
イベントコードでボタンに対応する文字が飛んで来る為、Linux Kernelのドライバモジュールを作成する際は本コマンドの重要性は然程高くない
操作 | コマンド | 戻り値 | 概要 |
---|---|---|---|
read | :sts |
<value> |
現在のステータスLEDのモードを取得する |
write | :sts <mode> |
(無し) | ステータスLEDのモードを設定する。モードは以下を参照 |
機種 | モード |
---|---|
HDL-A HDL2-A |
0 : "on" (緑点灯)1 : "blink" (緑点滅)2 : "err" (赤点灯)5 : "notify" (緑点滅(ゆっくり))8 : "serious_err" (赤点滅) |
HDL-XV | 0 : "on" (緑点灯)1 : "blink" (緑点滅)2 : "err" (赤点滅)4 : "notice" (赤点灯)5 : "notify" (緑点滅(異種, 4点滅1秒消灯)) |
HDL-A/HDL2-Aは上記以外にも橙点灯があるはずであるものの、現状番号と名称は不明。一度 serious_err
設定後は blink
とを行き来するしかできなくなり、他のモードに設定するには再起動(:reset
または :poweroff
発行)する必要がある。
操作 | コマンド | 戻り値 | 概要 |
---|---|---|---|
read | :hdd |
<HDD1 value><HDD2 value> (例: 01 ) |
HDD LEDの状態を取得する。数値1つが1つのHDD LEDに対応する |
write | :hdd <index> <value> |
(無し) | HDD LEDの状態を設定する。インデックスは0始まり |
機種 | 設定値 |
---|---|
HDL-A/HDL2-A | 0 : 消灯1 - 4 : 赤点滅5 : 赤点灯 |
HDL-XV | 0 : NORMAL (青点灯/アクセス時点滅, online)1 : FAIL (赤点灯)2 : ERROR (赤点滅, offline)3 : PLUG (青点滅, online)4 : UNPLUG (青点滅)5 : NOT_CONNECT (消灯, offline) |
HDL-XR/XVに於いては 1
- 4
にそれぞれ別の色や点灯/点滅が割り当てられている模様であるものの、HDL-A/HDL2-Aに於いてはいずれも赤の点滅のみに割り当てられている。
HDL-XVにおいて、2
または 5
に設定すると、そのベイに接続されているドライブの切断処理が走った。恐らくR8Cが何か飛ばしていると思われるが詳細不明。
操作 | コマンド | 戻り値 | 概要 |
---|---|---|---|
read | :led |
<value> |
LEDの輝度を割合 で取得する。値は16進数で返され、15以下は 0 で埋められて常に2桁となる |
write | :led <value> |
(無し) | LEDの輝度を割合で設定する。値は10進数で指定する |
機種 | 輝度値範囲 |
---|---|
HDL-A HDL2-A |
00 - 64 (10進数: 0 - 100) |
HDL-XV | 00 - 0a (10進数: 0 - 10) |
readとwriteとで値が16進数と10進数で異なる点に注意すること。
LED個別ではなく、全てのLEDに対する輝度設定。
操作 | コマンド | 戻り値 | 概要 |
---|---|---|---|
read | :temp |
0 - (?) |
基板上の温度を16進数値で取得する。マイナス範囲も含む |
操作 | コマンド | 戻り値 | 概要 |
---|---|---|---|
read | :fan |
0000 (停止)/0001 (回転) |
ファンの回転状況を取得する |
前述の説明書では回転数を示すとされているものの、HDL-A/HDL2-Aでは回転しているか否かのみが 0
または 1
で示される模様。
操作 | コマンド | 戻り値 | 概要 |
---|---|---|---|
read | :fancont |
<auto or manual><step> (例: 01 ) |
現在のファンの状態を取得する。1文字目が温度の閾値設定に基づく自動制御 (0 )か手動制御 (1 )かを示し、2文字目は速度の段階を示す1 : Low2 : High3 : Stop |
write | :fancont <value> |
(無し) | ファンの状態を設定する。上記の速度の段階の他、温度の閾値設定に基づく自動制御を使用する場合は 0 を指定する |
HDL-XR/XVでは、HighとLowの間にもう1段階存在する可能性がある。
操作 | コマンド | 戻り値 | 概要 |
---|---|---|---|
read | :thget |
<threshold1> <threshold2> <error temp> (例: 2d 28 3c ) |
現在の温度閾値設定を16進数で取得する。 1つ目: 不明な閾値 2つ目: Low->High遷移閾値 3つ目: 温度異常イベント用閾値 |
write | :thset <index> <value> |
0 (成功)/1 (失敗) |
:thget 時のインデックスに対する温度閾値を10進数で設定する。インデックスは0始まり |
readとwriteとで値が16進数と10進数で異なる点に注意すること。
インデックス=1(:thget
2つ目)の設定時は、インデックス=0(:thget
1つ目)以上の値を設定することはできず、もしそうした値を設定したい場合は先にインデックス=0を引き上げてからインデックス=1を設定する。なお、この挙動から、インデックス=0はファンの速度段階がHDL-A/HDL2-Aより1つ多い機種において、Middle->High遷移の閾値であるものと思われる。この場合、インデックス=1はLow->Middleの閾値であると思われる。
HDL-A/HDL2-A: Low --- (index=1) ---> High
HDL-? : Low --- (index=1) ---> Middle --- (index=0) ---> High
インデックス=2(:thget
3つ目)の温度異常閾値は、その値を上回った場合に温度異常イベントコード (T
)を発行させる。HDL-XR/XVに於いては、このコードを受信時にシャットダウンを実行する模様で、HDL-A/HDL2-Aに於いても同様と思われる。
操作 | コマンド | 戻り値 | 概要 |
---|---|---|---|
write | :mml |
(無し) | ビープスピーカーからのメロディ再生を停止する |
write | :mml <value> |
(無し) | ビープスピーカーからMML文法で記述されたメロディを再生する |
現在再生されているメロディなどを読み取るコマンドは無し。
短音は a
などを渡すとテストできる。
操作 | コマンド | 戻り値 | 概要 |
---|---|---|---|
read | :ee <index> |
<val> (成功)/1 (失敗) |
現在のEEPROMの値を16進数で取得する。インデックスは1始まりで、成功時は8文字が返される1 : デバイス稼働時間(分)2 : ファン稼働時間(分)3 : 電源稼働時間(分)4 : 電源サイクル数5 : ファン異常イベント数6 : 温度異常イベント数 |
write | :eeval <index> <value> |
0 (成功)/1 (失敗) |
EEPROMの値を10進数で設定する。readで読み取れるインデックスの他、以下が存在する模様7 : 保証対象外フラグ8 : autobootフラグ |
readとwriteとで値が16進数と10進数で異なる点に注意すること。
各インデックスの対応はHDL-XRの情報を基にしたものであり、HDL-A/HDL2-Aに於いて同じと思われるものの未確定。write時の 7
と 8
がHDL-A/HDL2-Aで有効なフラグであるかは不明。