一、WiFi框架概述
1、Wi‑Fi 是一种无线通信技术,在 Linux 系统上一般可处于三种工作模式,分别是: STATION、AP、MONITOR。
station :工作sta模式,类比手机主动连网。
ap:工作ap模式,类比手机开热点。
monitor:工作 monitor 模式,类比抓包网卡。
2、从整体结构上 Wi‑Fi 可以分为设备端(Device)和主机端(Host);设备端主要是数据链路层的实现和接口管理,主机端主要是应用层和协议层的实现。
模组驱动移植主要所做的工作:供电使能,传输接口适配。
(1)供电使能:提供 WiFi 供电,使能操作。如果平台 WiFi 供电通过电源管理芯片,那么就需要配置电源管理芯片电源域进行使能 WiFi 的所需电;WiFi 芯片正常工作需要主控 soc 输出使能信号。
(2)传输接口适配:WiFi 通过通信接口与主控进行连接,常见的通信接口有 SDIO,USB,PCI,SPI 等。通信接口的驱动往往是由主控端提供,平台层需要提供通信接口初始化(如 SDIO 扫卡)、读、写等函数操作集合。一般情况下由于通信接口都是标准的 Linux API,所以往往模组原厂已经适配好了读写等操作的接口函数,平台适配可能仅仅需要配置平台差异就好,如选择使用 SDIO 接口,需要确定选择的 SDIO 卡号、扫卡函数等。
二、硬件连接


三、工作条件
1、SDIO
SDIO Wi‑Fi 模组工作的条件,如下图,需要满足以下几个条件:
(1)供电:一般有两路供电,其中 VCCWIFI 为主电源,VCCIOWIFI 为 IO 上拉电源。(需要特别留意,有时候设计可以两路电合并)
(2)使能:要能正常工作,需要 WLREGON 给高电平。(部分模组可能有时序要求,比如先拉高再拉低,再拉高)
(3)唤醒主控:当系统休眠时,Wi‑Fi 模组可通过 WLWAKEAP 的中断唤醒主控。(有些模组也通过该引脚来作为主控接收数据的中断)
(4)SDIO:与 SOC 的通信有通过 USB,SDIO 等,这里以 SDIO 为例,其中 SDIO 0~3 为 SDIO 的4 条数据线。
(5)次时钟 32.768Khz 信号:根据模组而定,有些模组内部通过(6)中的输入的 clk 进行分频得到,有些需要外部单独输入该信号。
(6)主时钟 24/26Mhz 信号。

2、USB
USB Wi‑Fi 模组工作的条件,如下图,需要满足以下几个条件:
(1)供电:一般只有一路电源,采用贴板的 USB 模组一般会使用 VCC‑WiFi 给模组供电,电源由软件配置开启。采用 USB 接口可拔插设计的 WiFi 模组一般使用 USB 供电,一般为常电,则无需使用软件配置开启电源。
(2)使能:要能正常工作,需要 WLREGON 给高电平。采用 USB 接口可拔插设计的 WiFi 模组可能无此引脚则无需配置。(部分模组可能有时序要求,比如先拉高再拉低,再拉高)
(3)唤醒主控:当系统休眠时,Wi‑Fi 模组可通过 WLWAKEAP 的中断唤醒主控。USB 模组一般使用 USB 唤醒无须配置,若模组特殊要求使用 GPIO 唤醒则需要配置。(需要特别留意,多数 USBWiFi 模组不支持休眠唤醒)
(4)USB:与 SOC 的通信有通过 USB,SDIO 等,这里以 USB 为例,其中 DP、DM 为 USB 的两条数据线。

四、移植步骤
1、内核驱动适配
(1)获取驱动源码
在新方案上移植一款 Wi‑Fi 模组时,可以先查看《支持列表》文档是否有类似方案支持该模组。如果没有支持,则需要跟模组原厂获取驱动资料包。拿到原厂提供的资料包需要仔细阅读模组原厂提供的材料,如:支持的通信接口类型 SDIO, 还是 USB;SDIO 是 2.0 还是 3.0;支持 2.4G 还是 5G甚至是双频等。
(2)添加 Kconfig
路径:longan/bsp/drivers/net/wireless
添加内容如下:

(3)添加 Makefile
路径:longan/bsp/drivers/net/wireless
添加内容如下:

(4)内核配置对应选项

路径:longan/device/config/chips/t527/configs/xxx/linux-5.15/android13_arm64_defconfigCONFIG_RTL8821CS=y
(5)DTS
longan/bsp/configs/linux-5.15/sun55iw3p1.dtsi
内容如下:

