(文章尾巴--新增排错部分)

前言

手上拿到的是广州视源基于爱科微AIC8800系列芯片做的模组(代理商深圳市嘉鸿时代提供。),该系列均支持WIFI AX协议(WIFI6),目前这款是低成本单2.4G+BT5.2方案;价格比8723有优势,所以公司打算切入这款WIFI6 单频模组。

实操

实物图

我的主控平台是RK3399  Linux4.14 安卓10;

第一步:

吹下板内的RTL8723DS模块,换上8800模组; 硬件是pintopin,同时模组内置了晶振无需外部添加。

第二步:

找供应商拿到的驱动如下:

前提:wifi驱动 依赖 cfg80211
1. 将 aic 驱动包放置在 kernel/drivers/net/wireless/之下,并且修改
kernel/drivers/net/wireless/Kconfig 以及 kernel/drivers/net/wireless/Makefile

修改内核的 config
(或 make menuconfig)
2. 编译完后即可得到
aic8800_fdrv.ko、aic8800_bsp.ko
3. 各驱动模块的功用
aic8800_bsp.ko:模块固件初始化
aic8800_fdrv.ko:Wifi 驱动
内核移植、蓝牙移植以及 Android 移植完成后,将 SDK 编译即可使用 AIC8800 Wifi 以及蓝
牙功能。 
后续更新测试数据:
-------------------------
-------------------------

WIFI 性能:

----------------------------------------排错部分---------------------------------

一,

SDIO部分

1,扫描不到设备ID?

硬件部分:

检查模组供电情况 / VIO电平1.8或者3.3V(推荐1.8V) / clk配置时钟 / dts 配置了SDIO2.0或者3.0版本

如果供电正常,降低clk时钟依然异常:

排查SDIO走线,是否没有做等长等处理。

软件部分:

FEATURE_SDIO_PHASE 0或者2 翻转试试

正常如下:

cat /sys/bus/sdio/devices/mmc1\:7a8a\:1/uevent                                                                              
SDIO_CLASS=07
SDIO_ID=5449:0145
MODALIAS=sdio:c07v5449d0145

二,

FW固件部分

aic8800_porting_package\SDIO\driver_fw\fw 里面的固件有分别对应的芯片型号:

AIC8800(D) / AIC8800D80  /AIC8800DC  选择对应的固件拷贝到驱动的这个路径即可。

CONFIG _AIC_ FW _PATH: 默认或者自定义路径,加载BSP.KO的时候会从这里获取固件。

三,

测试部分

   a. insmod /vendor/lib/modules/aic8800_bsp.ko
   b. insmod /vendor/lib/modules/aic8800_fdrv.ko
   c. ifconfig wlan0 up

附上正常log (log是AIC8800D80)

测试扫描:

sudo iw dev wlan0 scan

连接测试即可。

四,

休眠部分

瑞芯微 Rockchip 移植方式(SDIO)
aic8800_btlpm
RK 平台默认已经有 bwrite 等接口,不需要使用 aic8800_btlpm 处理蓝牙休眠唤醒。
aic8800_bsp
Makefile 中将以下两个 CONFIG 改成 y,在 aic_bsp_driver.h 中将
AICBT_LPM_ENABLE_DEFAULT 改成 1
aic8800_fdrv
在 Makefile 中将以下两个 CONFIG 改成 y,平台选择 CONFIG_PLATFORM_ROCKCHIP
libbt-vendor
在 vnd_generic.txt 中将以下两个参数打开
upio.c 中修改 init_rfkill() 的代码

static int init_rfkill()
{
#if 1//For RK
        char path[64];
        char buf[16];
        int fd, sz, id;


        int rfkill_id;
                if (is_rfkill_disabled())
                        return -1;
                               for (id = 0; ; id++)
                {
                        snprintf(path, sizeof(path), "/sys/class/rfkill/rfkill%d/type", id);
                        fd = open(path, O_RDONLY);
                        if (fd < 0)
                        {
                                ALOGE("init_rfkill : open(%s) failed: %s (%d)\n", \
                                path, strerror(errno), errno);
                                return -1;
                        }
                                sz = read(fd, &buf, sizeof(buf));
                                close(fd);
                        if (sz >= 9 && memcmp(buf, "bluetooth", 9) == 0)
        {
            rfkill_id = id;
            break;
        }
            }
            asprintf(&rfkill_state_path, "/sys/class/rfkill/rfkill%d/state", rfkill_id);
            return 0;
            #endif
            #if 0
            char path[64];
            char buf[16];
            int fd, sz, id;
            const char *basepath = "/sys/devices/platform/aic-bt/rfkill";
            DIR *d;
            struct dirent *de;
if (!(d = opendir(basepath)))
        goto fail;
        while ((de = readdir(d))) {

if (strstr(de->d_name, "rfkill")) {
        snprintf(path, sizeof(path), "%s/%s/type", basepath, de->d_name);
            fd = open(path, O_RDONLY);
if (fd < 0)
        continue;
        sz = read(fd, &buf, sizeof(buf));
        close(fd);
if (sz >= 9 && memcmp(buf, "bluetooth", 9) == 0) {
        ALOGD("%s: rfkill path %s/%s", __func__, basepath, de->d_name);
        asprintf(&rfkill_state_path, "%s/%s/state", basepath, de->d_name);
        closedir(d);
        return 0;
        }
        }
}
closedir(d);
        fail:
        ALOGE("%s: No rfkill control node found", __func__);
        return -1;
        #endif
}
----------------------------------------------------后面更新蓝牙部分-----------------------------
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