WIFI HAL编译调试小记 - Gaojiquan/android_bootable_recovery GitHub Wiki
这次编译可把我给害惨了。 以为拿着官方的init.qcom.rc文件断然不会错,谁知道就是这个东西坑爹了。。。 不过很鄙视官方的做法。难道他们的代码都是写死的?
话不多说,在此记录一下吧,长点教训:
首先查看wpa_supplicant.conf文件。关于ctrl_interface这个参数的配置有两种做法:
-
ctrl_interface=/data/system/wpa_supplicant/
-
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!!!哦耶,睡觉吧!