board.dts
以下所有项必须参看原理图进行配置,配置与原理图实际使用的资源保持一致;最好是和硬件同事一起确认,比如有些设计供电可能是没有 axp 的,硬件直接供电了,所以不需要配置,特别注意的就是 sdio 的配置。
&rfkill {compatible = "allwinner,sunxi-rfkill";chip_en;power_en;pinctrl-0;pinctrl-names;status = "okay";/* wlan session */wlan {compatible = "allwinner,sunxi-wlan";clocks;clock-names;wlan_power = "axp2202-dcdc4", "axp2202-bldo1"; /* vcc-pl/vcc-pg/vcc-pm */wlan_power_vol= <3300000>, <1800000>;wlan_busnum = <0x1>;wlan_regon = <&r_pio PM 1 GPIO_ACTIVE_HIGH>;wlan_hostwake = <&r_pio PM 0 GPIO_ACTIVE_HIGH>;wakeup-source;};/* bt session */bt {compatible = "allwinner,sunxi-bt";clocks;clock-names;bt_power = "axp2202-dcdc4", "axp2202-bldo1"; /* vcc-pl/vcc-pg/vcc-pm */bt_power_vol= <3300000>, <1800000>;bt_rst_n = <&r_pio PM 2 GPIO_ACTIVE_LOW>;};
};
属性说明:
wlan_busnum :表示 WiFi 所使用的 SDIO 控制器号
wlan_power :表示给 WiFi 模组供电的 regulator 名称
wlan_power_vol :表示 WiFi 模组需要使用到的电的电压
wlan_regon :表示给 WiFi 模组的 GPIO 供电的 regulator 名称
wlan_hostwake :表示 WiFi 唤醒主控的 GPIOchip_en 表示 WiFi 模组使能引脚,硬件未使用时不配置
power_en :表示模块外部的电源开关控制引脚
(6)驱动
驱动路径:
longan/bsp/drivers/net/wireless/rtl8821cs
驱动内容:
路径:longan/bsp/drivers/net/wireless/rtl8821cs/os_dep/linux/sdio_intf.c
对应的SDIO组别

2、Android 配置
(1)BoardConfig.mk
文件路径:android/device/softwinner/saturn/{DEVICE}/BoardConfig.mk
BoardConfig.mk 文件决定 android 要加载哪一款 Wi‑Fi 模组,以及是否支持蓝牙。

(2)Android Wi‑Fi/BT 配置项说明
BOARD_WIFI_VENDOR :Wi‑Fi 模组厂商
BOARD_USR_WIFI :Wi‑Fi 模组型号
WIFI_DRIVER_MODULE_PATH :Wi‑Fi 驱动 ko 的路径
WIFI_DRIVER_MODULE_NAME :Wi‑Fi 驱动名称 (加载驱动后 lsmod 的名字)
WIFI_DRIVER_MODULE_ARG :Wi‑Fi 驱动加载所需参数
BOARD_BLUETOOTH_VENDOR :蓝牙模组厂商
BOARD_HAVE_BLUETOOTH_NAME :蓝牙模组型号
3、编译烧录
编译问题未进行记录,本驱动已经解决,可直接使用。
若出现下述问题,编译为ko文件,重定义问题会避免

五、验证说明
1、SDIO总线识别

2、驱动加载

dmesg |grep RTW
[ 4.268562] sunxi-rfkill soc@3000000:rfkill: RTW wlan_data end
[ 9.390946] RTW: module init start
[ 9.398262] RTW: rtl8821cs v5.14.2.1-48-g54206815b.20221004_COEX20210319-5555
[ 9.413366] RTW: build time: Mar 17 2025 22:07:27
[ 9.424323] RTW: rtl8821cs BT-Coex version = COEX20210319-5555
[ 9.591165] RTW: module init ret=0
[ 9.808791] RTW: == SDIO Card Info ==
[ 9.825226] RTW: card: (____ptrval____)
[ 9.825230] RTW: clock: 50000000 Hz
[ 9.825232] RTW: timing spec:
[ 9.863329] RTW: sd3_bus_mode: TRUE
[ 9.863331] RTW: func num: 1
[ 9.863334] RTW: func1: (____ptrval____) (*)
[ 9.884046] RTW: ================
[ 9.884101] RTW: [HALMAC]55772M
[ 9.966339] RTW:
[ 9.983050] RTW: 0x000: 29 81 00 BC 09 10
[ 10.017357] RTW: 0x010: FF FF FF FF FF FF FF FF FF FF FF 02 FF FF FF FF
[ 10.145630] RTW: 0x020: FF FF 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 30 2E 2C 2B
[ 10.155078] RTW: 0x030: 02 FF FF FF FF FF 00 FF FF FF 25 25 25 25 25 25
[ 10.163006] RTW: 0x040: 2C 2C 2C 2C 2C 14 FF FF FF FF FF FF FF FF FF FF
[ 10.170928] RTW: 0x050: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
[ 10.178850] RTW: 0x060: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
[ 10.187100] RTW: 0x070: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
[ 10.196333] RTW: 0x080: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
[ 10.204250] RTW: 0x090: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
[ 10.212173] RTW: 0x0A0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
[ 10.220085] RTW: 0x0B0: FF FF FF FF FF FF FF FF 7F 2F 1B 00 FF FF FF FF
[ 10.228018] RTW: 0x0C0: FF 21 00 41 00 00 00 00 00 FF 02 FF FF FF FF FF
[ 10.235939] RTW: 0x0D0: 7E D1 01 23 34 FF FF FF 20 04 4C 02 21 C8 21 02
[ 10.243868] RTW: 0x0E0: 0C 00 22 04 00 08 00 32 FF 21 02 0C 00 22 2A 01
[ 10.243894] RTW: 0x0F0: 01 00 00 00 00 00 00 00 00 00 00 00 02 00 FF FF
[ 10.243919] RTW: 0x100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 10.243944] RTW: 0x110: 00 EB 00 6E 01 00 00 00 00 FF DC 0D 30 96 08 B4
[ 10.243970] RTW: 0x120: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
[ 10.243995] RTW: 0x130: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
[ 10.244021] RTW: 0x140: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
[ 10.244047] RTW: 0x150: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
[ 10.244072] RTW: 0x160: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
[ 10.244098] RTW: 0x170: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
[ 10.244124] RTW: 0x180: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
[ 10.244149] RTW: 0x190: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
[ 10.244175] RTW: 0x1A0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
[ 10.244201] RTW: 0x1B0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
[ 10.244226] RTW: 0x1C0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
[ 10.244252] RTW: 0x1D0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
[ 10.244278] RTW: 0x1E0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
[ 10.244303] RTW: 0x1F0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
[ 10.244390] RTW: rtw_rfctl_decide_init_chplan chplan:0x7F
[ 10.247813] RTW: MAC dc 0d
[ 10.332633] RTW: c2h_mac_hidden_rpt_hdl: 0x0D
[ 10.436853] RTW: c2h_mac_hidden_rpt_hdl: 0x14
[ 10.436856] RTW: c2h_mac_hidden_rpt_hdl: 0x13
[ 10.436858] RTW: c2h_mac_hidden_rpt_hdl: 0xBC
[ 10.436861] RTW: c2h_mac_hidden_rpt_hdl: 0xF6
[ 10.436863] RTW: c2h_mac_hidden_rpt_hdl: 0xFF
[ 10.436865] RTW: c2h_mac_hidden_rpt_hdl: 0x37
[ 10.436867] RTW: c2h_mac_hidden_rpt_hdl: 0xFF
[ 10.436869] RTW: uuid x:0x0d y:0x14 z:0x13 crc:0x5e0
[ 10.436872] RTW: hci_type:0x6
[ 10.436874] RTW: package_type:0x7
[ 10.436876] RTW: tr_switch:0x1
[ 10.436878] RTW: wl_func:0xf
[ 10.436879] RTW: hw_stype:0xf
[ 10.436881] RTW: bw:0x7
[ 10.436883] RTW: ant_num:0x1
[ 10.436884] RTW: protocol:0x3
[ 10.436886] RTW: nic:0x3
[ 10.436890] RTW: c2h_mac_hidden_rpt_2_hdl: 0xFF
[ 10.510754] RTW: c2h_mac_hidden_rpt_2_hdl: 0xFF
[ 10.510757] RTW: c2h_mac_hidden_rpt_2_hdl: 0xF8
[ 10.510760] RTW: c2h_mac_hidden_rpt_2_hdl: 0xFC
[ 10.510762] RTW: c2h_mac_hidden_rpt_2_hdl: 0xFF
[ 10.516035] RTW: [RF_PATH] ver_id.RF_TYPE:RF_1T1R
[ 10.516040] RTW: [RF_PATH] HALSPEC's rf_reg_trx_path_bmp:0x11, rf_reg_path_avail_num:1, max_tx_cnt:1
[ 10.516044] RTW: [RF_PATH] PG's trx_path_bmp:0x00, max_tx_cnt:0
[ 10.516046] RTW: [RF_PATH] Registry's trx_path_bmp:0x00, tx_path_lmt:0, rx_path_lmt:0
[ 10.516049] RTW: [RF_PATH] HALDATA's trx_path_bmp:0x11, max_tx_cnt:1
[ 10.516051] RTW: [RF_PATH] HALDATA's rf_type:RF_1T1R, NumTotalRFPath:1
[ 10.516055] RTW: [TRX_Nss] HALSPEC - tx_nss:1, rx_nss:1
[ 10.516057] RTW: [TRX_Nss] Registry - tx_nss:0, rx_nss:0
[ 10.516059] RTW: [TRX_Nss] HALDATA - tx_nss:1, rx_nss:1
[ 10.516062] RTW: txpath=0x1, rxpath=0x1
[ 10.516064] RTW: txpath_1ss:0x1, num:1
[ 10.516605] RTW: ADAPTIVITY_VERSION 9.7.08
[ 10.516611] RTW: RTW_ADAPTIVITY_EN_ENABLE
[ 10.516616] RTW: RTW_ADAPTIVITY_MODE_NORMAL
[ 10.516659] RTW: rtw_regsty_chk_target_tx_power_valid return _FALSE for band:0, path:0, rs:0, t:-1
[ 10.517570] RTW: ERROR retriveFromFile() Fail. retrieve file : PHY_REG_PG.txt, error : -2
[ 10.517573] RTW: ERROR retriveFromFile() Fail. retrieve file : /vendor/etc/firmware/PHY_REG_PG.txt, error : -2
[ 10.517615] RTW: ERROR retriveFromFile() Fail. retrieve file : TXPWR_LMT.txt, error : -2
[ 10.517618] RTW: ERROR retriveFromFile() Fail. retrieve file : /vendor/etc/firmware/TXPWR_LMT.txt, error : -2
[ 10.518142] RTW: default mapping domain to txpwr_lmt:WW
[ 10.521792] RTW: rtw_ndev_init(wlan0) if1 mac_addr=dc:0d:30:96:08:b4
[ 10.708382] RTW: rtw_ndev_init(p2p0) if2 mac_addr=de:0d:30:96:08:b4
[ 13.579617] RTW: MAC dc 0d
[ 15.387802] RTW: wlan0 - hw_port : 0,will switch to port-1
[ 16.935207] RTW: wlan0- hw port(1) mac_addr =dc:0d:30:96:08:b4
[ 16.941920] RTW: p2p0- hw port(0) mac_addr =de:0d:30:96:08:b4
[ 17.121276] RTW: assoc success
[ 17.133251] RTW: set group key camid:0, addr:de:0d:30:96:08:b4, kid:1, type:TKIP
3、网络设备

4、连接测试
打开Android 设置 internet部分进行wifi搜索连接

连接时导致内核崩溃:

错误分析:
-
halrf_iqk_dbg+0x558/0x55c [8821cs] 表明错误发生在无线驱动程序(8821cs)的 halrf_iqk_dbg 函数中,通常与无线电频率校准(IQK)调试相关。
-
phy_iq_calibrate_8821c+0x284/0x3ec 显示了调用栈中的另一个函数,涉及到 8821c 无线芯片的 IQ 校准。
能否关闭IQ校准?
路径:longan/bsp/drivers/net/wireless/rtl8821cs/hal/phydm/halrf/rtl8821c/halrf_iqk_8821c.c:3542
注释 halrf_iqk_dbg(dm)
#if (DM_ODM_SUPPORT_TYPE & ODM_AP)_iqk_iqk_fail_report_8821c(dm); // 如果支持 AP 模式,调用 IQK 错误报告函数
#endif// halrf_iqk_dbg(dm); // 调用 IQK 调试函数if (!(*dm->mp_mode))_iqk_check_coex_status(dm, false); // 如果不在 MP 模式,检查协同工作状态RF_DBG(dm, DBG_RF_IQK, "[IQK]final 0x49c = %x\n", odm_read_1byte(dm, 0x49c)); // 打印调试信息
修改后可以正常连接
注释掉了halrf_iqk_dbg(dm);,问题解决。这说明该函数内部存在导致崩溃的代码,定位halrf_iqk_dbg函数的实现
代码路径:longan/bsp/drivers/net/wireless/rtl8821cs/hal/phydm/halrf/halrf.c +380
修复了位操作错误和RF路径越界访问的问题,并添加了必要的空指针检查和硬件兼容性判断:
void halrf_iqk_dbg(void *dm_void)
{struct dm_struct *dm = (struct dm_struct *)dm_void;u8 rf_path, j, max_rf_path;u32 tmp;/* two channel, PATH, TX/RX, 0:pass 1 :fail */boolean iqk_result[2][NUM][2];struct dm_iqk_info *iqk_info = &dm->IQK_info;struct _hal_rf_ *rf = &dm->rf_table;/* 新增:空指针检查 */if (!dm->channel || !dm->band_width) {RF_DBG(dm, DBG_RF_IQK, "Invalid channel/bandwidth info\n");return;}/* IQK INFO */RF_DBG(dm, DBG_RF_IQK, "%-20s\n", "====== IQK Info ======");/* 动态确定最大RF路径 */max_rf_path = RF_PATH_A; // 默认单路径
#if (RTL8822B_SUPPORT == 1 || RTL8822C_SUPPORT == 1 || RTL8814B_SUPPORT == 1)if (dm->support_ic_type & (RTL8822B | RTL8822C | RTL8814B))max_rf_path = RF_PATH_B; // 双路径芯片
#endifRF_DBG(dm, DBG_RF_IQK, "%-20s\n",(dm->fw_offload_ability & PHYDM_RF_IQK_OFFLOAD) ? "FW-IQK" :"Driver-IQK");if (dm->fw_offload_ability & PHYDM_RF_IQK_OFFLOAD) {halrf_get_fw_version(dm);RF_DBG(dm, DBG_RF_IQK, "%-20s: 0x%x\n", "FW_VER", rf->fw_ver);} else {RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "IQK_VER", HALRF_IQK_VER);}RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "reload",(iqk_info->is_reload) ? "True" : "False");RF_DBG(dm, DBG_RF_IQK, "%-20s: %d %d\n", "iqk count / fail count",dm->n_iqk_cnt, dm->n_iqk_fail_cnt);RF_DBG(dm, DBG_RF_IQK, "%-20s: %d\n", "channel", *dm->channel);if (*dm->band_width == CHANNEL_WIDTH_20)RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "bandwidth", "BW_20");else if (*dm->band_width == CHANNEL_WIDTH_40)RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "bandwidth", "BW_40");else if (*dm->band_width == CHANNEL_WIDTH_80)RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "bandwidth", "BW_80");else if (*dm->band_width == CHANNEL_WIDTH_160)RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "bandwidth", "BW_160");else if (*dm->band_width == CHANNEL_WIDTH_80_80)RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "bandwidth", "BW_80_80");elseRF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "bandwidth","BW_UNKNOWN");RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "rfk_forbidden",(iqk_info->rfk_forbidden) ? "True" : "False");
#if (RTL8814A_SUPPORT == 1 || RTL8822B_SUPPORT == 1 || \RTL8821C_SUPPORT == 1 || RTL8195B_SUPPORT == 1 ||\RTL8814B_SUPPORT == 1 || RTL8822C_SUPPORT == 1||\RTL8814C_SUPPORT == 1)RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "segment_iqk",(iqk_info->segment_iqk) ? "True" : "False");
#endifRF_DBG(dm, DBG_RF_IQK, "%-20s: %llu %s\n", "progressing_time",dm->rf_calibrate_info.iqk_progressing_time, "(ms)");/* 新增:仅在支持相关寄存器的芯片上访问 */
#if (RTL8822B_SUPPORT == 1 || RTL8822C_SUPPORT == 1 || RTL8814B_SUPPORT == 1)if (dm->support_ic_type & (RTL8822B | RTL8822C | RTL8814B)) {tmp = odm_read_4byte(dm, 0x1bf0);for (rf_path = RF_PATH_A; rf_path <= max_rf_path; rf_path++) {for (j = 0; j < 2; j++) {/* 修正位操作:移除错误右移 */iqk_result[0][rf_path][j] = (boolean)((tmp & BIT(rf_path + (j * 4))) != 0);}}RF_DBG(dm, DBG_RF_IQK, "%-20s: 0x%08x\n", "Reg0x1bf0", tmp);RF_DBG(dm, DBG_RF_IQK, "%-20s: 0x%08x\n", "Reg0x1be8",odm_read_4byte(dm, 0x1be8));RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "PATH_A-Tx result",(iqk_result[0][RF_PATH_A][0]) ? "Fail" : "Pass");RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "PATH_A-Rx result",(iqk_result[0][RF_PATH_A][1]) ? "Fail" : "Pass");
#if (RTL8822B_SUPPORT == 1 || RTL8822C_SUPPORT == 1)if (max_rf_path >= RF_PATH_B) {RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "PATH_B-Tx result",(iqk_result[0][RF_PATH_B][0]) ? "Fail" : "Pass");RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "PATH_B-Rx result",(iqk_result[0][RF_PATH_B][1]) ? "Fail" : "Pass");}
#endif}
#endif
} /* halrf_iqk_dbg */
4、联网测试

5、Android AP设置

