M5Stack CoreMP135にさわる（その１：BuildrootのBuild）

# M5Stack CoreMP135にてBuildrootをBuild（WiFiドングル付き）
スイッチサイエンス社から購入した、「[M5Stack CoreMP135](https://www.switch-science.com/products/9650?srsltid=AfmBOopKjLEiMWCvsqQrpDXm2MEgUSgqNmJRM5n5Z2cjYUnjC5oDOVQq)」にて、WiFiドングル含めてBuildrootをBuild（＆動作）したときの記録。

## 情報
### URL
初めは、スイッチサイエンス社サイトから辿れる、次の２つの情報を元にトライしたが、Buildはできるものの、小生の環境（Ubuntu 22.04.4 LTS ）で作成したイメージは動作しなかった。
- [CoreMP135_buildroot](https://github.com/m5stack/CoreMP135_buildroot)
- [CoreMP135_buildroot-external-st](https://github.com/m5stack/CoreMP135_buildroot-external-st)

で、本家サイトを探していたところ、下記情報によりBuildを行い、作製したイメージを動作させることができた。
- [CoreMP135 Buildroot](https://docs.m5stack.com/en/guide/linux/coremp135/buildroot)

### WiFiドングル
用いたWiFiドングルは下記バッファロー製のもの。
- [WLI-UC-GNM2](https://www.buffalo.jp/product/detail/wli-uc-gnm2.html)

## 最初のBuild：WiFiドングル使えず
上記動作することができたサイトの情報に従いBuild。
```
$ git clone https://github.com/m5stack/CoreMP135_buildroot.git
$ git clone https://github.com/m5stack/CoreMP135_buildroot-external-st.git
$ cd CoreMP135_buildroot
$
$ make BR2_EXTERNAL=../CoreMP135_buildroot-external-st/ m5stack_coremp135_defconfig
$ make -j4
$
$ sudo dd if=./output/images/sdcard.img of=/dev/sdc bs=4M
```
sdカードを本体に入れて動作はした。
```
# uname -a
Linux CoreMP135 5.15.118 #1 SMP PREEMPT Sat Aug 24 15:04:31 JST 2024 armv7l GNU/Linux

# cat /etc/issue 
#     #  #######   #####   #######     #      #####   #    # 
##   ##  #        #     #     #       # #    #     #  #   #  
# # # #  #        #           #      #   #   #        #  #   
#  #  #  ######    #####      #     #     #  #        ###    
#     #        #        #     #     #######  #        #  #   
#     #  #     #  #     #     #     #     #  #     #  #   #  
#     #   #####    #####      #     #     #   #####   #    # 
Welcome to CoreMP135, Powered by M5Stack.
```

が、WiFiドングル動作せず。dmesgによるログは下記。
```
[ 3182.218377] usb 2-1.3: new high-speed USB device number 5 using ehci-platform
[ 3182.678439] usb 2-1.3: reset high-speed USB device number 5 using ehci-platform
[ 3182.837993] ieee80211 phy0: rt2x00_set_rt: Info - RT chipset 3070, rev 0201 detected
[ 3182.867596] ieee80211 phy0: rt2x00_set_rf: Info - RF chipset 0005 detected
[ 3182.868077] ieee80211 phy0: Selected rate control algorithm 'minstrel_ht'
[ 3182.879171] usbcore: registered new interface driver rt2800usb
[ 3182.987830] ieee80211 phy0: rt2x00lib_request_firmware: Info - Loading firmware file 'rt2870.bin'
[ 3182.988000] rt2800usb 2-1.3:1.0: Direct firmware load for rt2870.bin failed with error -2
[ 3182.988032] ieee80211 phy0: rt2x00lib_request_firmware: Error - Failed to request Firmw
```
WiFiドングルをハードウェア的に認識するものの、「rt2870.bin」が足りていないらしい。

## Buildオプションの探索
正直時間がかかった（苦闘した）。
```
$ make ARCH=arm menuconfig
```
menuconfigにより、組み込む機能（Buildオプション）を選択できそうなことはわかったでいたが、menuconfigにより表示されるメニューや選択肢の階層が深く、どこに「rt2870.bin」があるのかすぐには分からずであった。シローとなりに調べると、「Config.in」と「*.mk」あたりが、Buildオプション選択に関連しそうなことがわかる。

## オプション選択：最終的なBuild
```
$ make ARCH=arm menuconfig
```
### rt2870.bin
「Target Packages > Hardware handling > Firmware > linux-firmware > Wifi firmware」に見つかる。
![TargetPackages_Hardware_Firmware_WiFi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/76c23f33-2784-b590-82a5-539ef5820a86.png)

### WiFi Supplicant
調べた結果、WiFi SupplicantなどWiFiツール関連を組み込んだ方が良さそうであった。「Target Packages > Networking applications」にある関連しそうなものを組み込む。
![wifi追加2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/aa823733-1603-84f5-2b9b-2c10729cd78f.png)
上記は一例。下記のものを選択。
- wpa_supplicant
- wireless tools
- Install wpa_cli binary
- Install wpa_client shared library
- Install wpa_passphrase binary
- iw
- iwd

### Network Manager（不要かもしれない）
何かと便利かと思い、Network Managerも組み込むことにした。同じく「Target Packages > Networking applications」から選ぼうとしたが、
![networkmanagerインストール不可.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/10bdedc9-f053-a82a-1a67-74fc071a68f3.png)
udev及びglibcを先に組み込む必要があるらしい。「System Configuraiton」に見つかる。
![SystemConfiguration-eudev.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/a6e74560-560e-0236-765b-f4bdfb14b598.png)
これを選択後、下記となる。
![NetworkManagerあり.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/422c1b2e-5bb7-a323-2a8c-b1eff4ae23bb.png)

### Build
```
$ make -j4
$
$ sudo dd if=./output/images/sdcard.img of=/dev/sdc bs=4M
```

## 検証
### 起動
起動後のKernelログ。
```
[    5.515887] usb 2-1.3: reset high-speed USB device number 3 using ehci-platform
[    5.675526] ieee80211 phy0: rt2x00_set_rt: Info - RT chipset 3070, rev 0201 detected
[    5.705376] ieee80211 phy0: rt2x00_set_rf: Info - RF chipset 0005 detected
[    5.706240] ieee80211 phy0: Selected rate control algorithm 'minstrel_ht'
[    5.715908] usbcore: registered new interface driver rt2800usb
[    7.028360] ieee80211 phy0: rt2x00lib_request_firmware: Info - Loading firmware file 'rt2870.bin'
[    7.045835] ieee80211 phy0: rt2x00lib_request_firmware: Info - Firmware detected - version: 0.36
```
ハードウェア検出後、rt2870.binロードされている。

### Supplicant設定及び起動。
/etc/wpa_supplicant.confにSSID及びパスワードの設定を行う。
```
# cat /etc/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1

network={
	ssid="SSID_ABC"
	psk="Himitsu" 
}
```
起動させる。
```
# wpa_supplicant -B -D nl80211 -i wlan0 -c /etc/wpa_supplicant.conf
Successfully initialized wpa_supplicant
nl80211: kernel reports: Match already configured
nl80211: kernel reports: Match already configured
nl80211: kernel reports: Match already configured
nl80211: kernel reports: Match already configured
nl80211: kernel reports: Match already configured
```
この時のKernelログは下記となる。
```
[  116.441587] wlan0: authenticate with 82:22:a7:XX:YY:ZZ
[  116.489488] wlan0: send auth to 82:22:a7:XX:YY:ZZ (try 1/3)
[  116.491278] wlan0: authenticated
[  116.496259] wlan0: associate with 82:22:a7:XX:YY:ZZ (try 1/3)
[  116.539283] wlan0: RX AssocResp from 82:22:a7:XX:YY:ZZ (capab=0x1431 status=0 aid=3)
[  116.551145] wlan0: associated
[  116.721358] cryptd: max_cpu_qlen set to 1000
[  116.878509] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
```

### 動作
WiFiインターフェース（wlan0）にて、DHCPによりIPアドレスを取得させる。
```
# udhcpc -i wlan0
udhcpc: started, v1.36.0
udhcpc: broadcasting discover
udhcpc: broadcasting discover
udhcpc: broadcasting select for 192.168.10.105, server 192.168.10.1
udhcpc: lease of 192.168.10.105 obtained from 192.168.10.1, lease time 86400
deleting routers
adding dns 192.168.10.1
```
成功。

```
# ifconfig

wlan0     Link encap:Ethernet  HWaddr 6A:F1:49:XX:UU:DD  
          inet addr:192.168.10.105  Bcast:192.168.10.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:43 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:3572 (3.4 KiB)  TX bytes:1374 (1.3 KiB)
```
WiFiインターフェースにIPアドレスが割り振られていることが確認できる。

EOF