当前位置: 首页 > news >正文

Android13 WIFI调试(rtl8821cs)

一、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 卡号、扫卡函数等。

二、硬件连接

SDIO接口:
USB接口;

三、工作条件

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

驱动内容:

SDIO_ID=024C:C821
路径: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、网络设备

ifconfig -a

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设置

设置后手机可正常搜索连接
至此。WIFI调试结束,功能正常!!!

相关文章:

Android13 WIFI调试(rtl8821cs)

一、WiFi框架概述 1、Wi‑Fi 是一种无线通信技术&#xff0c;在 Linux 系统上一般可处于三种工作模式&#xff0c;分别是: STATION、AP、MONITOR。 station &#xff1a;工作sta模式&#xff0c;类比手机主动连网。 ap&#xff1a;工作ap模式&#xff0c;类比手机开热点。 mon…...

Android常见界面控件、程序活动单元Activity练习

第3章 Android常见界面控件、第4章程序活动单元Activity 一. 填空题 1. (填空题)Activity的启动模式包括standard、singleTop、singleTask和_________。 正确答案&#xff1a; (1) singleInstance 2. (填空题)启动一个新的Activity并且获取这个Activity的返回数据&#xff…...

过拟合、归一化、正则化、鞍点

过拟合 过拟合的本质原因往往是因为模型具备方差很大的权重参数。 定义一个有4个特征的输入&#xff0c;特征向量为,定义一个模型&#xff0c;其只有4个参数&#xff0c;表示为。当模型过拟合时&#xff0c;这四个权重参数的方差会很大&#xff0c;可以假设为。当经过这个模型后…...

关于多agent多consumer架构设想

多个agent接入设备 每个agent对接同一个消费队列&#xff0c;非竞争设置&#xff0c;通过判断consumer中的参数如果是发给自己的&#xff0c;则下发&#xff0c;如果不是&#xff0c;则快速跳过。每个消费者接收消息时通过Header中值判断是来着哪个agent服务器的&#xff0c;发…...

国内互联网大厂推出的分布式数据库 的详细对比,涵盖架构、性能、适用场景、核心技术等维度

以下是 国内互联网大厂推出的分布式数据库 的详细对比&#xff0c;涵盖架构、性能、适用场景、核心技术等维度&#xff1a; 一、主流分布式数据库列表 大厂数据库名称类型适用场景发布时间腾讯云TDSQL分布式HTAP金融、电商、游戏、政企2010年阿里云OceanBase分布式HTAP银行核…...

【深度学习】自定义实现DataSet和DataLoader

dataset数据集 作用&#xff1a; 存储数据集的信息获取数据集长度 __len__获取数据集某特定条目的内容 __getitem__ dataloader 数据加载器 作用&#xff1a; 从数据集中随机加载数据, 并拼接为一个 batch实现迭代器, 可以使用时, 迭代获取数据内容 代码实现&#xff1a;…...

spark简介和核心编程

简介 1. Spark-SQL概述&#xff1a;Spark SQL是Spark处理结构化数据的模块&#xff0c;前身是Shark。Shark基于Hive开发&#xff0c;提升了SQL-on-Hadoop的性能&#xff0c;但对Hive的过度依赖制约了Spark发展。SparkSQL抛弃Shark代码&#xff0c;汲取其优点后重新开发&#x…...

47、Spring Boot 详细讲义(四)

六. Spring Boot 与数据库 目录 ​ JDBC 集成 ​ Spring Data JPA ​ MyBatis 集成 ​ 事务管理 1、JDBC 集成 1.1 JDBC简介 1.1.1 定义和作用 JDBC(Java Database Connectivity)是Java中用于与关系型数据库进行交互的API。它为Java程序提供了一个标准的、统一的接口…...

Dify - 整合Ollama + Xinference私有化部署Dify平台(01)

文章目录 总体方案服务器在Ubuntu 20.04上安装Docker更新软件包索引安装一些必要的软件包&#xff0c;以便apt能够通过HTTPS使用仓库&#xff1a;添加Docker的官方GPG密钥设置稳定的仓库再次更新软件包索引从新添加的仓库中安装Docker CE验证Docker是否安装成功&#xff08;可选…...

【RocketMQ】关于RocketMQ配置好了jdk环境变量却一直报需要配置环境变量的问题

正如上图所示&#xff0c;我明明已经配置好了环境变量&#xff0c;也显示配置好了&#xff0c;jdk与我的rocketmq的版本也是适配的&#xff0c;可每次启动namesrv和broker却一直显示要去配置环境变量&#xff0c;其实很简单&#xff0c;配置环境变量时特殊符号会影响路径查找&a…...

【信息系统项目管理师】高分论文:论信息系统项目的范围管理(投资信息化全流程管理项目)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 1、规划范围管理2、收集需求3、定义范围4、创建wbs5、确认范围6、控制范围2018年2月,我有幸参加了 XX省自贸区财政投资信息化全流程管理项目的假设,作为项目发起单位,省自贸办经过审时度势,及时响应国家自贸…...

Jmeter创建使用变量——能够递增递减的计数器

Jmeter创建使用变量——能够递增递减的计数器 如下图所示&#xff0c;创建一个 取值需限定为0 2 4这三个值内的变量。 Increment&#xff1a;每次迭代后 递增的值&#xff0c;给计数器增加的值 Maximum value&#xff1a;计数器的最大值&#xff0c;如果超过最大值&#xff0…...

数据分析不只是跑个SQL!

数据分析不只是跑个SQL&#xff01; 数据分析五大闭环&#xff0c;你做到哪一步了&#xff1f;闭环一&#xff1a;认识现状闭环二&#xff1a;原因分析闭环三&#xff1a;优化表现闭环四&#xff1a;预测走势闭环五&#xff1a;主动解读数据 数据思维&#xff1a;WHY-WHAT-HOW模…...

批量将文件夹名称、文件夹路径提取到 Excel 清单

在日常工作中&#xff0c;管理大量文件夹和文件路径可能变得十分繁琐。无论是在进行文件整理、备份还是数据分析时&#xff0c;提取文件夹的名称与路径信息&#xff0c;能够帮助你更高效地管理文件。本文将为您提供如何快速提取文件夹名称与路径&#xff0c;并将这些信息整理到…...

Git 基本使用

一、Git简介 简单的内容追踪系统&#xff1b;是一个快速、可扩展的分布式版本控制系统&#xff0c;拥有异常丰富的命令集提供高级操作和对内部的完全访问。 二、Git安装 详情看本人此文章。 三、Git 命令&#xff08;基础版&#xff09; 把 Git 分为上层封装命令&#xff08…...

LLM - Dify 平台介绍

文章目录 引言官网核心功能架构图典型应用场景在线平台 引言 Dify 是一款开源的 LLM&#xff08;大语言模型&#xff09;应用开发平台&#xff0c;旨在帮助开发者快速构建、部署和管理基于大语言模型的智能化应用。 官网 https://dify.ai/zh https://github.com/langgenius/…...

linux编译adbd工具使用

在使用linux时&#xff0c;通常是没有现成的adbd文件使用的&#xff0c;这就需要我们进行文件的编译了&#xff0c;编译可以分为三步进行&#xff0c;在编译前我们需要下载对应的源码使用,我们可以从 https://launchpad.net/android-tools地址处下载需要的android-tools源码使用…...

安全人员如何对漏洞进行定级?

CVSS 标准 CVSS 介绍 CVSS&#xff0c;即通用漏洞评分系统&#xff08;Common Vulnerability Scoring System&#xff09;&#xff0c;是一个用于评估计算机系统漏洞严重程度的行业标准。 CVSS为安全专业人员、漏洞管理团队和系统管理员提供了一种标准化的方法来评估和比较不…...

【ROS2】行为树 BehaviorTree(四):组合使用子树

1、大树调用子树 如下图,左边为大树主干: 1)如果门没有关,直接通过; 2)如果门关闭了,执行开门动作,然后通过 右边为子树,主要任务是开门 1)尝试直接开门; 2)尝试开锁开门,最多尝试5次; 3)最后尝试砸门! XML如何描述大树主干调佣子树:使用关键字 SubTree 来…...

第十六届蓝桥杯Java b组(试题C:电池分组)

问题描述&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 样例输入&#xff1a; 2 3 1 2 3 4 1 2 3 4 样例输出: YES NO 说明/提示 评测用例规模与约定 对于 30% 的评测用例&#xff0c;1≤T≤10&#xff0c;2≤N≤100&#xff0c;1≤Ai​≤10^3。对于 100…...

HarmonyOS:使用Refresh组件实现页面下拉刷新

一、前言 可以进行页面下拉操作并显示刷新动效的容器组件。 说明 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。该组件从API Version 12开始支持与垂直滚动的Swiper和Web的联动。当Swiper设置loop属性为true时&…...

Python----机器学习(基于PyTorch的垃圾邮件逻辑回归)

Logistic Regression&#xff08;逻辑回归&#xff09;是一种用于处理二分类问题的统计学习方法。它基于线性回归 模型&#xff0c;通过Sigmoid函数将输出映射到[0, 1]范围内&#xff0c;表示概率。逻辑回归常被用于预测某个实 例属于正类别的概率。 一、数据集介绍 本例使用了…...

Spark-SQL

概念 Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。 Spark-SQL 特点&#xff1a; 1&#xff0c;易整合&#xff0c;无缝的整合了 SQL 查询和 Spark 编程。 2&#xff0c;统一的数据访问&#xff0c;使用相同的方式连接不同的数据源。 3&#xf…...

spark-sql核心

在大数据处理领域&#xff0c;Apache Spark已成为极为重要的分布式计算框架&#xff0c;而Spark SQL作为其重要组件&#xff0c;极大地拓展了Spark的能力边界&#xff0c;为结构化数据处理提供了高效、便捷的解决方案。 一、Spark SQL架构剖析 Spark SQL的架构设计精妙&#…...

TypeScript 进阶指南 - 使用泛型与keyof约束参数

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…...

labview的VI密码破解程序

上图即为密码破解原理&#xff0c;若需源代码可联系我...

AI技术前沿:蓝耘元生代智算云快速入门教程详解,与其他云人工智能大模型深度对比

文章目录 一、前言二、蓝耘元生代智算云基础概念2.1 什么是智算云2.2 蓝耘元生代智算云的特点 三、蓝耘元生代智算云使用前准备3.1 注册与登录3.2 了解计费方式3.3 熟悉控制台界面 四、在蓝耘元生代智算云上运行第一个任务4.1 创建计算资源4.2 上传代码和数据4.3 安装依赖库4.4…...

Spring MVC 请求处理流程详解

步骤1&#xff1a;用户发起请求 所有请求首先被 DispatcherServlet&#xff08;前端控制器&#xff09;拦截&#xff0c;它是整个流程的入口。 DispatcherServlet 继承自 HttpServlet&#xff0c;通过 web.xml 或 WebApplicationInitializer 配置映射路径&#xff08;如 /&…...

金融行业 AI 报告自动化:Word+PPT 双引擎生成方案

—从数据到决策&#xff0c;10倍效率提升的智能金融解决方案 一、金融行业报告制作的四大核心痛点 1. 人工制作成本高 传统流程耗时&#xff1a; 分析师撰写Word报告&#xff1a;8-12小时/份设计师制作PPT&#xff1a;4-6小时/份团队协作修改&#xff1a;反复沟通&#xff0c…...

01_JDBC

文章目录 一、概述1.1、什么是JDBC1.2、JDBC原理 二、JDBC入门2.1、准备工作2.1.1、建库建表2.1.2、新建项目 2.2、建立连接2.2.1、准备四大参数2.2.2、加载驱动2.2.3、准备SQL语句2.2.4、建立连接2.2.5、常见问题 2.3、获取发送SQL的对象2.4、执行SQL语句2.5、处理结果2.6、释…...

三层架构与分层解耦:深入理解IOC与DI设计模式

目录 一、软件架构演进与三层架构概述 1.1 从单体架构到分层架构 1.2 经典三层架构详解 1.3 三层架构的优势 二、分层解耦的核心思想 2.1 耦合与解耦的基本概念 2.2 分层解耦的实现手段 2.3 分层解耦的实践原则 三、控制反转&#xff08;IOC&#xff09;深度解析 3.1…...

[react]Next.js之自适应布局和高清屏幕适配解决方案

序言 阅读前首先了解即将要用到的两个包的作用 1.postcss-pxtorem 自动将 CSS 中的 px 单位转换为 rem 单位按照设计稿尺寸直接写 px 值&#xff0c;由插件自动计算 rem 值 2.amfe-flexible 动态设置根元素的 font-size&#xff08;即 1rem 的值&#xff09;根据设备屏幕宽度和…...

TensorFlow深度学习实战——基于语言模型的动态词嵌入技术

TensorFlow深度学习实战——基于语言模型的动态词嵌入技术 0. 前言1. 基于语言模型的词嵌入1.1 ELMo 与 ULMFiT1.2 GPT1.3 BERT 2. 使用 BERT 作为特征提取器相关链接 0. 前言 基于语言模型的词嵌入技术&#xff0c;通过利用上下文信息来生成动态的词向量&#xff0c;大大提升…...

欧拉服务器操作系统部署deekseep(Ollama+DeekSeep+open WebUI)

​​一、解压并安装 Ollama​​ # 1. 解压文件&#xff08;默认会得到一个二进制文件&#xff09; tar -xzvf ollama-linux-amd64.tgz# 2. 将二进制文件安装到系统路径 sudo mv ollama /usr/local/bin/ sudo chmod x /usr/local/bin/ollama# 3. 验证安装 ollama --version链接…...

cocosCreator安卓隐私弹窗(链接版)

每次新上游戏都要重新弄这个隐私弹窗,记录一下下次直接抄。 一、创建Activity 1 用androidStudio 打开项目并切换到Android视角。 2 右键项目new一个空的Activity 3 修改Activity的名字并完成如下图 二、增加依赖文件 1 增加全局颜色定义文件:项目根目录 / res/values/ …...

统计销量前十的订单

传入参数&#xff1a; 传入begin和end两个时间 返回参数 返回nameList和numberList两个String类型的列表 controller层 GetMapping("/top10")public Result<SalesTop10ReportVO> top10(DateTimeFormat(pattern "yyyy-MM-dd") LocalDate begin,Dat…...

【Python爬虫】简单案例介绍2

本文继续接着我的上一篇博客【Python爬虫】简单案例介绍1-CSDN博客 目录 跨页 3.2 环境准备 跨页 当对单个页面的结构有了清晰的认识并成功提取数据后&#xff0c;接下来就需要考虑页面之间的跨页问题。此时我们便迎来了下一个关键任务&#xff1a;如何实现跨页爬取&#xf…...

适合单片机裸机环境的运行的软件定时器框架

如下这篇文档介绍了一个适用于裸机环境的软件定时器模块&#xff0c;其核心功能和实现如下&#xff1a; 模块功能&#xff1a;该模块通过硬件定时器中断实现时基累加&#xff0c;适合用于裸机程序的调度处理。它使用硬件定时中断&#xff08;如1ms一次&#xff09;来增加hw_ti…...

【ComfyUI】蓝耘元生代 | ComfyUI深度解析:高性能AI绘画工作流实践

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈人工智能与大模型应用 ⌋ ⌋ ⌋ 人工智能&#xff08;AI&#xff09;通过算法模拟人类智能&#xff0c;利用机器学习、深度学习等技术驱动医疗、金融等领域的智能化。大模型是千亿参数的深度神经网络&#xff08;如ChatGPT&…...

js的es6模块中 暴露的使用方法简介

在 JavaScript 的 ES6 模块系统中&#xff0c;一个模块文件只能有一个 export default。export default 用于导出一个默认值&#xff0c;这个默认值在导入时可以使用任意名称。 示例&#xff1a; 导出默认值&#xff1a; // myModule.jsexport default function greet() {con…...

基于Android的旅游自助APP(源码+lw+部署文档+讲解),源码可白嫖!

摘要 旅游自助APP设计的目的是为用户提供对景点信息和路线攻略、周边美食等方面的平台。 与PC端应用程序相比&#xff0c;旅游自助的设计主要面向于旅行者&#xff0c;旨在为用户提供一个旅游自助。用户可以通过APP及时景点信息&#xff0c;并对景点进行购票或收藏等。相反&am…...

