PIAST WDT ファームウェア

2016年3月2日 (水) 22:46時点におけるTakahashi (トーク | 投稿記録)による版 (PICファームウェア)

PIAST用のウォッチドッグ・ファームウエア解説

目次

PIC

PIC12F509(安い!)用。単純なループ処理でハートビートを監視するだけ。

PICピンアサイン

GP0 - RPiへのリセット信号出力
GP1 - ハートビート信号入力
GP2 - アームド信号入力
GP4 - デバッグ出力

解説

PIC側ファームウェアは100mSサイクルで入力を監視し、×256(25.6秒)以内にハートビート信号が検出されないとRPiを強制リセットします。
この時、RPi 2 model Bのリセット端子をLowに3秒間落としてから戻すという動作を行います。リセット端子はLow側がアクティブなので平常時はHiに保たれます。
ハートビートの監視はループが100mSなので101mS以上、200mS未満の信号を与えます。Low->Hiへのトランジションを検出しますので、20秒以内に1回、RPiのGPIOを150mS間Hiにすればこの仕様を満足します。

安全策

予期しないリセットを防ぐためPIC側のファームウェアは電源投入時にある条件が揃わないと起動しないようになっています。
以下の手順でPICの処理を起動させます。

GPIO17とGPIO27をLoにする
GPIO17とGPIO27をHiにする
GPIO17とGPIO27をLoにする

この処理を行うとウォッチドッグのファームウェアが処理を開始します。
ウォッチドッグにリセットを行わせるにはまずウォッチドッグを"アームド"状態にします。これは簡単でWDT制御信号(GPIO17)をHiにします。これによりハートビートの監視が行われます。Loに戻すとこの監視は停止します。
ハートビートの与え方は簡単で以下のようなシェルスクリプトでも十分です(sleepenhを入れておいてください)。

while :
do
    echo "1" > /sys/class/gpio/gpio27/value
    sleepenh 0.15 > /dev/null
    echo "0" > /sys/class/gpio/gpio27/value
    sleep 10
done

この例では10秒間隔で150mSのHi(1)を与えています。
アームド状態でハートビートを停止すると25秒後には強制リセットがかかってしまうので、ウォッチドッグを停止する場合にはWDT制御信号(GPIO17)をLoに戻してください。

ウォッチドッグ作動後の挙動

ウォッチドッグが作動するとRPiは強制的にハードウェアリセットが行われます。ウォッチドッグのファームウェア自体は電源投入時と同様に初期化条件が揃うまで待機します。通常はシステム起動のスクリプト等でウォッチドッグの初期化、ハートビート生成などを行いますから再起動完了後は再度、ウォッチドッグによる監視状態に戻るはずです。

特定条件下での動作

ウォッチドッグ監視状態で、RPiのGPIOポートが状態を維持、つまりWDT制御信号がHiの状態を維持したままRPiが停止するとウォッチドッグによる強制リセットが行われます。これはGPIO17がHiを維持している状態でシステムがhaltさせられてもウォッチドッグで復帰するということです。ただし、停止状態でのGPIO状態は保証されているわけではないので慎重にテストしてください。
ウォッチドッグを使用している状態で、うっかりhaltコマンドを叩いたりした場合には自動的に再復帰することが期待できます。

PICファームウェア

以下からダウンロードできます。Microchip MPLAB XでXC8コンパイラを使用してください。

http://ftp.voip-info.jp/piast/wd509.c