前回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 件のコメント:
コメントを投稿