RK Android11 WiFi模组 AIC8800 驱动移植调试记录

devtools/2025/2/22 21:20:43/

WiFi_AIC8800__0">RK Android11 WiFi模组 AIC8800 驱动移植调试记录

  • 作者:Witheart
  • 更新时间:20250221

概要:本文记录了 RK3568 平台上移植并调试 WiFi6 模组 AIC8800 的过程,涵盖 WiFi 和蓝牙驱动的适配与问题排查。
配置流程在另一篇文章:https://blog.csdn.net/Beihai_Van/article/details/145763043


1. 环境

  • WiFi 模组:BL-M8800DS2-40(基于 AIC8800D40 芯片)
  • CPU:RK3568
  • OS:Android

2. ko 文件未编译问题

  • 驱动代码已放入 kernel/drivers/net/wireless/aic8800/
  • defconfig 已配置:
    CONFIG_AIC_WLAN_SUPPORT=y
    CONFIG_AIC8800_WLAN_SUPPORT=m
    
  • 但编译后 aic8800_bsp.koaic8800_fdrv.ko 等未生成
    (查看kernel/drivers/net/wireless/aic8800/aic8800_bsp或者kernel/drivers/net/wireless/aic8800/aic8800_fdrv等文件夹,并没有看到编译出来的ko文件)

解决方式

  • defconfig 配置错误,patch 中的 defconfig 可能与项目实际 defconfig 不符
  • 要确保修改的是实际使用的 defconfig

3. 驱动 Makefile 中配置不正确问题

如果要适配Rockchip平台,以下 4 个驱动目录的 Makefile 需要修改:

kernel/drivers/net/wireless/aic8800/Makefile
kernel/drivers/net/wireless/aic8800/aic8800_bsp/Makefile
kernel/drivers/net/wireless/aic8800/aic8800_btlpm/Makefile
kernel/drivers/net/wireless/aic8800/aic8800_fdrv/Makefile

解决方式

  • 确保 Makefile 适配 Rockchip 平台:
    CONFIG_PLATFORM_ROCKCHIP ?= y
    CONFIG_PLATFORM_ALLWINNER ?= n
    CONFIG_PLATFORM_AMLOGIC ?= nifeq ($(CONFIG_PLATFORM_ROCKCHIP), y)
    ARCH = arm64
    KDIR ?= /home/hw/rk3568_android11_sdk/kernel
    CROSS_COMPILE ?= /home/hw/rk3568_android11_sdk/prebuilts/gcc/linux-x86/aarch64/gcc-linaro/bin/aarch64-linux-gnu-
    ccflags-y += -DANDROID_PLATFORM
    endif
    
  • 确保 KDIRCROSS_COMPILE 路径正确
    • KDIR是内核的路径
    • CROSS_COMPILE是交叉编译器的路径

4. aicbsp: sdio_err 报错

  • dmesg 报错:
[    5.103268] aicbsp_init
[    5.103303] RELEASE_DATE:2022_0312_1031\x0d
[    5.103752] aicbsp: aicbsp_set_subsys, subsys: AIC_WIFI, state to: 1
[    5.103768] aicbsp: aicbsp_set_subsys, power state change to 1 dure to AIC_WIFI
[    5.103777] aicbsp: aicbsp_platform_power_on
[    5.120128] aicbsp: aicbsp_sdio_probe:1
[    5.120237] aicbsp: aicbsp_sdio_probe:2
[    5.120251] aicbsp: aicbsp_sdio_probe after replace:1
[    5.120387] mmc_host mmc3: Bus speed (slot 0) = 50000000Hz (slot req 50000000Hz, actual 50000000HZ div = 0)
[    5.120403] aicbsp: Set SDIO Clock 50 MHz
[    5.120433] aicbsp: sdio_err:<aicwf_sdio_func_init,1232>: reg:11 write failed!
[    5.120444] aicbsp: sdio_err:<aicbsp_sdio_probe,184>: sdio func init fail
[    5.120494] aicbsp_sdio: probe of mmc3:390b:2 failed with error -34

4.1 排查过程

4.1.1 硬件检查

  • 初步怀疑 SDIO 报错与硬件问题相关,因此检查了走线和焊接,未发现异常。

  • 进一步测量模块关键 PIN 的电平,数据如下:

    Pin作用预期电平
    PIN12PWR_KEY(WiFi 开启)高电平(同步 VIO)
    PIN9VDD33(主电源)3.3V
    PIN22VIO(主控 IO 电平)与主控相同
    PIN14-19SDIO 相关1.8V(SDIO 3.0 标准)
  • 测量注意事项:

    • WiFi 打不开是关闭状态时,PIN12 复位 PIN 会被拉低,不能误判为供电问题。
    • PIN9(3.3V 供电)应始终存在。
    • SDIO 电平需在开机初始化时测量,因为初始化失败可能导致 SDIO 关闭,进而无法测量正确的电平。
  • 结论:

    • 重要 PIN 电平正常,排除硬件连接问题。

