文鎮化したBuffalo WZR-450HP-CWTを初期化する

# 背景
Buffaloルータが起動しなくなったので復旧手順をまとめました。
WZR-450HP(=WZR-HP-G450H)の情報かつ、OpenWRT/dd-wrtの書き込み、デフォルトファームへの戻し記事はあったのですが、WZR-450HP-CWT(Echonet Lite /HEMSが使えるモデル）についての記事が見つからなかったのでまとめました。
書き込み部分はWZR-450HP(=WZR-HP-G450H)と同じなので、binの用意部分に主眼をおいてます。


# 必要なもの
* ハードウェア
起動しないBuffaloルータ(WZR-450HP-CWT）
USB-シリアル変換ケーブル
スイッチングハブ（なくても対応可能）

* ソフトウェア
Windows PC
Linux 環境(Ubuntu)
tftpd
Firmware（公式HPからダウンロード）
buffalo-enc（OpenWRTをコンパイルすると作成される）

# 状況
ルータの管理画面から設定初期化をしたところ、Diag ランプが2回点滅を繰り返し、起動不可になってしまった。
Diagランプの2回点滅はフラッシュROMの不具合らしい

# 事前準備（ソフトウェアの準備）
**1. tftpの有効化**
”Windowsの機能の有効化または無効化”から"TFTPクライアント"を有効化します
**Windows Firewallは無効化**してください。無効化を忘れていてしばらくハマりました。

**2. IP設定＆ARPテーブル＆ルーティングテーブルの更新**
Buffaloのルータは起動前のtftp待受のタイミングで通常使用しているIP、MACアドレスではなく、一時的に192.168.11.1/24、02-aa-bb-cc-dd-23※が設定されるようです。
さらにARP応答しないため、ARPテーブルに手動で登録が必要になります。（ping応答もしない）

端末のIPを192.168.11.2/24に設定します。

コマンドプロンプトを**管理者権限**で起動し、以下のコマンドを実行します。

```shell
> netsh interface ipv4 set neighbors "インターフェースID" 192.168.11.1 02-aa-bb-cc-dd-23
```

※インタフェース名は`print route`から確認できるインタフェースID
※記事によっては`arp -s`でarpテーブルに静的エントリを追加しているものもありますが実行しなくても大丈夫です。
※末尾は機種によっては23ではなく、20,21,22等色々あるようです。（以下の情報は不正確かも）
　02-aa-bb-cc-dd-20　WZR-HP-AG300H
　02-aa-bb-cc-dd-21　WZR-HP-AG300H/V
　02-aa-bb-cc-dd-22　BHR-4GRV

**3. buffalo-encの用意**
公式Firmwareはエンコードされているようで、デコードするためにbuffalo-encを用意します。
buffalo-encはOpenWRTをコンパイルすることで作成されます。
以下のURLがわかりやすかったです。
[OpenWrtのビルド - Embedded System Engineer](https://www.emb-se.com/?page_id=1004)

# 事前準備（ハードウェアの準備）
**1. USB-シリアル変換ケーブルの用意**
Amazonで以下のものを購入しました。
[DSD TECH SH-U09G USB-TTLシリアルケーブル FTDI FT232RL IC内蔵 1.8M / 5.9FT](https://amzn.to/3HWXlRr)
[DiyStudio 10CM ジャンパー線多色デュポンワイヤー120pcs](https://amzn.to/3oVkpZl)

**2. スイッチングハブの用意（あったらでよい）**
途中出てくるtftpのファイル送信のタイミングがシビアなのでリンクアップ～パケット送信までのタイムラグを無くすためにあったほうがやりやすいです。

# 復旧手順
###1. 公式Firemwareを再構成

公式FWからkernel部分とrootfsの分割点である"start"という文字列を探します。
以下の例では20byte目(Wが19Byte目なので+1)と208Byte目に存在します。

```shell
$ strings -t d wzr_450hp_cwt_jp_200 |fgrep "start"
     19 Wstart
    208 start
$
```

　
次に公式FWをkernel部分とrootfs部分に分割します。
今回はrootfs部分だけを利用したので後半部分だけ抜き出します。stringコマンドで出力された数字+1をtailします。
また、hexdumpコマンドで抜き出したファイルが"start"から始まっていることを確認します。

```shell
$ tail -c+209 wzr450hpcwt-192 > rootfs.before
$ hexdump -C -v rootfs.before |head -1
00000000  73 74 61 72 74 00 64 00  00 00 0e 60 d6 89 6a cc  |start.d....`..j.|
$
```


* そしてrootfs.beforeをデコードします。
ここでMagicなどの各種情報が表示されない場合には失敗していますのでもう一度やり直してください。

```shell
$ ./buffalo-enc -d -i rootfs.before -o rootfs.bin
Magic           : 'start'
Seed            : 0x64
Product         : 'WZR-450HP-CWT'
Version         : '2.00'
Data len        : 22634496
Checksum        : 0xe6f244bb
$
```

###2. Firemwareを書き込み

冒頭に記載したとおり基盤自体はWZR-450HP(=WZR-HP-G450H)と同じなので、ここからは省略版です。
詳細は参考にも記載した「[ゆっくり遅報 - 死んだBuffalo製ルーターを蘇らせる(DD-WRT)](https://www.yukkuriikouze.com/2019/04/13/2609/)」 もしくは「[[Guide] Recovering a bricked Buffalo Airstation N450 Router (WZR-HP-G450H)](https://www.overclock.net/threads/guide-recovering-a-bricked-buffalo-airstation-n450-router-wzr-hp-g450h.1331611/)」を見ると良いです。

* シリアルケーブルを基盤に接続します。端子は左からGND/RXD/TXDです。
基盤 - PC
GND - GND
RXD - TXD
TXD - RDX
ボーレートは11520

* LANケーブルを接続します。
PC(Windows) ～ スイッチングハブ ～ ルータ(WZR-450HP-CWT) eth0

* ルーターモードはONもしくはAutoに設定
こちらも記事によってはAuto指定と記載されていましたが、どちらでもできました。

* tftpでbinを転送するタイミングについて（タイミングを図って転送する場合）
ルータ起動後、起動直後に短時間リンクアップします(1回目)。その後にリンクアップしたタイミングがtftp転送可能なタイミングです。
Windowsのtftpコマンドはリトライ処理をしますので、スイッチングハブがあればそれほどシビアではないです。無い場合にはリンクアップした瞬間にコマンドを実行するイメージです。
転送自体はコマンドプロンプトから以下のコマンドを上記のタイミングで実行することで可能です。

```shell
> tftp -i 192.168.11.1 put C:\[転送ファイルのパス]
```

* 任意のタイミングで転送した場合
シリアル接続している場合には「tftp server(receive) go, waiting:4[sec]」が表示されたタイミングで"Ctrl + C"を連打することでtftp受信モードで止まりますので任意のタイミングで転送可能です。この方法の場合にはWindows側/ルータ側双方でコマンド実行が必要です。

Windows側

```shell
> tftp -i 192.168.11.1 put C:\[転送ファイルのパス]\rootfs.bin
```

ルータ側

```shell
ar7240> tftpboot 81f00000 rootfs.bin
```


* Firmwareの書き込み
転送が完了したらメモリ領域を削除します。

```shell
ar7240> erase BF060000 BEFFFFFF
```

そして書き込みを行います。

```shell
ar7240> run u_fw
```

5-10分くらい待つと完了しますので、電源抜き差しで完了です。

* 最後にarp＆ルーティングテーブルの削除＆Windows Firewallの有効化を忘れないように

192.168.11.1が`02:aa:bb:cc:dd:23`に向いてますので、手動で削除が必要です。

```shell
> netsh interface ipv4 delete neighbors
```




# 参考
[[Guide] Recovering a bricked Buffalo Airstation N450 Router (WZR-HP-G450H)](https://www.overclock.net/threads/guide-recovering-a-bricked-buffalo-airstation-n450-router-wzr-hp-g450h.1331611/)
[Driver Labo. - OpenWrt / Buffaloファームウェアイメージ変換](https://www.drvlabo.jp/wp/openwrt-buffalo-wzr-agl300nh_abst/openwrt-buffalo_convert_update2rom)
[ゆっくり遅報 - 死んだBuffalo製ルーターを蘇らせる(DD-WRT)](https://www.yukkuriikouze.com/2019/04/13/2609/)