Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WG2600HP2 U-Boot環境変数が書き込めない #1

Closed
gogoyubari opened this issue Jul 18, 2020 · 8 comments
Closed

WG2600HP2 U-Boot環境変数が書き込めない #1

gogoyubari opened this issue Jul 18, 2020 · 8 comments

Comments

@gogoyubari
Copy link

WG2600HP2ですが、failsafeに入って /etc/fw_env.config 作成するも
fw_setenv でU-Boot環境変数が書き込めないようです。

Press the [f] key and hit [enter] to enter failsafe mode
f
- failsafe -


BusyBox v1.19.4 (2017-03-10 10:18:52 JST) built-in shell (ash)
Enter 'help' for a list of built-in c   NM                    MMMMMMM          M       M
   $MMMMM        MMMMM                MMMMMMMMMMM      MMM     MMM
  MMMMMMMM     MM MMMMM.              MMMMM:MMMMMM:   MMMM   MMMMM
MMMM= MMMMMM  MMM   MMMM       MMMMM   MMMM  MMMMMM   MMMM  MMMMM'
MMMM=  MMMMM MMMM    MM       MMMMM    MMMM    MMMM   MMMMNMMMMM
MMMM=   MMMM  MMMMM          MMMMM     MMMM    MMMM   MMMMMMMM
MMMM=   MMMM   MMMMMM       MMMMM      MMMM    MMMM   MMMMMMMMM
MMMM=   MMMM     MMMMM,    NMMMMMMMM   MMMM    MMMM   MMMMMMMMMMM
MMMM=   MMMM      MMMMMM   MMMMMMMM    MMMM    MMMM   MMMM  MMMMMM
MMMM=   MMMM   MM    MMMM    MMMM      MMMM    MMMM   MMMM    MMMM
MMMM$ ,MMMMM  MMMMM  MMMM    MMM       MMMM   MMMMM   MMMM    MMMM
  MMMMMMM:      MMMMMMM     M         MMMMMMMMMMMM  MMMMMMM MMMMMMM
    MMMMMM       MMMMN     M           MMMMMMMMM      MMMM    MMMM
     MMMM          M                    MMMMMMM        M       M
       M
 ---------------------------------------------------------------
   For those about to rock... (IPQ806X.LN, unknown)
 ---------------------------------------------------------------
root@(none):/# echo '/dev/mtd9 0x0 0x10000 0x10000' > /etc/fw_env.config
root@(none):/# fw_setenv mytestvariable abcdefg
root@(none):/# fw_printenv mytestvariable
root@(none):/# hexdump /dev/mtd9
0000000 ffff ffff ffff ffff ffff ffff ffff ffff
*
0010000
root@(none):/# 

U-Boot 2012.07 [Standard IPQ806X.LN,local] (May 20 2016 - 11:16:41)

smem ram ptable found: ver: 0 len: 5
DRAM:  491 MiB
NAND:  ipq_nand: unknown NAND device manufacturer: 0 device: 0
ipq_nand: failed to identify device
SF: Detected S25FL256S with page size 64 KiB, total 32 MiB
ipq_spi: page_size: 0x100, sector_size: 0x10000, size: 0x2000000
32 MiB
MMC:   
*** Warning - bad CRC, using default environment

考えられる理由がありますでしょうか。
メーカーファームは最初Ver1.0.5 -> Ver1.0.2まで戻して初期化もしましたが、
現象変わらずでした。

@musashino205
Copy link
Owner

添付頂いたログから同じ内容をWG2600HPで試してみましたが、特に問題無く値の登録等できており、これといった原因が今のところ思い浮かばない状況です...

Press the [f] key and hit [enter] to enter failsafe mode
f
- failsafe -


BusyBox v1.19.4 (2015-11-26 09:10:32 JST) built-in shell (ash)
Enter 'help' for a list of   NM                    MMMMMMM          M       M
   $MMMMM        MMMMM                MMMMMMMMMMM      MMM     MMM
  MMMMMMMM     MM MMMMM.              MMMMM:MMMMMM:   MMMM   MMMMM
MMMM= MMMMMM  MMM   MMMM       MMMMM   MMMM  MMMMMM   MMMM  MMMMM'
MMMM=  MMMMM MMMM    MM       MMMMM    MMMM    MMMM   MMMMNMMMMM
MMMM=   MMMM  MMMMM          MMMMM     MMMM    MMMM   MMMMMMMM
MMMM=   MMMM   MMMMMM       MMMMM      MMMM    MMMM   MMMMMMMMM
MMMM=   MMMM     MMMMM,    NMMMMMMMM   MMMM    MMMM   MMMMMMMMMMM
MMMM=   MMMM      MMMMMM   MMMMMMMM    MMMM    MMMM   MMMM  MMMMMM
MMMM=   MMMM   MM    MMMM    MMMM      MMMM    MMMM   MMMM    MMMM
MMMM$ ,MMMMM  MMMMM  MMMM    MMM       MMMM   MMMMM   MMMM    MMMM
  MMMMMMM:      MMMMMMM     M         MMMMMMMMMMMM  MMMMMMM MMMMMMM
    MMMMMM       MMMMN     M           MMMMMMMMM      MMMM    MMMM
     MMMM          M                    MMMMMMM        M       M
       M
 ---------------------------------------------------------------
   For those about to rock... (IPQ806X.LN, unknown)
 ---------------------------------------------------------------
