おは代々木ダイアリー

いろいろ試したメモを書きます。このブログはアフィリエイトを使用したプロモーションを含みます

SONY NCP-HG100 のネットワーク用のドライバをビルドする

ご無沙汰していますが、MANOMAネタで書きます。

ohayoyogi.hatenablog.com

前回記事ではAIホームゲートウェイ「MANOMA NCP-HG100」で開示されているLinuxのソースを使用して armhf な Debian を起動してみた、といった内容を書きました。

今回はその前回執筆時には使用できなかったネットワークインタフェースにドライバを当てることでネットワークを使える Debian にしていきます。

まずはどうなっているのか見る

困ったときの デバイスツリー の確認です。MANOMAをいじり始めてその存在を知ったんですが、ARM系のデバイスはどこに何がつながっているのかをデバイスツリーという形式で定義しておくらしいです。

arch/arm/boot/dts/qcom-ipq4019-ap.dk04.1-c4.dts

というファイルが NCP-HG100 のデバイスツリーのソースファイルです。依存する qcom-ipq4019.dtsi, qcom-ipq4019-ap.dk04.1.dtsi, qcom-iqp4019-audio.dtsi, qcom-ipq4019-mhi.dtsi あたりも参照する必要があります。

ネットワークインタフェースの定義は qcom-ipq4019.dtsi の 843行目あたりの

