跳到主要内容

扩展板 CAM126B-P-24 Wi-Fi / 蓝牙调试

本文记录 CAM126B-P-24 扩展板上 Wi-Fi、蓝牙的连接与验证方法,以及常见问题排查。

信息

调试前提:

  • 镜像需集成 AIC8800 驱动(aic8800_bsp / aic8800_fdrv / aic8800_btlpm),旧版镜像若没有这三个模块,ifconfig -a 里不会出现 wlan0
  • 板端可通过 adb 或网口登录 shell
  • SDIO 电压为 1.8V

模块与硬件准备​

项目说明
无线模块AIC8800D80,SDIO 接 Wi-Fi、UART 接 BT
频段双频 2.4G / 5G,实测协商到 5G(5200MHz,40MHz,Wi-Fi 6)
BT 串口/dev/ttyS2,1500000 波特率,硬件流控
设备树仍沿用 wifi_chip_type = ap6212,实际芯片为 AIC8800,配置时以实际驱动为准

S01 拨码用于选择模块 UART 的走向:

拨码位置功能说明
1 / 3 打开WIFI / BTUART 接到模块,Wi-Fi、蓝牙正常使用
2 / 4 打开TTLUART 接到 24PIN 排针,做调试串口
注意

模块工作异常时,先确认 S01 处于 1 / 3。拨到 2 / 4 时 UART 被切到 TTL 排针,蓝牙会表现为 hci0 无响应。

连接 WIFI 网络​

1. 确认网卡与驱动​

ifconfig -a                 # 应能看到 wlan0
lsmod | grep aic8800 # aic8800_bsp / aic8800_fdrv / aic8800_btlpm
dmesg | grep -i 'New interface create'

2. 写入 SSID / 密码​

编辑 /etc/wpa_supplicant.conf:

ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
update_config=1

network={
ssid="ORBI60"
psk="fanconn123"
key_mgmt=WPA-PSK
}

开机时 ifup wlan0 实际加载的是 /var/run/wpa_supplicant/wpa_supplicant.conf,wpa_cli save_config 写的也是这一份;本镜像上 /etc/wpa_supplicant.conf 是另一份独立文件,不会自动同步,两份都改才能保证重启后配置一致。

3. 扫描并连接​

wpa_cli -i wlan0 scan
sleep 6
wpa_cli -i wlan0 scan_results # 确认能看到目标 SSID 与加密方式

wpa_cli -i wlan0 reconfigure # 重新加载上面的配置
sleep 8
wpa_cli -i wlan0 status # 出现 wpa_state=COMPLETED 即连上

也可以交互式添加网络,效果等价:

wpa_cli -i wlan0 add_network
wpa_cli -i wlan0 set_network 0 ssid '"ORBI60"'
wpa_cli -i wlan0 set_network 0 psk '"fanconn123"'
wpa_cli -i wlan0 enable_network 0
wpa_cli -i wlan0 save_config

4. 获取 IP​

后台有 dhcpcd 在跑,连上后会自动分配地址:

ifconfig wlan0
ip route

若没有自动拿到地址,手动执行一次:

udhcpc -i wlan0 -q

5. 验证​

ping -c 4 10.0.0.1
ping -c 4 www.baidu.com
wpa_cli -i wlan0 signal_poll # 看 RSSI / LINKSPEED

6. 开机自启​

启动流程为 /etc/init.d/S36wifibt-init.sh → /usr/bin/wifibt-init.sh:加载 aic8800 三个模块、拉起 hciattach、再以如下参数启动 wpa_supplicant:

wpa_supplicant -B -i wlan0 -c /var/run/wpa_supplicant/wpa_supplicant.conf -P /run/wpa_supplicant.wlan0.pid

整条 Wi-Fi 链路(驱动 + hciattach + wpa_supplicant)需要重启时:

/etc/init.d/S36wifibt-init.sh restart

7. 断开与删除网络配置​

注意区分两种"断开",前者保留配置、后者彻底删除:

操作关键命令结果
只断开disconnect配置保留,reconnect 或重启后会自动连回
断开并删除remove_network + save_config配置从文件里消失,不再自动连接

只断开:保留配置​

调试漫游、信号差、临时切热点时常用:

wpa_cli -i wlan0 disconnect
wpa_cli -i wlan0 status # 应为 wpa_state=DISCONNECTED

wpa_cli -i wlan0 reconnect # 需要时再连回去
sleep 8
wpa_cli -i wlan0 status # 重新变回 wpa_state=COMPLETED
ifconfig wlan0 # IP 可能变化,确认拿到新地址

若 reconnect 后拿不到 IP,把网卡重新拉一遍:

ifconfig wlan0 down
ifconfig wlan0 up
wpa_cli -i wlan0 reconnect

断开并彻底删除配置​

wpa_cli -i wlan0 list_networks        # 先确认要删的 id,0 / 1 ...
wpa_cli -i wlan0 remove_network 0 # 从内存中删除
wpa_cli -i wlan0 save_config # 写回配置文件
wpa_cli -i wlan0 disconnect
注意

save_config 只写 /var/run/wpa_supplicant/wpa_supplicant.conf,而开机时 ifup wlan0(/etc/network/interfaces.d/wlan0 里的 wpa-conf)读的也是这个路径。/etc/wpa_supplicant.conf 在本镜像上是另一份独立文件,不会被自动同步,必须单独处理,否则残留的 network 段还会被连回去:

cat /var/run/wpa_supplicant/wpa_supplicant.conf   # 应只剩全局参数,没有 network 段
cat /etc/wpa_supplicant.conf # 若仍有 network 段,删掉或整份重写

删除后把 station 链路彻底停掉(切 AP 前也要做这一步):

killall wpa_supplicant
dhcpcd -k wlan0
sleep 1
ip addr flush dev wlan0
ifconfig wlan0 down

确认已经断开:

wpa_cli -i wlan0 status      # 报 Failed to connect ... 说明 wpa_supplicant 已退出
ip -4 addr show wlan0 # 没有 inet 地址

切换 SSID(先删再增)​

方式一:直接改配置文件(推荐,重启后依然生效)

vi /etc/wpa_supplicant.conf     # 修改 network 里的 ssid / psk
wpa_cli -i wlan0 reconfigure
sleep 8
wpa_cli -i wlan0 status

方式二:用 wpa_cli 在线增删,并写回配置

wpa_cli -i wlan0 list_networks        # 查看现有网络与 id
wpa_cli -i wlan0 remove_network 0 # 删掉旧的
wpa_cli -i wlan0 add_network # 返回新的 id,假设为 0
wpa_cli -i wlan0 set_network 0 ssid '"Fanconn"'
wpa_cli -i wlan0 set_network 0 psk '"fanconn123"'
wpa_cli -i wlan0 enable_network 0
wpa_cli -i wlan0 save_config # 写回 /var/run/wpa_supplicant/wpa_supplicant.conf
wpa_cli -i wlan0 reassociate
sleep 8
wpa_cli -i wlan0 status
提示
  • ssid / psk 都要带单引号包住的双引号,例如 '"ORBI60"',否则会按十六进制解析
  • 切换后 IP 由 dhcpcd 自动重新获取;仍为旧地址时执行 ifconfig wlan0 down && ifconfig wlan0 up 或重启 dhcpcd
  • save_config 依赖配置里的 update_config=1,缺这行只会改内存,重启即失效

常见问题​

