2. 模块介绍
目前H3 android4.4.2平台上已支持wifi模组有6款,本文档将以H3盒子原型机为例说明如何配置每款wifi模组。
wifi 模组可分 USB 接口和 SDIO 接口两种类型,部分模组带蓝牙功能,wifi 的全功能包括 station、softap和 wifi direct,其中 station 是 wifi 的最基本功能,每款 wifi 模组均支持。
注意:
1、 到 linux-3.4 目录下,输入 make ARCH=arm menuconfig,然后选择 Device Drivers --->Network device
suppor--->Wireless LAN,即可看到参与编译的 wifi 驱动。
2、内核默认是编译蓝牙,如果实际平台没有蓝牙功能可蓝牙去除编译,减少生成的内核大小,修改方法如下。
去到 linux-3.4 目录下,输入 make ARCH=arm menuconfig
然后选择[*] Networking support --->
< > Bluetooth subsystem support --->
.......
< > RF switch subsystem support --->
3. ap6181
功能:wifi station、softap、wifi direct
接口类型:SDIO
编译模式:编译成内核模块,修改路径如下
去到 linux-3.4 目录下,输入 make ARCH=arm menuconfig
然后选择 Device Drivers --->
Network device support --->
Wireless LAN --->
 Broadcom 4329/30 wireless cards support
