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