WIFI HAL编译调试小记 - Gaojiquan/android_bootable_recovery GitHub Wiki

这次编译可把我给害惨了。 以为拿着官方的init.qcom.rc文件断然不会错,谁知道就是这个东西坑爹了。。。 不过很鄙视官方的做法。难道他们的代码都是写死的?

话不多说,在此记录一下吧,长点教训:

首先查看wpa_supplicant.conf文件。关于ctrl_interface这个参数的配置有两种做法:

  1. ctrl_interface=/data/system/wpa_supplicant/

  2. ctrl_interface=wlan0

本人推荐用第二种写法,因为方便,libhardware_legacy下的wifi.c文件里也不需要配置IFACE_DIR这个数组了,当然我拿的是CM的源码,当检测到传进来的ifname为wifi.interface这个属性的值的时候,直接返回wlan0,而不会去拼接IFACE_DIR,灵活性大大提高。但也就因为这个问题,导致死活连不上,一直报"unable to find /data/system/wpa_supplicant/wlan0, no such file or directory" 这个错误。。。Google了好久,都说去检查init.rc。那好吧,那就仔细检查检查。。。没发现错误,浪费我一个下午。没办法,只好看WIFI HAL部分的源代码,DEBUG。。。

首先是解决WIFI模块加载的问题,直接手动insmod prima_wlan0.ko发现不行。看源码后觉得应该有一个EXT的module,找了下,发现prima下有两个ko文件,一个是cfg80211.ko,一个是prima_wlan0.ko。。。好吧。。。那就先insmod cfg80211.ko,再insmod prima_wlan.ko。。。一切OK,猜想正确。 (其实可以用lsmod这个命令在官方ROM下查看所加载的MODULE)

然后就是那个"unable to find /data/system/wpa_supplicant/wlan0, no such file or directory"的问题。大致定位到以下代码:

int wifi_connect_to_supplicant(const char *ifname) { char path[256];

if (is_primary_interface(ifname)) {
    if (access(IFACE_DIR, F_OK) == 0) {
        snprintf(path, sizeof(path), "%s/%s", IFACE_DIR, primary_iface);
    } else {
        strlcpy(path, primary_iface, sizeof(path));
    }
        return wifi_connect_on_socket_path(PRIMARY, path);
    } else {
        sprintf(path, "%s/%s", CONTROL_IFACE_PATH, ifname);
        return wifi_connect_on_socket_path(SECONDARY, path);
    }
}

也就是说在第一个if里判断ctrl_interface为wlan0的时候,会首先去尝试打开IFACE_DIR这个文件夹,如果返回OK,则将这个DIR跟 iface拼接,也就是/data/system/wpa_supplicant/wlan0。难道是这里错了么?LOG一下运行,果然是。用shell去到/data/system/目录下,果然有一个wpa_supplicant文件夹,还是一个软连接。该死,这不就是init.qcom.rc里干的那件事么。。。好吧,先在shell里rm掉这个软连,再修改init.qcom.rc下的如下代码段:

#Create the symlink to qcn wpa_supplicant folder for ar6000 wpa_supplicant
mkdir /data/system 0775 system system
# focus.lan : what a fuck! please do not symlink the dir!!!
# symlink /data/misc/wifi/wpa_supplicant /data/system/wpa_supplicant

注释掉最后一行的symlink即可。。。 重启打包内核,用fastboot刷入。。。一切OK!!!哦耶,睡觉吧!

⚠️ **GitHub.com Fallback** ⚠️