ガジェットがらみで個人的に試したことをいろいろと書いていきたいと思います。
SONY NCP-HG100 のネットワーク用のドライバをビルドする
ご無沙汰していますが、MANOMAネタで書きます。
前回記事では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 している順番をみてみると↓のように
- qrfs
- qca-ssdk
- 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
を取っておきます。
使ってみる
上記の手順でできあがった
- qrfs.ko
- qca-ssdk.ko
- essedma.ko
をUSBメモリなどでMANOMA側で読み取って使ってみます。
modprobe nf_nat insmod qrfs.ko insmod qca-ssdk.ko insmod essedma.ko
依存関係があるので、正しい順序で読み込まなければなりません。
ここまで行えば、普段どおり使用することができるようになるので、/etc/network/interfaces
を書くなどしてセットアップします。
DHCPのクライアントもちゃんと動いてハッピー。apt-get
もできました。
例によってパーミッションがぐちゃぐちゃになってますが、、、(debootstrap の使い方ちゃんと勉強しよう・・・)
終わりに
以上、NCP-HG100でネットワークを使用可能にする方法でした。良いお年を!
SONYの MANOMA NCP-HG100 で Debian Buster を起動する(するだけ)
何を言ってるかわからねえと思うが…(略
はじめに
以前、SONY が NCP-HG100 というAIスマートホームゲートウェイというルーターをOpenWRTベースで出していて、GPLなLinuxをソースコード開示している、という話をしました。
そんな開示されているソースコードですが、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.its
を mkimage
に食わせれば 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 スクリプトを実行してくれるようになるので、カーネルのコンフィグで設定します。
いざ起動
ここまで準備できたら uboot でコマンドを
env set fdt_high 87000000 env set bootargs console=ttyMSM0,115200n8 root=/dev/sda1 rootfstype=ext4 tftpboot manoma_fit.itb
最初はいきなり再起動がかかって失敗したかと思いましたが、再度起動したらちゃんとターミナルが表示されました。
終わりに
まぁここまでやった人はわかると思いますが、ブートするだけです。ネットワークインタフェースなどは全然認識されず、eth0
も eth1
もない!!どうしてこうなった!!!!
おまけ
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をいじるお話をしました。
前回記事ではOpenWRT 15.05.1で ipq806x をターゲットとしたパッケージが配布されておらず、 適当なパッケージをインストールしたところWWANが動かなくなってしまった、ということをご紹介しました。
やはり適当なパッケージをインストールしたのが原因なのではないかと思い、 ちゃんとビルド環境を整えようと思って実施したのが本記事内容です。
QSDK
ipq806x をターゲットとしたOpenWRT SDKってないのかな~と思い、見つけたのが QSDK
です。
https://wiki.codeaurora.org/xwiki/bin/QSDK/
manifestに数パターンあることがわかりますが、最下段「OpenWRT 15.05」「Linux Kernel 4.4」「ipq806x」とありビンゴ、という感じですね。
というかシリアル通信でログインした画面で見えてた↓は「QSDK」なのね・・・(OS⚡DKだと思ってました)
これで、どういった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 menuconfig
で ipq806x
にターゲットを設定しました。
また、manifestの説明にもある通り、wifi系のビルドに問題があるようで通らないので make menuconfig
で Kernel modules -> Wireless Drivers
から mac80211
がらみのもののチェックを全部はずしました。SDKがほしいだけなので問題ない(Wifiまわりの開発をしようとすると困るかな)
Wifiがらみのモジュールをビルドしなくなった関係で、ビルドが通らなくなるものが出てきますので、それも外します。 make menuconfig
で Network
から 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ベースで作られているデバイスらしいです。
今回はそんな 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 の 環境変数 bootargs
を console=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ご利用の際はこちらもご覧ください。
-- 追記ここまで