2024年11月23日土曜日

Luckfox Pico Mini BをWiFiに繋いでみる。

 前回Luckfox PicoにLANケーブルを直結してとりあえずLANで接続できるようになったので、USBホスト機能でUSBデバイスを使ってみることに。

電源はLuckfox Pico MiniのVBUSとGNDのピンヘッダを使って5Vを入力した。USBはダイソーのType C OTGアダプタを使用。ピンヘッダのVBUSに5Vを入れるとUSB側にも5Vが流れるのでデバイスにもそのまま電源を供給できる。

USBの切り替えはbuildrootを起動してluckfox-configコマンドから設定できる。

LAN経由でLuckfoxにSSH接続してluckfox-configと実行。USBでのNDISが使えなくなるので、シリアルコンソールかLANから設定を変更したほうが良い。USBの設定をhostに変更して再起動すればUSBのモードがホストに変更される。

早速USBデバイスを指してみる。USB WiFiが使えないかな?ということでrt3070なUSBドングル(Buffalo WLI-UC-GNM2T)があったので早速指してみた。
lsusbしてみる

[root@luckfox ko]# lsusb
Bus 001 Device 001: ID 1d6b:0002
Bus 001 Device 007: ID 0411:01ee
Bus 002 Device 001: ID 1d6b:0003

一応0411:01eeとして認識しているけどdmesgではWiFiモジュールがロードされてない感じ。

ということでカーネルモジュールを追加してみることに。ここからは前回同様にVM上のUbuntuマシンでの作業になる。

カーネルの設定は公式ページを参考にしてカーネルのmenuconfigからrt2800usbを有効にしてカーネルをビルドし直す。

cd $HOME/luckfox-pico/sysdrv/source/kernel
cp ./arch/arm/configs/luckfox_rv1106_linux_defconfig .config
make ARCH=arm menuconfig

Device Drivers > Network device support > Wireless LANのRalink devicesでスペースキーを押して有効に。そして下のRalink driver supportもスペースキーを押してMに。
Rockchip Wireless LAN supportもデフォルトでMになっていた。これでCFG80211とMAC80211が有効になってるっぽい。

あとはsaveでファイル名そのままで保存する。

make ARCH=arm savedefconfig
cp defconfig ./arch/arm/configs/luckfox_rv1106_linux_defconfig

これでカーネルのビルドの設定が終わったのでお次はWiFi関連のツールとRalink rt3070用のfirmwareを有効にする。

cd $HOME/luckfox-pico/sysdrv/source/buildroot/buildroot-2023.02.6/
make menuconfig

でTarget packagesのNetworking applicationsからwpa_supplicantとiwとwireless toolsを有効にする。
さらにTarget packages→ Hardware handling→ Firmware→ WiFi firmwareでRalink rt27xx/rt28xx/rt30xxを有効にする。そしたらSaveして画面を閉じる。

make savedefconfig
make

でアプリケーションをクロスコンパイル。

あとは

cd $HOME/luckfox-pico
./build.sh lunch

でLuckfox Pico Mini Bの内蔵フラッシュを選択したいので、2-1-0の順番で選ぶ。

./build.sh

でビルドする。ビルドが終わったら前回同様にluckfoxに書き込む。これでUbuntu側での作業は終了。
LuckfoxにLANからSSHに接続して、USBの設定がデフォルトに戻っているのでhostに設定して再起動。

またLuckfoxにSSHで接続して、下記のコマンドをLuckfox側で実行。

cd /oem/usr/ko
insmod cfg80211.ko
insmod libarc4.ko
insmod mac80211.ko
insmod rt2x00lib.ko
insmod rt2x00usb.ko
insmod crc-ccitt.ko
insmod rt2800lib.ko
insmod rt2800usb.ko
insmod ctr.ko
insmod ccm.ko
insmod libaes.ko
insmod aes_generic.ko

このようにWiFiに必要なモジュールとrt2800usbモジュールを読み込んでおく。カーネルモジュールによっては必要なモジュールを最初に読み込んでおかないといけないので順番に注意。順番バラバラに読み込んでいたら"unknown symbol in module, or unknown parameter"っていうエラーが出て困った…
更に下の4つはWiFiのセキュリティー認証とかで必要なモジュールで、これがないとAPに繋がっても一瞬でdeauthenticatingされてしまって(Reason: 1=UNSPECIFIED)ってなんだよ!ってなる。

これでdmesgをすると

[   20.604498] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[   20.633333] cfg80211: Problem loading in-kernel X.509 certificate (-22)
[   20.637840] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2
[   20.637873] cfg80211: failed to load regulatory.db
[   45.084413] usb 1-1: reset high-speed USB device number 2 using xhci-hcd
[   45.273651] ieee80211 phy0: rt2x00_set_rt: Info - RT chipset 3070, rev 0201 detected
[   45.289515] ieee80211 phy0: rt2x00_set_rf: Info - RF chipset 0005 detected
[   45.289882] ieee80211 phy0: Selected rate control algorithm 'minstrel_ht'
[   45.292707] usbcore: registered new interface driver rt2800usb

rt3070チップセットを認識して、rt2800usbがロードされてる!
WiFiのネットワークデバイス名を知るために
ip link show
をしてみたらwlan0が増えていた。

次にwpa_supplicantの設定。

nano /etc/wpa_supplicant.conf

で設定ファイルを開いて、network=のところを修正。

network={
        ssid="WiFiのSSID名"
        psk="WiFiのパスワード"
        key_mgmt=WPA-PSK
}

SSIDとパスワードはルーターの設定に合わせる。pskを直打ちが気になるようならwpa_supplicantのビルド設定をしたときに、wpa_passphraseも選んでおいて変換するといいかも。

wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf
udhcpc -i wlan0

dmesgしてもちゃんとファームウェア(rt2870.bin)がロードされてそう。
これでifconfigをしてみると…

WiFiにつながってる!
とりあえず今回はrt2800usbを使って昔Xlink Kai向けに500円で投げ売りされていたrt3070なWifiドングルでWifiに繋いでみた。今購入するならrtlwifiが使えるっぽいのでrtl8192cuが搭載されているWDC-300SU2SBKとかなら行けるかも?

あとは自動でカーネルモジュールを読み込めるようにしないとな。

0 件のコメント:

コメントを投稿