大破ログ

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

LEDE-ProjectをWN-G300DGRに対応させてみる

発端

  • 2ch(5ch)のOpenWrt/LEDEスレで、 "WN-G300DGRにOpenWrtを入れた人がいる" という情報を見かける
  • 面白そう
  • ざっくり調べてみる
  • 入れた方の記事が見つかる -> IODATA WN-G300DGR OpenWrt 化事前調査 : Royal Windows
  • 構成がかなり似ている機種があるらしく、0からではないのであればなんとかなりそう
  • ざっと見た感じではWN-G300DGR用のプロファイルを用意した上でネットワーク周りと各種LED及びボタン類の調整のみでいけそう
  • 学習に良さそう

注意

  • 前述の通り、0から対応させたのではなく類似機種と先行情報があった
  • 作業内容の理解度は半々程度。
  • 2019/06/22追記: この時内包した問題点の修正と、後のOpenWrt (LEDE-Project)で採用される方法が変更された、あるいは定まっていなかった方法が一点に決定された点などへの追従を最近大量に行いました。現在この記事を参考にすることは全く推奨されません

リポジトリ

musashino-build/openwrt (旧リポジトリ: musashino-build/lede-source
OpenWrtとLEDE-Projectが再統合してopenwrtリポジトリに移行したため、旧リポジトリは更新停止し以降は上記musashino-build/openwrtリポジトリで継続

ビルド済みファーム

Jenkinsにプロジェクトを作り、適当なタイミングでビルドしています。
ダウンロードは taiha.net/jenkins からどうぞ。なお、無線関連はFlashの領域確保のためドライバからユーティリティまで全て飛ばしてあります。

写真など

  • 基板全体
    IMG00370
  • 作業時
    シリアルはCN1で、三角からVcc, GND, TX, RX。接続時はケーブル側をNC, GND, RX, TXとして接続。TX, RXはスルーホールを埋めているハンダがすぐ抜けたものの、GNDとVccは手こずり上手くいかなかったため、GNDは別の場所(アンテナ付近)にピンを立てた。


    IMG00377

作業開始

  • プロファイルの用意

    単一のデバイスとしてファームを生成させるため、WN-G300DGR用に必要な各種ファイルを用意/変更する。プロファイルというのは半ば勝手な呼び方。 新規に追加するファイルは以下の通り。

    変更するファイルは以下の通り。

    • target/linux/ramips/base-files/etc/board.d/01_leds
      システムステータスを表すために使用されるLEDの指定。
    • target/linux/ramips/base-files/etc/board.d/02_network
      ネットワークのデフォルト構成ファイル。LANとWANにそれぞれ割り当てるポートの指定とMACアドレスの指定を行う。
    • target/linux/ramips/base-files/lib/ramips.sh
      ルータに搭載されるボードの名前などの対比を設定。
    • target/linux/ramips/base-files/lib/upgrade/platform.sh
      sysupgrade時に確認されるデバイス名の設定(たぶん)。
    • target/linux/ramips/image/rt305x.mk
      バイス毎のファームウェアの生成方法を指定。デバイス毎にデフォルトで含めるパッケージもここで指定。
  • 経過

    • とりあえずWL-351から大体コピー / commit: e4b2709
      WN-G300DGRとWL-351はハードの構成がほぼ同じということで、とりあえずdtsファイルを始めとして変更するファイルもほぼコピーして複製。デバイス名等はWN-G300DGRに変更。01_ledsのみ、搭載されているLEDが不明のためこの時点では変更せず。
      なお、02_network内のスイッチの設定については前述の先行情報のサイトにて別の記事で書かれていたものの、確認漏れでこの時点ではWL-351のまま設定。

      ちなみに、この時点ではまだWN-G300DGRは持ってなかったりする。
      (2017/10/31 14:55)
    • スイッチ構成を修正 / commit: 4a7edf4
      この時点でようやくスイッチの情報が前述のサイトにあることに気付き、02_networkを修正。
      これで3番ポートにデフォルトでWANが割り当てられるようになった(修正前は存在しない4番ポートに割当てになっていた)。
      (2017/10/31 22:50)
    • 定義済みLED, ボタン類の削除 / commit: b2c480e
      OpenWrt Wikiにある通り、GPIOを直接操作してLEDとボタン類のGPIOピン番号を確認するために、一旦dtsファイルにて定義済みのLEDとボタン類を全て削除。
      定義された状態では、特にLEDがGPIOを占有してしまっていて確認ができなかった。
      (2017/10/31 22:53)
    • LEDの定義を追加 / commit: d3c1256
      ここに来てようやくWN-G300DGRを中古で購入し、LEDに割り当てられているGPIOピンを確認。
      前述の通りOpenWrt Wikiにある方法で確認したが、GPIO 7を叩いたタイミングで強制的に再起動が掛かった。理由は不明。1 - 6まで確認後、スクリプトの gpio=$BASE を gpio=8 に書き換えてGPIO 8以降を確認。
      なお、搭載されているLEDのうち "ワイヤレス" LEDについては、RT3052FのGPIOではなく無線部のほうにぶら下がっている形だったため、ここでは追加する必要はなかった。ワイヤレスLEDはLEDEから設定を行うことは可能なものの、GPIOではなく無線部により管理されるため、無線のドライバを削除した場合一緒にこのLEDも使用不可となる。
      (2017/11/10 22:53)
    • ボタン定義の追加 / commit: a2f117b
      LEDに続きボタン類のGPIOピンも確認したため追加。スライドスイッチは少々よくわからず、色々弄ったうえで最終的に 8edbb0a で reset, wps, router の3つのみに。スライドスイッチはAPだけGPIOを取っておらず、残りの "Auto", "Router" にGPIOの割り当てがあることが判明したため、 3bd022f にて修正。
      (2017/11/11 02:24)
    • メーカー名を変更 / commit: 4bd0e01
      なんとなく、IO-DATAよりもIODATAが適切なのかなぁと思ったため。
      (2017/11/11 02:26)
    • LED設定の追加 / commit: eb57599
      ここで01_ledsにデフォルトのLED設定を追加。初回起動時からフロントの青色LEDが電源LEDとして点灯するようになった。 573dc2c では、青色LEDをdiag LEDとしても設定(起動時などに点滅したりする)。
      (2017/11/11 02:54)
    • USB周りのデフォルトパッケージを追加 / commit: 0751245
      USB Type-A端子を搭載しているため、使用できるように試しにusb-core, dwc2ドライバを追加。
      ただし、これだけでは機能せず、次の 37f54f3 でさらにドライバを追加するも依然ダメだったため、2回目の追加分を 4769500 でrevert。
      (2017/11/11 03:27)
    • マージ / commit: 0f75557
      ここまでWN-G300DGRのサポートを追加するためmasterとは別のブランチで作業していたものの、ある程度形になったためここでmusashino-build/lede-sourceのmasterへmerge。
      (2017/11/11 13:43)

起動ログ(LEDE-Project)

  • 121 - 123行目の "switchへの接続に失敗した" というエラーは、恐らくLEDEが最初にルータ上のスイッチを検出しようとするタイミングではRTL8366RBのドライバが読み込まれていないことに起因するものと思われる。
    少し後138行目でスイッチのドライバが読み込まれ、以降は正常に動作する。
  • 115行目ではUSBポートが "1ポート認識された" とログが吐かれるものの、何らかのデバイスを接続しても反応が無い。

[sourcecode] U-boot Ver:1.0.6.20 2011/06/01

Board: Ralink APSoC DRAM: 32 MB 2*16 MB

ASIC 3052_MP2 (Port5GigaSW) Product Name: WN-G300DGR

SDRAM CAS = 3(d1835272)

Please choose the operation: 1: Load system code to SDRAM via TFTP. Bad Magic Number,9DA993F9 Boot from KERNEL 1 !! [ 0.000000] Linux version 4.9.58 (musashino205@Taiha.Net) (gcc version 5.5.0 (LEDE GCC 5.5.0 r0+5730-0c72c27) ) #0 Tue Nov 21 09:34:38 2017 [ 0.000000] SoC Type: Ralink RT3052 id:1 rev:3 [ 0.000000] bootconsole [early0] enabled [ 0.000000] CPU0 revision is: 0001964c (MIPS 24KEc) [ 0.000000] MIPS: machine is IODATA WN-G300DGR [ 0.000000] Determined physical RAM map: [ 0.000000] memory: 02000000 @ 00000000 (usable) [ 0.000000] Initrd not found or empty - disabling initrd [ 0.000000] Primary instruction cache 32kB, VIPT, 4-way, linesize 32 bytes. [ 0.000000] Primary data cache 16kB, 4-way, VIPT, no aliases, linesize 32 bytes [ 0.000000] Zone ranges: [ 0.000000] Normal [mem 0x0000000000000000-0x0000000001ffffff] [ 0.000000] Movable zone start for each node [ 0.000000] Early memory node ranges [ 0.000000] node 0: [mem 0x0000000000000000-0x0000000001ffffff] [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x0000000001ffffff] [ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 8128 [ 0.000000] Kernel command line: console=ttyS0,57600 rootfstype=squashfs,jffs2 [ 0.000000] PID hash table entries: 128 (order: -3, 512 bytes) [ 0.000000] Dentry cache hash table entries: 4096 (order: 2, 16384 bytes) [ 0.000000] Inode-cache hash table entries: 2048 (order: 1, 8192 bytes) [ 0.000000] Writing ErrCtl register=00052213 [ 0.000000] Readback ErrCtl register=00052213 [ 0.000000] Memory: 28092K/32768K available (3033K kernel code, 147K rwdata, 708K rodata, 200K init, 204K bss, 4676K reserved, 0K cma-reserved) [ 0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 [ 0.000000] NR_IRQS:256 [ 0.000000] CPU Clock: 384MHz [ 0.000000] clocksource_probe: no matching clocksources found [ 0.000000] clocksource: MIPS: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 9954481493 ns [ 0.000015] sched_clock: 32 bits at 192MHz, resolution 5ns, wraps every 11184811005ns [ 0.015679] Calibrating delay loop... 255.59 BogoMIPS (lpj=1277952) [ 0.100966] pid_max: default: 32768 minimum: 301 [ 0.110380] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes) [ 0.123477] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes) [ 0.144928] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns [ 0.164495] futex hash table entries: 256 (order: -1, 3072 bytes) [ 0.176719] pinctrl core: initialized pinctrl subsystem [ 0.187980] NET: Registered protocol family 16 [ 0.230672] rt2880_gpio 10000600.gpio: registering 24 gpios [ 0.241771] rt2880_gpio 10000600.gpio: registering 24 irq handlers [ 0.259473] clocksource: Switched to clocksource MIPS [ 0.271207] NET: Registered protocol family 2 [ 0.281139] TCP established hash table entries: 1024 (order: 0, 4096 bytes) [ 0.295008] TCP bind hash table entries: 1024 (order: 0, 4096 bytes) [ 0.307629] TCP: Hash tables configured (established 1024 bind 1024) [ 0.320429] UDP hash table entries: 256 (order: 0, 4096 bytes) [ 0.332019] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes) [ 0.344832] NET: Registered protocol family 1 [ 0.357327] rt-timer 10000100.timer: maximum frequency is 3906Hz [ 0.370538] Crashlog allocated RAM at address 0x1f00000 [ 0.382957] workingset: timestamp_bits=30 max_order=13 bucket_order=0 [ 0.407787] squashfs: version 4.0 (2009/01/31) Phillip Lougher [ 0.419363] jffs2: version 2.2 (NAND) (SUMMARY) (LZMA) (RTIME) (CMODE_PRIORITY) (c) 2001-2006 Red Hat, Inc. [ 0.455324] io scheduler noop registered [ 0.463076] io scheduler deadline registered (default) [ 0.474013] Serial: 8250/16550 driver, 2 ports, IRQ sharing disabled [ 0.488177] console [ttyS0] disabled [ 0.495297] 10000c00.uartlite: ttyS0 at MMIO 0x10000c00 (irq = 20, base_baud = 8000000) is a Palmchip BK-3103 [ 0.515029] console [ttyS0] enabled [ 0.515029] console [ttyS0] enabled [ 0.528971] bootconsole [early0] disabled [ 0.528971] bootconsole [early0] disabled [ 0.546572] 1f000000.cfi: Found 1 x16 devices at 0x0 in 16-bit bank. Manufacturer ID 0x0000c2 Chip ID 0x0022a7 [ 0.566847] Amd/Fujitsu Extended Query Table at 0x0040 [ 0.577247] Amd/Fujitsu Extended Query version 1.1. [ 0.587453] 1f000000.cfi: Swapping erase regions for top-boot CFI table. [ 0.600979] number of CFI chips: 1 [ 0.612182] 4 ofpart partitions found on MTD device 1f000000.cfi [ 0.624363] Creating 4 MTD partitions on "1f000000.cfi": [ 0.635105] 0x000000000000-0x000000030000 : "u-boot" [ 0.647542] 0x000000030000-0x000000040000 : "u-boot-env" [ 0.661236] 0x000000040000-0x000000050000 : "factory" [ 0.674318] 0x000000050000-0x000000400000 : "firmware" [ 0.688924] 2 uimage-fw partitions found on MTD device firmware [ 0.700960] 0x000000050000-0x00000018d377 : "kernel" [ 0.713710] 0x00000018d377-0x000000400000 : "rootfs" [ 0.726592] mtd: device 5 (rootfs) set to be root filesystem [ 0.738117] 1 squashfs-split partitions found on MTD device rootfs [ 0.750623] 0x000000330000-0x000000400000 : "rootfs_data" [ 0.765254] libphy: Fixed MDIO Bus: probed [ 0.776833] rt3050-esw 10110000.esw: RGMII mode, not exporting switch device. [ 0.795291] mtk_soc_eth 10100000.ethernet eth0: mediatek frame engine at 0xb0100000, irq 5 [ 0.812813] rt2880_wdt 10000120.watchdog: Initialized [ 0.824669] NET: Registered protocol family 10 [ 0.838458] NET: Registered protocol family 17 [ 0.847628] 8021q: 802.1Q VLAN Support v1.8 [ 0.862828] VFS: Mounted root (squashfs filesystem) readonly on device 31:5. [ 0.878558] Freeing unused kernel memory: 200K [ 0.887575] This architecture does not have kernel memory protection. [ 1.633398] init: Console is alive [ 1.640737] init: - watchdog - [ 2.036293] kmodloader: loading kernel modules from /etc/modules-boot.d/ [ 2.197073] usbcore: registered new interface driver usbfs [ 2.208389] usbcore: registered new interface driver hub [ 2.219373] usbcore: registered new device driver usb [ 2.240590] dwc2 101c0000.otg: Configuration mismatch. dr_mode forced to host [ 2.291709] dwc2 101c0000.otg: DWC OTG Controller [ 2.301343] dwc2 101c0000.otg: new USB bus registered, assigned bus number 1 [ 2.315635] dwc2 101c0000.otg: irq 26, io mem 0x00000000 [ 2.328007] hub 1-0:1.0: USB hub found [ 2.336224] hub 1-0:1.0: 1 port detected [ 2.350726] kmodloader: done loading kernel modules from /etc/modules-boot.d/ [ 2.365381] random: fast init done [ 2.382949] init: - preinit - [ 2.751290] dwc2 101c0000.otg: Overcurrent change detected [ 2.917051] dwc2 101c0000.otg: Overcurrent change detected Failed to connect to the switch. Use the "list" command to see which switches are available. Failed to connect to the switch. Use the "list" command to see which switches are available. Failed to connect to the switch. Use the "list" comm[ 3.726453] 8021q: adding VLAN 0 to HW filter on device eth0 and to see which switches are available. Press the [f] key and hit [enter] to enter failsafe mode Press the [1], [2], [3] or [4] key and hit [enter] to select the debug level [ 7.251418] jffs2: notice: (313) jffs2_build_xattr_subsystem: complete building xattr subsystem, 0 of xdatum (0 unchecked, 0 orphan) and 0 of xref (0 dead, 0 orphan) found. [ 7.284407] mount_root: switching to jffs2 overlay [ 7.329039] urandom-seed: Seeding with /etc/urandom.seed [ 7.519324] procd: - early - [ 7.525425] procd: - watchdog - [ 8.322087] procd: - watchdog - [ 8.328994] procd: - ubus - [ 8.442323] procd: - init - Please press Enter to activate this console. [ 8.943197] kmodloader: loading kernel modules from /etc/modules.d/ [ 8.963789] ip6_tables: (C) 2000-2006 Netfilter Core Team [ 8.992741] Realtek RTL8366RB ethernet switch driver version 0.2.4 [ 9.005391] rtl8366rb rtl8366rb: using GPIO pins 1 (SDA) and 2 (SCK) [ 9.018436] rtl8366rb rtl8366rb: RTL5937 ver. 3 chip found [ 9.256780] libphy: rtl8366rb: probed [ 9.272512] ip_tables: (C) 2000-2006 Netfilter Core Team [ 9.295480] nf_conntrack version 0.5.0 (1024 buckets, 4096 max) [ 9.383927] xt_time: kernel timezone is -0000 [ 9.407083] PPP generic driver version 2.4.2 [ 9.420101] NET: Registered protocol family 24 [ 9.435053] kmodloader: done loading kernel modules from /etc/modules.d/ [ 17.873556] 8021q: adding VLAN 0 to HW filter on device eth0 [ 17.932526] br-lan: port 1(eth0.1) entered blocking state [ 17.943518] br-lan: port 1(eth0.1) entered disabled state [ 17.955128] device eth0.1 entered promiscuous mode [ 17.964874] device eth0 entered promiscuous mode [ 18.102423] br-lan: port 1(eth0.1) entered blocking state [ 18.113384] br-lan: port 1(eth0.1) entered forwarding state [ 127.039574] random: crng init done

BusyBox v1.27.2 () built-in shell (ash)

 _________
/        /\      _    ___ ___  ___

/ LE / \ | | | | | | / DE / \ | || || |) | | // LE \ |||/|| lede-project.org \ \ DE / \ LE \ / ----------------------------------------------------------- \ DE \ / Reboot (SNAPSHOT, r0+5730-0c72c27) _______\/ -----------------------------------------------------------