SQL(7):合并字段,使用UNION,首先应使用SELECT进行检索,再使用UMION进行拼接

核心功能&#xff1a;合并查询结果 想象一下&#xff0c;你有两个不同的名单&#xff0c;你想把它们合并成一个大名单。UNION 和 UNION ALL 都是 SQL 里用来干这个“合并名单”的活儿的。它们可以把两个&#xff08;或更多&#xff09;SELECT 查询语句的结果合并到一起&#x…...

Spring MVC 全栈指南:RESTful 架构、核心注解与 JSON 实战解析

目录 RESTful API 设计规范Spring MVC 核心注解解析静态资源处理策略JSON 数据交互全解高频问题与最佳实践 一、RESTful API 设计规范 1.1 核心原则 原则说明示例 URI资源为中心URI 使用名词&#xff08;复数形式&#xff09;/users ✔️ /getUser ❌HTTP 方法语义化GET&…...

【第43节】实验分析windows异常分发原理

目录 前言 一、异常处理大致流程图 二、实验一&#xff1a;分析 KiTrap03 三、实验二&#xff1a;分析CommonDispatchException 四、代码探究&#xff1a;分析 KiDispatchException 函数 五、代码探究&#xff1a;伪代码分析用户层KiUserExceptionDispatcher 前言 在Wind…...

自动化测试概念篇

文章目录 目录1. 自动化1.1 自动化概念1.1.1 回归测试 1.2 自动化分类1.3 自动化测试金字塔 2. web自动化测试2.1 驱动2.1.1 安装驱动管理2.1.2 selenium库 3. Selenium3.1 一个简单的web自动化示例3.2 selenium驱动浏览器的工作原理 目录 自动化web自动化测试Selenium 1. 自…...

「数据可视化 D3系列」之开篇:开启数据可视化之旅

一、系列介绍 欢迎来到《快速学习D3.js》系列&#xff01;在这个系列中&#xff0c;我们将一起从零开始掌握D3.js&#xff08;Data-Driven Documents&#xff09;&#xff0c;一个强大的JavaScript库&#xff0c;用于创建动态、交互式的数据可视化。 无论你是前端开发者、数据…...

编译构建 WSO2 产品时的一些注意事项

编译构建 WSO2 产品时的一些注意事项 1、JDK 版本2、maven 版本3、npm 和 node 版本4、编译命令示例 1、JDK 版本 对于 WSO2 ESB、WSO2 EI 老产品&#xff0c;可以直接使用 JDK 1.8对于 WSO2 APIM、WSO2 IS、WSO2 MI 等产品的新版本&#xff0c;需要 JDK 11 以上 特别注意&…...

字符串与相应函数(下)

字符串处理函数分类 求字符串长度&#xff1a;strlen长度不受限制的字符串函数&#xff1a;strcpy,strcat,strcmp长度受限制的字符串函数:strncpy,strncat,strncmp字符串查找&#xff1a;strstr字符串切割&#xff1a;strtok错误信息报告&#xff1a;strerror字符操作&#xf…...

驾驭 Linux 云: JavaWeb 项目安全部署

目录 1. 引言 2. Linux 基础指令 2.1 ls 展示目录/文件 2.2 pwd 查看所在路径 2.3 mkdir 创建文件夹 2.4 cd 切换路径 2.5 touch 创建文件 2.6 rm 删除文件 2.6 rm -r/rf 删除文件夹 2.7 rz/sz 上传/下载文件 2.7.1 rz 上传文件 2.7.2 sz 下载文件 2.8 mv 移动文件…...

【MySQL数据库】InnoDB存储引擎:逻辑存储结构、内存架构、磁盘架构

逻辑存储结构 一个数据库是由一张张表组成的&#xff0c;而表中是由一个个段构成的&#xff0c;一个段是由区构成的&#xff0c;区空间是由页构成的&#xff0c;页是行构成的。 ①表空间&#xff1a;.ibd文件&#xff0c;一个mysql实例可以对应多个表空间&#xff0c;用于存储…...