(文章尾巴--新增排错部分)
前言
手上拿到的是广州视源基于爱科微AIC8800系列芯片做的模组(代理商深圳市嘉鸿时代提供。),该系列均支持WIFI AX协议(WIFI6),目前这款是低成本单2.4G+BT5.2方案;价格比8723有优势,所以公司打算切入这款WIFI6 单频模组。
实操
实物图
我的主控平台是RK3399 Linux4.14 安卓10;
第一步:
吹下板内的RTL8723DS模块,换上8800模组; 硬件是pintopin,同时模组内置了晶振无需外部添加。
第二步:
找供应商拿到的驱动如下:
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
连接测试即可。
四,
休眠部分



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
}