wifi与蓝牙放在一起,因为这两者的芯片供应商有2种:
高通(qcom)或博通(brcm)
而且都是成对一起使用某个厂商的芯片,不会出现wifi是高通,蓝牙是博通的情况
高通wifi芯片:
在system\etc\firmware\wlan\prima\里有WCNSSxxxx类似的文件,这些是固件
在system\lib\modules\prima里有prima_wlan.ko,这是wifi驱动
wifi驱动也有不以模块形式加载,而直接集成在内核里的
博通wifi芯片:
在system\etc\firmware\里有fw_bcmdhdxxx.bin类似的文件,这些是固件
在system\etc\wifi里有bcmdhd.cal配置文件
高通蓝牙:
system\etc\init.qcom.bt.sh有初始化蓝牙的相关脚本
system\bin里有btnvtool蓝牙工具
博通蓝牙:
能找到BCM4334B0_002.001.013.1804.1954.hcd这样的文件
或者有brcm_patchram_plus这个程序
# Wifi
BOARD_HAS_QCOM_WLAN := true
BOARD_WLAN_DEVICE := qcwcn
WPA_SUPPLICANT_VERSION := VER_0_8_X
BOARD_WPA_SUPPLICANT_DRIVER := NL80211
BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_$(BOARD_WLAN_DEVICE)
BOARD_HOSTAPD_DRIVER := NL80211
BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_$(BOARD_WLAN_DEVICE)
WIFI_DRIVER_MODULE_PATH := "/system/lib/modules/wlan.ko"
WIFI_DRIVER_MODULE_NAME := "wlan"
WIFI_DRIVER_FW_PATH_STA := "sta"
WIFI_DRIVER_FW_PATH_AP := "ap"
在本例里,必须从官方rom里提取wlan.ko放到/system/lib/modules/wlan.ko
然后参考官方卡刷包的刷机脚本updater-script
在device/pantech/a870/Android.mk里添加如下语句
# Create wlan firmware links
$(shell mkdir -p $(TARGET_OUT_ETC)/firmware/wlan/prima; \
ln -sf /data/misc/wifi/WCNSS_qcom_cfg.ini $(TARGET_OUT_ETC)/firmware/wlan/prima/WCNSS_qcom_cfg.ini; \
ln -sf /data/misc/wifi/prima.bin $(TARGET_OUT_ETC)/firmware/wlan/prima/prima.bin)
# Create wlan module links
$(shell mkdir -p $(TARGET_OUT)/lib/modules; \
ln -sf /system/lib/modules/prima/prima_wlan.ko $(TARGET_OUT)/lib/modules/wlan.ko)
这些语句用于创建链接
最终编译后会在updater-script里生成如下语句:
symlink("/data/misc/wifi/WCNSS_qcom_cfg.ini", "/system/etc/firmware/wlan/prima/WCNSS_qcom_cfg.ini");
symlink("/data/misc/wifi/prima.bin", "/system/etc/firmware/wlan/prima/prima.bin");
symlink("/system/lib/modules/prima/prima_wlan.ko", "/system/lib/modules/wlan.ko");
另外值得提醒的是,WCNSS_qcom_cfg.ini这个文件,aosp或其它第三方rom必须放在system\etc\wifi才会起作用,但官方ROM却有可能放在system\etc\firmware\wlan\prima里,至于需要放在哪个路径才行,请读者自行试验。
# Wifi
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"
WIFI_DRIVER_FW_PATH_STA := "/system/etc/firmware/fw_bcmdhd.bin"
WIFI_DRIVER_FW_PATH_AP := "/system/etc/firmware/fw_bcmdhd_apsta.bin"
然后在build.prop还必须有wifi相关的配置项,具体请参考官方rom
例如wifi.interface=wlan0类似这种项必须有,请读者自行尝试
# Bluetooth
BOARD_HAVE_BLUETOOTH := true
BOARD_HAVE_BLUETOOTH_QCOM := true
BLUETOOTH_HCI_USE_MCT := true
BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/pantech/a870/bluetooth
# Bluetooth
BOARD_HAVE_BLUETOOTH := true
BOARD_HAVE_BLUETOOTH_BCM := true
BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/pantech/a870/bluetooth
注意:博通蓝牙的话,可能msm-aosp对其支持较差,总之笔者没有成功适配过博通蓝牙功能-_-
修改device/pantech/a870/bluetooth/bdroid_buildcfg.h
#define BTM_DEF_LOCAL_NAME "QCOM-BTD"
这个是蓝牙默认名称,可以自己修改,比如泛泰a870可以这样改
#define BTM_DEF_LOCAL_NAME "IM-A870"
当wifi不能用时,除了看log,还可以对比官方rom来做试验
打开adb shell并取得root权限
接下来介绍几个调试命令
getprop wlan.driver.status
获取wlan驱动状态
未打开wifi时是unloaded
打开wifi后是ok
cat /proc/modules
这个用于获取当前加载的模块
未打开wifi时
texfat 174987 0 - Live 0x00000000 (PO)
mwlan_aarp 3331 0 - Live 0x00000000 (PO)
打开wifi后
wlan 3021860 0 - Live 0x00000000 (O)
texfat 174987 0 - Live 0x00000000 (PO)
mwlan_aarp 3331 0 - Live 0x00000000 (PO)