edma@c080000 {
    compatible = "qcom,ess-edma";
    reg = <0xc080000 0x8000>;

とあります。

ここで重要なのが qcom,ess-edma という compatible の値です。この値でドライバはデバイスを見つけにいくので(ここの表現あってるかはわからない)、この値を見つけにいくドライバがカーネルに含まれていなければドライバが当たらず使用できない、という事象が発生します。

結論から言ってしまうと、配布されている linux-4.4 には含まれていませんでした。つまり、カーネルのビルドとは別にビルドされている可能性が高そうです。

ここで、QSDK を見てみますと…

qca/src/qca-edma/edma_aci.c
static const struct of_device_id edma_of_mtable[] = {
    {.compatible = "qcom,ess-edma" },
    {}
};

ありますねえ!!

つまり、QSDKでビルドしたものでは、ビルドされたこの qca-edma を modprobe しているからネットワークが使えるんですね。ということでビルドして使えるようにしていきましょう。

と言いたいところですが、実際にmodprobe している順番をみてみると↓のように

  1. qrfs
  2. qca-ssdk
  3. qca-edma

の順番でロードしているようです。今回はこの3つをビルドします。

手順

というわけで、ビルド手順です。

必要なもの

それぞれ QSDK と同じリポジトリからダウンロードします。

在り処と使用されているブランチを確認するにはマニフェストファイルを確認すればいいのですが、NCP-HG100 で使用されたマニフェストは不明なのでエイヤでこれを使います↓

https://source.codeaurora.org/quic/qsdk/releases/manifest/qstak/tree/caf_AU_LINUX_QSDK_DATE_4.4_TARGET_ALL.10.0.3019.xml?h=release

上記URLより一部抜粋したものが下記。

  <project name="quic/qsdk/oss/lklm/qca-edma" path="qsdk/qca/src/qca-edma" revision="e0efb01b44d45a6dff5f944238f6de3255afcc1b" upstream="nss"/>
  <project name="quic/qsdk/oss/lklm/qca-rfs" path="qsdk/qca/src/qca-rfs" revision="709b93474e60aaf4d884d3d16c1435d8b5f0f90b" upstream="nss"/>
  <project name="quic/qsdk/oss/lklm/qca-ssdk" path="qsdk/qca/src/qca-ssdk" revision="d84da8955bc4eecbb164bdd729b7862a89523bcb" upstream="master"/>

上記を参考に

git clone https://source.codeaurora.org/quic/qsdk/oss/lklm/qca-edma -b nss
git clone https://source.codeaurora.org/quic/qsdk/oss/lklm/qca-rfs -b nss
git clone https://source.codeaurora.org/quic/qsdk/oss/lklm/qca-ssdk -b master

としてソースコードをクローンしてきます。

qca-edma, qca-rfs のビルド

qca-edma, qca-rfs のビルドは比較的かんたんです。

qca-edma のビルド

cd qca-edma
make -C $LINUX_SOURCE_DIR M=$PWD ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

$LINUX_SOURCE_DIR にはソニーが公開している linux-4.4 を展開したディレクトリを指定します。

ここでエラーが出るんですが、

             if (res < 0)

となっているかしょを

             if(false) //if (res < 0)

とすることで回避可能です。(これ本来ビルドのオプションで殺すべきかもしれませんが、詳しくないのでよくわかりません)

ビルドして出てきた essedma.ko を取っておきます。

qca-rfs

cd qca-rfs
make -C $LINUX_SOURCE_DIR M=$PWD ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

同じです。

今回もエラーになるので、下記のように修正しました。(いいのか

/*
 * rfs_rule_exit()
 */
void rfs_rule_exit(void)
{
    // struct rfs_rule *rr = &__rr;

    RFS_DEBUG("RFS Rule exit\n");
    // if (rr->proc_rule);
    remove_proc_entry("rule", rfs_proc_entry);
    rfs_rule_destroy_all();
}

出てきた qrfs.ko を取っておきます。

qca-ssdk のビルド

これが鬼門です。

まずはソースコードを修正します。

src/init/ref_port_ctrl.c の修正。90行目、Linuxのバージョンが4.4.60以降は~という条件分が入っていますが、配布されているlinux-4.4ではFAL_SPEED_2500が未定義というエラーが出るので4.4.61以降に書き換えます(この修正が必要なのはわけがわからん。)

#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,4,61))

次に、 src/init/ssdk_dts.c。ssdk_dts.c:320:13: error: ‘ssdk_dt_parse_uniphy’ defined but not used [-Werror=unused-function] というエラーが出てしまうので、もう含めないようにしてしまいます。319行目の定数に_Aを付け加えて別物に変えてしまいます。

#ifdef IN_UNIPHY_A

最後に、 config を修正します。 -fno-pic が指定されずにビルドされるとビルドはできるものの動かない代物ができあがるので付けます。

117行目の CPU_CFLAG-fno-pic を追加します。

ifeq ($(KVER),$(filter 4.9% 4.4% 5.4%,$(KVER)))
  CPU_CFLAG= -fno-pic -DMODULE -nostdinc -D$(BOARD_NAME) -mlittle-endian -Wundef -Wstrict-prototypes -Wno-trigraphs -Werror -fno-strict-aliasing -fno-common -Wno-format-security -fno-delete-null-pointer-checks -O2 -fno-dwarf2-cfi-asm -mabi=aapcs-linux -mno-thumb-interwork -mfpu=vfp -funwind-tables -marm -D__LINUX_ARM_ARCH__=7 -march=armv7-a -msoft-float -Uarm -Wframe-larger-than=2048 -fno-stack-protector -Wno-unused-but-set-variable -fomit-frame-pointer -g -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -Werror=implicit-int -DCC_HAVE_ASM_GOTO    -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(mem)"
endif

で、いざビルド

make -f Makefile M=$PWD ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-  TOOL_PATH=$PWD/tos/bin SYS_PATH=$LINUX_SOURCE_DIR KVER=4.4.60 TOOLPREFIX=arm-linux-gnueabihf- TARGET_NAME=arm-linux-gnueabihf

で、ここでさらに困ったことに、Makefile はクロスコンパイルへの配慮がなく、死ぬので、クロスコンパイルする際は

ln -s /usr/lib/gcc-cross/arm-linux-gnueabihf /usr/lib/gcc/arm-linux-gnueabihf

として、シンボリックリンクを張るといいのではないかなと思います。なんとかする方法あれば教えていただきたいです。

で、できあがった build/bin/qca-ssdk.ko を取っておきます。

使ってみる

上記の手順でできあがった

  1. qrfs.ko
  2. qca-ssdk.ko
  3. essedma.ko

USBメモリなどでMANOMA側で読み取って使ってみます。

modprobe nf_nat
insmod qrfs.ko
insmod qca-ssdk.ko
insmod essedma.ko

依存関係があるので、正しい順序で読み込まなければなりません。

ここまで行えば、普段どおり使用することができるようになるので、/etc/network/interfaces を書くなどしてセットアップします。

使えるようになったぞ

DHCPのクライアントもちゃんと動いてハッピー。apt-get もできました。

apt-get

例によってパーミッションがぐちゃぐちゃになってますが、、、(debootstrap の使い方ちゃんと勉強しよう・・・)

終わりに

以上、NCP-HG100でネットワークを使用可能にする方法でした。良いお年を!

SONYの MANOMA NCP-HG100 で Debian Buster を起動する(するだけ)

何を言ってるかわからねえと思うが…(略

Debian

はじめに

以前、SONY が NCP-HG100 というAIスマートホームゲートウェイというルーターをOpenWRTベースで出していて、GPLLinuxソースコード開示している、という話をしました。

ohayoyogi.hatenablog.com

そんな開示されているソースコードですが、QSDKというSDKから切り出された一部であり、このソースコードさえあればビルド可能な環境が手に入るかというとそうではありません。

現在の OpenWRT と 当該QSDK では書き方が変わっている部分があったり、そもそもOpenWRTに取り込まれていないドライバがあったりと、素人の私には手の出しづらい領域でした。(とりあえず OpenWRT 19.07あたりは動かしたけど…その次の一手が打てなかった)

ではどうするか

というわけで、私にもできないことがないか?と考えたところ「linux-4.4にはフルのlinuxカーネルが含まれているのだから、DebianのrootfsマウントすればDebian動くんじゃね?」という仮説でした。

ファンとスピーカーとタッチパネルとLEDが付いたarmhf な Debian が手に入る。素敵ではないか。

実践

というわけでやってみました。結論からいくと素の linux-4.4 ではダメです。

カーネルコンフィグ

とりあえず、展開した linux-4.4 で

make menuconfig ARCH=arm

としてカーネルのコンフィグをいじっていきます。いきなりmmcにrootfsを書くのは自殺行為なので ext4 でフォーマットしたUSBをマウントできるようにします。(.configはいじりすぎてカオスになってしまったので、いつか整理したい。というか今考えるとこれもいらない手順だったか?)。あとはDebianでsystemdとか使うのでそれようのコンフィグとかします()

ビルド

カーネルをビルドしてから、ubootに食わせる FIT イメージを生成します。

カーネル

カーネルをビルドするコマンドはこれです↓

CC="ccache gcc" make zImage modules dtbs ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

ローダブルカーネルモジュールはこれで生成できます

CC="ccache gcc" make modules_install ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/path/to/install_mod/

/path/to/install_mod/lib/module/4.4.60/ みたいなディレクトリにコンフィグでM指定したモジュールが生成されます。

FIT イメージ

FIT イメージ生成用の .its ファイルには、OpenWRTのスクリプトが便利なのでそれを使います。

/home/user/dev/openwrt/scripts/mkits.sh -A arm -C none -c config@1 -a 0x80208000  -e 0x80208000 -v 4,4.60 -k ./arch/arm/boot/Image -D manoma -d ./arch/arm/boot/dts/qcom-ipq4019-ap.dk04.1-c4.dtb -o manoma_fit.its

で、できた manoma_fit.itsmkimage に食わせれば uboot で使用可能な FITイメージができあがります。

mkimage -f manoma_fit.its manoma_fit.itb

initramfs (initrd) 生成

ここらへんの手順、だいぶ整理できてなくてカオスなんですが、メモとして残します。

まず、前提として、ext4でフォーマットしたUSBのパーティションに debootstrap で構成した armhf の rootfs を生成します。(qemu と debootstrap で頑張る)。

(/dev/console がないといざ起動しようとするとカーネルパニックが発生するので、mknod で作ります)

次に、公式ファームで起動したmanomaにそのUSBを差し、debootstrap で生成した環境に chroot します。

chroot /mnt/USBDriveA/

みたいな。その状態で update-initramfs を呼び出すと initrd が /boot に生成されるのでそれを何らかの方法でホストにコピーします。(これmanomaでやる必要ないかも)

update-initramfs で 生成した initrd は cpio を gzip したものなので、zcat initrd.img-4.4.60 > initrd-4.4.60.cpio みたいな感じで cpio にします。

この cpio の活用方法なんですが、 FITイメージに同梱すると、カーネル起動時に読み込んで中の init スクリプトを実行してくれるようになるので、カーネルのコンフィグで設定します。

cpio埋め込むコンフィグの図

いざ起動

ここまで準備できたら uboot でコマンドを

env set fdt_high 87000000
env set bootargs console=ttyMSM0,115200n8 root=/dev/sda1 rootfstype=ext4 
tftpboot manoma_fit.itb

最初はいきなり再起動がかかって失敗したかと思いましたが、再度起動したらちゃんとターミナルが表示されました。

Debian on manoma

終わりに

まぁここまでやった人はわかると思いますが、ブートするだけです。ネットワークインタフェースなどは全然認識されず、eth0eth1 もない!!どうしてこうなった!!!!

おまけ

manomaいじりには↑みたいなオスがバネになってるテストワイヤがすごく便利でした。

続きます

次回、ネットワークを有効にします!!!

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

SONYの MANOMA NCP-HG100 用に Dropbear(SSHサーバー) をビルドする

はじめに

SONYの AIスマートホームゲートウェイ、MANOMAをいじるお話をしました。

ohayoyogi.hatenablog.com

前回記事ではOpenWRT 15.05.1で ipq806x をターゲットとしたパッケージが配布されておらず、 適当なパッケージをインストールしたところWWANが動かなくなってしまった、ということをご紹介しました。

やはり適当なパッケージをインストールしたのが原因なのではないかと思い、 ちゃんとビルド環境を整えようと思って実施したのが本記事内容です。

QSDK

ipq806x をターゲットとしたOpenWRT SDKってないのかな~と思い、見つけたのが QSDK です。

https://wiki.codeaurora.org/xwiki/bin/QSDK/

QSDKの対応リスト

manifestに数パターンあることがわかりますが、最下段「OpenWRT 15.05」「Linux Kernel 4.4」「ipq806x」とありビンゴ、という感じですね。

というかシリアル通信でログインした画面で見えてた↓は「QSDK」なのね・・・(OS⚡DKだと思ってました)

QSDK

これで、どういったconfigでビルドされたのかはわかりませんが、MANOMA NCP-HG100 がQSDKでビルドされたものであるということが特定できたわけです。

QSDKを使えるようにする

というわけで、このSDKを使えるようにしていくわけですが、基本的には https://wiki.codeaurora.org/xwiki/bin/QSDK/ にある通りの手順を実施します。

repo init -u git://codeaurora.org/quic/qsdk/releases/manifest/qstak -b release -m caf_AU_LINUX_QSDK_<your version>.xml --repo-url=git://codeaurora.org/tools/repo.git --repo-branch=caf-stable
repo sync
cp qca/configs/qsdk/ipq_open.config .config
make package/symlinks
make defconfig

ただ、このままだとターゲットが ipq になってしまいますので、 make menuconfigipq806x にターゲットを設定しました。

ターゲットを ipq806x に

また、manifestの説明にもある通り、wifi系のビルドに問題があるようで通らないので make menuconfigKernel modules -> Wireless Drivers から mac80211 がらみのもののチェックを全部はずしました。SDKがほしいだけなので問題ない(Wifiまわりの開発をしようとすると困るかな)

mac80211がらみを外す

Wifiがらみのモジュールをビルドしなくなった関係で、ビルドが通らなくなるものが出てきますので、それも外します。 make menuconfigNetwork から wpad-mesh を外します。

wpad-mesh外す

いざビルド

というわけで SDK をビルドしていきます。

make -j4 V=s

私は Windows10 で Ubuntu18.04(WSL2) を使ってビルドしましたが、色々とハマる部分はあったので下記サイトを参考に適宜修正しました。

Ubuntu18.04下编译OpenWRT15.05遇到的问题和解决方案 | iZheteng

めちゃくちゃ時間かかりましたが、出ているエラー内容をもとにググると多くは解決できたので(前述のようにカーネルビルドのconfigいじったりする必要はあった)、 気合です。

(そしてめっちゃ容量を食った。色々ソースを展開するので合計30GBぐらい使ったかも?)

dropbear

このSDK、パッケージ単体でのビルドもできるんですが、上記の make コマンドで標準搭載のパッケージがビルドされるようなのでそれを利用します。

bin/ipq806x/packages/base/dropbear_2017.75-1_ipq806x.ipk

にパッケージが生成されるはずなので、それをコピーしてUSBメモリなどでMANOMAに移します。

opkg install dropbear_2017.75-1_ipq806x.ipk

上記コマンドでインストールして前回記事のように有効化して終わりです。

さいごに

ついにWWANに不具合が発生しないままSSHでログインできるようになりました。

みなさんもよきMANOMAライフを!

SONYの MANOMA NCP-HG100 に SSHでログインできるようにする

-- 20210114追記

多くの方にお読みいただけているようで光栄です。タイトルでは「SSHでログイン」とありますが、記事中にもあるとおり、SSHを導入すると不具合をきたします。本記事で実際に利用できる範囲は「シリアルでログイン」までです。

-- 追記ここまで

はじめに

SONYが出している「AIスマートホームゲートウェイ」 MANOMAをご存知ですか?(私は知りませんでした)

LTEモジュールが付いているルーターなんですけど、 OpenWRTベースで作られているデバイスらしいです。

結構でかい NCP-HG100

今回はそんな OpenWRTルーター(違 をSSHでログインできるようにしていきたいと思います。

注意事項

なお、当然ながら自己責任でお願いいたします。 (ファームウェアの書き換えは発生しないので、技適適用外にはならないとは思うんですが、詳しくないので無線は切って使用するのがよいでしょう)

というかだめでした。この方法でSSHを有効にするとWWANがダメになり、DHCPも死ぬという現象が発生します。

手順(rootでログインする)

シリアル通信が必要になるので、適当な母艦PCとUSBシリアル変換みたいなのがあると良いです。

初心者すぎてそんなものは持っていなかったので、私はArduino UNO使ってます

あとはピンヘッダなどがついておらず、スルーホールになっていますので、片方がバネ付きのオスになってるケーブルがあると便利です。

殻割り

まずはシリアル通信するために本体を開封します。4つのネジとツメで固定されていてやらしー感じなんですが、 外側のカバー(メッシュのようになっているところ)を広げる感じでツメを外します。

配線

出てきた4つのピンにつないでいきます。 GND, TX, RXがわかればいいのでテスターでGNDを見つけて繋いでから、teratermなどでコンソール見つつTX, RXを特定していきます。

ボーレートは 115200です。

繋いだ

するとコンソールの出力がバーっとでてきます。普通に uboot とか見られるのでファーム作れる人はここから色々学ぶんでしょうね

起動オプションの変更

どうもUARTに使用しているGPIOとなにか(Z-Wave系?)が排他になっているようで、 そのまま起動してしまうと起動プロセス中にUARTが止まってしまいます。

起動オプションに ttyMSM0,115200n8 が含まれているとUARTが優先されるようなので(未検証)、 uboot の 環境変数 bootargsconsole=ttyMSM0,115200n8 に変更して起動します。

起動オプション変更

手順としては

  • uboot のコンソールに入る(シリアル通信中、電源入れてからすぐ適当にKey連打する)
  • env set bootargs console=ttyMSM0,115200n8 を実行する
  • run bootcmd で起動する

といった感じです。

ログイン完了

すると起動完了後、 Enter 押下でログインできると思います。

ログイン後

手順(SSHサーバーを導入する)

ここまでくれば opkg でパッケージ入れ放題!と思いきや

 ---------------------------------------------------------------
   For those about to rock... (Chaos Calmer, r48067)
   Product Name: SHH-001       Image Version: 1.4.46.5
 ---------------------------------------------------------------

Chaos Calmer の文字。 OpenWRT 15.05.1には ipq806x (←NCP-HG100にインストールされてる OpenWRTターゲット)がないぞ?!

手動でインストールする

というわけで、仕方がないので、適当にパッケージを拾ってきて入れます。

OpenWRTでは、opensshではなく、より軽量なdropbearが使われることが多いらしく、 ipq806x では dropbear_2017.75-1_ipq806x.ipk というパッケージがありました。

https://archive.openwrt.org/snapshots/trunk/ipq806x/generic/packages/base/

これをUSBメモリなどに保存し、ルーターに差し込み、シリアル通信からログインしたコンソールで

opkg install dropbear_2017.75-1_ipq806x.ipk

を実行してインストールします。

依存パッケージとして libc があるので、それも入れます。 libc_1.1.16-1_ipq806x.ipk (ここからきな臭くなってきます。)

最後に、

/etc/init.d/dropbear enable

で dropbear を起動時に有効にします。

ちなみに、起動できるかどうかを手動で確認したい場合は

/usr/sbin/dropbear

を実行してみるのが一番です。依存モジュールが足りないとかだとここで Not found といって怒られます。

動作確認

/etc/init.d/dropbear start

でdropbearを起動したら、おもむろにSSHします。 ssh root@192.168.132.1 (お

ハイレタ

さいごに

ここまで書いておいてあれですが、この方法だと再起動後、様々な機能に不調をきたすようなのでより安定してdropbearが使えるようになる方法を探しています。

みなさんもよかったらぜひ、一緒にMANOMAをいじりませんか。

-- 20210114追記

dropbear を使えるようにビルドする方法を記事にしました。SSHご利用の際はこちらもご覧ください。

ohayoyogi.hatenablog.com

-- 追記ここまで