2024年12月7日土曜日

Luckfox Picoで11ac無線LAN子機を使ってみた。

 先日購入した11acなWiFiドングルWD-4510ACをLuckfoxのbuildrootで使えるようにカーネルモジュールを組み込んでみた。最初はTOKAIZ TWA-001を使おうと思ったけどusb_modeswitchがLuckfoxのbuildrootで簡単に有効にできそうだったので、Driver FreeタイプのWiFiドングルでも大丈夫そう。どっちも同じカーネルモジュールで行けるのでWD-4510ACができればTWA-001も簡単に動きそうだし。

RTL8821CUのカーネルモジュールは何種類かあったんだけど、ラズパイ3Bに組み込んでみたやつは途中まではビルドできるんだけど、cfg80211関連のエラーが出て進まなかったのでrtw88を使ってみた。

実はrtw88はLuckfox用のカーネルの中に組み込まれているんだけどrtl8821cuが含まれていないバージョンだった。なので新しいバージョンに置き換えてビルドしてみることに。
Ubuntu上でLuckfoxのSDKの中のファイルを差し替える。

$HOME/luckfox-pico/sysdrv/source/kernel/drivers/net/wireless/realtek/

の中のrtl88を適当な名前にリネームして、最新のrtw88を持ってくる。
そんでもってKconfigとMakefileを最新のLinuxカーネルのものに差し替える。

https://github.com/torvalds/linux/raw/refs/heads/master/drivers/net/wireless/realtek/rtw88/Makefile
https://github.com/torvalds/linux/raw/refs/heads/master/drivers/net/wireless/realtek/rtw88/Kconfig

からダウンロードした。

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

menuconfigでrtw88を有効にしてrtl8821cuを有効にする。

このバージョンなら8821CUが選べる。表記は8821CUだけど8811CUも使えるようになる。
あとはWirelessのEnable LED triggersを入れておくとmac80211からステータスLEDを制御してくれる。rtw88はこれを有効にしないとLEDが点灯しないので有効にした。
Saveして終了して
make ARCH=arm savedefconfig
cp defconfig ./arch/arm/configs/luckfox_rv1106_linux_defconfig
として設定を保存する。
お次はツール関係。
cd $HOME/luckfox-pico/sysdrv/source/buildroot/buildroot-2023.02.6/
make menuconfig

ここからusb_modeswitchを有効にする。

wpa_supplicantとiwとwireless toolsは前回有効にしているのでそのままでOK。usb_modeswitch_dataもいれると自動でudevを設定してくれるらしいけど今回は入れずに手動でRealtekのDriver Freeだけ設定してみることに。

make savedefconfig
make

ビルド

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

Luckfoxに書き込み。
Luckfoxを起動してUSBをhostモードにしてOTGアダプタを繋いで再起動してlsusbすると

[root@luckfox ko]# lsusb
Bus 001 Device 001: ID 1d6b:0002
Bus 001 Device 015: ID 0bda:1a2b
Bus 002 Device 001: ID 1d6b:0003

となる。これはCDROMデバイスとして認識するID。

usb_modeswitch -KW -v 0bda -p 1a2b

すると

Bus 001 Device 001: ID 1d6b:0002
Bus 001 Device 016: ID 0bda:c820
Bus 002 Device 001: ID 1d6b:0003

となってRTL8821CUとして認識する。

cd /oem/usr/ko
insmod cfg80211.ko
insmod libarc4.ko
insmod mac80211.ko
insmod rtw88_core.ko 
insmod rtw88_usb.ko 
insmod rtw88_8821c.ko
insmod rtw88_8821cu.ko
insmod ctr.ko
insmod ccm.ko
insmod libaes.ko
insmod aes_generic.ko

として先程組み込んだカーネルモジュールを読み込む。

dmesgすると

[  450.921679] rtw_8821cu 1-1:1.2: Direct firmware load for rtw88/rtw8821c_fw.bin failed with error -2
[  450.921716] rtw_8821cu 1-1:1.2: failed to request firmware
[  450.929119] rtw_8821cu 1-1:1.2: failed to load firmware
[  450.929143] rtw_8821cu 1-1:1.2: failed to setup chip efuse info
[  450.929153] rtw_8821cu 1-1:1.2: failed to setup chip information
[  450.929434] rtw_8821cu: probe of 1-1:1.2 failed with error -22
[  450.929561] usbcore: registered new interface driver rtw_8821cu

ファームウェアいれるの忘れてた。

luckfoxの/lib/firmwareの中にrtw88というディレクトリを作成してrtw8821c_fw.binを入れる。firmwareはrtw88のfirmwareフォルダの中に入っている。

WiFiドングルを指し直してusb_modeswitchをやり直してやると

[  552.795533] rtw_8821cu 1-1:1.2: Firmware version 24.5.0, H2C version 12
[ 552.936411] usbcore: registered new interface driver rtw_8821cu

ip link showしてみるとwlan0が増えてる。
認識した!

あとはrt3070のときと同様wpa_supplicantの設定をやればWiFiにつながった。
ちなみにLuckfox Pico Miniと合わせて全体の消費電流は80~100mAぐらいだった。

これでrtw88の最新版を有効にすることができたので今回はRTL8821CUを使えるようにできた。流石にRT3070のUSB WiFiアダプタは今どき売ってないだろうし。RTL8812BUを有効にしてビルドすればRTL8812BUなWI-U2-866DM/Nが使えたりするかもしれない。

Bluetoothを使わないのであればTWA-001(RTL8811CU)で十分かも。ちなみにTWA-001もちゃんと使えました。usb_modeswitchがいらないので便利。

次は8821CUのBluetoothを使えるようにしてみたい。

追記:自動で接続できるようにしてみた。

0 件のコメント:

コメントを投稿