[*] Use Customized firmware path
[*] Use Customized NVRAM path
[*] Use Customized config path
Interrupt type (Out-of-Band Interrupt) --->
进入 Interrupt type (Out-of-Band Interrupt)--->,选择
(X) Out-of-Band Interrupt
3.1. wifi function
3.1.1. BoardConfig.mk
BoardConfig.mk 文件决定 android 加载哪一款 wifi 模组,要配置成使用 ap6181 模组需要把 BoardConfig.mk
文件的相关代码修改成如下。
# wifi and bt configuration
# 1. Wifi Configuration
#BOARD_WIFI_VENDOR := realtek
BOARD_WIFI_VENDOR := broadcom
# 1.1 broadcom wifi support
ifeq ($(BOARD_WIFI_VENDOR), broadcom)
BOARD_WPA_SUPPLICANT_DRIVER := NL80211
WPA_SUPPLICANT_VERSION := VER_0_8_X
BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_bcmdhd
BOARD_HOSTAPD_DRIVER := NL80211
BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_bcmdhd
BOARD_WLAN_DEVICE := bcmdhd
WIFI_DRIVER_FW_PATH_PARAM := "/sys/module/bcmdhd/parameters/firmware_path"
SW_BOARD_USR_WIFI := AP6181
include hardware/broadcom/wlan/bcmdhd/firmware/firmware-bcm.mk
endif
说明:
1、“#”符号起注释作用;
2、“#BOARD_WIFI_VENDOR := realtek”指明不使用 realtek 系统 wifi 模组;
3、“BOARD_WIFI_VENDOR := broadcom”指明使用 broadcom 系统 wifi 模组;
4、“SW_BOARD_USR_WIFI := AP6181”指明使用 AP6181 模块;
3.1.2. init.rc
init.rc 是资源和服务配置相关的文件,使用 ap6181 wifi 模组需要作如下修改(部分代码)。
添加以下内容加载 wifi 驱动:
#insmod boardcom wifi driver
insmod /system/vendor/modules/bcmdhd.ko
添加以下内容,启动 wpa_supplicant:
# broadcom wifi service
# 1 broadcom wifi station and softap
service wpa_supplicant /system/bin/logwrapper /system/bin/wpa_supplicant \
-iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \
-I/system/etc/wifi/wpa_supplicant_overlay.conf \
-O/data/misc/wifi/sockets \
-e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0
class main
socket wpa_wlan0 dgram 660 wifi wifi
disabled
oneshot
# 2 braodcom wifi sta p2p concurrent service
service p2p_supplicant /system/bin/logwrapper /system/bin/wpa_supplicant \
-iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \
-I/system/etc/wifi/wpa_supplicant_overlay.conf \
-O/data/misc/wifi/sockets -N \
-ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf \
-I/system/etc/wifi/p2p_supplicant_overlay.conf \
-puse_p2p_group_interface=1 -e/data/misc/wifi/entropy.bin \
-g@android:wpa_wlan0
class main
socket wpa_wlan0 dgram 660 wifi wifi
disabled
oneshot
3.1.3. eagle_fvd_p1.mk
添加以下内容,使得在设置界面显示 wifi 和 wifi 直连功能:
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.wifi.xml:system/etc/permissions/android.hardware.wifi.xml \
frameworks/native/data/etc/android.hardware.wifi.direct.xml:system/etc/permissions/android.hardware.wifi.direct.xml
3.1.4. config.xml
在 frameworks\base\core\res\res\values\config.xml 文件里添加以下内容,使得在设置界面显示“网络共享与
便携式热点”功能:
"wlan0"
3.1.5. sys_config.fex
要配置成使用 ap6181 模组需要把 sys_config.fex 文件修改成如下(部分代码)。
[mmc1_para]
sdc_used = 1
sdc_detmode = 4
sdc_buswidth = 4
sdc_clk = port:PG00<2><1><2>
sdc_cmd = port:PG01<2><1><2>
sdc_d0 = port:PG02<2><1><2>
sdc_d1 = port:PG03<2><1><2>
sdc_d2 = port:PG04<2><1><2>
sdc_d3 = port:PG05<2><1><2>
sdc_det =
sdc_use_wp = 0
sdc_wp =
sdc_isio = 1
sdc_regulator = "none"
;--------------------------------------------------------------------------------
;wifi/bt/fm/gps/nfc modules configuration
;module_num:
; 0- none
; 1- rtl8188eu(wifi)
; 2- rtl8723bs(wifi+bt)
; 3- ap6181(wifi)
; 4- ap6210(wifi+bt)
; 5- ap6330(wifi+bt)
; 6- ap6335(wifi)
;module_power0: axp used by module, "axp22_dldo1" - use dldo1, not use keep it empty
;module_power0_vol: power0 voltage, mv;
;chip_en: enable chip io
;lpo_use_apclk: ""- not use, "losc_out"- a23/33, "ac10032k1"、"ac10032k2"、"ac10032k3"- a80
;--------------------------------------------------------------------------------
[module_para]
module_num = 3
module_power0 = "axp22_dldo1"
module_power0_vol = 3300000
module_power1 = "axp15_cldo3"
module_power1_vol = 3000000
module_power2 = "axp22_ldoio0"
module_power2_vol = 3000000
module_power3 =
module_power3_vol =
chip_en =
lpo_use_apclk = "ac10032k2"
;--------------------------------------------------------------------------------
;wifi configuration
;wifi_used: 0-not use, 1- use
;wifi_sdc_id: 0- SDC0, 1- SDC1, 2- SDC2, 3- SDC3
;wifi_usbc_id: 0- USB0, 1- USB1, 2- USB2
;wifi_usbc_type: 1- EHCI(speed 2.0), 2- OHCI(speed 1.0)
;wl_reg_on: wifi function enable io
;wl_host_wake: wifi device wake-up host
;wl_host_wake_invert: whether wl_host_wake use inverter between ap and module
; 0: not used, 1: used
;--------------------------------------------------------------------------------
[wifi_para]
wifi_used = 1
wifi_sdc_id = 1
wifi_usbc_id = 1
wifi_usbc_type = 1
wl_reg_on = port:PL02<1><0>
wl_host_wake = port:PL03<0><0>
wl_host_wake_invert = 0
说明:
1、“;”符号起注释作用;
2、“wifi_used”宏赋值为 1 表示使用 wifi,为 0 表示不使用;
3、“wifi_sdc_id”宏表示使用哪个 SD 接口连接 SDIO wifi;
4、“wifi_num”宏表示选用哪一款 wifi 模组;
5、“module_power0”宏表示 wifi 供电电源;
6、“module_power0_vol”宏表示 wifi 供电电源的电压值;
7、“module_power1”宏作用与 module_power0 宏一样;
8、“module_power1_vol”宏作用与 module_power0_vol 宏一样;
9、“module_power2”宏表示 wifi IO 口上拉电阻所接的电压源;
10、“module_power2_vol”宏表示 wifi IO 口上拉电阻所接的电压值;
11、“lpo_use_apclk”宏表示所选择的 32K 时钟源;
注意:
1、模组供电电源和使用哪些 pin 做为 ap6181 的控制需要根据具体平台而定
3.2. wifi wake host
ap6181 支持 wifi 唤醒休眠主控功能,只需要在 sys_config.fex 的[wakeup_src_para]主键中做添加即可,具体修改如下。
[wakeup_src_para]
cpu_en = 0
cpu_freq = 48
; (cpu:apb:ahb)
pll_ratio = 0x111
dram_selfresh_en = 1
dram_freq = 36
wakeup_src0 =
wakeup_src_wl = port:PL03<4><0>
bb_wake_ap = port:PM01<4><0>
说明:
1、“wakeup_src_wl”子键是为 wifi 唤醒休眠主控而添加的
注:
1、模组使用哪些 pin 做为 ap6181 的控制需要根据具体平台而定
3.3. ap6181 模组移植相关文件
以下文件是与 ap6181 模组移植相关的,无需再对这些文件作修改,只需了解即可。
一、ap6181 驱动代码
\linux-3.4\drivers\net\wireless\bcmdhd
二、电源及 GPIO 控制
lichee\linux-3.4\drivers\misc\rf_pm\wifi_pm.c
lichee\linux-3.4\drivers\misc\rf_pm\module_pm.c
lichee\linux-3.4\drivers\misc\rf_pmbt_pm.c
wifi_pm.c 是 ap6181 模组电源和 GPIO 控制的实现文件。
bt_pm.c 是蓝牙电源管理的实现文件。
注:
1、broadcom 的 ap6xxx 系列模组均是使用相同的 bcmdhd 驱动;
4. ap6210
功能:wifi station、softap、wifi direct、bluetooth
接口类型:SDIO、UART
参考方案:eagle_fvd_p1
编译模式:编译成内核模块,修改路径如下
去到 linux-3.4 目录下,输入 make ARCH=arm menuconfig
然后选择 Device Drivers --->
Network device support --->
Wireless LAN --->
 Broadcom 4329/30 wireless cards support
