大破ログ

日々大破、それと側転少々。PC関連その他、気になったことなどをつらつらと。

WG2600HP(経過報告)

さて再びやり始めた新機種のサポートですが、今回は最後の1つがコケておりPRにたどり着かない状況です。

  • きっかけ

    雑記にも書きましたが、3月24日の東海道らぐ横浜当日に「何か面白そうな機種無いかな」と秋葉原に寄ってフラフラ徘徊した際、駅近くのソフマップでWG2600HPを一部部品欠損で¥6,500弱で見つけ(パネルが無いとされていたが全部揃っていた)、ipq806x機と予想されることから購入しました。
  • サポート作業

    • 流れ

      • 筐体を開ける
        ここがしんどい。WPSボタンのある側がまず黒いカバーを外すことができ、その下にさらに金属板が取り付けられたベージュとグレーの中間程度の色をしたカバーが取り付けられている。この2つ目のカバーの取り外しに手間取った。フロント側(USB, RJ-45等と反対側)のツメが銀色の帯と反対側にあり、奥まった位置にあるため上手く引っ掛けてツメを外すことができない。
        最終的に強く力を掛けた際にツメが1つ破損し、その結果大きく開くようになったのでなんとか残りのツメを外して開けた。
      • シリアルを繋ぐ
        基板上にスルーホールで出ており、ハンダ埋めも無いのであまり難しい点は無し。USBやRJ-45側から RX, TX, NC, GND, Vcc。ケーブルは TX, RX, (接続無し), GND, (接続無し)とする。
      • コンソールで色々確認する(失敗)
        WG2600HPではコンソールにパスワードが掛けられており、アクセス不可。OpenWrtベースのQSDKが使用されておりfailsafeへ落ちることはできるものの、ある程度時間が経過すると "watchdog barked!" と出て再起動されてしまい、行動が著しく制限される。そこでrootのパスワードハッシュを見つけはしたものの、パスワードまでは現状特定できずログインもできていない。
        また、U-Bootもブートを中断してコンソールに入ることなどができない上に、何らかのボタンを押しながらブートすることでinitramfsイメージを受け付けるといった機能が無いようで、ビルドしたファームを流し込むことができない。
      • とりあえずファームをビルド
        流し込む手段が見つけられていないものの、とりあえずファームをベース部分だけ組んでビルド。OpenWrtのipq806xでサポート済みの機種のうち "Qualcomm IPQ8064/AP148 (dts: qcom-ipq8064-ap148.dts)" がリファレンスボードらしくWXR-2533DHPでもこれを流用できたので、このdts等をコピーしてWG2600HP用の機種サポートを暫定的に追加する。
        mtdパーティションについてはfailsafeやbootlogから確認できていたので、それを基に定義を追加。
      • U-Bootの環境変数を弄れた
        failsafeで利用できるコマンドを見て回っていたところ、U-Bootの環境変数を表示するfw_printenv、その変更を行うfw_setenvを発見。そのまま叩いてもuciに設定が入っておらず、/etc/fw_env.config も無いのでエラーになるが、/etc/fw_env.config をAPPSBLENVパーティションで記述したところ環境変数の取得と設定を行うことができた。
      • initramfsイメージを投げ込む
        fw_setenvが利用できたので、bootcmdを書き換えてinitramfsイメージをTFTPで取らせてブートする様に変更する。
        コマンドが少々長いので、"ramboot" として分離した。rambootはWXR-2533DHPのものを参考にした。 [sourcecode language="bash"] fw_setenv autostart yes fw_setenv ipaddr 192.168.10.1 fw_setenv serverip 192.168.10.2 fw_setenv ramboot "rootfstype=ramfs; tftpboot 0x44000000 wg2600hp.bin" fw_setenv bootcmd "run ramboot" [/sourcecode] ipaddrでルータ側のIPアドレスを、serveripでTFTP側のIPアドレスを設定する。
        rambootでは、rootfstypeをramfsとして指定、TFTPを利用してサーバから wg2600hp.bin を取得してメモリ上 0x44000000 にロードしてブートする。ただしこれだけではロードしただけで止まってしまうため、自動でブートも行うよう "autostart=yes" を設定する。
        bootcmdでは、rambootに設定したコマンドを実行 (run) する。
      • mtdをバックアップ
        initramfsイメージでブートできたら、弄る前に各mtdパーティションをバックアップしておく。ddしてscpでダウンロードした。
        また、WG2600HPでは バックアップしたうちの "ART" ではなく "PRODUCTDATA" パーティションMACアドレスが格納されているため、メーカーファーム上で確認しておいた各インターフェースに割り当てられているMACアドレスと比較して始点アドレスを確認する。
      • 各種情報を確認する
        initramfsイメージでブートし、各種情報(主にGPIO周辺)を確認する。
        NECが公開しているWG2600HPのソースコードでは "CONFIG_BOARD_AKRO" として #ifdef にWG2600HPの情報が記述されており、これと合致しているかを確認する。
        WG2600HPのRJ-45ポートにPCなどとケーブルを接続し、リンク状態も確認する。すると、OpenWrtで既にサポートされている他機種とはポート構成が異なっており、ほんとか?という気持ちになった(そうリンクするんだからそれしか無いのだが)。
      • コードを修正してテスト
        確認した情報を基にコードを修正し、再度投入して正常に機能するかテスト。問題が見つかれば再度修正してトライ。
        USBポートやPCIe、各インターフェースのMACアドレス辺りを何度か修正を重ねた。
      • Flashに焼き込み
        initramfsイメージでできる作業がおおよそ完了したら、最後にFlash周りの確認のため焼き込む。
        mtdパーティション等の構成からipq806x内のTP-LINK VR2600vと同じ書き込み方法が使えると判断し、その通りに platform.sh を記述。
        initramfsイメージからsysupgradeで焼き込む前に、FlashからブートできるようにU-Bootのbootcmdを変更する。この際、bootipqを設定するだけだと、kernel自体が破損しているのであればU-Bootのコンソールに自動で落ちるものの、そうではない問題があった場合にブートが止まってしまったり、再起動を繰り返すのみで復旧不能に陥るため、rambootも残すようにする。 [sourcecode language="bash"] fw_setenv bootcmd "run ramboot || bootipq" [/sourcecode] 上記でまずrambootを受け付け、それが失敗すればbootipqを実行する。
        bootcmdを設定したらsysupgradeを実行してFlashに焼き込む。ここまでは問題無く成功。
  • 問題

    • sysupgradeで設定を引き継げない

      sysupgradeの際、本来であれば "kernel", "rootfs" パーティションに新しいファームウェアが書き込まれると同時にバックアップされていたconfig類が書き戻されるはずが、コンソール上にメッセージは出るものの再起動すると初期状態になってしまっている。
      SPI Flash環境でのsysupgradeに通常使用される "default_do_upgrade" を実行した後に "jffs2_copy_config" を実行すればconfig類が引き継がれたものの、コードを確認しても本来であれば "default_do_upgrade" だけでできるはずであり、他に "jffs2_copy_config" を実行している機種は無い。この問題が解決できずしばらくここで作業がストップしてしまっている。
      config類がどこか別のパーティションに書き込まれてしまっているのかと確認したものの、WinMerge等でバイナリのdiffを取ってもkernelとrootfs以外に変更されたパーティションは無かった。
      もう少し追加で詳しく調べてみる予定。
  • 所感とか

    作業中、ミスによってkernelがコンソールに何も吐かない状態にしてしまい、故意にメーカーファームのkernelを破損させる羽目になるなどかなり綱渡りの作業になった(それも、kernelを破損させられずにrootfsをやってしまったらたぶんアウト)。しんどいけど楽しい。
    気になる個所はいくつかあるものの、現状問題らしい問題は上記のsysupgradeの問題1つのみ。さすがにこの状態でPR投げるわけにもいかないため、解決できずストップしてしまっている。
    それまでは(initramfsイメージを投げ込めてからは)サクサクと進んでいたため、まさかそこでコケるとは思わず早いうちにPR投げるまで行けそうと思っていた。
    今のところ解決策が全く思いつかないため、今後Forumで質問してみようかなと思う。場合によってはjffs2_copy_configでPR投げてしまおうかとも考えたものの、メンテナ氏に迷惑かけてしまうのもどうかというところがある。