=== WARNING! ===================================== There is no root password defined on this device! Use the "passwd" command to set up a new password

in order to prevent unauthorized SSH logins.

root@LEDE:/# [/sourcecode]

課題

  • USB周り
    色々弄ってみたものの、結局現在も使用不可。必要と思われるドライバは導入してあり、起動時にもportを認識したというようなログは流れるも、何かデバイスを接続しても認識せず。
    ぶっちゃけ手詰まり。

総評

バイスのサポートの追加は今回が初めてだったものの、WHR-G300NやWZR-900DHPのおかげでdtsやその他のファイルに何度か触れていたため、あれが必要、これが必要ということに思い至れて行き詰まることが少なく、自分でも驚くほどのペースで進められた。
今回でGPIOについてもなんとなく操作の仕方は覚えられたものの、まだまだ細かい使い方が知りたいので、何かできれば、と思う。(Raspberry Piの類がいいのかなぁと)
一つ、前述の通りUSBポートを使用できるようにすることが課題になっているものの、正直これ以上何を弄ればいいのか見当が付かない。にゃーん。

2018/02/02 追記

USB周り

その後しばらく弄り回した結果、そもそもUSBポートに給電自体行われていないことが判明。
そのため、OpenWrt内の他のramips機で見受けられるようにGPIOをどれかexportすることで給電が行われるようにできないか試したところ、GPIO #7と#22で行われることを発見。

ただしGPIO #7はメーカーファームでルータの再起動に利用されるものらしく、exportしようとするだけでもすぐにリセットが掛かってしまうため違うと判断。残りのGPIO #22をdtsにてexportしたところ、デフォルトでUSBポートから給電が行われるようになった上、接続したデバイスも問題なく認識されるようになった。