Buffalo WXR-2533DHP編
※WXR-2533DHPは2018/1/4現在、稼働するOpenWrt/LEDE/DD-WRTファームウェアはありません。→ OpenWrt snapshot build に組み込まれました。次期安定板19.03では正式サポートされると思われます
概要
WXR-2533DHPはbootloader用の4MbyteのSPIフラッシュメモリとOS用の256MByteのNAND フラッシュメモリを搭載しています。
この機種のu-bootはメモリの内容を本体のEthenetポート経由で外部とのTFTPによる送受信できるようにbuildされています。
SPIフラッシュ、NANDフラッシュ共、フラッシュメモリから外部に直接TFTP送受信することはできませんが、一度内容をメインメモリに展開させることでネットワーク経由のバックアップ&リストアができます。
WXR-2533DHPでは、NANDフラッシュ側は単純にフラットにデータが書かれているわけではありません。
UBIパーティション型式でフォーマットされており(ファイルシステムはsquashfs)、さらにbad blockの代替blockなどがu-boot側でも管理され、OS側で保存したチェックサムと整合性をチェックするようになっています。単純な書き戻しではOS起動時にファイルシステムエラーが出ます。
WXR-2533DHPではu-boot側のbuffalo独自拡張機能により、OS boot時に不整合があればバックアップ領域から書き戻しを行ってリカバリするようになっています。
この機能を利用して、u-boot経由でフラッシュメモリの内容を書き戻した後に、意図的に一部の領域を消去してバックアップ領域からのリカバリを誘発するようにします。
準備
ハードウェアの準備
u-bootへのアクセスはSerialのみなので、WXR-2533DHPを殻割りして基板上のシリアルポートにアクセスする必要があります。
UART端子にピンをハンダ付けし、3.3v仕様のUSB-UART変換アダプタ等を接続するなどしてください。
シリアルポート設定
bitrateは115200bps/nonparity/data 8bit/stopbit 1 (115200N81) フロー制御なしです。
ネットワーク設定
WXR-2533DHPのu-boot起動中のIPアドレスは 192.168.11.1/24 です。
バックアップ先TFTPサーバは192.168.11.10 を設定してください。
u-bootプロンプトへのアクセス
WXR-2533DHPの起動中に以下のメッセージが表示されたら任意のキーを押下するとu-bootプロンプトに入れます。
Hit any key to stop autoboot:
本体のGUESTボタンを押しながら電源を入れるとu-bootプロンプトで止まるので、そちらでも構いません。
以降の操作はu-bootプロンプトにて実施します。
バックアップ
SPIフラッシュ側
1)SPI flash を認識させる
sf probe
2)フラッシュメモリのデータをメモリ展開
sf read 0x42000000 0 0x400000
# SPI Flashからメインメモリ 0x42000000番地の
# 先頭(offset=0)へ 0x400000(=4MByte) 読み込む
3)TFTPサーバにアップロード
tftpput 0x42000000 0x400000 192.168.11.10:spi.img
# メインメモリ 0x42000000番地から 0x400000(=4MByte) 分、
# 192.168.11.10のTFTPサーバにspi.img で PUTする。
NANDフラッシュ側
1) nand0 を選択
nand device 0
2)フラッシュメモリのデータをメモリ展開
nand read 0x42000000 0 0x10000000
# NAND Flash からメインメモリ 0x42000000番地の先頭(offset=0)に
# 0x10000000(=256MByte) 読み込む
3)TFTPサーバに分割アップロード
tftpput 0x42000000 0x2000000 192.168.11.10:nand0-1.img
tftpput 0x44000000 0x2000000 192.168.11.10:nand0-2.img
tftpput 0x46000000 0x2000000 192.168.11.10:nand0-3.img
tftpput 0x48000000 0x2000000 192.168.11.10:nand0-4.img
tftpput 0x4A000000 0x2000000 192.168.11.10:nand0-5.img
tftpput 0x4C000000 0x2000000 192.168.11.10:nand0-6.img
tftpput 0x4E000000 0x2000000 192.168.11.10:nand0-7.img
tftpput 0x50000000 0x2000000 192.168.11.10:nand0-8.img
# 0x2000000(=32Mbyte) 毎に分割してtftpサーバにput
リストア
NANDフラッシュ側
1)TFTPサーバ上のファイルの内容をメモリに展開
tftpboot 0x42000000 192.168.11.10:nand0-1.img
tftpboot 0x44000000 192.168.11.10:nand0-2.img
tftpboot 0x46000000 192.168.11.10:nand0-3.img
tftpboot 0x48000000 192.168.11.10:nand0-4.img
tftpboot 0x4A000000 192.168.11.10:nand0-5.img
tftpboot 0x4C000000 192.168.11.10:nand0-6.img
tftpboot 0x4E000000 192.168.11.10:nand0-7.img
tftpboot 0x50000000 192.168.11.10:nand0-8.img
2)ベリファイ
正しくメモリに展開できたか tftpput コマンドを使ってもう一度TFTPでputして
PC側でdiffしてベリファイする
3)nand0 を選択してNANDフラッシュの消去
nand device 0
nand erase 0 0x10000000
nand device 1 とするとはSPI Flashが指定されてしまうようです。eraseの選択時に誤って指定するとbootloaderが消去される恐れがあります。再起不能になりますのでご注意ください。
4)メモリの内容をNANDフラッシュに書き込み
nand write 0x42000000 0 0x10000000
# メモリアドレス 0x42000000 の先頭(オフセット0)から 0x10000000 byte NANDに書込む
5)意図的に一部の領域を消去してboot時のUBIパーティション修復を誘発
nand device 0
nand erase 0 0x2000000
#NANDの先頭32MByteを消去する。
#(あえて書いてから消去させていますが、最初から先頭32Mbyteを書き込まなくても可)
6)reset
u-bootからのOS起動中に先頭32Mbyteが欠損していることを検知し、NANDフラッシュの再構築が始まります。
起動時のimageチェックで nand bank2 (0x4000000-0x8000000) のimageと一致しないためにbank2 から bank1への書き戻しが行われます。
この時、UBIの作法に乗取って bank1 がパーティションから再構成されるためUBIのエラーが解消します。
※5)をやらずにresetすると以下のようなエラーが表示されます。
・u-boot側でのnand0 のチェック時
UBI error: ubi_io_read: error -74 while reading 2048 bytes from PEB 54:2048, read 0 bytes
ubi_io_read[188] not here
・OS boot時
msm_nand_read_oob 2820800 800 0 failed -74, corrected 0
SPIフラッシュ側
NANDと同様の手法が採れると思われますが未検証です。
参考サイト
最終更新:2019年04月06日 13:54