A20 wifi驱动移植

来源:互联网 发布:阿里云幸运券是什么 编辑:程序博客网 时间:2024/04/29 15:06

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

/* eagle sdio wifi */
#ifndef WIFI_DRIVER_MODULE_PATH
#define WIFI_DRIVER_MODULE_PATH "/system/vendor/modules/eagle.ko"
#endif
#ifndef WIFI_DRIVER_MODULE_NAME
#define WIFI_DRIVER_MODULE_NAME "eagle"
#endif

关掉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">

<item>"wlan\\d"</item>
</string-array>
-->

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

class main
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、开机进不了系统

是因为在配置文件中注释掉了蓝牙使用到的一些接口,虽然这个芯片没用蓝牙功能,但是代码可能有些问题,会调用到这些接口。所以需要打开
; 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>

2、wifi不工作

是因为系统为了降低功耗,每次在加载和卸载驱动的时候会给wifi模块上电下电。这个上电下电,又是通过控制另外一个芯片的EN引脚来实现的。
由于驱动中没做这一步动作,所以wifi不工作。解决办法:在每次加载wifi驱动的时候给控制芯片的EN引脚一个高电平,然后延时一下,这个延时的时间很重要,大概60~150ms。
如果还是不行,就直接在开机的过程中将这个EN引脚拉高,即在rf下的wifi_pm_eagle.c中的esp_gpio_init中拉高。

3、移植好之后,发现点击打开wifi后,wifi自动开关

一般移植wifi需要改动很多配置文件,而改了这些配置文件后需要make clean然后再编译才能生效。所以移植wifi后一定要make clean 再编译。

4、供电模块的EN引脚总是拉不高

通过在rf下的wifi_pm_eagle.c中的esp_gpio_init中给EN引脚交替的高低电平,用示波器课看到一个方波,但是最后被拉低了。那有课能是其他的驱动,把这个引脚给拉低了。在sys_config.fex文件中将这个引脚给注释掉。有些驱动可能在系统中没有加载,但是用到了这个引脚,也有可能会影响到。
原创粉丝点击