RK3588 & Android12 调试 RTL8852BE(wifi篇)

本文详细介绍了如何在RK3588平台上配置RTL8852BEWiFi模块的PCIE接口,包括内核的dts配置,驱动安装,以及遇到的常见问题及解决方案,如Kconfig错误、编译器警告和命名空间导入等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

平台:RK3588 & Android12

模块:RTL8852BE

接口:PCIE

内容:调试RTL8852BE模块的WiFi功能

=================================================================

一、内核

1.1 dts配置

首先是配置PCIE,查看原理图,看一下模块用的哪一个PCIE

--------------------------------------------------------------------------------------------------------------------------------

很明显,这里接到了Mux1上,Mux1的 PHY(combphy1_ps)配合PCIe30x1_0(dts命名为pcie2x1l0),所以配置如下:

	vcc3v3_pcie20_wifi: vcc3v3-pcie20-wifi {
		compatible = "regulator-fixed";
		regulator-name = "vcc3v3_pcie20_wifi";
		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
		enable-active-high;
        /*
         * wifi_reg_on 是在vbat、vddio稳定后才使能,在reset-gpios前拉高,所以
         * 放到PCIe的电源节点中才满足模块时序。
         */
		gpios = <&gpio0 RK_PC4 GPIO_ACTIVE_HIGH>;
		startup-delay-us = <5000>;
		vin-supply = <&vcc12v_dcin>;
	};

&combphy1_ps {
	status = "okay";
};

&pcie2x1l0 {
	reset-gpios = <&gpio1 RK_PB2 GPIO_ACTIVE_HIGH>;
	rockchip,skip-scan-in-resume;
	status = "okay";
};

然后配置WiFi:

wireless_wlan: wireless-wlan {
		compatible = "wlan-platdata";
		wifi_chip_type = "rtl8852be";
		pinctrl-names = "default";
		pinctrl-0 = <&wifi_host_wake_irq>, <&wifi_poweren_gpio>;
		WIFI,host_wake_irq = <&gpio0 RK_PB2 GPIO_ACTIVE_HIGH>;
        /* 不能这里控制wifi_reg_on管脚,请挪到vcc3v3_pcie20_wifi */
		//WIFI,poweren_gpio = <&gpio0  RK_PC4 GPIO_ACTIVE_HIGH>;
		status = "okay";
	};

