純規の暇人趣味ブログ

首を突っ込んで足を洗う

Raspberry Pi(Zero)でBuffalo WZR-300HPのファーム蘇生を試みる

      HimaJyun

珍しく成功はしていません、が、手順としては良い感じだったので記事にしておきます。

もう一度書いておきます、成功していません、手順としては最後まで行けましたがダメでした。その事を踏まえたうえでご覧ください。

事の始まり

(Buffaloの社員が見ていませんように……)

この製品自体がかなり古いってのもあるけど、ファームが死んだ理由は「おめーん所の設計が悪いんだよfu(ピー)!」と言いたくなるような奴。

ファーム更新中にキャンセルボタン(ブラウザの更新ボタンだったかも)を押すだけで死ぬファームの方に問題があると言いたい。

「体格のゴツイ友人が前を歩いていたので「よう!」って背中を軽く叩いたら転んでそのまま死んだ」みたいな気分でっせ。(なんだそれ)

名前はバッファローなのにファームの設計がウサギ並。

という訳で新しいルーターを買ってきて(しかし金がないので新しいルーターもBuffaloである)、このルーターはおもちゃに

……と言うのがいつ頃かも覚えてないくらい前の話、多分1年くらい。そしてようやく修理を試みる気になった。(ちなみにだが、しくじると死ぬ物仲間のBIOSを蘇生させたこともある)

情報集め

どうやらこの製品は分解(要トルクスレンチ)すればシリアル接続が出来るみたい、だが手元にシリアル接続が出来るような物を持っていない……

いや、これがあったな……

何かに使えればと思って購入したPi Zero、流石に5ドルのコンピューターでは性能が足りなさ過ぎて検証用になっている。

確かこれのGPIOからシリアル通信が出来たはず。

決まり、これで行く。

準備

準備の方がめんどくさいよっ!

