おはよう君需要なし

求不得苦な日々

NCP-HG100 調査中

Twitterでもちょこちょこ書いているんですが、NCP-HG100、いわゆるMANOMAの調査をしています。

uboot 遊び

とりあえず ubootのコマンドをちょこちょこ叩いて、どういう風にロードして、ブートしてるのかを確認してみました。

まずは printenv です。

(IPQ40xx) # printenv
baudrate=115200
bootcmd=bootipq
bootdelay=2
eth1addr=dd:dd:dd:dd:dd:dd
ethact=eth0
ethaddr=dd:dd:dd:dd:dd:dd
fileaddr=88000000
filesize=1AC
flash_type=1
ipaddr=192.168.132.1
machid=8010301
serverip=192.168.132.100
stderr=serial
stdin=serial
stdout=serial

Environment size: 286/262140 bytes

bootcmd=bootipq から分かる通り、基本的なブートは

bootipq

というコマンド1つで実施されていて、中身はわかりません。

GitHub - gl-inet/uboot-ipq40xx

GitHubにあるソースコードを読んでみると、bootipq コマンドには debug と引数に書くことでデバッグ情報を出せることがわかります。

(IPQ40xx) # bootipq debug
Using MMC device
bootargs=rootfsname=rootfs_1 rootwait
Booting from flash

MMC read: dev # 0, block # 28194, count 16384 ... 16384 blocks read: OK
runcmd: bootm 0x84000028#config@ap.dk04.1-c4

## Booting kernel from FIT Image at 84000028 ...
   Using 'config@ap.dk04.1-c4' configuration
   Trying 'kernel@1' kernel subimage
     Description:  ARM OpenWrt Linux-4.4.60
     Type:         Kernel Image
     Compression:  gzip compressed
     Data Start:   0x8400010c
     Data Size:    3706933 Bytes = 3.5 MiB
     Architecture: ARM
     OS:           Linux
     Load Address: 0x80208000
     Entry Point:  0x80208000
     Hash algo:    crc32
     Hash value:   3f3888ec
     Hash algo:    sha1
     Hash value:   b89e736642f09d638741a2ac0e176a822d8b62f8
   Verifying Hash Integrity ... crc32+ sha1+ OK
## Flattened Device Tree from FIT Image at 84000028
   Using 'config@ap.dk04.1-c4' configuration
   Trying 'fdt@ap.dk04.1-c4' FDT blob subimage
     Description:  ARM OpenWrt qcom-ipq40xx-ap.dkxx device tree blob
     Type:         Flat Device Tree
     Compression:  uncompressed
     Data Start:   0x843c5534
     Data Size:    33755 Bytes = 33 KiB
     Architecture: ARM
     Hash algo:    crc32
     Hash value:   496024b9
     Hash algo:    sha1
     Hash value:   54c3f8319be5d79c5cb16de0ccbaf6000a93b38c
   Verifying Hash Integrity ... crc32+ sha1+ OK
   Booting using the fdt blob at 0x843c5534
   Uncompressing Kernel Image ... OK
   Loading Device Tree to 86ff4000, end 86fff3da ... OK
Using machid 0x8010301 from environment

Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 4.4.60 (android@androidbuildmachine) (gcc version 5.3.0 (OpenWrt GCC 5.3.0 r48067) ) #3 SMP PREEMPT Thu Mar 21 15:55:35 CST 2019

こんな感じ。 この情報とソースコードをもとに、bootipq を使わずとも手動で動かせるようなコマンドを探しました。

MMC read: dev # 0, block # 28194, count 16384 ... 16384 blocks read: OK

この部分、28194 = 6E22 は mmc のパーティション14の開始位置と一致しますね。(mmc partの結果は保存し忘れた)
あとはソースコードを追ってみて、不足してるコマンドを足していきます。

env set fdt_high 86ff4000
env set bootargs rootfsname=rootfs_1 rootwait
mmc read 84000000 6E22 4000
bootm 84000028#config@ap.dk04.1-c4

一応これで動く。不明点としては下記の2点

  • fdt_high とは一体何か。これに指定すべき値は?
  • なんで mmc はパーティションの先頭から 0x28 ずれているのか??

2つ目は本当によくわかってないです。

実際に、mmcのダンプ(/dev/sdc に 全パーティション dd した)のパーティション14を40バイトずらして mkimage -l してみるとこんな感じ。