4.1.2 SDIO 相关问题

  • 发现 /sys/bus/sdio/devices/ 目录下扫描到两个 mmc3 设备:

    mmc3:390b:1
    mmc3:390b:2
    
    • 设备树 aliases 定义:
      aliases {mmc3 = &sdmmc2;
      }
      
    • WiFi 确实接到了 SDMMC2,设备映射关系正确。
  • 查看 uevent 信息

    cat /sys/bus/sdio/devices/mmc3:390b:1/uevent
    SDIO_CLASS=07
    SDIO_ID=C8A1:0082
    MODALIAS=sdio:c07vC8A1d0082cat /sys/bus/sdio/devices/mmc3:390b:2/uevent
    SDIO_CLASS=07
    SDIO_ID=C8A1:0182
    MODALIAS=sdio:c07vC8A1d0182
    
    • 发现 SDIO_ID=C8A1:0082 与官方 patch 配置的 VID:PID 不一致,一度怀疑读取错误。
    • 查阅资料后发现,其他用户使用 AIC8800 时也读到了相同的 VID:PID,说明 SDIO 通信本身是正常的

4.2 解决方式

4.2.1 发现 patch 可能不适配当前模组

  • 参考了 CSDN 文章:RK3568 Android11 WiFi6-AIC8800 调试。

  • 问题点:

    • patch 仅指示了修改方法,但其中的驱动可能并不适用于当前 WiFi 模组
    • 官方提供的驱动包适配多款模组,而 patch 仅适用于其中某款,并且官方更新驱动时不会同步更新 patch
    • 需要从 driver_fw 目录中查找正确的驱动,而非直接使用 patch 中的驱动。
  • 解决方案:

    • 向厂家获取最新驱动(避免使用 patch 中的驱动)。
    • 固件需匹配模组型号
      • 例如,BL-M8800DS2-40 模组应使用 driver_fw/fw/aic8800D80 目录下的固件。

4.2.2 编译最新驱动

  • 使用新驱动后,编译报错,修改 kernel/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_wakelock.c
    在这里插入图片描述

  • 编译成功后,发现 WiFi 无法自动加载驱动

    • 需要手动加载驱动进行测试:
      cd /vendor/lib/modules
      insmod aic8800_bsp.ko
      insmod aic8800_fdrv.ko
      lsmod
      
    • 如果能手动加载,说明 WiFi 可正常使用

4.2.3 WiFi 驱动无法自动加载

  • 可能原因:VID:PID 不匹配
  • 需检查 rk_wifi_ctrl.cpp
    static wifi_device supported_wifi_devices[] = {{"AIC8800", "5449:0145"},
    };
    
  • 解决方案
    • 确认 SDIO_ID 是否正确:
      cd /sys/bus/sdio/devices
      ls
      cat mmc3:390b:1/uevent
      
    • SDIO_ID 读出 C8A1:0082,则修改 rk_wifi_ctrl.cpp,匹配正确的 VID:PID
      在这里插入图片描述

至此,WiFi可以正常使用。

5. 蓝牙调试

5.1 编译错误:libbt-vendor already defined

MODULE.TARGET.SHARED_LIBRARIES.libbt-vendor already defined by hardware/aic xxx

这是由于aic的libbt库与其他厂家的库编译出的文件名重复导致的,比如aic与broadcom的libbt都会编译出libbt-vendor.so。

解决过程
  • 由于上文的经验,询问厂家后得知,libbt库也不应使用patch中的库,而应该使用driver_fw中的库,所以进行替换,但是要保持patch中定义的目录结构,具体替换红框中的内容:
    在这里插入图片描述

直接替换后进行编译,就会报libbt-vendor already defined错误。

  • 刚开始直接将broadcom的libbt编译出的文件名称进行修改,可以成功编译,具体修改如下:
    在这里插入图片描述

  • 但是烧录后,点击蓝牙图标一直显示正在打开,logcat查看日志,发现 dlopen failed: library "libbt-vendor-aic.so" not found
    在这里插入图片描述
    也就是没找到编译出的蓝牙库。

  • 原因是,driver_fw中的蓝牙库并没有对rochchip平台的适配,编译出来的库名称和配置时的库名称不一致,所以找不到对应的库
    配置下面这个文件时
    hardware\interfaces\bluetooth\1.0\default\vendor_interface.cc
    定义了

static const char* VENDOR_AIC_LIBRARY_NAME = "libbt-vendor-aic.so";

  • 所以需要修改编译出的库和这个库名称一致
    hardware/aic/aicbt/libbt/Android.mk
    在这里插入图片描述