root@(none):/# echo '/dev/mtd9 0x0 0x10000 0x10000' > /etc/fw_env.config
root@(none):/# fw_setenv mytestvariable abcdefg
root@(none):/# fw_printenv mytestvariable
mytestvariable=abcdefg
root@(none):/# hexdump -n 128 -C /dev/mtd9
00000000  18 f0 db de 62 6f 6f 74  63 6d 64 3d 62 6f 6f 74  |....bootcmd=boot|
00000010  70 3b 20 73 65 74 65 6e  76 20 62 6f 6f 74 61 72  |p; setenv bootar|
00000020  67 73 20 72 6f 6f 74 3d  2f 64 65 76 2f 6e 66 73  |gs root=/dev/nfs|
00000030  20 6e 66 73 72 6f 6f 74  3d 24 7b 73 65 72 76 65  | nfsroot=${serve|
00000040  72 69 70 7d 3a 24 7b 72  6f 6f 74 70 61 74 68 7d  |rip}:${rootpath}|
00000050  20 69 70 3d 24 7b 69 70  61 64 64 72 7d 3a 24 7b  | ip=${ipaddr}:${|
00000060  73 65 72 76 65 72 69 70  7d 3a 24 7b 67 61 74 65  |serverip}:${gate|
00000070  77 61 79 69 70 7d 3a 24  7b 6e 65 74 6d 61 73 6b  |wayip}:${netmask|
00000080

最近までHP2を所有しておりましたが既に放出してしまい確認できないのと、保有中にブログの手順でOpenWrtを行ったかどうか、行っていたとしたら問題無くできていたかという記憶が既に曖昧になっており、できるはずという断言ができない状況です。すみません。

そちらのHP2で、failsafeにおける /proc/mtd の内容を見せていただいてもよろしいでしょうか。

@gogoyubari
Copy link
Author

検証ありがとうございます。
/proc/mtd の内容は以下のとおりとなっております。

root@(none):/# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00020000 00010000 "SBL1"
mtd1: 00020000 00010000 "MIBIB"
mtd2: 00040000 00010000 "SBL2"
mtd3: 00080000 00010000 "SBL3"
mtd4: 00010000 00010000 "DDRCONFIG"
mtd5: 00010000 00010000 "SSD"
mtd6: 00080000 00010000 "TZ"
mtd7: 00080000 00010000 "RPM"
mtd8: 00080000 00010000 "APPSBL"
mtd9: 00010000 00010000 "APPSBLENV"
mtd10: 00030000 00010000 "PRODUCTDATA"
mtd11: 00040000 00010000 "ART"
mtd12: 00040000 00010000 "TP"
mtd13: 00500000 00010000 "TINY"
mtd14: 00200000 00010000 "HLOS"
mtd15: 015a0000 00010000 "rootfs"
mtd16: 007f0000 00010000 "rootfs_data"

@musashino205
Copy link
Owner

ありがとうございます。やはりHPと同じレイアウトになっており、特段問題は見当たらないように思えます...

インストール方法について、ブログ掲載のものとは別のものを案内させていただくため、Twitterのアカウント @musashino_205 へDMか、OpenWrtにおけるSigned-off-byに使用しているメールアドレスまでご連絡頂いてもよろしいでしょうか。

こちらのIssueはひとまずOpenのままとして、今後当方で再度HP2を確保した際に、検証して追記しCloseとさせていただきたいと思います。

@musashino205
Copy link
Owner

musashino205 commented Jul 19, 2020

gogoyubari氏とやり取りしてのメモ

問題

  1. WG2600HP2以降、U-Bootが特定サイズ (0x200000 = 2 MiB) 固定でKernelを読みだす

    • 現在のOpenWrtにおけるKernelは既に 2MiB を超過しており(例: OpenWrt 19.07.3 --> 約 2.10 MiB)、0x200000の読み出しでは途中までしか読みだされずそれ以降が欠落、U-Bootによるチェックサム検証でエラーとなりブート不可
    • WG2600HPではサイズを固定しない読み出しをしており、2 MiBを超えるKernelも問題無くブート可能
  2. WG2600HP2ではメーカーファーム上での fw_printenv, fw_setenv が正常に機能しない(?)

    • WG2600HPでは可能だった、メーカーファーム上からU-Bootの環境変数の操作がHP2では行えない可能性がある

対応策/確認事項

  1. U-Bootの環境変数 bootcmd にデフォルトの bootipq に代わり set autostart yes && nboot 0x44000000 1 0x860000 を設定

    • WG2600HPと同等の挙動をさせる

    • U-Boot上からの場合:
      set bootcmd "set autostart yes && nboot 0x44000000 1 0x860000"
      saveenv

    • OpenWrt上からの場合(fw_setenv使用):
      fw_setenv bootcmd "set autostart yes && nboot 0x44000000 1 0x860000"

  2. failsafe内で /etc/init.d/rcS を実行後 fw_printenv, fw_setenv を実行

    • failsafe内ではHPと異なり読み書きできない模様
      • /etc/init.d/rcS を実行し通常起動(非failsafe)に近い状態まで持っていくと機能するようになる
      • 上記実行後は uci により必要な設定が行われているため、/etc/fw_env.config の作成は不要
    • WG2600HPと異なり、HP2ではshellのstderrが表示されない模様
    • /etc/init.d/rcS 実行の副次的効果としてwatchdogによるresetが発生しなくなる

2020/08/02 追記: 手元の個体でinitramfsイメージのブートが途中で止まってしまう問題が発生しており、環境変数を追加した後の手順が検証できず一旦保留としています。

@musashino205
Copy link
Owner

musashino205 commented Jan 21, 2021

大変遅くなりましたが、検証を行ったので追記します。

2020/08/02 追記: 手元の個体でinitramfsイメージのブートが途中で止まってしまう問題が発生しており、環境変数を追加した後の手順が検証できず一旦保留としています。

IPQ8064のSPC (Standalone Power Collapse) による問題だったため、これを無効化することにより解決しました。
ipq806x: disable SPC of IPQ8064 on NEC WG2600HP to fix boot issue · openwrt/openwrt@622ce71

まとめると、WG2600HP2でのOpenWrtインストール手順としては

1. WG2600HP2のfailsafeモードに入る

ブート中にfailsafeに関するメッセージが表示されたら、FキーとEnterキーを連続して押下してfailsafeモードに入ります

2. /etc/init.d/rcS を実行

実行することでU-Bootの環境変数領域が設定可能になります。WG2600HPでは手動で作成する必要があったfw_env.configは自動で作成されます。

3. U-Bootの環境変数を設定

WG2600HPと同様に、initramfsイメージをブート時に読み込ませる設定を行います。以下を設定します。この時、 bootcmd の引数はLinux上のshellによって解釈されて空欄がセットされることが無いよう、シングルクォーテーションを前後に付けてください。

fw_setenv ipaddr "192.168.0.1"
fw_setenv serverip "192.168.0.2"
fw_setenv bootcmd 'set autostart yes; ping ${serverip} && tftpboot 0x44000000 wg2600hp-initramfs.bin; nboot 0x44000000 1 0x860000'

ブート時、LAN側のポートがリンクしていれば serverip に設定したアドレスに対して起動毎にpingを実行し、応答があればtftpでのinitramfsイメージ取得とそれを使用してのブートを試行します。
もしtftpを行わない時にping応答があった場合、U-Bootが成功するまでtftpを実行し続けてしまう可能性があることに留意してください(HP2での挙動は未確認ですがWG2600HPではその仕様でした)。その為、serverip はLAN側で使用することが無いアドレスとするか、もしくは ipaddrserverip でLAN側で使用することが無いアドレス帯(192.168.254.0/24など)を使用することをお勧めします。
設定後、 fw_printenv で設定内容を確認しましょう。

4. PC側でTFTPサーバを用意

上記でU-Bootの環境変数に設定した serverip のアドレスでPC側にTFTPサーバを用意します。WG2600HP用のinitramfsイメージを wg2600hp-initramfs.bin にリネームしてTFTPのディレクトリに置いてください。このファイル名は、U-Bootの環境変数の設定で任意のものを指定した場合はそれを使用してください。

5. WG2600HP2をinitramfsイメージでブート

電源ケーブルを一度抜き差しするなどしてWG2600HP2を再起動させ、TFTPからinitramfsイメージを取得させてそれを使用して起動させます。
この時、PC側はファイアウォールなどでping (echo-request) に応答できる状態にしておきます。

6. sysupgradeイメージの書き込み

initramfsイメージでブート後、WG2600HPのsysupgradeイメージをダウンロードしたうえで
mtd erase firmware
を実行し "firmware" パーティション内を消去、sysupgradeイメージでsysupgradeを行います。再起動してOpenWrtで起動してくれば完了です。再起動時、TFTPで使用したPCを切断するなどしてinitramfsイメージがTFTPでダウンロードされないよう注意してください。

@musashino205
Copy link
Owner

ひとまず、時間が掛かりすぎましたが、以上を以てクローズとさせて頂きます。このIssueはブログのWG2600HPの記事にリンクを掲載します。

@gogoyubari
Copy link
Author

検証いただき、ありがとうございました。

@musashino205
Copy link
Owner

こちらこそ、ご報告頂いて本当に感謝です 🙏

@musashino205 musashino205 pinned this issue Jan 26, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants