扩展板 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 / BT | UART 接到模块,Wi-Fi、蓝牙正常使用 |
| 2 / 4 打开 | TTL | UART 接到 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 无 wlan0 | aic8800 驱动未加载;用 lsmod 与 dmesg 中的 aic 日志确认,必要时 /etc/init.d/S36wifibt-init.sh restart |
wpa_cli 报 Failed to connect to non-global ctrl_ifname: wlan0 | wlan0 不存在或 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 校验 / 客户端隔离挡住 |
该镜像内核 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。
| 现象 | 原因 / 处理 |
|---|---|
| 手机连上但没 IP | logread | 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.ko | BT 低功耗管理 |
/lib/firmware/fw_patch_8800d80_u02_ext0.bin | BT patch 固件 |
/lib/firmware/aic_userconfig_8800d80.txt | Wi-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 available | HCI 未 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 配置入手排查。