$ mkimage -l 40sdc14.img
FIT description: ARM OpenWrt FIT (Flattened Image Tree)
Created:         Thu Mar 21 16:57:58 2019
 Image 0 (kernel@1)
  Description:  ARM OpenWrt Linux-4.4.60
  Created:      Thu Mar 21 16:57:58 2019
  Type:         Kernel Image
  Compression:  gzip compressed
  Data Size:    3706933 Bytes = 3620.05 KiB = 3.54 MiB
  Architecture: ARM
  OS:           Linux
  Load Address: 0x80208000
  Entry Point:  0x80208000
  Hash algo:    crc32
  Hash value:   3f3888ec
  Hash algo:    sha1
  Hash value:   b89e736642f09d638741a2ac0e176a822d8b62f8
 Image 1 (fdt@ap.dk06.1-c1)
  Description:  ARM OpenWrt qcom-ipq40xx-ap.dkxx device tree blob
  Created:      Thu Mar 21 16:57:58 2019
  Type:         Flat Device Tree
  Compression:  uncompressed
  Data Size:    24573 Bytes = 24.00 KiB = 0.02 MiB
  Architecture: ARM
  Hash algo:    crc32
  Hash value:   2fe5090e
  Hash algo:    sha1
  Hash value:   2394a703806613746ce57f7afc4e78d4268f91c9
 Image 2 (fdt@ap.dk04.1-c3)
  Description:  ARM OpenWrt qcom-ipq40xx-ap.dkxx device tree blob
  Created:      Thu Mar 21 16:57:58 2019
  Type:         Flat Device Tree
  Compression:  uncompressed
  Data Size:    24413 Bytes = 23.84 KiB = 0.02 MiB
  Architecture: ARM
  Hash algo:    crc32
  Hash value:   3de84285
  Hash algo:    sha1
  Hash value:   894b3598dad2e22cda6ac4d155e95ead356566c6
 Image 3 (fdt@ap.dk04.1-c5)
  Description:  ARM OpenWrt qcom-ipq40xx-ap.dkxx device tree blob
  Created:      Thu Mar 21 16:57:58 2019
  Type:         Flat Device Tree
  Compression:  uncompressed
  Data Size:    24548 Bytes = 23.97 KiB = 0.02 MiB
  Architecture: ARM
  Hash algo:    crc32
  Hash value:   2fc2f98e
  Hash algo:    sha1
  Hash value:   c5eb850a52daae7e8765bba5f6f9ef676138cddb
 Image 4 (fdt@ap.dk04.1-c1)
  Description:  ARM OpenWrt qcom-ipq40xx-ap.dkxx device tree blob
  Created:      Thu Mar 21 16:57:58 2019
  Type:         Flat Device Tree
  Compression:  uncompressed
  Data Size:    24512 Bytes = 23.94 KiB = 0.02 MiB
  Architecture: ARM
  Hash algo:    crc32
  Hash value:   5ee79cd0
  Hash algo:    sha1
  Hash value:   47a11759c4a3f3592db3fb90687e9fc7c27d3ecd
 Image 5 (fdt@ap.dk07.1-c1)
  Description:  ARM OpenWrt qcom-ipq40xx-ap.dkxx device tree blob
  Created:      Thu Mar 21 16:57:58 2019
  Type:         Flat Device Tree
  Compression:  uncompressed
  Data Size:    21732 Bytes = 21.22 KiB = 0.02 MiB
  Architecture: ARM
  Hash algo:    crc32
  Hash value:   f8d6ee37
  Hash algo:    sha1
  Hash value:   f31b3a8794ad44ef0f35663a3259ef4c8a6ce2ea
 Image 6 (fdt@ap.dk01.1-c3)
  Description:  ARM OpenWrt qcom-ipq40xx-ap.dkxx device tree blob
  Created:      Thu Mar 21 16:57:58 2019
  Type:         Flat Device Tree
  Compression:  uncompressed
  Data Size:    17955 Bytes = 17.53 KiB = 0.02 MiB
  Architecture: ARM
  Hash algo:    crc32
  Hash value:   18f0d9c8
  Hash algo:    sha1
  Hash value:   c3b51bc5a32de4091adddb569df0c0f925afaa5e
 Image 7 (fdt@ap.dk05.1-c1)
  Description:  ARM OpenWrt qcom-ipq40xx-ap.dkxx device tree blob
  Created:      Thu Mar 21 16:57:58 2019
  Type:         Flat Device Tree
  Compression:  uncompressed
  Data Size:    18075 Bytes = 17.65 KiB = 0.02 MiB
  Architecture: ARM
  Hash algo:    crc32
  Hash value:   a834524e
  Hash algo:    sha1
  Hash value:   ea4f70db72ae39d01133244b186110dd4b56fee7
 Image 8 (fdt@ap.dk07.1-c2)
  Description:  ARM OpenWrt qcom-ipq40xx-ap.dkxx device tree blob
  Created:      Thu Mar 21 16:57:58 2019
  Type:         Flat Device Tree
  Compression:  uncompressed
  Data Size:    21417 Bytes = 20.92 KiB = 0.02 MiB
  Architecture: ARM
  Hash algo:    crc32
  Hash value:   ca24813b
  Hash algo:    sha1
  Hash value:   bf91a85fc1a75ea35a55dd58b22bb4e04c16079b
 Image 9 (fdt@ap.dk04.1-c2)
  Description:  ARM OpenWrt qcom-ipq40xx-ap.dkxx device tree blob
  Created:      Thu Mar 21 16:57:58 2019
  Type:         Flat Device Tree
  Compression:  uncompressed
  Data Size:    30100 Bytes = 29.39 KiB = 0.03 MiB
  Architecture: ARM
  Hash algo:    crc32
  Hash value:   8d7ed410
  Hash algo:    sha1
  Hash value:   9205b8f96928d01bb3562fef64f049597fcc1134
 Image 10 (fdt@ap.dk01.1-c1)
  Description:  ARM OpenWrt qcom-ipq40xx-ap.dkxx device tree blob
  Created:      Thu Mar 21 16:57:58 2019
  Type:         Flat Device Tree
  Compression:  uncompressed
  Data Size:    17955 Bytes = 17.53 KiB = 0.02 MiB
  Architecture: ARM
  Hash algo:    crc32
  Hash value:   1312477b
  Hash algo:    sha1
  Hash value:   a24451ce2018a82f7d1a6088dfe39608ecc3e426
 Image 11 (fdt@ap.dk01.1-c2)
  Description:  ARM OpenWrt qcom-ipq40xx-ap.dkxx device tree blob
  Created:      Thu Mar 21 16:57:58 2019
  Type:         Flat Device Tree
  Compression:  uncompressed
  Data Size:    18063 Bytes = 17.64 KiB = 0.02 MiB
  Architecture: ARM
  Hash algo:    crc32
  Hash value:   8754a808
  Hash algo:    sha1
  Hash value:   226ccba27f32415de045da09b2ae5af8b08ba932
 Image 12 (fdt@ap.dk04.1-c4)
  Description:  ARM OpenWrt qcom-ipq40xx-ap.dkxx device tree blob
  Created:      Thu Mar 21 16:57:58 2019
  Type:         Flat Device Tree
  Compression:  uncompressed
  Data Size:    33755 Bytes = 32.96 KiB = 0.03 MiB
  Architecture: ARM
  Hash algo:    crc32
  Hash value:   496024b9
  Hash algo:    sha1
  Hash value:   54c3f8319be5d79c5cb16de0ccbaf6000a93b38c
 Default Configuration: 'config@ap.dk04.1-c4'
 Configuration 0 (config@ap.dk06.1-c1)
  Description:  OpenWrt
  Kernel:       kernel@1
  FDT:          fdt@ap.dk06.1-c1
 Configuration 1 (config@ap.dk04.1-c3)
  Description:  OpenWrt
  Kernel:       kernel@1
  FDT:          fdt@ap.dk04.1-c3
 Configuration 2 (config@ap.dk04.1-c5)
  Description:  OpenWrt
  Kernel:       kernel@1
  FDT:          fdt@ap.dk04.1-c5
 Configuration 3 (config@ap.dk04.1-c1)
  Description:  OpenWrt
  Kernel:       kernel@1
  FDT:          fdt@ap.dk04.1-c1
 Configuration 4 (config@ap.dk07.1-c1)
  Description:  OpenWrt
  Kernel:       kernel@1
  FDT:          fdt@ap.dk07.1-c1
 Configuration 5 (config@ap.dk01.1-c3)
  Description:  OpenWrt
  Kernel:       kernel@1
  FDT:          fdt@ap.dk01.1-c3
 Configuration 6 (config@ap.dk05.1-c1)
  Description:  OpenWrt
  Kernel:       kernel@1
  FDT:          fdt@ap.dk05.1-c1
 Configuration 7 (config@ap.dk07.1-c2)
  Description:  OpenWrt
  Kernel:       kernel@1
  FDT:          fdt@ap.dk07.1-c2
 Configuration 8 (config@ap.dk04.1-c2)
  Description:  OpenWrt
  Kernel:       kernel@1
  FDT:          fdt@ap.dk04.1-c2
 Configuration 9 (config@ap.dk01.1-c1)
  Description:  OpenWrt
  Kernel:       kernel@1
  FDT:          fdt@ap.dk01.1-c1
 Configuration 10 (config@ap.dk01.1-c2)
  Description:  OpenWrt
  Kernel:       kernel@1
  FDT:          fdt@ap.dk01.1-c2
 Configuration 11 (config@ap.dk04.1-c4)
  Description:  OpenWrt
  Kernel:       kernel@1
  FDT:          fdt@ap.dk04.1-c4

FIT Image っぽいな・・・ ということがわかります。

これ適当な FIT Image でも動くんじゃね?ということで、OpenWRTの公式で配られている GL.iNet B1300 の OpenWRT 19.07 の uImage を動かしてみたところ、 なんとかカーネルは上がるみたいです。(デバイスツリーは全然一致してないので全然動きませんが)

後は公式が配ってる Linux のソース内の dts を移植すれば終わりかと思ったら全然そうでもなく、 うんともすんともって感じです。

感想

MANOMA、私みたいな初心者が触っても「なんとか動かせそう・・・?」と思えるデバイスなので、 結構素直な作りをしてるんじゃないかな?と思いました。がまだまだ先は長そう