WXR-2533DHP(経過報告2)

前回の経過報告から10日くらい経過し、いくらか進んだのでここで再び経過報告です。

状況

  • U-Bootのbankチェックをパスできるようになった
    • rootfs checksumがどんな値かも判明。xeditで以下の様に出すことができ、
      wxr-2533dhp_133.PNG
      Linuxでの算出方法は某氏より以下を教えて頂いた。

      od -A n -t u1 | tr -s ' ' '\n' | awk '{s+=$0}END{printf "%x", 255-s%256}'
      
    • 上記により、ブート時にU-Bootのコンソールからbootipqを叩いてチェックをスキップさせる必要が無くなった(→ 何もせずブートできる)
  • KernelのRootfsとU-BootのRootfsチェック用にrootfsボリュームを2つ作る必要が生じた
    • U-Bootは “ubi_rootfs” ボリュームのみを、OpenWrtのKernelは “rootfs” ボリュームのみをそれぞれ固定で参照しようとするため。
      • 当初U-Boot側に合わせてOpenWrt側rootfsのボリューム名をubinizeで “ubi_rootfs” に変更したが、何度試してもrootfsの認識に失敗した。結局、OpenWrt側が target/linux/generic/pending-4.9/491-ubi-auto-create-ubiblock-device-for-rootfs.patch でrootfsとして使えるボリュームを “rootfs” のみに固定していることが判明、やむなく別個で作ることにした。
      • OpenWrtビルド時に生成されるrootfsを “ubi_rootfs” にもそのまま使用するとNAND Flash上のスペースを無駄に占有する(OpenWrt側では使用されない)ため、空のフォルダ1個をsquashfs化して、そこにU-Bootのチェックをパスするのに必要なchecksumを付加するようにした。
  • U-Bootの挙動に絡み、KernelはBank1を、RootfsはBank2のモノを使用することにした
    • U-Bootが、Bank2を “破損している” と判定しない限りBank2⇒Bank1の向きで書き戻しを行い、またその際 “kernel” と “ubi_rootfs” のみの書き戻ししか行わないため。
      • WXR-2533DHPでは、メーカーファームでは当然ながらBank1の “kernel”, “ubi_rootfs”, “ubi_rootfs_data” がブートに使用される。
      • その状態でアップデートを行った場合、更新先のファームはBank1ではなくBank2に書き込み、リブートしてU-Bootのbankチェックが実行された際、イメージが異なるとしてBank2からBank1へイメージが書き込まれ、アップデートが完了する仕組みになっている。
      • OpenWrtの場合、KernelはメーカーファームでもOpenWrtでも “kernel” なのでU-Bootにより問題なくBank2⇒Bank1へ書き込まれるが、RootfsはU-Boot用の “ubi_rootfs” がU-Bootに認識され書き戻されるのみで、Bank2にあるOpenWrt用の “rootfs” は何もされない(= Bank1のrootfsが更新されない)。
      • もしOpenWrtでKernelとRootfsを両方ともBank1から起動できるようにする場合、”kernel” と “ubi_rootfs” はBank2に、”rootfs” とデータ領域の “rootfs_data” はBank1にと2か所に書き込まなければならず、手順が面倒になる。
        また、sysupgrade時も両方への書き込みが必要になり、複雑化してしまう。
      • 対して、kernelはBank1、RootfsはBank2としてしまえば、Bank2に書き込まれたOpenWrtの “kernel” とU-Boot用の “ubi_rootfs” は自動でBank1に書き込まれU-Bootはそれをブートするほか、RootfsはBank2に書き込み済みの “rootfs” を読み込ませれば良いのでだいぶ簡単になる。
      • メーカーファームと現時点でのOpenWrtファームにおけるUBIボリュームの使用状況については、雑記にまとめた。
      • ただし、ぶっちゃけ上記の雑記で改めて表にしてみると「ひどいなこれ」という感想しか出てこない。
      • というのを書きながら、’Bank1にイメージ書き込んだ後Bank2から意図的に “kernel” だけボリューム削除して破損扱いにさせれば、通常とは逆向きのBank1⇒Bank2の書き戻しが発生するから、使用するボリュームをBank1にまとめることもできるかな?’ というのが思い浮かんだ。後で試す。
  • sysupgradeまで機能するようにできた
    • WXR-2533DHPでは上の項目で長々と書いた通り “ubi_rootfs” を上手く扱わなくてはならず、その関係上OpenWrtに存在しているsysupgradeスクリプト(というかNAND向けスクリプトのnand.sh)では対応できない。そのため、いくらか引用したうえでbuffalo.shを作成し、 “ubi_rootfs” をバックアップ/書き戻しすることでsysupgradeを行えるようにした。
    • ただし、テスト回数とテスト条件はあまり多く試せていないため、確実性は不安。
    • また、上のBankの取り扱いで最後に書いた思いついたことを試す場合、再度sysupgrade用スクリプトの改変が必要になるため、どうなることやら。
  • PCI周りがエラーらしきものを吐く
    • ブート時にPCI周辺で “無線のFirmwareが読めない” というようなエラーが吐かれる。
      ただしブート完了後無線は正常に機能しているように見え、また少し検索してみても “問題ない” というような記述が見られる。

      ログ

      [   19.985388] ath10k_pci 0000:01:00.0: enabling device (0140 -> 0142)
      [   19.985940] ath10k_pci 0000:01:00.0: pci irq msi oper_irq_mode 2 irq_mode 0 reset_mode 0
      [   20.172091] ath10k_pci 0000:01:00.0: Direct firmware load for ath10k/QCA99X0/hw2.0/firmware-6.bin failed with error -2
      [   20.172147] ath10k_pci 0000:01:00.0: Falling back to user helper
      [   36.077329] firmware ath10k!QCA99X0!hw2.0!firmware-6.bin: firmware_loading_store: map pages failed
      [   36.492146] ath10k_pci 0000:01:00.0: qca99x0 hw2.0 target 0x01000000 chip_id 0x003b01ff sub 168c:0002
      [   36.492179] ath10k_pci 0000:01:00.0: kconfig debug 0 debugfs 1 tracing 0 dfs 1 testmode 1
      [   36.502471] ath10k_pci 0000:01:00.0: firmware ver 10.4.1.00030-1 api 5 features no-p2p crc32 d2901e01
      [   36.600352] ath10k_pci 0000:01:00.0: board_file api 2 bmi_id 1:1 crc32 08fa09f2
      [   37.865657] ath10k_pci 0000:01:00.0: htt-ver 2.2 wmi-op 6 htt-op 4 cal pre-cal-file max-sta 512 raw 0 hwcrypto 1
      [   37.953404] ath10k_pci 0001:01:00.0: enabling device (0140 -> 0142)
      [   37.953970] ath10k_pci 0001:01:00.0: pci irq msi oper_irq_mode 2 irq_mode 0 reset_mode 0
      [   38.156469] ath10k_pci 0001:01:00.0: Direct firmware load for ath10k/QCA99X0/hw2.0/firmware-6.bin failed with error -2
      [   38.156515] ath10k_pci 0001:01:00.0: Falling back to user helper
      [   38.307675] firmware ath10k!QCA99X0!hw2.0!firmware-6.bin: firmware_loading_store: map pages failed
      [   38.307815] ath10k_pci 0001:01:00.0: qca99x0 hw2.0 target 0x01000000 chip_id 0x003b01ff sub 168c:0002
      [   38.315640] ath10k_pci 0001:01:00.0: kconfig debug 0 debugfs 1 tracing 0 dfs 1 testmode 1
      [   38.327131] ath10k_pci 0001:01:00.0: firmware ver 10.4.1.00030-1 api 5 features no-p2p crc32 d2901e01
      [   38.389439] ath10k_pci 0001:01:00.0: board_file api 2 bmi_id 1:2 crc32 08fa09f2
      [   39.664713] ath10k_pci 0001:01:00.0: htt-ver 2.2 wmi-op 6 htt-op 4 cal pre-cal-file max-sta 512 raw 0 hwcrypto 1
      