现象原因 / 处理
ifconfig -a 无 wlan0aic8800 驱动未加载;用 lsmod 与 dmesg 中的 aic 日志确认,必要时 /etc/init.d/S36wifibt-init.sh restart
wpa_cli 报 Failed to connect to non-global ctrl_ifname: wlan0wlan0 不存在或 wpa_supplicant 未启动
Could not read interface wlan0 flags: No such device同上,先解决网卡不存在的问题
wpa_state=SCANNING / 4WAY_HANDSHAKE 卡住密码错误或路由器为 WPA3 模式;先用 scan_results 核对加密方式
连上但无 IP路由器 DHCP 池满;手动 udhcpc -i wlan0 -q
信号弱 / 速率低接 J5 IPEX 天线,signal_poll 看 RSSI(-40dBm 左右为佳)

WIFI 热点(AP 模式)​

wlan0 默认是 station(连路由器)。本节把它切成 AP,供手机 / 上位机连接。本镜像没有 NAT 能力,因此提供两种方案,按用途二选一:

方案用途终端地址优点缺点
DHCP 方案与 1126BP 通信:调试、传文件、adb、RTSP 等192.168.126.100 ~ 200,网关 192.168.126.1网段固定、地址可预测,不依赖现场网络终端不能上网
透明路由方案让终端通过板子 eth0 上网上游网段 10.0.3.100 ~ 150,网关 10.0.0.1终端能上网不做 NAT,地址由上游网段分配,必须知道终端 IP 才能做局域网通信;依赖上游路由器,可能被 ARP 校验 / 客户端隔离挡住
为什么透明路由不做 NAT

该镜像内核 CONFIG_NF_CONNTRACK / CONFIG_NF_NAT / CONFIG_BRIDGE 均未开启,系统里也没有 iptables,既做不了 NAT 共享,也做不了网桥,只能用"透明路由"绕过去。

通用准备:停掉 station 链路​

