1.问题现象:
打开wifi的图标,wifi加载后又自动卸载。
2.问题分析
驱动能正常加载,但是又自动卸载,说明驱动没有完全满足安卓的要求,查看wifi加载的源码“hardware/libhardware_legacy/wifi/wifi.”可知wifi要正确加载必须满足“wlan0和p2p”两个条件
int wifi_load_driver()
{
char driver_status[PROPERTY_VALUE_MAX];
int count = 0;
char tmp_buf[512] = {0};
char *p_strstr_wlan = NULL;
char *p_strstr_p2p = NULL;
int ret = 0;
FILE *fp = NULL;
ALOGD("Start to insmod %s.ko\n", WIFI_DRIVER_MODULE_NAME);
if (insmod(DRIVER_MODULE_PATH, DRIVER_MODULE_ARG) < 0) {
ALOGE("insmod %s ko failed!", WIFI_DRIVER_MODULE_NAME);
rmmod(DRIVER_MODULE_NAME); //it may be load driver already,try remove it.
return -1;
}
do{
fp=fopen("/proc/net/wireless", "r");
if (!fp) {
ALOGE("failed to fopen file: /proc/net/wireless\n");
property_set(DRIVER_PROP_NAME, "failed");
rmmod(DRIVER_MODULE_NAME); //try remove it.
return -1;
}
ret = fread(tmp_buf, sizeof(tmp_buf), 1, fp);
if (ret==0){
ALOGD("faied to read proc/net/wireless");
}
fclose(fp);
ALOGD("loading wifi driver...");
p_strstr_wlan = strstr(tmp_buf, "wlan0");
p_strstr_p2p = strstr(tmp_buf, "p2p0");
if (p_strstr_wlan != NULL && p_strstr_p2p != NULL) {
property_set(DRIVER_PROP_NAME, "ok");
break;
}
usleep(200000);// 200ms
} while (count++ <= TIME_COUNT);
if(count > TIME_COUNT) {
ALOGE("timeout, register netdevice wlan0 failed.");
property_set(DRIVER_PROP_NAME, "timeout");
rmmod(DRIVER_MODULE_NAME);
return -1;
}
return 0;
}
利用命令查询wifi驱动加载后的状态
255|shell@tulip-t1:/vendor/modules # cat /proc/net/wireless
Inter-| sta-| Quality | Discarded packets | Missed | WE
face | tus | link level noise | nwid crypt frag retry misc | beacon | 22
wlan0: 0000 0 0 0 0 0 0 0 0 0
发现只有一个wlan0的接口,没有p2p的接口,出现这个问题是由于wifi驱动的配置参数出问题了,增加p2p支持后就能解决问题,再次查看wifi状态就正常了。
shell@tulip-t1:/ $ cat /proc/net/wireless
Inter-| sta-| Quality | Discarded packets | Missed | WE
face | tus | link level noise | nwid crypt frag retry misc | beacon | 22
wlan0: 0000 50. -60. -256 0 0 0 0 0 0
p2p0: 0000 0 0 0 0 0 0 0 0 0