&pinctrl添加:

	wireless-wlan {
		wifi_host_wake_irq: wifi-host-wake-irq {
			rockchip,pins = <0 RK_PB2 RK_FUNC_GPIO &pcfg_pull_down>;
		};

		wifi_poweren_gpio: wifi-poweren-gpio {
			rockchip,pins = <0 RK_PC4 RK_FUNC_GPIO &pcfg_pull_up>;
		};

配好这些模块应该就挂到pcie上了:

2.1 驱动

RK3588似乎并没有兼容RTL8852BE这个模块,驱动需要问供应商要,存放路径

SDK\kernel-5.10\drivers\net\wireless\rockchip_wlan

二、系统层

由于SDK没有兼容RTL8852BE,所以要修改一些文件,让系统自动加载对应的ko文件

SDK\frameworks\opt\net\wifi\libwifi_hal\rk_wifi_ctrl.cpp

++    #define RTL8852BE_DRIVER_MODULE_PATH     WIFI_MODULE_PATH"8852be.ko"
++    #define RTL8852BE_DRIVER_MODULE_NAME     "8852be"

static wifi_device supported_wifi_devices[] = {
++    {"RTL8852BE",	"10ec:b852"},
...

const wifi_file_name module_list[] = {
++    {"RTL8852BE", RTL8852BE_DRIVER_MODULE_NAME, RTL8852BE_DRIVER_MODULE_PATH, UNKOWN_DRIVER_MODULE_ARG, REALTEK_WIFI_HAL},
...

其实就是照葫芦画瓢,对着兼容的模块的写法去写。

三、遇到的问题

3.1 驱动报错

1)报错信息:

drivers/net/wireless/rockchip_wlan/rtl8852be/Kconfig:5: syntax error
drivers/net/wireless/rockchip_wlan/rtl8852be/Kconfig:4: unknown statement "---help---"
drivers/net/wireless/rockchip_wlan/rtl8852be/Kconfig:5: unknown statement "Help"

Kconfig语法有错,---help---改成help即可

2)报错信息:

error: "Must be LITTLE/BIG Endian Host"
error: declaration of 'struct cfg80211_csa_settings' will not be visible outside of this function [-Werror,-Wvisibility]

没有选择对应的平台

修改Makefile:

--    CONFIG_PLATFORM_I386_PC = y
++    CONFIG_PLATFORM_I386_PC = n

--    CONFIG_PLATFORM_ARM_ROCKCHIP = n
++    CONFIG_PLATFORM_ARM_ROCKCHIP = y

# Import platform assigned KSRC and CROSS_COMPILE
--    include $(wildcard $(DRV_PATH)/platform/*.mk)
++    include $(src)/platform/arm_rk.mk

需要查看驱动 platform 目录下的相关文件,看包含哪个。

3)报错信息:

drivers/net/wireless/rockchip_wlan/rtl8852be/core/rtw_mlme.c:5359:27: error: equality comparison with extraneous parentheses [-Werror,-Wparentheses-equality]
        if ((pregpriv->wifi_spec == 1))

drivers/net/wireless/rockchip_wlan/rtl8852be/phl/hal_g6/mac/mac_ax/trxcfg.c:1253:9: error: explicitly assigning value of variable of type 'u32' (aka 'unsigned int') to itself [-Werror,-Wself-assign]
                val32 = val32;

报类似上面的错误,改了一个又出来另一个,直接修改 Makefile 禁止此类报错

EXTRA_CFLAGS += -Wno-tautological-overlap-compare
EXTRA_CFLAGS += -Wno-pointer-bool-conversion
++    EXTRA_CFLAGS += -Wno-parentheses-equality
++    EXTRA_CFLAGS += -Wno-self-assign

加的编译选项其实和报错信息差不多,其它类似报错照葫芦画瓢,大概用途:

-Wno-uninitialized:禁止未初始化变量的警告
-Wno-enum-conversion:禁止枚举类型转换警告
-Wno-fortify-source:禁止源码加固警告
-Wno-invalid-source-encoding:禁止无效的源码编码警告
-Wno-tautological-pointer-compare:禁止指针比较警告
-Wno-tautological-overlap-compare:禁止重叠比较警告
-Wno-pointer-bool-conversion:禁止指针转布尔型警告
-Wno-parentheses-equality:禁止多余括号的比较警告
-Wno-self-assign:禁止变量自赋值警告
-Wno-header-guard:禁止头文件守卫重复定义警告

4)报错信息:

ERROR: modpost: module 8852be uses symbol kernel_write from namespace VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver, but does not import it.
ERROR: modpost: module 8852be uses symbol kernel_read from namespace VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver, but does not import it.
ERROR: modpost: module 8852be uses symbol filp_open from namespace VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver, but does not import it.

缺少相关命名空间,查找引用了 kernel_write 的文件,加入命名空间:

MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver);

四、参考文章

高版本linux内核编译驱动报错记录_uses symbol kernel_write from namespace vfs_intern-优快云博客

RK3568-B2-ANDROID11-WIFI-RTL8821CU_rk平台rtl8821cu调试-优快云博客

五、资料包

内含改好编好的驱动以及相关参考文档

链接:https://pan.baidu.com/s/1xU_dgcywp86gLfZOceabFA 
提取码:zesv 
--来自百度网盘超级会员V1的分享 

### RK3568 平台下 RTL8852BE 的 PCIe 配置及驱动支持 对于 RK3568 平台上使用的 RTL8852BE 芯片,其通过 PCIe 接口连接时涉及的配置和驱动支持问题可以分为以下几个方面来讨论。 #### 1. **硬件兼容性** RK3568 是一款基于 ARM 架构的处理器,通常用于嵌入式设备。RTL8852BE 是 Realtek 生产的一款 Wi-Fi 和蓝牙组合芯片,主要面向消费类电子市场。虽然该芯片理论上可以通过 PCIe 进行通信,但在实际应用中需要确认以下几点: - 确认 RK3568 的 PCIe 控制器是否能够完全支持 RTL8852BE 所需的功能集[^3]。 - 检查 RTL8852BE 是否已列入 Rockchip 官方支持的外设列表中[^4]。 #### 2. **内核驱动集成** 由于 Android 12 默认情况下可能未提供对 RTL8852BE 的原生支持,因此需要手动导入相应的驱动程序并将其编译进 Linux 内核。以下是具体操作: ##### (a) 驱动路径选择 根据已有经验,可将 RTL8852BE 的驱动文件放置于以下目录之一: - `kernel/drivers/net/wireless/rockchip_wlan/`[^2] - 或者 `kernel/drivers/net/wireless/realtek/rtlwifi/` 这取决于具体的项目需求以及现有代码库结构。 ##### (b) 修改 Kconfig 文件 为了使新加入的驱动能够在构建过程中被识别到,还需要编辑对应的 Kconfig 文件,在其中添加如下条目(假设模块名为 rtl8852be): ```makefile config RTL8852BE tristate &quot;Realtek RTL8852BE WiFi driver&quot; depends on PCI &amp;&amp; NET help This option enables support for the Realtek RTL8852BE wireless LAN adapter. ``` 随后重新运行菜单配置工具 (`make menuconfig`) 来启用此选项即可。 ##### (c) 编写 dts/dtsi 设备树节点定义 针对特定 SoC 版本创建或更新 device tree blob (.dts/.dtb),描述物理层接口参数比如中断号、寄存基址等信息。例如: ```diff &amp;pcie { status = &quot;okay&quot;; + wifi@0,0 { + compatible = &quot;realtek,rtl8852be&quot;; + reg = &lt;0x0000 0&gt;; /* BDF */ + interrupts = &lt;GIC_SPI IRQ_NUMBER&gt;; + interrupt-parent = &lt;&amp;gic&gt;; + }; }; ``` 以上片段展示了如何向现有的 PCIe 子系统声明一个新的子功能单元&mdash;&mdash;即我们的无线网卡实例化过程的一部分[^5]。 #### 3. **固件加载机制** 某些型号可能会依赖外部二进制固件才能正常工作。如果发现即使安装好了上述软件组件之后仍然无法启动联网服务,则应该进一步排查是否存在缺失必要的 firmware blobs 的情况。一般可以从厂商官网下载最新版本或者参考开源社区维护的相关资源仓库获取所需资料[^6]。 最后附上一段简单的测试脚本来验证最终效果: ```bash #!/bin/sh echo &quot;Loading RTL8852BE module...&quot; modprobe rtl8852be || { echo &quot;Failed to load module&quot;; exit 1; } iw dev wlan0 info &gt;/dev/null 2&gt;&amp;1 &amp;&amp; \ { echo &quot;Wireless interface detected successfully!&quot;; } || \ { echo &quot;No valid wireless interfaces found.&quot;; } ``` ---
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值