两种方案都要先断开当前 Wi-Fi 并停掉客户端进程(配置删除方法见前面的 ### 7. 断开与删除网络配置):

wpa_cli -i wlan0 remove_network 0       # 若还保存着网络
wpa_cli -i wlan0 save_config
wpa_cli -i wlan0 disconnect
killall wpa_supplicant
dhcpcd -k wlan0
sleep 1
ip addr flush dev wlan0
ifconfig wlan0 down

再让 dhcpcd 不要管 wlan0,否则它会以 DHCP 客户端身份抢地址:

grep -q '^denyinterfaces wlan0' /etc/dhcpcd.conf || echo 'denyinterfaces wlan0' >> /etc/dhcpcd.conf
killall -HUP dhcpcd

方案一:DHCP 方案(与 1126BP 通信,不能上网)​

由板子自己起 DHCP,给终端发 192.168.126.0/24 的地址。终端与板子同网段,可直接访问板子上的服务;板子不做转发,所以终端上不了互联网(板子自身仍走 eth0 上网,不受影响)。

1. 拉起 AP(WPA2 加密)​

写入 /etc/hostapd_ap.conf:

interface=wlan0
driver=nl80211
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
ssid=RV1126B-p
hw_mode=g
channel=6
ieee80211n=1
wmm_enabled=1
auth_algs=1
wpa=2
wpa_passphrase=00000000
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

先前台试跑,看到 AP-ENABLED 再放后台:

ifconfig wlan0 up
timeout 8 hostapd /etc/hostapd_ap.conf # 出现 wlan0: AP-ENABLED 即正常
hostapd -B /etc/hostapd_ap.conf # 后台常驻
hostapd_cli -i wlan0 status | grep -E '^(state|ssid|freq)'

输出里的 rfkill: Cannot open RFKILL control device 不影响 AP,可忽略。

2. 配置 192.168.126.1 与 DHCP​

ip addr flush dev wlan0
ip addr add 192.168.126.1/24 dev wlan0
ifconfig wlan0 up

备份后覆盖 /etc/dnsmasq.conf,只做 DHCP、不下发公网出口:

[ -f /etc/dnsmasq.conf.bak ] || cp -a /etc/dnsmasq.conf /etc/dnsmasq.conf.bak
cat > /etc/dnsmasq.conf <<'EOF'
interface=wlan0
bind-interfaces
dhcp-range=192.168.126.100,192.168.126.200,255.255.255.0,12h
dhcp-option=3,192.168.126.1
dhcp-option=6,192.168.126.1
log-dhcp
EOF
/etc/init.d/S80dnsmasq restart
提示

dhcp-option=3 是网关、dhcp-option=6 是 DNS,都指向板子自己。终端能访问板子上的服务,但没有公网出口,系统提示"已连接,无法访问互联网"属正常现象。

3. 验证​

手机连 RV1126B-p(密码 00000000),应拿到 192.168.126.100 ~ 200,网关 / DNS 为 192.168.126.1。

hostapd_cli -i wlan0 all_sta        # 终端 MAC 是否已关联
cat /var/lib/misc/dnsmasq.leases # 已发出的租约

在终端上 ping 192.168.126.1 应通;访问板子服务时地址固定为 192.168.126.1(例如 adb connect 192.168.126.1:5555)。

4. 无密码版本​

排查加密协商问题时,可以换成开放热点,地址与 DHCP 完全不变:

cat > /etc/hostapd_ap_open.conf <<'EOF'
interface=wlan0
driver=nl80211
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
ssid=RV1126B-p-open
hw_mode=g
channel=6
ieee80211n=1
wmm_enabled=1
auth_algs=1
wpa=0
EOF

killall hostapd
sleep 2
hostapd -B /etc/hostapd_ap_open.conf
hostapd_cli -i wlan0 status | grep -E '^(state|ssid)'

wpa=0 即开放网络,手机连接不弹密码框,但系统会提示"不安全"。用完切回加密热点:

killall hostapd && sleep 2 && hostapd -B /etc/hostapd_ap.conf

5. 断开并删除热点配置​

killall hostapd
ip addr flush dev wlan0
ifconfig wlan0 down
rm -f /etc/hostapd_ap.conf /etc/hostapd_ap_open.conf

恢复 dnsmasq 原配置(首次操作前已备份):

/etc/init.d/S80dnsmasq stop
[ -f /etc/dnsmasq.conf.bak ] && cp -a /etc/dnsmasq.conf.bak /etc/dnsmasq.conf
/etc/init.d/S80dnsmasq start

需要回到 station(客户端)模式时,去掉 dhcpcd 的屏蔽并重新拉起 wpa_supplicant(前提是 /var/run/wpa_supplicant/wpa_supplicant.conf 里还有 network 段):

sed -i '/^denyinterfaces wlan0$/d' /etc/dhcpcd.conf
killall -HUP dhcpcd
wpa_supplicant -B -i wlan0 -c /var/run/wpa_supplicant/wpa_supplicant.conf -P /run/wpa_supplicant.wlan0.pid
sleep 8
wpa_cli -i wlan0 status
udhcpc -i wlan0 -q

方案二:透明路由方案(终端可上网)​

给终端发上游网段地址,并由板子在 eth0 / wlan0 之间转发,终端因此可以直接上网。代价是不做 NAT:

  • 终端地址由上游网段分配,板子无法预知,要和终端通信必须先 cat /var/lib/misc/dnsmasq.leases 查到 IP
  • 依赖上游路由器能 ARP 到终端 IP,遇到 ARP 校验 / 客户端隔离会不通
手机 10.0.3.1xx/22 ──wlan0(AP,10.0.3.250)──▶ 板子 ──eth0(10.0.2.0)──▶ 网关 10.0.0.1 ──▶ Internet

AP 部分(hostapd 配置、加密 / 无密码)与方案一完全相同,这里只列差异步骤。

1. 切地址并开转发​

dnsmasq 要求 DHCP 池与接口地址在同一子网,所以 wlan0 必须持有一个上游网段的地址(这里取 10.0.3.250,避开常用段):

ip addr flush dev wlan0
ip addr add 10.0.3.250/22 dev wlan0
ifconfig wlan0 up
ip route del 10.0.0.0/22 dev wlan0 2>/dev/null
ip route add 10.0.0.0/22 dev wlan0 metric 3003 src 10.0.3.250

echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp
echo 1 > /proc/sys/net/ipv4/conf/wlan0/proxy_arp
注意

wlan0 加上 10.0.0.0/22 后会生成一条 metric 0 的直连路由,比 eth0 的 metric 1002 优先,板子自己的上网会被切到 wlan0。所以必须删掉再加成 metric 3003,并用下面这条确认上行仍走 eth0:

ip route get 10.0.0.1     # 应输出 dev eth0

2. 改 DHCP 池与回程路由​

每个租约补一条 /32 路由,保证回程包从 wlan0 出去:

cat > /etc/ap_lease.sh <<'EOF'
#!/bin/sh
case "$1" in
add|old) ip route replace "$3/32" dev wlan0 ;;
del) ip route del "$3/32" dev wlan0 2>/dev/null ;;
esac
EOF
chmod +x /etc/ap_lease.sh