ちなみに使用したRaspbianはStretch Lite、修理/改造にGUIは邪道だー!!(そんなことはありません

GPIOでシリアル接続する準備

RasPiのGPIOでシリアル接続(UART)するにはいくつかの設定変更が必要。

まず、/boot/cmdline.txtを編集する。

具体的に言うと、「console=serial0,115200」を削除する。これがあると自分自身にシリアル接続してしまってカオスな事になる。

次に、serial-gettyとかいうデーモンを停止させる

sudo systemctl stop serial-getty@ttyAMA0.service
sudo systemctl disable serial-getty@ttyAMA0.service

ちなみにBluetoothを積んでいるPi3とZero Wは/boot/config.txtに「enable_uart=1」を追記する必要がある。

その後、再起動する。ちなみに/dev/ttyAMA0がシリアル通信のデバイスファイル、catで流れて来るデータが見られるのはLinuxの強み。

TFTPサーバーを用意

どうやらルーター側からファームを取りに来るみたい(どこかにファームがget出来るTFTPサーバーが必要)なので、TFTPサーバーの準備をする。

「sudo apt-get install tftp-server」で恐らくtftpd-hpaがインストールされるはず。

次に、設定ファイルである「/etc/default/tftpd-hpa」をエディタで開く。

まず、「TFTP_OPTIONS」が「--source」になっているはずなので、これを「-s -c」に変更する。(そうしないと「Only absolute filenames allowed」と言われる)

それから、「TFTP_DIRECTORY」に設定されている値を確認する。(恐らく「/srv/tftp」になっているはず)

設定が完了したら「sudo systemctl restart tftpd-hpa」で再起動。

次に作業しているRasPiにファームを転送して、TFTPディレクトリ(/srv/tftp)に移動する。

sudo mv -v [ファームのファイル] /srv/tftp/firmware

移動したら一応読み書き可能にしておく

sudo chown -R tftp:nogroup /srv/tftp
sudo chmod -R 777 /srv/tftp

取得出来るか確認しておく。

~$ tftp 127.0.0.1
tftp> verbose
Verbose mode on.
tftp> binary
mode set to octet
tftp> get firmware
getting from 127.0.0.1:firmware to firmware [octet]
Received 23085256 bytes in 14.6 seconds [12649455 bits/sec]
tftp> quit

ルーターとPiを繋ぐ

起動したまま繋いでもOK、ピンアサインは以下の通り。

注意点だが、片方から見たTX(送信)は相手側から見たRX(受信)になる、つまりお互いのTX/RXを入れ替えて繋ぐ必要がある。

例によって刺すだけ接続で行く。

作業

繋がったら作業していく。

接続確認

シリアル通信ではお手軽なscreenを使う事にした、なのでインストールする。

sudo apt-get install screen

ボーレートは11520らしいので、以下のように接続(データ8bit、パリティnone、ストップ1bitだがボーレートの指定だけで行けた)

sudo screen /dev/ttyAMA0 115200

接続した後でルーターのスイッチを入れると以下のような文字が出るはず。

BUFFALO U-BOOT Ver 1.11
  == CPU:400MHz, DDR:400MHz, AHB:200MHz ==
PB93 (ar7241 - Virian) U-boot
DRAM:  64 MB
WAN port disabling: done
Top of RAM usable for U-Boot at: 84000000
Reserving 267k for U-Boot at: 83fbc000
Reserving 192k for malloc() at: 83f8c000
~~~ 略 ~~~

繋がる事が分かったので、ルーターを再起動して、起動中にCtrl+Cを連打すると以下のようにコマンド待ちになる。

tftp server(receive) go, waiting:4[sec]
ar7240> <INTERRUPT>
ar7240> 

これで送受信共にOKなのが確認できた。

IPを振る

ルーターにLANケーブルを繋いで、以下のようなコマンドでIPを振る

setenv ipaddr 192.168.0.100
setenv serverip 192.168.0.4

ipaddrはルーター、serveripはTFTPサーバーのIPアドレスを設定する。

ファームの取得

まずはiminfoでマジックナンバーを確認する。

ar7240> iminfo

## Checking Image at 81f00000 ...
   Bad Magic Number

81f00000がそれ。Bad Magic Numberといかにもエラーっぽい事を言っている。へたれファームめ……

tftpbootを使ってルーターにファームを取得しに行かせる

tftpboot 81f00000 firmware

81f00000が先ほどのマジックナンバー、firmwareの所はファイル名

以下のような感じで転送が進む

ar7240> tftpboot 81f00000 firmware
Using eth0 device
TFTP from server 192.168.0.4; our IP address is 192.168.0.100
Filename 'firmware'.
Load address: 0x81f00000
Loading: #################################################################
         ~ 略 ~
         ########################
done
Bytes transferred = 23085256 (16040c8 hex)

転送出来たらiminfoで確認、先ほど出ていた「Bad Magic Number」が消えればOK

……なのだが、なぜか消えず、純正ファームでは何故か上手く行かないのでDD-WRTを試してみる事に

ar7240> iminfo

## Checking Image at 81f00000 ...
   Image Name:   MIPS Linux Kernel Image
   Created:      2013-03-25   3:41:56 UTC
   Image Type:   MIPS Linux Kernel Image (lzma compressed)
   Data Size:    1179354 Bytes =  1.1 MB
   Load Address: 80002000
   Entry Point:  802525a0
   Verifying Checksum ... crc32_fw: 81f00040 - 8201ff19 (len:0011feda) calc...
OK

成功すると大丈夫そうな出力に変わる。

(という事はつまりファームの生死を確認する機能はあるって事なんだから、ファーム用のROMをもう一個積んでバックアップ的な事をするだけで生存率は倍以上になるでしょ牛さんよ……)

ファームの書き込み

間違えたら死ぬ可能性がある……らしい。

まずはprintenvで書き込み先とバイト数を確認、色々出るが以下の3つを探す

ar7240> printenv
fw_eaddr=BF060000 BEFFFFFF
filesize=16040c8
fileaddr=81F00000

まずは今あるファームをeraseする。

erase BF060000 BEFFFFFF

BF060000とBEFFFFFFはfw_eaddrの値、しばらくかかるので気長に待つ。

出力は以下のような感じ。

search sector 0xbf060000 - 0xbeffffff
BANK #1 (6 : 255)
  000  PPPP.Poooooooooooooooooooooooooo
  032  oooooooooooooooooooooooooooooooo
  064  oooooooooooooooooooooooooooooooo
  096  oooooooooooooooooooooooooooooooo
  128  oooooooooooooooooooooooooooooooo
  160  oooooooooooooooooooooooooooooooo
  192  oooooooooooooooooooooooooooooooo
  224  oooooooooooooooooooooooooooooooo
BANK #2 (0 : 255)
  000  oooooooooooooooooooooooooooooooo
  032  oooooooooooooooooooooooooooooooo
  064  oooooooooooooooooooooooooooooooo
  096  oooooooooooooooooooooooooooooooo
  128  oooooooooooooooooooooooooooooooo
  160  oooooooooooooooooooooooooooooooo
  192  oooooooooooooooooooooooooooooooo
  224  oooooooooooooooooooooooooooooooo

First 0x6 last 0xff sector size 0x10000

First 0x0 last 0xff sector size 0x10000
Erased 506 sectors

cp.bコマンドでファームをコピーする。構文は

cp.b 81f00000 be060000 16040c8

つまり「cp.b fileaddr fw_eaddrの最初の値 filesize」という構文。

出力は以下のような感じ。

ar7240> cp.b 81F00000 BE060000 16040c8
Copy to Flash... 
 Copy 18817024 byte to Flash...
done

これで書き込み完了、祈りながら起動する

復活せず

手順的にはこれで正しく、理論的にはこれで行けるはずなんだが……何故か復活せず。

普段ならもっと深追いするけど、BIOSの時とは違って直っても使い道がないので「別に無理して直さなくても……」という気分になったので諦めた

真似したい人が居れば参考程度にどうぞ、保証はしない。ゾンビが骨になるか生き返るかの二択だ。

参考

偉大なる先人達

 - コンピューター