Android Wi-Fi原始碼分析之WifiService操作Wi-Fi(一):分析Wifi.c中的wifi_load_driver()函式
阿新 • • 發佈:2019-01-04
Wi-Fi原始碼分析之WifiService操作Wi-Fi(一)
分析Wifi.c中的wifi_load_driver()函式
int wifi_load_driver()
{
ALOGD("============wifi_load_driver================");
/* WIFI_DRIVER_MODULE_PATH定義wlan driver的檔案路徑名. 我這裡並沒有定義 */
#ifdef WIFI_DRIVER_MODULE_PATH
ALOGD("============wifi_load_driver:WIFI_DRIVER_MODULE_PATH================" );
char driver_status[PROPERTY_VALUE_MAX];
int count = 100; /* wait at most 20 seconds for completion */
if (is_wifi_driver_loaded()) {
return 0;
}
/* DRIVER_MODULE_PATH裡儲存WIFI_DRIVER_MODULE_PATH巨集定義的檔案路徑名;
* 如果WIFI_DRIVER_MODULE_PATH定義了就在此處通過 insmod向核心新增wlan driver*/
if (insmod(DRIVER_MODULE_PATH, DRIVER_MODULE_ARG) < 0)
return -1;
/* FIRMWARE_LOADER 變數指向 WIFI_FIRMWARE_LOADER巨集定義的 wlan 韌體載入程式檔案路徑名
* DRIVER_PROP_NAME 的值為"wlan.driver.status";
* 如果沒有指定 wlan 韌體載入程式,則直接設定"wlan.driver.status"的屬性為"ok"
* 否則 通過"ctl.start"方式來啟動 wlan 韌體載入程式
* */
if (strcmp(FIRMWARE_LOADER,"") == 0) {
/* usleep(WIFI_DRIVER_LOADER_DELAY); */
property_set(DRIVER_PROP_NAME, "ok");
}
else {
property_set("ctl.start", FIRMWARE_LOADER);
}
sched_yield();
while (count-- > 0) {
if (property_get(DRIVER_PROP_NAME, driver_status, NULL)) {
if (strcmp(driver_status, "ok") == 0)
return 0;
else if (strcmp(DRIVER_PROP_NAME, "failed") == 0) {
wifi_unload_driver();
return -1;
}
}
usleep(200000);
}
property_set(DRIVER_PROP_NAME, "timeout");
wifi_unload_driver();
return -1;
#else
/*如果沒有定義巨集WIFI_DRIVER_MODULE_PATH,則直接設定"wlan.driver.status"的屬性為"ok"*/
property_set(DRIVER_PROP_NAME, "ok");
return 0;
#endif
}