备份后覆盖 /etc/dnsmasq.conf:

cp -a /etc/dnsmasq.conf /etc/dnsmasq.conf.bak
cat > /etc/dnsmasq.conf <<'EOF'
interface=wlan0
bind-interfaces
dhcp-range=10.0.3.100,10.0.3.150,255.255.252.0,12h
dhcp-option=3,10.0.0.1
dhcp-option=6,10.0.0.1
dhcp-script=/etc/ap_lease.sh
log-dhcp
EOF
/etc/init.d/S80dnsmasq restart

3. 验证​

手机连 RV1126B-p(密码 00000000),应拿到 10.0.3.100 ~ 150,网关与 DNS 均为 10.0.0.1,可直接上网。板子侧同步观察:

hostapd_cli -i wlan0 all_sta      # 终端 MAC 是否已关联
cat /var/lib/misc/dnsmasq.leases # 查终端 IP,局域网通信 / 排障都要用到
ip route | grep 10.0.3 # 应出现 10.0.3.1xx/32 dev wlan0
ping -c 3 www.baidu.com # 板子自身连通性(走 eth0)
提示

该模式下终端地址不固定,要和终端通信必须先知道它的 IP(cat /var/lib/misc/dnsmasq.leases);方案一则是固定的 192.168.126.x。

现象原因 / 处理
手机连上但没 IPlogread | grep dnsmasq 看是否报池不匹配;确认 dnsmasq 已重启、wlan0 地址在 10.0.0.0/22
手机有 IP 但打不开网页上游路由器对非 DHCP 记录的 IP 做 ARP 校验/客户端隔离;确认两端 proxy_arp 均为 1,且 ip route | grep 10.0.3 有对应 /32
板子自己上不了网ip route get 10.0.0.1 走了 wlan0;按本方案第 1 步把 10.0.0.0/22 路由重建为 metric 3003
AP 起不来或状态反复先 killall hostapd,确认没有 wpa_supplicant/dhcpcd 占用 wlan0

无密码版本与方案一第 4 步完全相同(只替换 hostapd 配置文件,地址与 DHCP 不变)。

4. 断开并删除热点配置​

killall hostapd
ip addr flush dev wlan0
ifconfig wlan0 down
rm -f /etc/hostapd_ap.conf /etc/hostapd_ap_open.conf /etc/ap_lease.sh

还原转发与代理 ARP,避免板子继续替上游主机代答 ARP:

echo 0 > /proc/sys/net/ipv4/ip_forward
echo 0 > /proc/sys/net/ipv4/conf/eth0/proxy_arp
echo 0 > /proc/sys/net/ipv4/conf/wlan0/proxy_arp
ip route flush dev wlan0

恢复 dnsmasq 原配置、回到 station 模式的命令与方案一第 5 步相同。

提示

以上都是运行态配置,重启后不会自动开热点(wlan0 仍走 ifup 的 station 流程,但因配置里已删掉 network 段,不会自动连回)。需要开机自动开热点,可把对应方案的前两步做成 /etc/init.d/S37wifi-ap.sh 之类的启动脚本。