今後

  • できればfactoryイメージを作りたいものの、単にKernelとRootfsを投入しただけではリブート後OpenWrtのKernelがRootfsを見つけられなくなるので、どうしたものか

雑感とか

  • SoC(IPQ8064)は負荷に応じてコアごとにクロックが変動していた(384MHz – 1,400MHz)
  • LuCIのページ遷移が体感的に速い
  • どこかで有線のiperf計測したい

お知らせっぽいもの

  • 今のところ今年2月のOSC 2018 Tokyo/Springにて、東海道らぐブースの場所をお借りしてWXR-2533DHPを動態展示させていただく予定です。
    色々詳しい方にご意見等頂ければと思います。
広告

WXR-2533DHPをメーカーファームに書き戻す

弄るうえで一番重要な気がする。書くのを忘れていた。

WXR-2533DHPでのfirmware

WXR-2533DHPでは、U-Bootやデバイス固有の情報(WPS PIN、無線の事前共有鍵、MACアドレス、その他色々)を4MBのSPI Flashに持ち、KernelとRootfs、Rootfs_data は256MBのNAND Flashに持っている。

このうちNANDでは、前半128MB分が 0x0 – 0x4000000 と 0x4000000 – 0x8000000 にそれぞれ分割され、それぞれ mtd0, mtd1 として割り当てられており、それぞれに Kernel + Rootfs + Rootfs_data の同一のイメージが格納されている。ちなみに、後半128MB分は使用されず空。
ただしデータは直接mtdに書き込まれているのではなく、書き込み分散などのウェアレベリング機能を有するUBIにより “kernel”, “ubi_rootfs”, “ubi_rootfs_data” パーティションが形成され、その中にそれぞれ格納されている。

