はじめに
Orange Pi PC Plusを、Wake on LANや遠隔管理用の常時稼働ノードにしようと思いました。
そこでUSB Wi-Fiを追加するために買ったのが、
TP-Link Archer TX1U Nano/A
です。
Amazon上では「Wi-Fi 6 / 287Mbps / Bluetoothなし」の小型USB無線LAN子機。
普通なら、
USBに挿す
↓
Wi-Fiが出る
↓
終わり
だと思うじゃないですか。
終わりませんでした。
今回の実機では、Linuxから見ると中身がAICSemi系で、最終的に AIC8800DC として扱う必要がありました。
しかも途中で、
pid:0x3625 vid:0x0110 unsupport
からの
Unable to handle kernel NULL pointer dereference
まで踏みました。
同じUSB子機やAIC8800系で詰まった人向けに、実際に何が起きたかを残しておきます。
この記事は2026年9月8日に実際に作業したログを元にしています。
Armbianやドライバ側は更新されるため、将来そのまま通る保証はありません。
環境
| 項目 | 内容 |
|---|---|
| SBC | Orange Pi PC Plus |
| OS | Armbian |
| SoC系統 | Allwinner sun8i |
| 最終Kernel | 6.18.49-current-sunxi |
| USB Wi-Fi | TP-Link Archer TX1U Nano/A |
| 商品仕様 | Wi-Fi 6 / 287Mbps / Bluetoothなし |
| Linux上のチップ | AICSemi AIC8800DC |
最初の lsusb
まずUSB子機を挿して、
lsusb
を確認しました。
最初に出てきたのは、Wi-Fiデバイスっぽいものではなく、
a69c:5721 AICSemi AIC MSC
でした。
MSC?
MSC は Mass Storage Class 系のモードです。
つまりこの時点では、
「USB Wi-Fi子機を挿したのに、まだWi-Fi側のUSBデバイスとして立ち上がっていない」
状態でした。
ここでかなり時間を使いました。
usb_modeswitch で切り替える
usb-modeswitch を入れます。
sudo apt update
sudo apt install -y usb-modeswitch
そして、
sudo usb_modeswitch -K -v a69c -p 5721
を実行。
再び、
lsusb
すると、
3625:0110 AICSemi AIC8800DC
へ変わりました。
これでようやく、
AIC8800DC用のドライバを探す
という正しいスタートラインに立てました。
ここでの教訓
製品名が
TP-Link Archer TX1U Nano
だからといって、Linuxでその文字列だけを検索するのでは足りないことがあります。
今回かなり役立ったのは、
a69c:5721
3625:0110
AICSemi
AIC8800DC
という実際のUSB IDとチップ名でした。
次の罠: Kernelとheadersが違う
外部ドライバをビルドしようとしたところ、別の問題がありました。
途中の環境では、
実行中:
6.12.63-current-sunxi
に対して、
headers:
6.18.49-current-sunxi
という状態になっていました。
これはまずい。
確認には、
uname -r
ls -l /lib/modules/$(uname -r)/build
dpkg -l | grep linux-headers
を使いました。
最終的には再起動して、
6.18.49-current-sunxi
へ統一。
外部moduleをビルドするときは、最初にここを見た方がいいです。
ドライバを入れれば終わり……ではなかった
AIC8800系Linux Driverをいくつか試しました。
途中では ronnyf/AIC8800-Linux-Driver 系も試しています。
USB ID 3625:0110 を認識させるため、USB device tableに、
{USB_DEVICE_AND_INTERFACE_INFO(0x3625, 0x0110, 0xff, 0xff, 0xff)},
を追加してビルドする方法も試しました。
module自体はロードされ、
lsmod | grep aic
で、
aic8800_fdrv
cfg80211
aic_load_fw
まで見えるようになりました。
一見すると良さそうです。
しかし lsusb -t を見ると正常にbindされていない。
そして dmesg には、
AICWFDBG(LOGERROR) aicwf_usb_probe pid:0x3625 vid:0x0110 unsupport
が出ていました。
そしてKernel Oops
さらにその直後、
Unable to handle kernel NULL pointer dereference at virtual address 00000000
Internal error: Oops: 5 [#1] SMP THUMB2
まで発生。
ログ上では、
aicwf_usb_free_urb
aicwf_usb_deinit
aicwf_usb_probe
周辺がスタックに出ていました。
この時点で、
USB IDを追加してprobeに入ればOK
ではないことが分かります。
AIC8800系には複数の派生があり、PID・chip mapping・firmwareの組み合わせが合っている必要があるようです。
少なくとも今回の個体では、PIDだけ通す方法では正常動作しませんでした。
一歩進んだ: AIC8800DCとして認識
別のドライバ構成では、かなり先まで進みました。
dmesg に、
Product: AIC8800DC
AICWFDBG(LOGINFO) aicwf_usb_chipmatch USE AIC8800DC
AICWFDBG(LOGINFO) aicwf_parse_usb endpoints = 4
AICWFDBG(LOGINFO) Aic high speed USB device detected
が出現。
さらに、
chip_id=7, chip_sub_id=1
まで読めています。
firmwareも、
/lib/firmware/aic8800DC/fmacfw_patch_8800dc_u02.bin
/lib/firmware/aic8800DC/fmacfw_patch_tbl_8800dc_u02.bin
/lib/firmware/aic8800DC/fmacfw_calib_8800dc_u02.bin
からロードされました。
「来た!」と思ったんですが……
start app fail: -110
次はこれ。
Start app: 00130009, 4
start app fail: -110
dpd calib fail: -110
err_lmac_reqs
aicwf_rwnx_usb_platform_init err -1
最終的にはprobe失敗。
ここで分かったのは、
USB認識
↓
chip判定
↓
firmwareファイル読込
まで成功しても、
まだWi-Fiが使えるとは限らない
ということです。
ドライバ沼、深い。
最終的に使った aic8800d80
最終盤では、
~/aic8800d80/drivers/aic8800
で作業しました。
cd ~/aic8800d80/drivers/aic8800
make
ビルド中、
Skipping BTF generation ... due to unavailability of vmlinux
という表示も出ましたが、今回の環境ではmoduleのビルド自体は完了しました。
続いて、
sudo make install
sudo depmod -a
を実行。
make install により、現在のKernel
6.18.49-current-sunxi
向けのmoduleとして、
aic_load_fw.ko
aic8800_fdrv.ko
などが /lib/modules/.../ 以下へ配置されました。
moduleを確認
lsmod | grep aic
確認できたのは、
aic8800_fdrv
cfg80211
aic_load_fw
です。
必要なら手動で、
sudo modprobe aic_load_fw
sudo modprobe aic8800_fdrv
します。
ただし自動でロードされている場合は不要です。
lsmod だけで安心しない
今回かなり大事だったのがこれ。
lsusb
lsusb -t
です。
lsmod にドライバ名があっても、
そのUSBデバイスへ実際にbindされているとは限りません。
あわせて、
iw dev
ip link
rfkill list
nmcli device status
まで確認した方がいいです。
Wi-Fiへ接続する
最終的なSSID入力操作そのものは保存していた端末ログに残っていなかったため、ここだけ再現用の標準手順です。
nmtui
sudo nmtui
Activate a connection からSSIDを選択。
または nmcli なら、
sudo nmcli device wifi connect "<SSID>" password "<PASSWORD>"
確認:
nmcli device status
ip addr
ip route
疎通:
ping -c 3 1.1.1.1
ping -c 3 google.com
そして再起動後も、
sudo reboot
からの、
lsusb
lsusb -t
lsmod | grep aic
iw dev
nmcli device status
で復帰することを確認します。
今回の流れをまとめる
ざっくりこうでした。
Archer TX1U Nano/Aを挿す
↓
a69c:5721 AIC MSC
↓
usb_modeswitch
↓
3625:0110 AIC8800DC
↓
Kernel / headers不一致に気付く
↓
6.18.49-current-sunxiへ揃える
↓
AIC8800系ドライバを試す
↓
3625:0110 unsupport
↓
USB ID追加
↓
Kernel Oops
↓
別構成でAIC8800DC認識
↓
firmwareロード
↓
start app fail: -110
↓
aic8800d80をビルド・インストール
↓
Wi-Fi利用可能
同じ症状の人が最初に見るべきもの
個人的には、次の順番で見た方が早いと思います。
uname -r
lsusb
lsusb -t
lsmod | grep aic
iw dev
rfkill list
dmesg | grep -Ei 'aic|firmware|usb|wlan'
特に、
a69c:5721
3625:0110
のどちらで見えているかは重要です。
今後
このOrange Piは、単にWi-Fiを使うためではなく、
iPhone / 外出先
↓
Tailscale
↓
Orange Pi
↓
Wake on LAN
↓
メインPC / サーバ
という構成の中継ノードにする予定です。
WOLのためだけにルーターへUDPポートを直接開けるのではなく、TailscaleでOrange Piへ入り、LAN内へMagic Packetを送る構成にします。
Orange Pi自体の電源を落とせば、その遠隔経路も止められるので、管理上も分かりやすい構成になります。
次はTailscaleとWOLを設定していきます。
補足
この記事は実際の会話履歴と2026-09-08に保存した端末ログを元に再構成しました。
保存ログで確認できた事実と、記事として再現するための一般的な接続手順を分けています。
特に最終SSID接続時の nmcli / nmtui 操作だけは完全な端末ログが残っていなかったため、その部分は標準的な手順を書いています
