A20 wifi驱动移植
本驱动移植是在ak27的平台上移植8089wifi驱动,驱动名字为eagle
一、lichee部分移植
测试模式部分:
dragonboard下的文件主要是针对wifi在测试模式下工作的配置,可不用太关心。
lichee/tools/pack/chips/sun7i/configs/dragonboard/k70/test_config.fex(由于dragonboard目录下没有ak27这个目录,就选择了k70)
[wifi]
display_name= "网络"
activated = 1
program = "wifitester.sh"
category = 0
run_type = 1
module_path = "/system/vendor/modules/eagle.ko"
module_args =
lichee/tools/pack/chips/sun7i/configs/dragonboard/k70/sys_config.fex
[mmc3_para]
sdc_used = 1
sdc_detmode = 3
sdc_buswidth = 4
[wifi_para]
wifi_used = 1 ;使用wifi
wifi_sdc_id = 3 ;使用sdc3,好像是与上面使用的mmc3相对应
wifi_usbc_id = 2 ;使用usb2
wifi_usbc_type = 1 ;1- EHCI(speed 2.0), 2- OHCI(speed 1.0)
wifi_mod_sel = 8 ;这里与wifi.c中的case语句对应
wifi_power = "" ;这个在驱动中的xxx_module_power中会用到
ap6xxx_wl_regon = port:PH09<1><default><default><0>(这一块和蓝牙工作相关的引脚不能注释掉,否则可能导致开不了机)
ap6xxx_wl_host_wake = port:PH10<0><default><default><0>
ap6xxx_bt_regon = port:PB05<1><default><default><0>
ap6xxx_bt_wake = port:PI20<1><default><default><0>
ap6xxx_bt_host_wake = port:PI21<0><default><default><0>
; 8 - eagle
esp_wl_chip_en = port:PH09<1><default><default><0> ;(配置wifi的工作引脚)
esp_wl_rst = port:PH10<0><default><default><0> ;这个引脚在8089 这个wifi模块中没有用
esp_wl_pw = port:PH03<1><default><3><0> ;给wifi模块供电的一个模块的使能引脚,每次在加载和卸载驱动的时候给这个引脚高/低电平
lichee/buildroot/target/dragonboard/src/testcases/wifitester/wifitester.sh 这个也是与测试相关的,不明白在干什么
正常工作模式部分:
配置文件sys_config.fex:
lichee/tools/pack/chips/sun7i/configs/android/wing-ak27/sys_config.fex
[mmc3_para]
sdc_used = 1
sdc_detmode = 3
sdc_buswidth = 4
[wifi_para]
wifi_used = 1
wifi_sdc_id = 3
wifi_usbc_id = 2
wifi_usbc_type = 1
wifi_mod_sel = 8
wifi_power = ""
; 3 - rtl8723as sdio wifi + bt gpio config 将这个wifi模块所使用的引脚全部注释掉,以免收到干扰
;rtk_rtl8723as_wl_dis = port:PH09<1><default><default><0>
;rtk_rtl8723as_bt_dis = port:PB05<1><default><default><0>
;rtk_rtl8723as_wl_host_wake = port:PH10<0><default><default><0>
;rtk_rtl8723as_bt_host_wake = port:PI21<0><default><default><0>
; 7 - ap6210 sdio wifi + bt gpio config
ap6xxx_wl_regon = port:PH09<1><default><default><0> ;这些与蓝牙相关的引脚虽然没有用到,但是不能注释掉,否则会导致开不了机
ap6xxx_wl_host_wake = port:PH10<0><default><default><0>
ap6xxx_bt_regon = port:PB05<1><default><default><0>
ap6xxx_bt_wake = port:PI20<1><default><default><0>
ap6xxx_bt_host_wake = port:PI21<0><default><default><0>
; 8 - eagle switch rst and chip_en
esp_wl_chip_en = port:PH10<1><default><default><0>
;esp_wl_rst = port:PH09<0><default><default><0>
esp_wl_rst =
esp_wl_pw = port:PH03<1><default><3><0> ;给wifi模块供电的一个模块的使能引脚,每次在加载和卸载驱动的时候给这个引脚高/低电平
编译测试内容的脚本:
lichee/linux-3.3/scripts/build_sun7i_dragonboard.sh 这个文件主要用来配置怎么编译与dragonboard相关的内容,一般不许要修改
驱动:
lichee/linux-3.3/drivers/net/wireless/eagle 将驱动eagle这个目录整个丢到wireless目录下,然后修改相应的Makefile 和Kconfig即可,
注意Makefile中depends on所依赖的内容要打开才能编译。
mmc文件:
lichee/linux-3.3/drivers/mmc/host/sunxi-mci.c mmc这一块主要是做卡的检测,根据驱动的不同修改可能有所不同,一般core.c中是不需要修改的。
lichee/linux-3.3/drivers/mmc/core/core.c
rf文件:
lichee/linux-3.3/arch/arm/mach-sun7i/rf/wifi_pm_eagle.c 这个文件是由驱动原厂提供,主要提供一些操作GPIO的接口和上电的接口供驱动调用
lichee/linux-3.3/arch/arm/mach-sun7i/rf/wifi_pm.c 将wifi_pm_eagle.c加载进系统,主要是将其加入到一个数组中,然后通过case语句去调用,
这里的调用与配置文件中的wifi_mod_sel = 8 相对应
lichee/linux-3.3/arch/arm/mach-sun7i/rf/wifi_pm.h 函数接口声明
lichee/linux-3.3/arch/arm/mach-sun7i/rf/Makefile 将wifi_pm_eagle.c加入到Makefile
协议的配置:
lichee/linux-3.3/arch/arm/configs/sun7ismp_min_defconfig
CONFIG_LIB80211=y
CONFIG_MAC80211=y ;eagle这个驱动中的Makefile依赖与这个协议,如果这里没有打开,就不会编译eagle
CONFIG_RFKILL=y
lichee/linux-3.3/arch/arm/configs/sun7ismp_defconfig
CONFIG_LIB80211=y
CONFIG_MAC80211=y
CONFIG_RFKILL=y
lichee/linux-3.3/arch/arm/configs/sun7ismp_android_defconfig
CONFIG_LIB80211=y
CONFIG_MAC80211=y
CONFIG_RFKILL=y
因为用的是sdiowifi所以将以下与usbwifi相关的内容注释掉
#CONFIG_USB_RTL8150=m
#CONFIG_USB_USBNET=m
#CONFIG_USB_NET_AX8817X=m
#CONFIG_USB_NET_QF9700=m
#CONFIG_USB_NET_CDCETHER=m
#CONFIG_USB_NET_MCS7830=m
#CONFIG_RTL8192CU_SW=m 将其他的一些wifi模块注释掉,应该也可一不注释
#CONFIG_RTL8188EU=m
#CONFIG_RTL8189ES=m
#CONFIG_RTL8723AS=m
CONFIG_EAGLE=m 加载自己的wifi模块
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
android部分:
wifi.c:
android/hardware/libhardware_legacy/wifi/wifi.c
添加自己的wifi驱动模块
#elif defined EAGLE_WIFI_USED
#ifndef WIFI_DRIVER_MODULE_PATH
#define WIFI_DRIVER_MODULE_PATH "/system/vendor/modules/eagle.ko"
#ifndef WIFI_DRIVER_MODULE_NAME
#define WIFI_DRIVER_MODULE_NAME "eagle"
关掉p2p
int wifi_start_supplicant(int p2p_supported)
{
char supp_status[PROPERTY_VALUE_MAX] = {'\0'};
int count = 200; /* wait at most 20 seconds for completion */
#ifdef HAVE_LIBC_SYSTEM_PROPERTIES
const prop_info *pi;
unsigned serial = 0, i;
#endif
if (p2p_supported) {
ALOGE("wifi_start_supplicant, JLU disable p2p_support\n");
p2p_supported = 0;
}
if (p2p_supported) {
...................
...........................
}
int wifi_stop_supplicant(int p2p_supported)
{
char supp_status[PROPERTY_VALUE_MAX] = {'\0'};
int count = 50; /* wait at most 5 seconds for completion */
if (p2p_supported) {
ALOGE("wifi_stop_supplicant, JLU disable p2p\n");
p2p_supported = 0;
}
if (p2p_supported) {
...................
...........................
}
android/hardware/libhardware_legacy/wifi/Android.mk
# eagle sdio wifi module
ifeq ($(SW_BOARD_USR_WIFI), eagle) ;SW_BOARD_USR_WIFI 这个变量是在softwinner下的Boaedconfig中定义的
LOCAL_CFLAGS += -DEAGLE_WIFI_USED
LOCAL_CFLAGS += -DEAGLE_WIFI_VENDOR
endif
wpa_supplicant:
android/external/wpa_supplicant_8/wpa_supplicant/android.config
CONFIG_DRIVER_NL80211=y 打开相关的wifi通信协议驱动
禁用以下功能:
# Enable P2P
#CONFIG_P2P=n
#CONFIG_AP=n
#Enable Wifi Display
#CONFIG_WIFI_DISPLAY=n
添加wpa_supplicant需用到的lib库:
android/device/softwinner/common/hardware/eagle ;eagle这个目录是由原厂提供,整个目录丢进去即可。这里面主要是wpa_supplicant所用到的一些lib库
android/device/softwinner/common/hardware/eagle/wlan/wpa_supplicant_8_lib
softwinner/wing-ak27下文件的配置:
android/device/softwinner/wing-ak27/overlay/frameworks/base/core/res/res/values/config.xml
如果wifi不支持tethering功能(wifi热点共享)则注释掉以下语句:
<!-- default: disable Softap feature
<string-array translatable="false" name="config_tether_wifi_regexs">
-->
android/device/softwinner/wing-ak27/wing_ak27.mk
注释掉以下语句:
# frameworks/native/data/etc/android.hardware.wifi.direct.xml:system/etc/permissions/android.hardware.wifi.direct.xml \
# ap6210 sdio wifi fw and nvram
#PRODUCT_COPY_FILES += \
# hardware/broadcom/wlan/firmware/ap6210/fw_bcm40181a2.bin:system/vendor/modules/fw_bcm40181a2.bin \
# hardware/broadcom/wlan/firmware/ap6210/fw_bcm40181a2_apsta.bin:system/vendor/modules/fw_bcm40181a2_apsta.bin \
# hardware/broadcom/wlan/firmware/ap6210/fw_bcm40181a2_p2p.bin:system/vendor/modules/fw_bcm40181a2_p2p.bin \
# hardware/broadcom/wlan/firmware/ap6210/nvram_ap6210.txt:system/vendor/modules/nvram_ap6210.txt \
# hardware/broadcom/wlan/firmware/ap6210/bcm20710a1.hcd:system/vendor/modules/bcm20710a1.hcd
init.sun7i.rc:
android/device/softwinner/wing-ak27/init.sun7i.rc 启动自己的wifi 服务,要去掉其他的wiif的服务
# 1. eagle wifi service
# 1.1 eagle wifi sta service
service wpa_supplicant /system/bin/wpa_supplicant -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -e/data/misc/wifi/entropy.bin
socket wpa_wlan0 dgram 660 wifi wifi
disabled
oneshot
android/device/softwinner/wing-ak27/BoardConfig.mk: 这个文件很重要,真多地方的调用已经编译条件都是来自这里
# 1. Wifi Configuration
BOARD_WIFI_VENDOR := eagle
#BOARD_WIFI_VENDOR := broadcom
# 1.1 eagle wifi support
ifeq ($(BOARD_WIFI_VENDOR), eagle)
WPA_SUPPLICANT_VERSION := VER_0_8_X
BOARD_WPA_SUPPLICANT_DRIVER := NL80211
BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_eagle
BOARD_HOSTAPD_DRIVER := NL80211
BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_eagle
SW_BOARD_USR_WIFI := eagle
BOARD_WLAN_DEVICE := eagle
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
问题总结:
1、开机进不了系统
ap6xxx_wl_regon = port:PH09<1><default><default><0>
ap6xxx_wl_host_wake = port:PH10<0><default><default><0>
ap6xxx_bt_regon = port:PB05<1><default><default><0>
ap6xxx_bt_wake = port:PI20<1><default><default><0>
ap6xxx_bt_host_wake = port:PI21<0><default><default><0>
2、wifi不工作
如果还是不行,就直接在开机的过程中将这个EN引脚拉高,即在rf下的wifi_pm_eagle.c中的esp_gpio_init中拉高。
3、移植好之后,发现点击打开wifi后,wifi自动开关
4、供电模块的EN引脚总是拉不高