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

打印 上一主题 下一主题

主题 1511|帖子 1511|积分 4533

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 已设置:
    1. CONFIG_AIC_WLAN_SUPPORT=y
    2. CONFIG_AIC8800_WLAN_SUPPORT=m
    复制代码
  • 但编译后 aic8800_bsp.ko、aic8800_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 必要修改:
  1. kernel/drivers/net/wireless/aic8800/Makefile
  2. kernel/drivers/net/wireless/aic8800/aic8800_bsp/Makefile
  3. kernel/drivers/net/wireless/aic8800/aic8800_btlpm/Makefile
  4. kernel/drivers/net/wireless/aic8800/aic8800_fdrv/Makefile
复制代码
解决方式



  • 确保 Makefile 适配 Rockchip 平台:
    1. CONFIG_PLATFORM_ROCKCHIP ?= y
    2. CONFIG_PLATFORM_ALLWINNER ?= n
    3. CONFIG_PLATFORM_AMLOGIC ?= n
    4. ifeq ($(CONFIG_PLATFORM_ROCKCHIP), y)
    5. ARCH = arm64
    6. KDIR ?= /home/hw/rk3568_android11_sdk/kernel
    7. CROSS_COMPILE ?= /home/hw/rk3568_android11_sdk/prebuilts/gcc/linux-x86/aarch64/gcc-linaro/bin/aarch64-linux-gnu-
    8. ccflags-y += -DANDROID_PLATFORM
    9. endif
    复制代码
  • 确保 KDIR 和 CROSS_COMPILE 路径准确

    • KDIR是内核的路径
    • CROSS_COMPILE是交织编译器的路径

4. aicbsp: sdio_err 报错



  • dmesg 报错:
  1. [    5.103268] aicbsp_init
  2. [    5.103303] RELEASE_DATE:2022_0312_1031\x0d
  3. [    5.103752] aicbsp: aicbsp_set_subsys, subsys: AIC_WIFI, state to: 1
  4. [    5.103768] aicbsp: aicbsp_set_subsys, power state change to 1 dure to AIC_WIFI
  5. [    5.103777] aicbsp: aicbsp_platform_power_on
  6. [    5.120128] aicbsp: aicbsp_sdio_probe:1
  7. [    5.120237] aicbsp: aicbsp_sdio_probe:2
  8. [    5.120251] aicbsp: aicbsp_sdio_probe after replace:1
  9. [    5.120387] mmc_host mmc3: Bus speed (slot 0) = 50000000Hz (slot req 50000000Hz, actual 50000000HZ div = 0)
  10. [    5.120403] aicbsp: Set SDIO Clock 50 MHz
  11. [    5.120433] aicbsp: sdio_err:<aicwf_sdio_func_init,1232>: reg:11 write failed!
  12. [    5.120444] aicbsp: sdio_err:<aicbsp_sdio_probe,184>: sdio func init fail
  13. [    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.3VPIN22VIO(主控 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 装备:
    1. mmc3:390b:1
    2. mmc3:390b:2
    复制代码

    • 装备树 aliases 界说:
      1. aliases {
      2.     mmc3 = &sdmmc2;
      3. }
      复制代码
    • WiFi 确实接到了 SDMMC2,装备映射关系准确。

  • 检察 uevent 信息
    1. cat /sys/bus/sdio/devices/mmc3:390b:1/uevent
    2. SDIO_CLASS=07
    3. SDIO_ID=C8A1:0082
    4. MODALIAS=sdio:c07vC8A1d0082
    5. cat /sys/bus/sdio/devices/mmc3:390b:2/uevent
    6. SDIO_CLASS=07
    7. SDIO_ID=C8A1:0182
    8. MODALIAS=sdio:c07vC8A1d0182
    复制代码

    • 发现 SDIO_ID=C8A1:0082 与官方 patch 设置的 VIDID 不同等,一度怀疑读取错误。
    • 查阅资料后发现,其他用户使用 AIC8800 时也读到了相同的 VIDID,阐明 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 无法主动加载驱动

    • 必要手动加载驱动进行测试:
      1. cd /vendor/lib/modules
      2. insmod aic8800_bsp.ko
      3. insmod aic8800_fdrv.ko
      4. lsmod
      复制代码
    • 假如能手动加载,阐明 WiFi 可正常使用


4.2.3 WiFi 驱动无法主动加载


  • 可能缘故原由:VIDID 不匹配
  • 需检查 rk_wifi_ctrl.cpp:
    1. static wifi_device supported_wifi_devices[] = {
    2.     {"AIC8800", "5449:0145"},
    3. };
    复制代码
  • 解决方案

    • 确认 SDIO_ID 是否准确:
      1. cd /sys/bus/sdio/devices
      2. ls
      3. cat mmc3:390b:1/uevent
      复制代码
    • 若 SDIO_ID 读出 C8A1:0082,则修改 rk_wifi_ctrl.cpp,匹配准确的 VIDID。


至此,WiFi可以正常使用。
5. 蓝牙调试

5.1 编译错误:libbt-vendor already defined

  1. 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
    界说了
  1. 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


  • 修改串口波特率
    1. #define UART_TARGET_BAUD_RATE           1500000
    复制代码
修改 vnd_generic.txt
根据实际硬件连接调整。
hardware/aic/aicbt/libbt/include/vnd_generic.txt
  1. BLUETOOTH_UART_DEVICE_PORT = "/dev/ttyS6"
  2. FW_PATCHFILE_LOCATION = "/vendor/etc/firmware/"
复制代码

再次进行编译,蓝牙可以正常使用。
*
根据实际硬件连接调整。
hardware/aic/aicbt/libbt/include/vnd_generic.txt
  1. BLUETOOTH_UART_DEVICE_PORT = "/dev/ttyS6"
  2. FW_PATCHFILE_LOCATION = "/vendor/etc/firmware/"
复制代码
再次进行编译,蓝牙可以正常使用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张国伟

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表