大破ログ (original) (raw)
WR8750N 内部
2019年頃に一度まとめ上げたものの、当時サードパーティのU-Boot(U-Boot本家ではない)を使用していた為に投入を見送り作業終了としていたものを復活させて投げ込み、マージされたものです。
まとめていきます。
仕様
いずれも既に10数年前に発売されたAR9344搭載機であり、それ故に全体的な構成は古めです。
法律の関係上、無線機能の仕様は非推奨です。
共通
- SoC: Atheros AR9344
- RAM: DDR2 128MiB
- WAN/LAN: 1000Mbps x1/1000Mbps x4
- USB 2.0 Type-A x1
WR8750N, WG600HP
- Flash: SPI-NOR 8MiB
- UART: CN110, 9600bps(三角マークから3.3V, GND, NC, TX, RX)
WR9500N
- Flash: SPI-NOR 16MiB
- UART: 無線チップ付近のパッド4つ, 9600bps(AR8327側から3.3V, GND, TX, RX)
その他詳細については、雑記を参照。
OpenWrt化
諸々の課題を解決出来た為、2段階ではあるもののfactoryイメージを仕立てることができています。
- WR8750N/WR9500N/WG600HPを起動
なお、ルータモードに設定されていることを前提とする http://192.168.0.1/
にアクセスし、ファームウェア更新ページに移動- OpenWrtのfactory.binイメージを選択し、更新実行ボタンを押下
- アップデートが完了し再起動後にOpenWrt上にuboot.binとsysupgradeイメージをアップロード(あるいはダウンロード)
- uboot.binで "bootloader" パーティションを書き換えてブートローダをU-Bootへ置き換え
mtd write <uboot.bin> bootloader
- sysupgradeイメージでsysupgradeを実行
sysupgrade <sysupgrade.bin>
- Flashに書き込み後再起動され、OpenWrtが起動して完了
備考
- 全てのLEDはSoCではなく無線チップ (AR938x) に接続されており、それ故に無線の認識が完了するまでは制御することができない。この為、OpenWrtのブート中に点滅させることができず、無線チップが認識されるまでは消灯、認識された後は点灯状態となる。
- 内部USBハブのRESETラインがLED同様に無線チップのGPIOに接続されており、これも無線チップの認識が完了するまで制御できない為USBハブチップがリセット状態に入ったままとなり、USBポートに接続されたデバイスも無線チップが認識されるまで検出されない。
- メーカー出荷時に搭載されているブートローダは、ファームウェア領域において特殊なファイルシステムを必要とする。このファイルシステムはOpenWrtで扱うことができず、sysupgradeイメージをFlashからブートすることができない為、initramfsベースのfactoryイメージでブートした際にブートローダをU-Bootへ入れ替える必要がある。
- このU-Bootは利用できるパーティションサイズが
0x20000 (=128KiB)
に限られる関係上、サイズ低減の為にネットワークサポートやその他様々な機能/コマンドを無効化しており、kernelが破損していて文鎮化した際などの復旧にはloadb
やloadx
ほかシリアルコンソール経由の投入のみが利用可能。また、環境変数領域の保存に使用できるパーティションが存在しない為、saveenv
コマンドは利用不可。 - 元のブートローダで設定されている
baudrate=9600bps
では遅すぎることもあり、U-Bootではbaudrate=115200bps
に設定し、Linux Kernelにもそれを渡すように設定済。なお、元のブートローダからinitramfs-factoryイメージをブートした場合は、9600bps
で表示される。
- このU-Bootは利用できるパーティションサイズが
作業時の色々
- とにもかくにも、sysupgradeイメージをどうやってFlashからブートするかの戦いだった。元のブートローダがファームウェア領域でどうしても謎のファイルシステムを必要とし、通常のLinuxベース機と同じようにプレーンなファームウェアを書き込むとエラーになり消し飛ばしてしまう。
どうにかブートする為にそのFSをmtdとして扱うドライバを書いてみたりしたものの、どうにも知識不足で信頼性に欠ける為、2019年頃は pepe2k/u-boot_mod をフォークしてデバイス用の変更を行い、ビルドしたものに置き換えることで対処した。
ただしOpenWrtにおいて、OSSのサードパーティ(OSS本家ではなく改変された外部のコードを使用したもの)は許容しないという暗黙のルールが存在するらしいことから、これに該当してしまうu-boot_modを使用するこの3機種は投入不可と判断し、一度作業終了とした。
しかし結局のところ諦めの悪さが出て、さらにはU-Boot本家でAtheros AR934xもサポートされていることを知り、ならばと2019年当時は諦めたmainline U-Bootでのこの3機種のサポートにトライし、なんとか達成して投げ込み、マージされた。 - U-Bootへの置き換えに絡んで、通常のLinux Kernelを使用している市販の無線LANルータではブートローダが初期化している箇所を自前で初期化する必要が出て、いくつかの点で悩まされた。
U-Bootへ置き換えたところ、ネットワーク, PCIe, SoC内蔵無線LANが機能しない状態に陥り、特に後者2つはブートの途中にkernelが固まる症状を引き起こした。このうちネットワークについては、クロック設定が必要だったのと、全般的なリセットレジスタでいくつかのビットが立ったままであったので、それを寝かせることで正しく機能させられるようになった。
PCIeとSoC内蔵無線LANについては、一旦どちらも無効化したうえで片方ずつ検証したところ、PCIeではAR9344におけるPCIeレジスタの初期化が足りておらず、初期化が中途半端となってその後のドライバの処理が止まっており、SoC内蔵無線LANにおいてはネットワーク同様リセットレジスタで一見関係なさそうなビットが立ったままであることでath9kドライバの処理が止まっていた。いずれもドライバ側やlzma-loaderで対処することで、正常に動作する状態に持っていくことができた。 - 念の為、sysupgrade実行時にブートローダがU-Bootへ置き換えられているかチェックを行い、もし置き換えられていない場合はsysupgradeを失敗させるように構成した。
- 当初initramfs-factoryイメージの形式を生成するのはMakefile内のスクリプトで行っていたものの、ヘッダの生成/付加やチェックサム算出等でスクリプトがあまりにも複雑化していたので、firmware-utilsのツールの1つとして書き直した。
この3機種がマージされた際、本来はそのツールもマージされる必要があったものの見落とされてしまったようで、しばらくビルドが通らない状態に陥った。その後OpenWrtチームメンバーにメッセージを飛ばしてツール側のレビューを依頼し、指摘を受けて改善を行った末にマージされ、正常にビルドできる状態となった。
現在は公式ビルドも利用可能。ath79/tiny - factoryイメージを仕立てる際、メーカーファームウェア内に存在する "tp" ブロックをどうするかもだいぶ問題となった。この "tp" ブロックはAtermシリーズのメーカーファームウェアにおいて通常 "firmware" ブロックの1つ前に存在し、元のブートローダが起動する際に読み込まれ、中にあるPOST (Power On Self Test) を実行するようになっている。 "tp" ブロックは必須であり、もし存在しない場合はブートが止まる為、これをどうにかする必要に迫られた。
多少紆余曲折はあったものの、最終的には、OpenWrtにおいてLinux Kernelを特殊な状況下において読み込んで実行するために用意されているlzma-loaderを置くことで対処に成功し、factoryイメージを実現することができた。
色々
正直なところ、スペックで言ってしまえば今更感は強いものの、もう何年も諦め悪くどうにかできないかと何かと考え続けていたこの3機種を投入しマージされたことで、だいぶ達成感が強い。
積極的に確保する意義は薄いものの、家に残っているなどの理由で試しに投入してみるには良さそう。
QCA9558を搭載するWG1400HP等については、U-Boot側のSoCサポートをU-Boot本家に投げる必要がありそうで、今後どうするかは思案中。
WSR-2533DHPL2内部
それぞれ市川大野と吉川のハードオフで見付けて少し迷った末に確保し、作業して投げ込んだものです。
まとめていきます。
仕様
大まかには既にサポート済のWSR-2533DHPL (DHP)とハードウェア構成が近く、一方でSPI-NORではなくRAW NANDを搭載するなどある程度変更されています。
WSR-2533DHPL2とDHPLSではほぼ同一のハードウェア構成。
法律の関係上、無線機能の仕様は非推奨です。
共通
WSR-2533DHPL2
- UART: J4, 57600bps(三角マークから3.3V, GND, TX, RX)
WSR-2533DHPLS
- UART: J4, 115200bps(三角マークから3.3V, GND, TX, RX)
その他詳細については、雑記を参照。
OpenWrt化
WSR-2533DHPLとは異なり、factoryイメージを生成できている為、直接投入することが可能です。
- WSR-2533DHPL2/DHPLSを起動 なお、ルータモードに設定されていることを前提とする
http://192.168.11.1/
にアクセスし、ファームウェア更新ページに移動- OpenWrtのfactory.binイメージを選択し、更新実行ボタンを押下
- factory-uboot.binは使用しない
- Flashに書き込み後再起動され、OpenWrtが起動して完了
備考
- WSR-2533DHPLやWSR-2533DHP2などと同様に、Flash内にOSイメージを2つ抱える構成となっている。それらの使用方法も変わらず原則として1つ目が使用される仕様であり、OpenWrtでもその様に扱う。
- 名前に "factory" と付くファームウェアファイルが2種類存在する。詳細はそれぞれのサポートコミットを参照。(WSR-2533DHPL2, WSR-2533DHPLS)
- WSR-2533DHPL2はOpenWrtにおいて使用できるパーティションのサイズが
0x3D20000
(61.125 MiB) と比較的余裕があるものの、WSR-2533DHPLSは搭載している "ネット脅威ブロッカー" 機能関係に使用されると思われるパーティションにかなりのサイズを取られており、OpenWrtにおいて利用できるのは0x1800000
(24MiB) に留まる。
必然的に、OpenWrt導入後の空き領域も後者はだいぶ小さくなる。
作業時の色々
- WSR-2533DHPL2とDHPLSではハードウェア構成にほとんど違いは無いながらも、一方で中身のソフトウェア面ではだいぶ違いが存在していた。
前述のパーティション構成はもちろんのこと、NAND Flash上でBadblock絡みの管理を行う仕組みが別々の世代であるほか、U-BootもWSR-2533DHPL2はDeviceTreeに対応せず、DHPLSでは対応しているものであった。恐らくDHPLSではメーカーファームウェア作成時のSDKが新しめのものに更新されている。Linux Kernel側もDHPL2はmachineベースであり、DHPLSはDeviceTreeベースとなっている。 - WSR-2533DHPL2とDHPLSでは "TRX" というファームウェア形式を使用しており、なおかつ他のWSRシリーズと同様に非標準の機種固有なMagic Numberを使用している。
これに対応する為、ramips/mt7621 subtargetで使用されていた、firmwareパーティションからkernelとrootfsの領域をそれぞれ切り出すドライバをOpenWrt独自のものから、Linux Kernelに存在しているMagic Numberの指定が可能なものへ切り替えを行った。 - ファームウェアの生成周りは mediatek/mt7622 subtargetに属しているサポート済のWSR-2533DHP2と同じコードが流用できる為、新規に書く量を抑えることができた。
- WSR-2533DHPLSを先に確保した当時、他にも色々と作業を並行している状態だったことからしばらく放置していた結果、他の方がサポート作業を行いPRをオープンしていた。
ただ、NAND搭載機故に必要となる実装がされていなかったことからこちらで引き継ぐこととなり、その後確保していたWSR-2533DHPL2も併せてサポート作業を行い、同時に投げ込んだ。
色々
少々時間は要したものの、マージされたので一安心。
WSR-2533DHPLSはパーティション構成の関係上容量に若干難があるものの、選択肢が増えたので良し。
FortiGate 52E内部
ある時既にサポート済のFortiGate 50Eを追加で確保しようかどうしようか、とヤフオクを眺めていたところ、偶然FortiGate 52Eを見掛け、その後色々あり増えていき作業したものです。
マージされたので、まとめていきます。
仕様
既にサポート済のFortiGate 50Eと同様に、ほとんどの機種でFortiSOCまたはIntel CPUを搭載するFortiGateの中ではかなり珍しく、Marvellの汎用SoCである88F6820を搭載。
今回サポートされた機種はいずれも50Eの系列機であり、基本的なハードウェア仕様は50Eと同一。
共通
- SoC: Marvell Armada 385 88F6820
- RAM: DDR3 2048MiB
- Flash: SPI-NOR 128MiB (MX66L1G45GMI-10G)
- WAN/LAN: 1000Mbps x2/1000Mbps x5
- USB: USB 3.0 Type-A x1
- UART: "CONSOLE", 所謂Ciscoケーブル互換
FortiGate/FortiWiFi 51E
- SSD: mSATA 32GB (A-DATA AXM21ES3-32GM-B) x1
FortiGate 52E
- SSD: mSATA 32GB (A-DATA AXM21ES3-32GM-B) x2
その他詳細については、雑記を参照。
OpenWrt化
ブートローダが主に復旧用としてファームウェア投入機能を持つ為、それを使用してinitramfsイメージを踏み台とする
なお、 "FG-5xE" と称する
FG-5xEのブートメニューを表示させる
電源を接続しブートする途中、 Please wait for OS to boot, or press any key to display configuration menu
と表示されたタイミングで適当なキーを押下し、ブートメニューに入る
2. ##### コンソールポートのbaudrateを9600bpsに設定
ブートメニュー上で [I]: System information.
から [S]: Set serial port baudrate.
を呼び出し、baudrateを9600に設定する
3. ##### TFTPサーバを用意
ブートメニュー上で [R]: Review TFTP parameters.
を呼び出してTFTP関連の情報を表示し、それに従ってTFTPサーバを用意する
なお、PCはTFTP関連情報内で示されているポートに接続する
また、OpenWrtのinitramfsイメージは image.out
にリネームの上TFTPフォルダに配置する
4. ##### TFTPでinitramfsイメージをダウンロード
ブートメニュー上で [T]: Initiate TFTP firmware transfer.
を呼び出してTFTPを実行し、initramfsイメージをサーバからダウンロードする
5. ##### initramfsイメージを実行
TFTPサーバからのダウンロードが完了後、 Save as Default firmware/Backup firmware/Run image without saving:[D/B/R]?
と表示されたら R キーを押下し、Flashには書き込まずブートする
6. ##### メーカーファームウェアをバックアップ
もし将来的にメーカーファームウェアに書き戻す可能性がある場合など、必要であればメーカーファームウェアをバックアップするdd
を用い、 /proc/mtd を確認の上
- firmware-info
- kernel
- rootfs
を最低限取り出し、scp等でPCに転送し保管する
例)
root@OpenWrt:/# mkdir /tmp/mtd
root@OpenWrt:/# cd /tmp/mtd
root@OpenWrt:/tmp/mtd# cat /proc/mtd
dev: size erasesize name
mtd0: 001c0000 00010000 "u-boot"
mtd1: 00010000 00010000 "firmware-info"
mtd2: 00010000 00010000 "dtb"
mtd3: 00010000 00010000 "u-boot-env"
mtd4: 00010000 00010000 "board-info"
mtd5: 00600000 00010000 "kernel"
mtd6: 01800000 00010000 "rootfs"
mtd7: 00600000 00010000 "kn2"
mtd8: 01800000 00010000 "rfs2"
mtd9: 01200000 00010000 "part1"
mtd10: 01200000 00010000 "part2"
mtd11: 01e00000 00010000 "config"
root@OpenWrt:/tmp/mtd# dd if=/dev/mtdblock1 of=mtd1_firmware-info.bin
128+0 records in
128+0 records out
root@OpenWrt:/tmp/mtd# dd if=/dev/mtdblock5 of=mtd5_kernel.bin
12288+0 records in
12288+0 records out
root@OpenWrt:/tmp/mtd# dd if=/dev/mtdblock6 of=mtd6_rootfs.bin
49152+0 records in
49152+0 records out
バックアップをデバイスに書き戻す際は、 mtd
コマンドを用いて書き込む
mtd write <backup image> <target partition>
例)
mtd write mtd1_firmware-info.bin firmware-info
mtd verify mtd1_firmware-info.bin firmware-info # 書き込まれたデータが元データと一致するか検証
OpenWrt上でsysupgradeを実行
scpなどを用いてsysupgradeイメージをデバイス上にアップロード(またはダウンロード)し、sysupgradeを実行する
8. ##### 完了
Flashへの書き込みが完了後再起動され、OpenWrtで起動する
この時メーカーファームウェアで起動してしまう場合は、ブートメニューに入った上で [B]: Boot with backup firmware and set as default.
を呼び出し、デフォルトのOSイメージをOpenWrtを書き込んだ1番目の方に切り替える
備考
- 今回のサポートにおいて、CONSOLEポートのbaudrateはFortiGateで広くデフォルトとして使用されている9600bpsを前提としている。
その他の値に設定されていた場合、Linux Kernelのdmesgが出力されないなどのトラブルが起きる為注意する。 - WAN1, WAN2ポートはデフォルトでブリッジを構成している為、上流が1系統である場合はどちらに接続しても問題無い。
ただし、それぞれで別系統のWANを利用する場合、ブリッジを解除しそれぞれにOpenWrtの仮想インターフェースを割り当て直す。 - OpenWrtのサポートにおいては、Flash内に2組存在するOSイメージ領域のうち1つ目の最小限を利用するよう構成しており、もう片方のメーカーファームウェアに対しての影響は恐らく無いと思われる。
この為、ブートメニューにおいて[B]: Boot with backup firmware ~
を選択することで、必要に応じてOpenWrtとメーカーファームウェアを切り替えてブートできる。 - 中古などで入手する場合、本機種のDCジャックは特殊であり通常の丸形プラグを持つACアダプタを使用できない為、基本的にはACアダプタが付属するものの選択を推奨。
なお、嵌合するプラグはMolex 5557-02Rであり、自作することは可能(例)。 - FortiGate/FortiWiFi 51EとFortiGate 52EはmSATA SSDを搭載しており、メーカーファームウェアではログの保存等に使用される。
任意のメーカーのものに交換できることは確認済みであるものの、1枚当たりの消費電流値はできるだけ1A以内のSSDを選定するのが無難と思われる。
作業時の色々
- 基本的には一部を除いてFortiGate 50Eと共通のハードウェアであり、それ故にDeviceTreeなどのコードを仕立てるのは比較的容易であった。
- FortiGate 52EでmSATA SSDが搭載されているスロットをMiniPCIeとして利用できるか試したものの、カードが認識されず不可だった。
- 当初FortiGate 52Eのみを追加するPRをオープンしたものの、他のコントリビュータから "ほかのFortiGate/FortiWiFi 30E/50E系列に興味は無いか" という提案があり、その方がまとめた情報を見る限りでは然程手間は掛からなさそうに思えたので、提案された機種を追加することにした。
はじめはFortiWiFi 30Eも追加していたものの、テストを依頼したところ何故かネットワーク周りの動作不良が発生しているという報告があった(が何故かFortiGate 30Eでは再現しない)為、最終的にはFortiWiFi 30Eは除外し、それ以外の50E系列機4機種のみとなった。
なおさらにほかの方からFortiWiFi 30Eのモバイル回線対応派生機の追加の提案もあったものの、前述の通り素のFortiWiFi 30Eでトラブルを起こしていたことと、モデムを使用する為に必要なパッケージ等の知見があまり無く手間が掛かりそうだと思い、今回は見送ることにした。 - mSATA SSDを搭載しているFortiGate 52EではSSD上のファイルシステム内に存在するファイルの読み書きをテストしてみたものの、特に書き込みではCPUを2コアのうち1コア使い切って頭打ちになってしまうようで、パフォーマンス的には伸び悩む結果ではあった。
その為、NAS用途などとして性能が必要なしっかり使う用途よりは、おまけとしてや、軽量なデータの保管場所とするような用途が適しているかもしれない。
色々
今回はFortiGate 50E系列機が一気に増加。国内ではFortiGate/FortiWiFi 51Eは見当たらないものの、選択肢が増えたので良し。
mSATA SSD搭載機はパフォーマンス面の不足は少々あるものの、使い方の幅が広がる点においては大きい。
WRC-X1800GS内部
秋葉原方面などで新品が安価に放出された折に、とある方より提案を頂いて提供頂いたものです。
まとめていきます。
仕様
サポート済のWN-DEAX1800GRに続いて2機種目の、MT7621ベースな11ax機です。基本的にはWN-DEAX1800GRとハードウェア構成は近くなっています。
WRC-X1800GSもどちらかというとAP寄りの使用を想定した機種であるのか、有線ポートは計3ポートに絞られています。
なお、法律の関係上無線機能の使用は非推奨です。
- SoC: MediaTek MT7621A
- RAM: DDR3 256MiB
- Flash: RAW-NAND 128MiB (MX30LF1G28AD-TI)
- WAN/LAN: 1000Mbps x1/1000Mbps x2
- UART: J2, 115200bps(三角のシルク印刷から3.3V, TX, RX, NC, GND)
その他詳細については、雑記を参照。
OpenWrt化
これもWN-DEAX1800GRと同様に、2段階での導入が必要です。
- WRC-X1800GSをブート
http://192.168.2.1/
にアクセスし、ファームウェアの更新ページへ移動- OpenWrtのinitramfs-factory.binイメージを選択して適用ボタンを押下し、ファームウェアの更新を実施
- 更新が完了後再起動されるので、OpenWrtで起動したらsysupgrade.binイメージをscp等を用いてデバイス上に転送し、sysupgradeを実施
- Flashへの書き込みが完了後再起動され完了
備考
- I-O DATAのWN-DEAX1800GRやWN-DX1167Rほかと同じくMSTCによって製造された機種であり、デュアルブートの管理などがほぼ同じ仕様になっている。この機種もFlash内に2つのOSイメージ用領域を抱えており、ファームウェア更新毎に切り替わる仕様となっている。
OpenWrtにおいては1つ目の領域のみを使用する。 - ブートローダであるU-Bootはデフォルトで
bootmenu_delay
に0
が設定されており、それ故にブート時にU-Bootのブートメニューが表示されることなくLinux Kernelのブートに入ってしまい、止めることができない。 OpenWrtにおいてはsysupgrade時にこの値を確認し、0
である場合3
に設定している。 なお、WN-DX1167Rなどでブートを中断できるようにするかどうかの管理を行っていたdebugflag
はWRC-X1800GSでも存在するものの、メーカーファームウェアにおいてのデバッグ機能に関係するのみで、ブート周りには関与していない。 - 販売されていた期間内に一度ハードウェアの仕様変更が生じており、フロントにある緑色の "2.4GHz" LEDに割り当てられるGPIOピンが変更されている。 OpenWrtにおいてはメーカーファームウェアと同じように、仕様変更前と変更後の2つのGPIOピンそれぞれで計2つの同じLEDを定義し、デフォルトで同じ動作をするように構成した。
作業時の色々
- ファームウェアを必要な形式で生成するにあたり、2つのヘッダのうちELECOM特有の片方は既に生成コードが存在するものの、もう片方は新たに書き起こす必要があるかもしれないと当初考えていた。 が、色々確認してみるとサポート済のZyXEL WSM20がWRC-X1800GSと大体似通った構成であり、ほぼ同じ形式を生成できるコードが存在していた為、WRC-X1800GSに必要な変更をそのコードに加えるのみで済んだ。
- WRC-X1800GSもWN-DEAX1800GRと同様に、MT7915DがMT7621のPCIe 1本では帯域が不足することから、合計2本を使用して接続されている。
- initramfsベースのfactoryイメージを介した2段階の導入を簡略化する為に、OpenWrtにおいてデュアルブートの取り扱いができないかといくつか試行錯誤したものの、Linux Kernelにおけるbootargsの解釈周りの仕様の関係上どうしてもpatchの追加が避けられないほか、ヘッダのチェックサム絡みの仕様の関係上変更量がだいぶ増大してしまう為、できなくはないものの今回はそこまでする意欲が湧かず、断念した。Linux Kernelに対して追加したpatchがOpenWrtにおいてacceptableかどうかが判然としなかったというのも理由の一つ。
色々
提供頂いた後、他機種と並行しながらも作業を進め、デュアルブートできないかと思いつつもLinux Kernelその他の仕様上厳しいことがわかり断念するなどしながらも何とかマージまで到達。
11ax対応機ながら元々がエントリー帯であることから新品でも放出価格がだいぶ落ちており、選択肢としてアリかもしれない。
WMC-S1267GS2, WMC-M1267GST2内部
吉川のハードオフに立ち寄った際、ジャンク扱いでかなり安くセット品であるDLGST2を見付け、その場で散々迷った末に確保したものです。
マージされてから1か月近く経過してしまっていますが、まとめていきます。
仕様
基本的には既にサポート済のELECOM WRC-1167GS2やWRC-1167GST2にほぼ同等のハードウェア構成であり、特段目新しい点は無し。
なお、法律の関係上無線機能の使用は非推奨です。
共通
- SoC: MediaTek MT7621A
- RAM: DDR3 256MiB (NT5CC128M16JR-EK)
- Flash: SPI-NOR 32MiB (W25Q256JVFIQ)
- UART: J4, 57600bps(三角のシルク印刷から3.3V, GND, TX, RX)
WMC-M1267GST2
- WAN/LAN: 1000Mbps x1/1000Mbps x4
WMC-S1267GS2
- WAN/LAN: -/1000Mbps x4
その他詳細については、雑記を参照。
OpenWrt化
既にサポート済のWRC-*GS/GSV/GST(2)系統と同様に、factoryイメージによる直接投入が可能です。
- WMC-M1267GST2またはWMC-S1267GS2をブート
http://192.168.2.1/
にアクセスし、ファームウェアの更新ページへ移動- OpenWrtのfactory.binイメージを選択して適用ボタンを押下し、ファームウェアの更新を実施
- Flashへの書き込みが完了後再起動され完了
備考
- WMC-S1267GS2はメッシュ子機側であることからメーカーファームウェアにおいてLAN側のDHCPが提供されていない。OpenWrt導入時はPC側のIPアドレスを手動で
192.168.2.0/24
の.1
を除いたいずれかに設定する。 - 前述の通りWMC-S1267GS2は子機側でありWANポートを搭載しない計4ポート構成となっている為、OpenWrtにおいても全てのポートがLAN側扱いとなっている。WAN側のポートを利用したい場合は、任意のポートをブリッジから外したりVLANを利用するなどしてwanゾーンに割り当てる。
作業時の色々
- 既に散々触ったWRC-*GS/GSV/GST(2)系列とほぼ同等である為、然程難しい点は無かった。
- 唯一WMC-S1267GS2におけるOpenWrt導入についてのみ、メッシュ親機側との連携を確立しなければアクセスできないのではと不安になったものの、確認してみたところ連携確立前にも固定のIPアドレスでWebUIがアクセス可能であることが分かり、factoryイメージ投入手段を得られた。
色々
Wi-Fi 5 (11ac)世代であることから既に中古もだいぶ価格が落ちており、WRC-*GS/GSV/GST(2)系列と併せて手軽に導入できる機種としての活用も良さそう。
特にWMC-S1267GS2はWANポートが無い点はやや引っ掛かるものの、子機故にメーカーファームウェアでは単体で使用できないからか、少し前に安価で新品が放出されるなどしていたことから、選択肢としてアリかもしれない。
さて、最近のELECOM公式のセールによってすっかりお馴染みとなったWAB-I1750-PSですが、OpenWrtにおいて "SERIAL" ポートの動作がサポートされました。
留意する点がいくつかある為、まとめていきます。
仕様
ファームウェアでのSERIAL ポート
メーカーOpenWrtでのSERIALポート
- デフォルトではコンソールの割り当ては無し
* Enterキーを押しても改行されていくだけで、シェルは表示されず、操作は不可 - Linux Kernelのデフォルトである9600bpsで動作
- デフォルトではコンソールの割り当ては無し
OpenWrtにおけるSERIALポートの使用
2024/03/26改訂: WAB-I1750-PSのサポート用コードを変更するほか、OpenWrtのシステム系に手を入れることでLinux KernelやOpenWrtのコンソールをデフォルトで割り当てられそうだ、と思い至ったので変更を試して投げ込み、マージされました。
下記コミット以降において、U-Boot部分とOpenWrtの一部システムメッセージを除いて、 "SERIAL" ポートを "SERVICE" ポートと同様に利用することが可能です。
procd: update to Git HEAD (2024-03-25) · openwrt/openwrt@ff064b6
備考
- OpenWrtの一部システムメッセージは "SERVICE" ポートにのみ出力され、 "SERIAL" ポート側には出力されない
*- config restore -
*- failsafe button <button> was pressed -
(failsafeモード移行時)
*- failsafe -
(failsafe移行時)
* sysupgrade時のCommencing upgrade. Closing all shell sessions.
以降のログ
など
- OpenWrtの一部システムメッセージは "SERVICE" ポートにのみ出力され、 "SERIAL" ポート側には出力されない
何らかのアプリケーションで /dev/ttyATH1
をオープンするか、ポートにOpenWrtのコンソールを結び付けるなどして使用してください。
* ### 共通
* シェル上でbaudrateをデフォルトの9600bpsから変更する場合は、
stty
コマンド等を使用する* 例: stty -F /dev/ttyATH1 115200
### OpenWrtのコンソールとして使用
1./etc/inittab
の末尾に以下を追記
ttyATH1::askfirst:/usr/libexec/login.sh
2. WAB-I1750-PSを再起動
ブート後半でSERIALポートのコンソール上にPlease press Enter to activate this console.
と表示され、操作が可能になる注:firstboot
すると/etc/inittab
の変更が消失し、コンソールが再び開けなくなるので注意すること。また、sysupgrade時に引き継がれる対象のファイルに含まれていない可能性があるので、その点も注意する。なお、追記済みの/etc/inittab
ファイルを用意して、Image Builderでそれを組み込んだイメージをビルドすることも可能。
技術的な話
WAB-I1750-PSが搭載しているSoCであるQualcomm Atheros QCA9558の属するQCA955xシリーズでは、プライマリのUARTにはごく一般的な8250互換である16550 UARTを搭載しているが、それに加えてセカンダリとしてAtheros AR933xが搭載するUARTと互換のものを備えている。
前者は "SERVICE" ポートや、それと同一ラインである内部ピンヘッダに割り当てられ、メーカーによるデバッグや復旧用となっている一方で、後者はこの記事で主題となっている "SERIAL" ポートに割り当てられ、ユーザーによる設定用として供用されている。
QCA955x SoCにおいて、16550 UARTは何ら問題無くサポートされ機能する状態であるものの、AR933x互換UARTについてはこれまでQCA955x SoC上ではOpenWrtにおいてサポートされておらず、WAB-I1750-PSのサポートがOpenWrt公式にマージされた時点では使用不可の状態であった。
ただ、それがマージされた時点で少々気になっていた点があり、落ち着いてからDeviceTreeを弄ってみたところ、Linux Kernelへのpatch等は無しで動いてしまった。そこで折角だからとQCA955x SoCにAR933x互換UARTのサポートを追加する変更と、WAB-I1750-PSでそれを有効化する変更を仕立ててOpenWrt公式に投げ込み、マージされた。
これにより、OpenWrt公式のファームウェアでも "SERIAL" ポートが使用できる状態となった。
ちなみに、できればメーカーファームウェアと同じ115200bpsで動作させたかったものの、DeviceTreeプロパティの current-speed
がAR933x互換UARTのドライバではサポートされていなかった為、やむなく9600bpsで置いておくことになった。
当初はLinux Kernelのdmesgも "SERIAL" ポートに "SERVICE" ポート同様出力させようとしてみたものの、OpenWrtのプロセス管理ツール(systemdの代替)であるところのprocdによるコンソールの検出ロジックとLinux Kernelによるメインコンソールの取得ロジックが嚙み合わずworkaroundを用いた結果、failsafeモード下において "SERVICE" ポート側の入出力が壊れる問題が発生した為、断念してdmesgは流さないこととした。
具体的にはLinux Kernelがbootargsに存在する複数の console= 引数のうち最後を /dev/console として割り当てるのに対し、procdは最初のものをOpenWrtのコンソールとして取得してしまう為、対象となるコンソールの不一致が起きた。その為の対処として "SERVICE" 側のコンソール (ttyS0) を最初と最後で2回設定したところ、通常起動のOpenWrtコンソールでは問題無いものの、failsafeモードにおいては "SERVICE" 側の入力が壊れた(入力が中途半端な状態で送出される, 前の入力が一緒に送出される等)。
また、/etc/inittab
へユーザーによる追記が必要な点については、あくまでWAB-I1750-PSでは ttyATH1 が設定用シリアルコンソールとして供用されているというだけで、それ以外のデバイスでは他の目的で用いられている可能性が絶対に無いとは言い切れない為、ath79/generic の /etc/inittab
としてttyATH1をコンソールに割り当てたものを用意することはしなかった。
2024/03/26追記分:
上記のLinux Kernelとprocdのコンソール取得方法の差による問題は、procdにおいてbootargs内に複数の console=
パラメータを検出した場合に、特定のコンソールデバイス (/dev/ttyS<n>
) の代わりにLinux Kernelが設定済みの /dev/console を使用するように変更することで対処した。
また、OpenWrtのコンソールとして登録する点については、procdがコンソールを探すのに使用する /etc/inittab の内容をブート時に毎回チェックし、OpenWrtがブートされているデバイスがWAB-I1750-PSで、なおかつ ttyATH1::askfirst
が存在する場合は何もせずスキップし、存在しない場合はエントリを追加するスクリプトを追加することで対処した。
なお、一部システムメッセージが "SERIAL" 側に出力されないのは、前述の通りprocdが /dev/console(**/dev/ttyS0**("SERVICE" ポート側) が割り当てられたもの) を出力先として使用していることが理由。これについては複数のコンソールに出力できない関係上、U-Bootの出力先である "SERVICE" 側をOpenWrtでも一貫してメインのコンソールとして設定した。
また、U-Bootが "SERIAL" 側で出力されない点については、そもそもU-Bootが "SERIAL" ポートへの出力を想定せず、セットアップも行っていないことが原因なので、どうしようもない。U-Bootを操作したい場合は "SERVICE" ポートを使用する。
WAB-S600-PS, WAB-S1167-PS, WAB-I1750-PS内部
3年半くらい前に某氏がWAB-I1750-PSの作業を始め、当方では興味があったので少し弄って放置していました。
が、最近割引セールでWAB-I1750-PSが話題になったことに伴い、せっかくだからとWAB-S600-PSとWAB-S1167-PSも確保して1750とコードを共有させる形で組み立て直して投げ込み、マージされました。
まとめていきます。
仕様
基本的に3機種ともハードウェアはかなり似通っており、特に600と1167は同一と思われ、ソフトウェア面での差のみと推測されます。
法律の関係上、無線機能の使用は非推奨です。
WAB-S600-PS
WAB-S1167-PS
WAB-I1750-PS
その他詳細については、雑記を参照。
OpenWrt化
WABをブートしWebUIにアクセス
ACアダプタまたはDHCPの無いPoEに接続してデバイスをブートし、192.168.3.x
に設定したPCを "PSE" ポート側に接続して http://192.168.3.1
にアクセスする
2. ##### factory.binイメージでアップデートを実行
ファームウェア更新ページを開き、OpenWrtのsquashfs-factory.binイメージを選択してアップデートを実行する
3. ##### 完了
Flashに書き込み後再起動され、OpenWrtでブートしてくれば完了
備考
- イーサネットポート2つはデフォルトでブリッジされ、DHCPで
192.168.1.0/24
のアドレスが配布される状態となっている。
DHCPが他から配布される上流ネットワークに接続する場合、OpenWrtのLANインターフェースを静的アドレスからDHCPクライアントに変更するなどの設定を行う。 - "SERVICE" ポートは内部ピンヘッダと同じ入出力が行える、SoCのプライマリかつデバッグ用シリアルポートである一方で、RJ-45ジャックであるものの電圧と配列が特殊であり、所謂Ciscoケーブルとは互換性は無い。
- "SERIAL" ポートはSoCの持つセカンダリのシリアルポート。このポートは "SERVICE" ポートのシリアルポートとは別の仕組みであり、WAB 3機種のサポート時点ではLinux KernelやOpenWrtでのサポートが無い為、OpenWrt環境下では利用できない。
なお、今後サポートされたとしても、U-Bootの出力先が "SERVICE" 側である関係上、U-BootとLinux Kernel (OpenWrt) で一貫させる為に "SERIAL" 側にLinux Kernelのdmesgを出力させるようにはしない。
(メインのコンソール入出力ポート以外にdmesg出力のみ(入力無し)を他のポートに割り当てることはLinux Kernelの機能によって可能であるものの、出力だけの為に "SERIAL" ポートを占有するのもどうかと思うのでやらない)
作業時の色々
- 今回のWABシリーズ3機種のファームウェアは、先行してサポートされているI-O DATA WN-AC733GR3やWN-AC1167GRと同じファームエア形式を採用しており、OpenWrt側に生成コードが既に存在していることから、WAB用のWebUIから投入できるfactoryイメージの生成も問題無く行えた。
- 基板自体は3機種とも同一であり、無線の差異によってSoCや5GHz帯用無線チップ、アンテナ回路の実装がわずかに異なる程度だった。
- 基本的には以前自分が弄ったコードと某氏が作業したコードをすり合わせ、当時のOpenWrtにおける実装方法から変更されたものは今現在の形に書き換えるなどの変更を行った。
色々
前述の通りWAB-I1750-PSは3年半ぶりとなるので、当時の記憶を思い出しつつの作業となった。
最終的に "SERIAL" ポートは少々気になるものの、マージされたので一安心。"SERIAL" については気が向いたら少し弄ってみるかもしれない。
今回は筐体を開けて内部のUARTピンヘッダを利用したものの、毎回開けるのは面倒なので、 "SERVICE" ポートをRJ-45から2.54mm間隔のピンヘッダに変換する基板を製造予定。