このためか、mtdに対してそのバックアップを直接

# mtd write mtd0.bin /dev/mtd0

として書き込んでも、エラーが大量に出るようになってしまう。

書き戻し

そこで、書き戻しには ubiformat または ubiupdatevol を使用する。

  • ubiformat
    mtdをUBIとしてフォーマットするコマンドではあるものの、-f オプションでイメージの書き込みも可。
    # ubiformat -f <image> <mtd>
    

    上記コマンドを使い、メーカーファームで

    # dd if=/dev/mtd0 of=/tmp/mtd0.bin
    

    などとして取得したイメージを投入する。現状ビルドできているOpenWrt initramfsイメージ上からも可。
    例:

    # ubiformat -f mtd0.bin /dev/mtd0.bin
    

    ただし指定したmtdがUBIでattachされている場合は書き込みができずエラーが出るため、先に ubidetach でdetachしておく。

    # ubidetach -p /dev/mtd0
    
  • ubiupdatevol
    mtd上に存在するUBI Volumeに対して、個別で更新を実行するコマンド。メーカーファームでのファームアップデートでもこれが使われていた。
    ubiformatとは異なり、先にmtdがUBIでattachされている必要がある。

    # ubiattach -p /dev/mtd0
    # ls -al /dev/ubi*
    

    /dev/ubi*_* の最初の数字は、マウントされた順番で割り当てられる。2つ目は 0: kernel, 1: ubi_rootfs, 2: ubi_rootfs_data 。
    基本はそれぞれにkernelやrootfsの単体のイメージを焼き込む。単一のイメージから位置とサイズを指定して実行することも可能。
    位置の指定は、メーカーファームではoffsetを意味する -o オプションが該当、OpenWrtでは –skip オプションが該当すると思われる。

    ubiupdatevol <ubi> <image>
    

    例:

    ubiupdatevol /dev/ubi0_1 /tmp/ubi0_1.bin
    

    メーカーファームでのkernelやrootfsの取り出しは、/dev/ubi*_* をcatでファイルに出力することで可能だった。

WXR-2533DHPをOpenWrtでサポートしてみる(経過報告)

Twitterのほうで色々悩みながら進めてるOpenWrt (LEDE)におけるBUFFALO WXR-2533DHPのサポート追加ですが、まだまだ終わりが見えません。なのでとりあえず経過報告です。

状況

  • OpenWrtのinitramfsイメージでブートできる
    • U-Bootから
      run ramboot
      

      を実行すると、192.168.11.10に “wxr2300-initramfs.uImage” を取りに行く

  • initramfsでブートして、ubiformatを使用してmtd0にOpenWrtを焼き込んで再起動、U-Bootのイメージチェックを特定の操作で回避するとOpenWrtでブートできる
    • ブート中断してU-Bootのコンソールに入り、
      bootipq
      

      を実行

  • 回避策を使わずにそのままブートさせた場合、U-BootによるNAND内bank1, bank2のチェックの際にrootfsのchecksumがエラーだとして弾かれ、bank2からbank1へ書き戻されてしまう
  • U-Bootがチェックに使用するchecksumは、kernelはヘッダに含まれるdata CRC、rootfsは末尾 1Byte
    • v1.32では 0x64 、v1.33では 0xD3
    • メーカーのアップデートファームを展開した場合、rootfsのchecksumの後ろにさらに不明な値が 1Byte付く。
  • rootfsのchecksum算出方法が不明

U-Bootやハードウェアなどの詳細に関しては、雑記の WXR-2533DHP – 大破雑記帳 を参照

作業用OpenWrt リポジトリ

musashino-build/openwrt – devadd/wxr-2533dhp

OpenWrt ファーム

現状ビルドできているファーム。LEDはWANやLAN、USBなどにそれぞれ設定済み
taiha.net/jenkins

  • initramfs
    • openwrt-ipq806x-WXR-2533DHP-initramfs-uImage
      run ramboot用
  • squashfs
    • openwrt-ipq806x-WXR-2533DHP-squashfs-nand-factory.ubi
      initramfsでの
      ubiformat -f <image> /dev/mtd0
      

      実行用

  • factory
    • openwrt-ipq806x-WXR-2533DHP-squashfs-factory.bin
      factoryイメージ(を目指したいもの)。現状正しく投入できず要調整(作り方はたぶんar71xxのBHR-4GRV2が近い)

一言

rootfsのchecksumがどこにあるのか謎だったところから進んだが、今度はchecksumの算出方法が全く分からない。詳しい方、いつでもお待ちしております。