5.2 蓝牙无法打开问题

  • 经过前面 WiFi 适配的修改后,不再出现 dlopen failed: library "libbt-vendor-aic.so" not found 的错误。

  • 但点击蓝牙图标时,始终显示“正在打开”,无法正常使用

  • 问题与 WiFi 适配类似

    • driver_fw 目录中的蓝牙库未针对 Rockchip 平台进行完整适配
    • 需要调整 串口波特率、串口名称、固件路径 等关键配置。
解决方式

修改 bt_vendor_aicbt.h
修改为实际串口波特率。
hardware/aic/aicbt/libbt/include/bt_vendor_aicbt.h

  • 修改串口波特率
    #define UART_TARGET_BAUD_RATE           1500000
    

修改 vnd_generic.txt
根据实际硬件连接调整。
hardware/aic/aicbt/libbt/include/vnd_generic.txt

BLUETOOTH_UART_DEVICE_PORT = "/dev/ttyS6"
FW_PATCHFILE_LOCATION = "/vendor/etc/firmware/"

在这里插入图片描述

再次进行编译,蓝牙可以正常使用。
*
根据实际硬件连接调整。
hardware/aic/aicbt/libbt/include/vnd_generic.txt

BLUETOOTH_UART_DEVICE_PORT = "/dev/ttyS6"
FW_PATCHFILE_LOCATION = "/vendor/etc/firmware/"

再次进行编译,蓝牙可以正常使用。


http://www.ppmy.cn/devtools/161026.html

相关文章

WPS/WORD$OffterAI

OfficeAI助手简介&#xfeff; Last modified: 14 二月 2025 ⬇️ 点击这里高速下载 功能简介&#xfeff; OfficeAI 助手 是一款免费的智能AI办公工具软件&#xff0c;专为 Microsoft Office 和 WPS 用户打造。 无论你是在寻找如何输入“打勾&#xff08;√&#xff09;符…

设计模式教程:享元模式(Flyweight Pattern)

享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;用于减少对象的创建数量&#xff0c;避免大量相似对象的内存占用。它通过共享对象来有效支持大量的细粒度对象&#xff0c;尤其是在需要大量类似对象的情况下&#xff0c;享元模式可以显著节…

PyTorch-基础(CUDA、Dataset、transforms、卷积神经网络、VGG16)

PyTorch-基础 环境准备 CUDA Toolkit安装&#xff08;核显跳过此步骤&#xff09; CUDA Toolkit是NVIDIA的开发工具&#xff0c;里面提供了各种工具、如编译器、调试器和库 首先通过NVIDIA控制面板查看本机显卡驱动对应的CUDA版本&#xff0c;如何去下载对应版本的Toolkit工…

典型的OSPF配置案例

案例1:单区域OSPF基础配置 场景:3台路由器直连,部署在Area 0中。 配置Router R1 interface GigabitEthernet0/0 ip address 10.1.1.1 255.255.255.0 ! router ospf 1 router-id 1.1.1.1 network 10.1.1.0 0.0.0.255 area 0 配置Router R2 interface GigabitEthernet0/0…

【单臂路由配置】

【单臂路由配置】 设备接口IP子网网关vlanR1G0/0/1.1192.168.1.254255.255.255.0NAvlan10R1G0/0/1.2192.168.2.254255.255.255.0NAvlan20R1G0/0/1.3192.168.3.254255.255.255.0NAvlan30PC1e0/0/1192.168.1.1255.255.255.0192.168.1.254vlan10PC2e0/0/1192.168.2.1255.255.255.0…

FPGA DSP:Vivado 中带有 DDS 的 FIR 滤波器

本文使用 DDS 生成三个信号&#xff0c;并在 Vivado 中实现低通滤波器。低通滤波器将滤除相关信号。 介绍 用DDS生成三个信号&#xff0c;并在Vivado中实现低通滤波器。低通滤波器将滤除较快的信号。 本文分为几个主要部分&#xff1a; 信号生成&#xff1a;展示如何使用DDS&am…

HarmonyOS学习第3天: 环境搭建开启鸿蒙开发新世界

一、引言 在数字化时代&#xff0c;操作系统作为连接用户与硬件设备的桥梁&#xff0c;其重要性不言而喻。HarmonyOS 作为华为公司推出的面向全场景的分布式操作系统&#xff0c;以其创新的理念和卓越的性能&#xff0c;正逐渐在全球范围内崭露头角。它打破了设备之间的界限&a…

物联网与大数据:揭秘万物互联的新纪元

物联网与大数据&#xff1a;揭秘万物互联的新纪元 在当今高速发展的科技时代&#xff0c;物联网&#xff08;IoT&#xff09;和大数据无疑是推动各行各业转型和创新的重要力量。通过将日常生活中的各种设备连接至互联网&#xff0c;并利用大数据技术进行实时分析&#xff0c;我…