1.3.4 在android中使用BCM43xx
前面的过程只是在android系统中添加编译了BCM43xx驱动源码,但是要想在android中使用它,还需要费一番功夫。需要修改的地方在开始的地方已经用蓝色背景标注了,在这里我们要看看到底要修改哪些文件。
1.3.4.1 hardware/libhardware_legacy/wifi/wifi.c
为BCM43xx驱动模块做适当修改。Wifi.c作为加载wifi驱动模块和启动关闭wpa_supplicant的重要角色而存在,为了使wifi能更好的工作,该文件中的一些变量参数必须被适当的设置(根据wpa_supplicant.conf)。
PC$ vi hardware/libhardware_legacy/wifi/wifi.c
......
#define WIFI_DRIVER_MODULE_PATH
"/system/lib/modules/dhd.ko"
......
#define WIFI_DRIVER_MODULE_NAME"dhd"
......
#define WIFI_DRIVER_MODULE_ARG
"firmware_path=/etc/firmware/sdio-g-cdc-reclaim-idsup-wme-ccxwapi.
bin nvram_path=/etc/firmware/nvram_4325b0.txt"
......
#define WIFI_TEST_INTERFACE "eth0"
......
static const char IFACE_DIR[] = "";
......
static const char SUPP_CONFIG_TEMPLATE[]=
"/data/misc/wifi/wpa_supplicant.conf";
……
static const char SUPP_CONFIG_FILE[] =
"/etc/wifi/wpa_supplicant.conf";
......
上面的红色部分,就是对wifi驱动的特殊化定义,不同的wifi驱动会有不同的定义。修改还包括了固件的和配置文件的路径,以及接口名的相关定义。
WIFI_TEST_INTERFACE定义的是wpa_supplicant和UI的交互接口名,当通过property_get()函数获取wifi接口名错误时,就会使用此定义的接口名。Property_get()函数获取的接口名,就是init.xx.rc文件中的接口定义的wifi.interface:
Setprop wifi.interface “eth0”
SUPP_CONFIG_TEMPLATE定义的是wpa_supplicant配置文件的临时文件。而SUPP_CONFIG_FILE定义的是wpa_supplicant运行时使用的配置文件,并且对wifi配置的修改也会保持到这个文件里。
IFACE_DIR是wpa_supplicant控制接口的目录,该目录下的接口被UI用来连接到wpa_supplicant,这个目录是由wpa_supplicant决定的,其实,这个接口实际上是一个socket,在wpa_supplicant启动时被创建,wpa_supplicant_ctrl_iface_init()
中有两种方式来创建这个socket接口:
(1)android系统的socket
它使用wpa_%ctrl_interface%组合来定义自己的名字,通过socketwpa_eth0 dgram ...命令来生成的(在init.rc中),如果使用这种socket,下面的代码中的接口名必须是一直的:
ctrl_interface=eth0 (In wpa_supplicant.conf)
"socket wpa_eth0 ..." (In init.*.rc )
setprop wifi.interface "eth0" (In init.*.rc)
wpa_supplicant ‐ieth0 ... (In init.*.rc)
此时,IFACE_DIR的定义为NULL。
(2)特殊socket
Wpa_supplicant会通过wpa_supplicant.conf中的ctrl_interface目录来创建控制接口socket,而这个值一般被定义为:"ctrl_interface=DIR=/data/misc/....",这个socket的名字由wpa_supplicant的“-i”参数传递,如果使用这种方式的socket,下面的变量定义必须一致:
ctrl_interface=DIR=/data/misc/ (In wpa_supplicant.conf)
IFACE_DIR=/data/misc/ (In wifi.c)