ログ

  • bootm=”bootipq debug”(一部)

    BUFFALO WXR-2533DHP U-Boot Ver 1.14 (May 18 2015 - 13:24:36)
    
    CPU:   IPQ8064 clock 1.4 GHz
    DRAM:  DDR3 512 MiB clock 533 MHz
    NAND:  ECC 4 bits, 256 MiB
    SF: Detected W25Q32 with page size 64 KiB, total 4 MiB
    MMC:   
    In:    serial
    Out:   serial
    Err:   serial
    cdp: get part failed for 0:HLOS
    cdp: get part failed for rootfs
    Net:   MAC2 addr:74:3:bd:bc:1d:98
    athrs17_reg_init: complete
    athrs17_vlan_config ...done
    S17c init  done
    eth1
    Memory Test Start
    Pattern: 55555555
    Pattern: AAAAAAAA
    Pattern: 00000000
    Memory Test Pass 
    
    Hit any key to stop autoboot:  0 
    Checking Bank1 Image ... 
    Creating 1 MTD partitions on "nand0":
    0x000000000000-0x000004000000 : "mtd=0"
    Bank1 Image is good
    kernel_checksum is 0x74fdd894 , rootfs_checksum is 0x64 
    Checking Bank2 Image ... 
    Creating 1 MTD partitions on "nand0":
    0x000004000000-0x000008000000 : "mtd=0"
    Bank2 Image is good
    kernel_checksum is 0x74fdd894 , rootfs_checksum is 0x64 
    Bank1 Image the same as Bank2 Image 
    MMC Device 0 not found
    
    dmagic1 0 dmagic2 0 
     
    MMC Device 0 not found
    Using nand device 1
    Device 1: nand1... is now current device
    bootargs=console=ttyHSL1,115200n8 ubi.mtd=rootfs root=mtd:ubi_rootfs rootfstype=squashfs
    Booting from flash
    set mtdids nand0=nand0 && set mtdparts mtdparts=nand0:0x4000000@0x0(fs),${msmparts} && ubi part fs && ubi read 0x44000000 kernel && bootm 0x44000000
    Creating 1 MTD partitions on "nand0":
    0x000000000000-0x000004000000 : "mtd=0"
       Image Name:   Linux-3.4.103
       Image Type:   ARM Linux Kernel Image (uncompressed)
       Data Size:    1826120 Bytes = 1.7 MiB
       Load Address: 41508000
       Entry Point:  41508000
       Loading Kernel Image ... OK
    OK
    Setting up atags for msm partition: rootfs
    
    device nand0 <nand0>, # parts = 1
     #: name                size            offset          mask_flags
     0: fs                  0x04000000      0x00000000      0
    
    active partition: nand0,0 - (fs) 0x04000000 @ 0x00000000
    
    defaults:
    mtdids  : none
    mtdparts: none
    Using machid 0x1260 from environment
    
    Starting kernel ...
    

  • run ramboot(一部)

    BUFFALO WXR-2533DHP U-Boot Ver 1.14 (May 18 2015 - 13:24:36)
    
    CPU:   IPQ8064 clock 1.4 GHz
    DRAM:  DDR3 512 MiB clock 533 MHz
    NAND:  ECC 4 bits, 256 MiB
    SF: Detected W25Q32 with page size 64 KiB, total 4 MiB
    MMC:   
    In:    serial
    Out:   serial
    Err:   serial
    cdp: get part failed for 0:HLOS
    cdp: get part failed for rootfs
    Net:   MAC2 addr:74:3:bd:bc:1d:98
    athrs17_reg_init: complete
    athrs17_vlan_config ...done
    S17c init  done
    eth1
    Memory Test Start
    Pattern: 55555555
    Pattern: AAAAAAAA
    Pattern: 00000000
    Memory Test Pass 
    
    Hit any key to stop autoboot:  0 
    (IPQ) # run ramboot
    Using eth1 device
    TFTP from server 192.168.11.10; our IP address is 192.168.11.1
    Filename 'wxr2300dhp-initramfs.uImage'.
    Load address: 0x44000000
    Loading: #################################################################
             #################################################################
             #################################################################
             #################################################################
             #################################################################
             #################################################################
             #################################################################
             #################################################################
             #################################################################
             #################################################################
             #################################################################
             #################################################################
             #################################################################
             #################################################################
             #################################################################
             #################################################################
             ###############################
    done
    Bytes transferred = 5478980 (539a44 hex)
       Image Name:   ARM OpenWrt Linux-4.9.73
       Image Type:   ARM Linux Kernel Image (uncompressed)
       Data Size:    5478916 Bytes = 5.2 MiB
       Load Address: 42208000
       Entry Point:  42208000
       Loading Kernel Image ... OK
    OK
    mtdids not defined, no default present
    info: "mtdparts" not set
    Using machid 0x1260 from environment
    
    Starting kernel ...
    

  • ubiformat -f /dev/mtd0(一部)

    root@OpenWrt:/# cd /tmp
    root@OpenWrt:/tmp# wget http://taiha.net/jenkins/job/OpenWrt-master-BUFFALO-WXR-
    2533DHP/lastSuccessfulBuild/artifact/bin/targets/ipq806x/generic/openwrt-ipq806x
    -WXR-2533DHP-squashfs-nand-factory.ubi
    Downloading 'http://taiha.net/jenkins/job/OpenWrt-master-BUFFALO-WXR-2533DHP/lastSuccessfulBuild/artifact/bin/targets/ipq806x/generic/openwrt-ipq806x-WXR-2533DHP-squashfs-nand-factory.ubi'
    Connecting to 240b:12:500:6570:c822:64a3:7e11:4961:80
    Writing to 'openwrt-ipq806x-WXR-2533DHP-squashfs-nand-factory.ubi'
    openwrt-ipq806x-WXR- 100% |*******************************|  6144k  0:00:00 ETA
    Download completed (6291456 bytes)
    root@OpenWrt:/tmp# ubiformat -f openwrt-ipq806x-WXR-2533DHP-squashfs-nand-factor
    y.ubi /dev/mtd0
    ubiformat: error!: please, first detach mtd0 (/dev/mtd0) from ubi0
    root@OpenWrt:/tmp# ubidetach -p /dev/mtd0
    [  388.945705] ubi0: detaching mtd0
    [  388.947550] ubi0: mtd0 is detached
    root@OpenWrt:/tmp# ubiformat -f openwrt-ipq806x-WXR-2533DHP-squashfs-nand-factor
    y.ubi /dev/mtd0
    ubiformat: mtd0 (nand), size 67108864 bytes (64.0 MiB), 512 eraseblocks of 131072 bytes (128.0 KiB), min. I/O size 2048 bytes
    libscan: scanning eraseblock 511 -- 100 % complete  
    ubiformat: 512 eraseblocks have valid erase counter, mean value is 1
    ubiformat: flashing eraseblock 47 -- 100 % complete  
    ubiformat: formatting eraseblock 511 -- 100 % complete  
    root@OpenWrt:/tmp# reboot
    root@OpenWrt:/tmp# [  407.346606] br-lan: port 1(eth1.1) entered disabled state
    [  407.354586] device eth1.1 left promiscuous mode
    [  407.354607] device eth1 left promiscuous mode
    [  407.358018] br-lan: port 1(eth1.1) entered disabled state
    [  407.373520] IPv6: ADDRCONF(NETDEV_UP): eth1.1: link is not ready
    [  411.923545] reboot: Restarting system
    
    
    BUFFALO WXR-2533DHP U-Boot Ver 1.14 (May 18 2015 - 13:24:36)
    
    CPU:   IPQ8064 clock 1.4 GHz
    DRAM:  DDR3 512 MiB clock 533 MHz
    NAND:  ECC 4 bits, 256 MiB
    SF: Detected W25Q32 with page size 64 KiB, total 4 MiB
    MMC:   
    In:    serial
    Out:   serial
    Err:   serial
    cdp: get part failed for 0:HLOS
    cdp: get part failed for rootfs
    Net:   MAC2 addr:74:3:bd:bc:1d:98
    athrs17_reg_init: complete
    athrs17_vlan_config ...done
    S17c init  done
    eth1
    Memory Test Start
    Pattern: 55555555
    Pattern: AAAAAAAA
    Pattern: 00000000
    Memory Test Pass 
    
    Hit any key to stop autoboot:  0 
    Checking Bank1 Image ... 
    Creating 1 MTD partitions on "nand0":
    0x000000000000-0x000004000000 : "mtd=0"
    UBI: volume 2 ("ubi_rootfs_data") re-sized from 9 to 457 LEBs
    Rootfs Checksum Error
    Bank1 Image is fail
    Checking Bank2 Image ... 
    Creating 1 MTD partitions on "nand0":
    0x000004000000-0x000008000000 : "mtd=0"
    Bank2 Image is good
    kernel_checksum is 0x74fdd894 , rootfs_checksum is 0x64 
    Cpoy to Bank1 Image from Bank2 Image 
    Creating 1 MTD partitions on "nand0":
    0x000000000000-0x000004000000 : "mtd=0"
    1826184 bytes written to volume kernel
    size > volume size! Aborting!
    
    NAND erase: device 0 offset 0x0, size 0x4000000
    Erasing at 0x3fe0000 -- 100% complete.
    OK
    Try again
    Checking Bank1 Image ... 
    Creating 1 MTD partitions on "nand0":
    0x000000000000-0x000004000000 : "mtd=0"
    UBI: empty MTD device detected
    UBI: create volume table (copy #1)
    UBI: create volume table (copy #2)
    UBI Volume is empty 
    Bank1 Image is fail
    
    NAND erase: device 0 offset 0x0, size 0x4000000
    Erasing at 0x3fe0000 -- 100% complete.
    OK
    Creating 1 MTD partitions on "nand0":
    0x000000000000-0x000004000000 : "mtd=0"
    UBI: empty MTD device detected
    UBI: create volume table (copy #1)
    UBI: create volume table (copy #2)
    Creating dynamic volume kernel of size 5332992
    Creating dynamic volume ubi_rootfs of size 31490048
    Creating dynamic volume ubi_rootfs_data of size 5332992
    Bank1 UBI Partition is Broken
    Checking Bank2 Image ... 
    Creating 1 MTD partitions on "nand0":
    0x000004000000-0x000008000000 : "mtd=0"
    Bank2 Image is good
    kernel_checksum is 0x74fdd894 , rootfs_checksum is 0x64 
    Cpoy to Bank1 Image from Bank2 Image 
    Creating 1 MTD partitions on "nand0":
    0x000000000000-0x000004000000 : "mtd=0"
    1826184 bytes written to volume kernel
    15233705 bytes written to volume ubi_rootfs
    MMC Device 0 not found
    
    dmagic1 0 dmagic2 0 
     
    MMC Device 0 not found
    Using nand device 1
    Device 1: nand1... is now current device
    bootargs=console=ttyHSL1,115200n8 ubi.mtd=rootfs root=mtd:ubi_rootfs rootfstype=squashfs
    Booting from flash
    set mtdids nand0=nand0 && set mtdparts mtdparts=nand0:0x4000000@0x0(fs),${msmparts} && ubi part fs && ubi read 0x44000000 kernel && bootm 0x44000000
    Creating 1 MTD partitions on "nand0":
    0x000000000000-0x000004000000 : "mtd=0"
       Image Name:   Linux-3.4.103
       Image Type:   ARM Linux Kernel Image (uncompressed)
       Data Size:    1826120 Bytes = 1.7 MiB
       Load Address: 41508000
       Entry Point:  41508000
       Loading Kernel Image ... OK
    OK
    Setting up atags for msm partition: rootfs
    
    device nand0 <nand0>, # parts = 1
     #: name                size            offset          mask_flags
     0: fs                  0x04000000      0x00000000      0
    
    active partition: nand0,0 - (fs) 0x04000000 @ 0x00000000
    
    defaults:
    mtdids  : none
    mtdparts: none
    Using machid 0x1260 from environment
    
    Starting kernel ...
    

WT1520とdtsとGPIO

最近lede-project/sourceにマージされたPR #1542 に関連して、dtsのGPIO関連について初めて理解できた点が多かったので、備忘録的に。
前置きが長いので、不要な人は 本題 まですっ飛ばしてください。

仕様

何はともあれ、まずWT1520の仕様。

  • SoC: Ralink RT5350 (MIPS32, 1C1T, 384MHz)
  • RAM: 32MB
  • Flash: 4MB
  • WAN/LAN: 100Mbps x1 / 100Mbps x1
  • USB: USB 2.0 Type-A x1

ざっくり言ってしまうと、少し古めの所謂ポケットルータ。

問題

OpenWrtから長らく、リセットボタンがdts(Device Tree Source)で定義されておらず使用できなかった。

対処法

Windows使いのOpenWrt(ビルド編) | もくのすけのスペース
で紹介されている通り、dtsに付け足してビルドする。

その後

上記対処法でビルドした結果、LEDEになりramipsのKernelが4.4から4.9に引き上げられる前後までは正常に機能していた。しかし、どこからか(気づいたのがだいぶ遅かったので、どこからNGになったのか正確には不明)この対処法でビルドした場合リセットボタンは機能するものの、シリアルのコンソールが入力を受け付けない状態になってしまった。
個人的にリセットボタンよりもシリアルコンソールが重要なので、泣く泣くリセットボタンを有効化するためのコミットをrevert。

以上が長いけど前置き。

修正してみる

手持ちのルータは基本シリアルを取るようにしているので、リセットボタンが機能しなくても通常は firstboot コマンドで初期化が可能。しかしながら、WT1520に関しては2台所有しているうち片方はシリアルのケーブルをハンダ付けする際に誤って基板上のパターンを剥がしてしまったために、シリアル通信が不可能になってしまった。そのため、どうしてもリセットボタンを使えるようにする必要があった。

修正内容

何度か試行錯誤を重ねた結果、WT1520のFlash 4MB版と8MB版で共通部を定義する WT1520.dtsi を以下のように修正。

修正前

#include "rt5350.dtsi"

/ {
	compatible = "nexx,wt1520", "ralink,rt5350-soc";

	memory@0 {
		device_type = "memory";
		reg = <0x0 0x2000000>;
	};

	chosen {
		bootargs = "console=ttyS1,57600";
	};
};

&uart {
	pinctrl-names = "default";
	pinctrl-0 = <&uartf_pins>;
	status = "okay";
};

&pinctrl {
	state_default: pinctrl0 {
		gpio {
			ralink,group = "jtag";
			ralink,function = "gpio";
		};
	};
};

&ethernet {
	mtd-mac-address = <&factory 0x4>;
};

&wmac {
	ralink,mtd-eeprom = <&factory 0>;
};

&ehci {
	status = "okay";
};

&ohci {
	status = "okay";
};

修正後

ハイライト部分が追加/修正/削除した箇所。

#include "rt5350.dtsi"

#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>

/ {
	compatible = "nexx,wt1520", "ralink,rt5350-soc";

	memory@0 {
		device_type = "memory";
		reg = <0x0 0x2000000>;
	};

	chosen {
		bootargs = "console=ttyS1,57600";
	};

	gpio-keys-polled {
		compatible = "gpio-keys-polled";
		#address-cells = <1>;
		#size-cells = <0>;
		poll-interval = <20>;

		reset {
			label = "reset";
			gpios = <&gpio0 10 GPIO_ACTIVE_LOW>;
			linux,code = <KEY_RESTART>;
		};
	};
};

&uart {
	status = "okay";
};

&pinctrl {
	state_default: pinctrl0 {
		gpio {
			ralink,group = "jtag", "uartf";
			ralink,function = "gpio";
		};
	};
};

&ethernet {
	mtd-mac-address = <&factory 0x4>;
};

&wmac {
	ralink,mtd-eeprom = <&factory 0>;
};

&ehci {
	status = "okay";
};

&ohci {
	status = "okay";
};

変更点


#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>

ボタンの定義に関して、GPIOの0/1をLOW/HIGHと記述したり、ボタンの割り当てコードを数字ではなく文字で記述できるようにするためのincludeを追加


	gpio-keys-polled {
		compatible = "gpio-keys-polled";
		#address-cells = <1>;
		#size-cells = <0>;
		poll-interval = <20>;

		reset {
			label = "reset";
			gpios = <&gpio0 10 GPIO_ACTIVE_LOW>;
			linux,code = <KEY_RESTART>;
		};
	};

ボタンの定義を追加。”gpio-keys-polled” はボタン(key)の種類で、その後の#address-cellsや#size-cells, poll-intervalは正直不明。その下に、個々のボタンの定義が並ぶ。
resetボタンはGPIOチップ0のGPIO10がLOW、つまり0である場合にACTIVE(押されている状態)。codeは他の機種と同様に “KEY_RESTART” を割当て。


&uart {
	status = "okay";
};

pinctrl-names = “default”; と pinctrl-0 = ; の削除。リセットボタンに関して参考にした前述のサイトを読んだ際、”シリアルコンソールとリセットボタンでGPIOピンを共有している” という盛大な勘違いをしてしまい、この箇所を削ると上手く両立できるようになるのでは?と考えた(間違い)。


&pinctrl {
	state_default: pinctrl0 {
		gpio {
			ralink,group = "jtag", "uartf";
			ralink,function = "gpio";
		};
	};
};

39行目の ralink,group に “uartf” を追加。これも上記同様、シリアルとリセットボタンを両立させるために必要なのでは、と考えた(間違い)。


以上が自分で修正してみた点。かなり色々と思い込みが多く、認識を間違えたままやってしまったものの、これでリセットボタンが機能するようになってしまった

PR

できればUpstreamにも反映できないかな、と考えた結果、この状態でPRを出した。正直ブン殴りたい。
予想していなかったわけではないものの指摘が入ったが、どちらかというと予想外な方向だった。

この指摘とそれに関連する議論については、lede-project/source – PR #1542 を参照。恥ずかしい。詳細は記事では割愛します。

 メンテナのmkresin氏の指摘やアドバイスに従って確認作業をしていくと、どうも元々 WT1520.dtsi 自体に問題があったことが判明。どうやら、基板上に出ているシリアルはGPIO10ではなく別のピンの “UART Lite” に接続されているらしい。
 WT1520の搭載するRT5350にはUART LiteとUART Fullが存在し(これも初めて知った)、UART Liteは送受信各1本のみの信号線を有する文字通りLiteなインターフェースで、UART FullはLiteの信号線以外にも各種制御用などの信号線を有するフル機能版ということになる。
 このうち、UART Liteは既に WT1520.dtsi でincludeしている rt5350.dtsi で有効化(status = “disabled” が無い)されており、WT1520.dtsi でも有効扱いとなっている。これだけでUART Liteは使用可能になっているが、何故か WT1520.dtsi ではUART Fullまで有効化していた。
 このため、ttyS0はUART Fullに、ttyS1はUART Lite割り当てられてしまい、そのままでは(デフォルト設定はconsole=ttyS0のため)シリアルコンソールを接続しても通信ができなくなってしまう。そこで、WT1520.dtsi では chosen {}; ノードにより console をttyS1 に設定されていた。

ざっくりまとめると以下の表のとおり。

本来(18cc8d5 以降)

UART status tty bootargs
Lite
(Console)
Enable
(rt5350.dtsi)
ttyS0 (None)
Full Disable (None)

WT1520(18cc8d5 よりも前)

UART status tty bootargs
Lite
(Console)
Enable
(rt5350.dtsi)
ttyS1 console=ttyS1,57600
Full Enable
(WT1520.dtsi)
ttyS0

上記の通りttyS0が入れ替わってしまい、bootargsを設定してUART LiteであるttyS1を指定し直している。では、UART Fullを有効にして何に使っていたかというと、何もしていない。RT5350のdatasheetを見るとUART Fullのピンの中にリセットボタンが接続されているGPIO10があるが、リセットボタンを機能させるのにUART Fullの有効化は必要ない。
要するに、不要なUART Fullを有効にしてそのためにttyS0が変更され、わざわざUART LiteのttyS1を指定し直すという二度手間ということだった。どうしてこうなってしまったのかは謎。

最終的に “UART Full の有効化は必要ないので消してしまおう” ということになり、具体的な修正方法まで示されたので、それに従ってコミットを修正し、それがLEDE-Project masterブランチへマージされた。(後から気付いたが、lede-17.01ブランチにもbackportされていた。)
WT1520.dtsi の最終的なコードは、lede-project/source を参照。

気づいたこと

&pinctrl {
	state_default: pinctrl0 {
		gpio {
			ralink,group = "jtag", "uartf";
			ralink,function = "gpio";
		};
	};
};

は、ピンのグループ(上記だと “jtag” や “uartf”)に対する機能の割り当ての設定ということ。上記ではグループ “jtag” と “uartf” がそれぞれ持っているピンに対して、一括でGPIOとして機能するように割り当てを行っている。この場合、あくまでGPIOとしてのみ動作し、元々のJTAGやUART Fullとして動作することはできなくなる。

もし本来の機能通りに動作させる場合、gpio {}; ノードの中ではなく下記のように設定する。

&uart {
	status = "ok";
}

&pinctrl {
	state_default: pinctrl0 {
		gpio {
			ralink,group = "jtag";
			ralink,function = "gpio";
		};
		uartf {
			ralink,group = "uartf";
			ralink,function = "uartf";
		};
	};
};

1 – 3行目でUART(≠ UART Lite)を有効化し、pinctrl内で uartf {}; を設定して “uartf” グループに対して “uartf” 機能の割り当てを行う。
このうち、pinctrl内の uartf {}; は rt5350.dtsi でも定義されており、それを利用して以下の通りに書くことも可能な模様(commit 18cc8d5 よりも前と同じ状態)。

&uart {
	pinctrl-names = "default";
	pinctrl-0 = <&uartf_pins>;
	status = "okay";
};

&pinctrl {
	state_default: pinctrl0 {
		gpio {
			ralink,group = "jtag";
			ralink,function = "gpio";
		};
	};
};

&uart {}; ノード内に pinctrl-names と pinctrl-0 を追加。

このピンの割り当て方法については、”rt5350 datasheet” などと検索すると見つかるデータシートに詳しく書かれている。
(1 PIN DESCRIPTION -> 1.3 PIN SHARING SCHEME -> Table 1-5 UARTF Pin Sharing Scheme)
これを見ると、UART Fullの持つ8本のピンのうち、全てをUART Fullとして利用するものから半分で分割するもの、全てGPIOとして利用するものなど複数あり、なるほどと思える。
今回、commit 18cc8d5 の前までは全てのピンがUART Fullとして割り当てられ、commit 18cc8d5 以降は逆に全てGPIOとしての割り当てになった。
ちなみに、GPIOとUART Fullでピンを半々に割り当てる場合、

&pinctrl {
	state_default: pinctrl0 {
		gpio {
			ralink,group = "jtag";
			ralink,function = "gpio";
		};
		uartf_gpio {
			ralink,group = "uartf";
			ralink,function = "gpio uartf";
		};
	};
};

というように、ralink,function に並べて指定する模様。

まとめ

mkresin氏、本当に丁寧に教えて頂いてありがとうございました。

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

発端

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

注意

  • 前述の通り、0から対応させたのではなく類似機種と先行情報があった
  • 作業内容の理解度は半々程度。

リポジトリ

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用に必要な各種ファイルを用意/変更する。プロファイルというのは半ば勝手な呼び方。
    新規に追加するファイルは以下の通り。

    • WN-G300DGR.dts
      デバイスの構成情報を格納するファイル (Device Tree Source)。Flash内でのパーティション情報、LED、ボタン類、イーサネットスイッチ等。

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

    • 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ポート認識された” とログが吐かれるものの、何らかのデバイスを接続しても反応が無い。
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:/# 

課題

  • 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ポートから給電が行われるようになった上、接続したデバイスも問題なく認識されるようになった。