[*] Use Customized firmware path
[*] Use Customized NVRAM path
[*] Use Customized config path
Interrupt type (Out-of-Band Interrupt) --->
进入 Interrupt type (Out-of-Band Interrupt)--->,选择
(X) Out-of-Band Interrupt
4.1. wifi function
4.1.1. BoardConfig.mk
BoardConfig.mk 文件决定 android 加载哪一款 wifi 模组,要配置成使用 ap6210 模组需要把 BoardConfig.mk
文件的相关代码修改成如下。
# wifi and bt configuration
# 1. Wifi Configuration
#BOARD_WIFI_VENDOR := realtek
BOARD_WIFI_VENDOR := broadcom
# 1.1 broadcom wifi support
ifeq ($(BOARD_WIFI_VENDOR), broadcom)
BOARD_WPA_SUPPLICANT_DRIVER := NL80211
WPA_SUPPLICANT_VERSION := VER_0_8_X
BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_bcmdhd
BOARD_HOSTAPD_DRIVER := NL80211
BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_bcmdhd
BOARD_WLAN_DEVICE := bcmdhd
WIFI_DRIVER_FW_PATH_PARAM := "/sys/module/bcmdhd/parameters/firmware_path"
SW_BOARD_USR_WIFI := AP6210
include hardware/broadcom/wlan/bcmdhd/firmware/firmware-bcm.mk
endif
说明:
1、“#”符号起注释作用;
2、“#BOARD_WIFI_VENDOR := realtek”指明不使用 realtek 系统 wifi 模组;
3、“BOARD_WIFI_VENDOR := broadcom”指明使用 broadcom 系统 wifi 模组;
4、“SW_BOARD_USR_WIFI := AP6210”指明使用 AP6210 模块
4.1.2. init.rc
init.rc 是资源和服务配置相关的文件,使用 ap6210 wifi 模组需要作如下修改(部分代码)。
添加以下内容加载 wifi 驱动:
#insmod boardcom wifi driver
insmod /system/vendor/modules/bcmdhd.ko
4.1.2. init.rc
init.rc 是资源和服务配置相关的文件,使用 ap6210 wifi 模组需要作如下修改(部分代码)。
添加以下内容加载 wifi 驱动:
#insmod boardcom wifi driver
insmod /system/vendor/modules/bcmdhd.ko
4.1.3. eagle_fvd_p1.mk
添加以下内容,使得在设置界面显示 wifi 和 wifi 直连功能:
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.wifi.xml:system/etc/permissions/android.hardware.wifi.xml \
frameworks/native/data/etc/android.hardware.wifi.direct.xml:system/etc/permissions/android.hardware.wifi.direct
.xml
4.1.4. config.xml
在 frameworks\base\core\res\res\values\config.xml 文件里添加以下内容,使得在设置界面显示“网络共享与便
携式热点”功能:
"wlan0"
4.1.5. sys_config.fex
要配置成使用 ap6210 模组需要把 sys_config.fex 文件修改成如下(部分代码)。
[mmc1_para]
sdc_used = 1
sdc_detmode = 4
sdc_buswidth = 4
sdc_clk = port:PG00<2><1><2>
sdc_cmd = port:PG01<2><1><2>
sdc_d0 = port:PG02<2><1><2>
sdc_d1 = port:PG03<2><1><2>
sdc_d2 = port:PG04<2><1><2>
sdc_d3 = port:PG05<2><1><2>
sdc_det =
sdc_use_wp = 0
sdc_wp =
sdc_isio = 1
sdc_regulator = "none"
sdc_power_supply = "vcc-wifi-io"
;--------------------------------------------------------------------------------
;wifi/bt/fm/gps/nfc modules configuration
;module_num:
; 0- none
; 1- rtl8188eu(wifi)
; 2- rtl8723bs(wifi+bt)
; 3- ap6181(wifi)
; 4- ap6210(wifi+bt)
; 5- ap6330(wifi+bt)
; 6- ap6335(wifi)
;module_power0: axp used by module, "axp22_dldo1" - use dldo1, not use keep it empty
;module_power0_vol: power0 voltage, mv;
;chip_en: enable chip io
;lpo_use_apclk: ""- not use, "losc_out"- a23/33, "ac10032k1"、"ac10032k2"、"ac10032k3"- a80
;--------------------------------------------------------------------------------
[module_para]
module_num = 4
module_power0 = "axp81x_dcdc1"
module_power0_vol = 3300000
module_power1 =
module_power1_vol =
module_power2 =
module_power2_vol =
module_power3 =
module_power3_vol =
chip_en =
lpo_use_apclk = "ac10032k2"
;--------------------------------------------------------------------------------
;wifi configuration
;wifi_used: 0-not use, 1- use
;wifi_sdc_id: 0- SDC0, 1- SDC1, 2- SDC2, 3- SDC3
;wifi_usbc_id: 0- USB0, 1- USB1, 2- USB2
;wifi_usbc_type: 1- EHCI(speed 2.0), 2- OHCI(speed 1.0)
;wl_reg_on: wifi function enable io
;wl_host_wake: wifi device wake-up host
;wl_host_wake_invert: whether wl_host_wake use inverter between ap and module
; 0: not used, 1: used
;--------------------------------------------------------------------------------
[wifi_para]
wifi_used = 1
wifi_sdc_id = 1
wifi_usbc_id = 1
wifi_usbc_type = 1
wl_reg_on = port:PL02<1><0>
wl_host_wake = port:PL03<0><0>
wl_host_wake_invert = 0
说明:
1、“;”符号起注释作用;
2、“wifi_used”宏赋值为 1 表示使用 wifi,为 0 表示不使用;
3、“wifi_sdc_id”宏表示使用哪个 SD 接口连接 SDIO wifi;
4、“wifi_num”宏表示选用哪一款 wifi 模组;
5、“module_power0”宏表示 wifi 供电电源;
6、“module_power0_vol”宏表示 wifi 供电电源的电压值;
7、“module_power1”宏作用与 module_power0 宏一样;
8、“module_power1_vol”宏作用与 module_power0_vol 宏一样;
9、“module_power2”宏表示 wifi IO 口上拉电阻所接的电压源;
10、“module_power2_vol”宏表示 wifi IO 口上拉电阻所接的电压值;
11、“lpo_use_apclk”宏表示所选择的 32K 时钟源
注意:
1、模组供电电源和使用哪些 pin 做为 ap6210 的控制需要根据具体平台而定
4.2. bluetooth function
修改内核配置,把蓝牙休眠功能给选择上。去到 linux-3.4 目录下,输入 make ARCH=arm menuconfig
,把内核中把支持蓝牙休眠功能选择上。
选择 [*] Networking support --->
 Bluetooth subsystem support--->
