Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92
Wifi: AP6335
概念:
WiFi芯片内部有一个小系统,用来运行802.11协议,此部分代码就叫Firmware。有些芯片(例如 broadcom)的Firmware是以文件的形式存放的,有些芯片(例如 realteck)的Firmware是做到驱动代码中的。
WiFi芯片需要作相应的RF参数校准,校准值等信息一般放到到Nvram中。例如,同一个芯片bcm4330,做成不同的模块时,需要不同的Nvram。另外,有些芯片(例如realtek)将RF参数校准等信息写到芯片的EEPROM中,这部分工作在模块出厂时完成
WiFi芯片工作前,需要host先下载Firmware文件到WiFi芯片中,此部分工作在WiFi驱动中完成。
路径:
Firmware与Nvram文件存放于external/wlan_loader/firmware/目录中,最终被编译到系统的/system/etc/firmware
加载:
系统开机默认就加载好firmware和nvram文件了,过程可参考 [RK3288][Android6.0] WiFi的驱动初始化过程小结
rk_wifi_config.c
int rkwifi_set_firmware(char *fw, char *nvram)
{
int chip = get_wifi_chip_type();
if (chip == WIFI_AP6335) {
sprintf(fw, "%s%s", ANDROID_FW_PATH, "fw_bcm4339a0_ag.bin");
sprintf(nvram, "%s%s", ANDROID_FW_PATH, "nvram_AP6335.txt");
}
}
因此对应的文件是fw_bcm4339a0_ag.bin
在framework虽然也有调reload firmware
SoftapController.cpp
int SoftapController::fwReloadSoftap(int argc, char *argv[])
{
char *fwpath = NULL;
if (argc < 4) {
ALOGE("SoftAP fwreload is missing arguments. Please use: softap " );
return ResponseCode::CommandSyntaxError;
}
if (strcmp(argv[3], "AP") == 0) {
fwpath = (char *)wifi_get_fw_path(WIFI_GET_FW_PATH_AP);
} else if (strcmp(argv[3], "P2P") == 0) {
fwpath = (char *)wifi_get_fw_path(WIFI_GET_FW_PATH_P2P);
} else if (strcmp(argv[3], "STA") == 0) {
fwpath = (char *)wifi_get_fw_path(WIFI_GET_FW_PATH_STA);
}
if (!fwpath)
return ResponseCode::CommandParameterError;
if (wifi_change_fw_path((const char *)fwpath)) {
ALOGE("Softap fwReload failed");
return ResponseCode::OperationFailed;
}
else {
ALOGD("Softap fwReload - Ok");
}
return ResponseCode::SoftapStatusResult;
}
这些宏定义是在wifi_bt_common.mk中
WIFI_DRIVER_FW_PATH_STA := "/system/etc/firmware/fw_bcm4329.bin"
WIFI_DRIVER_FW_PATH_P2P := "/system/etc/firmware/fw_bcm4329_p2p.bin"
WIFI_DRIVER_FW_PATH_AP := "/system/etc/firmware/fw_bcm4329_apsta.bin"
但是在external/wlan_loader/firmware并不存在,虽然驱动加载,但是softap和p2p可能会有问题