蓝牙调试​

1. 确认控制器​

开机由 wifibt-init.sh 自动执行 attach,正常情况下直接可用:

hciconfig -a
hci0:   Type: Primary  Bus: UART
BD Address: D8:02:5F:19:D6:EB ACL MTU: 1021:9 SCO MTU: 255:4
UP RUNNING
HCI Version: 5.4 (0xd) Revision: 0xb

2. 手动 attach(自动流程失效时)​

ps | grep hciattach                     # 确认进程是否在跑
hciattach -s 1500000 /dev/ttyS2 any 1500000 flow

上电状态可用 rfkill 与 gpio 确认:

for r in /sys/class/rfkill/rfkill*; do echo "$r $(cat $r/name) state=$(cat $r/state)"; done
cat /sys/kernel/debug/gpio | grep bt # gpio-193 bt_default_poweron 应为 out hi

3. 扫描与配对​

bluetoothctl
[bluetooth]# power on
[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# scan on

非交互方式(扫描 20 秒后打印结果):

bluetoothctl --timeout 20 scan on > /tmp/bt_scan.log 2>&1
bluetoothctl devices

4. 驱动与固件​

文件说明
aic8800_bsp.ko总线/电源管理,负责 BT patch 下载
aic8800_btlpm.koBT 低功耗管理
/lib/firmware/fw_patch_8800d80_u02_ext0.binBT patch 固件
/lib/firmware/aic_userconfig_8800d80.txtWi-Fi 射频配置

dmesg 中可确认 patch 加载与串口参数:

aicbt_patch_table_load bt uart_baud[3]:1500000
aicbt_patch_table_load bt uart_flowctrl[3]:1

常见问题​

现象原因 / 处理
hciconfig -a 无输出hciattach 未运行或已退出;手动执行第 2 步
hci0: Opcode 0x0c03 failed: -110芯片未上电或 UART 未通到模块;查 rfkill 状态、S01 是否在 1 / 3
bluetoothctl list 报 No default controller availableHCI 未 attach 成功
扫描不到设备未 power on,或 scan on 时间太短(建议 ≥10s)
控制器名显示 BlueZ 5.77默认未设置别名,bluetoothctl system-alias <名字> 修改

实测记录​

测试时间 2026-10-29,镜像 Buildroot 2024.02 / rockchip_rv1126b(2026-10-28 06:55),内核 6.1.141,通过 adb connect 10.0.2.0:5555 登录。

项目结果实测数据
驱动加载正常aic8800_bsp / aic8800_fdrv / aic8800_btlpm 均在 lsmod 中,New interface create wlan0
wlan0正常MAC D8:02:5F:19:D6:EA
扫描正常scan_results 可看到 ORBI60(2.4G / 5G / 5.8G 多个 BSSID)
连接成功wpa_state=COMPLETED,ssid=ORBI60,key_mgmt=WPA2-PSK,5200MHz / 40MHz
IP自动获取10.0.0.35/22,网关 10.0.0.1
连通性正常ping 10.0.0.1 0% 丢包;ping www.baidu.com 0% 丢包,平均 5ms
信号良好RSSI=-40,LINKSPEED=286,NOISE=-92
BT 控制器正常hci0 UP RUNNING,BD Address D8:02:5F:19:D6:EB,HCI 5.4,Manufacturer 0x0b3b(AIC)
BT 扫描正常bluetoothctl --timeout 20 scan on 扫到 17 个设备(含手机、BLE 传感器等)
提示

同一个 CAM126B-P-24 板子,若刷的是不含 aic8800 驱动的镜像(例如 rockchip_rv1126b_ipc 配置的版本),SDIO 上能枚举到无线芯片(mmc2 ... SDIO card at address 390b),但 wlan0 不会出现、BT 也无 hci0。遇到这种情况先换用集成 AIC8800 驱动的固件,不要从 wpa_supplicant 配置入手排查。