Bluetooth device drivers--->
 Broadcom Bluetooth Low Power Manager Support
注意:
这里将它编译成模块
4.2.1. BoardConfig.mk
修改 BoardConfig.mk 文件,让其支持 ap6210 的蓝牙功能,修改如下。
# 2. Bluetooth Configuration
# make sure BOARD_HAVE_BLUETOOTH is true for every bt vendor
BOARD_HAVE_BLUETOOTH := true
BOARD_HAVE_BLUETOOTH_BCM := true
#BOARD_HAVE_BLUETOOTH_RTK := true
#BLUETOOTH_HCI_USE_RTK_H5 := true
SW_BOARD_HAVE_BLUETOOTH_NAME := ap6210
BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR :=
device/softwinner/eagle-tvd-perf3/bluetooth/
4.2.2. init.rc
修改 init.rc 文件,设置蓝牙属性信息,修改如下。
on boot
insmod /system/vendor/modules/bcm_btlpm.ko
# bcm bluetooth
# uart device
chmod 660 /dev/ttyS1
chown bluetooth net_bt_stack /dev/ttyS1
mkdir /data/misc/bluedroid 770 bluetooth net_bt_stack
# power up/down interface
chmod 0660 /sys/class/rfkill/rfkill0/state
chmod 0660 /sys/class/rfkill/rfkill0/type
chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/state
chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/type
#write /sys/class/rfkill/rfkill0/state 0
# bluetooth MAC address programming
chown bluetooth net_bt_stack ro.bt.bdaddr_path
chown bluetooth net_bt_stack /system/etc/bluetooth
chown bluetooth net_bt_stack /data/misc/bluetooth
setprop ro.bt.bdaddr_path "/data/misc/bluetooth/bdaddr"
# bluetooth LPM
chmod 0220 /proc/bluetooth/sleep/lpm
chmod 0220 /proc/bluetooth/sleep/btwrite
chown bluetooth net_bt_stack /proc/bluetooth/sleep/lpm
chown bluetooth net_bt_stack /proc/bluetooth/sleep/btwrite