1、获取驱动
一般是通过客户向原厂获取到该款wifi的驱动。
2、编译修改
Kconfig修改:
路径:longan/kernel/linux-4.9/drivers/net/wireless/Kconfig
--- a/drivers/net/wireless/Kconfig
+++ b/drivers/net/wireless/Kconfig
@@ -116,5 +116,6 @@ source "drivers/net/wireless/uwe5622/Kconfig"
source "drivers/net/wireless/rtl8822bs/Kconfig"
source "drivers/net/wireless/rtl8723ds/Kconfig"
source "drivers/net/wireless/rtl8821cs/Kconfig"
+source "drivers/net/wireless/ssv6x5x/Kconfig"
Makefile修改:
--- a/drivers/net/wireless/Makefile
+++ b/drivers/net/wireless/Makefile
obj-$(CONFIG_SPARD_WLAN_SUPPORT) += uwe5622/
+obj-$(CONFIG_SSV6158) += ssv6x5x/
3、驱动移植
将获取到的ssv6x5x wifi驱动放到对应的驱动目录下
longan/kernel/linux-4.9/drivers/net/wireless
4、内核配置
make ARCH=arm64 menuconfig 手动进行修改。或者按如下方法修改代码:
路径:longan/kernel/linux-4.9/arch/arm64/configs/sun50iw9p1smp_h616_android_defconfig
CONFIG_AIC8800_WLAN_SUPPORT=m
CONFIG_AIC8800_BTSDIO_SUPPORT=m
+CONFIG_SSV6X5X=m
5、依赖
查看原厂提供的驱动移植指南,确认是否要依赖一些特殊属性。
(1)ssv6x5x WiFi 驱动配置,config 需要进行配置如下。如要 ssv6x5x buildin 到内核(前提是cfg80211/mac80211 都需要 buidin 到内核),buildin 选 Y,编成 module 选 M"。
(2)内核需支持 MAC80211 & cfg80211,buildin 选 Y,编成 module 选 M。"
那么这里就需要在配置中加上80211的配置。
路径:longan/kernel/linux-4.9/arch/arm64/configs/sun50iw9p1smp_h616_android_defconfig
# CONFIG_CFG80211_WEXT is not set
# CONFIG_LIB80211 is not set
-# CONFIG_MAC80211 is not set
+CONFIG_MAC80211=y
+CONFIG_MAC80211_HAS_RC=y
+CONFIG_MAC80211_RC_MINSTREL=y
+CONFIG_MAC80211_RC_MINSTREL_HT=y
+CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y
+CONFIG_MAC80211_RC_DEFAULT="minstrel_ht"
6、ssv适配
android的ssv适配:保证\android\hardware目录下ssv文件有适配
7、 使能P2P功能
路径:android/hardware/aw/wireless/wlan/config/p2p_supplicant_overlay.conf
--- a/wlan/config/p2p_supplicant_overlay.conf
+++ b/wlan/config/p2p_supplicant_overlay.conf
@@ -1,3 +1,4 @@
+p2p_no_group_iface=1
disable_scan_offload=1
路径:android/external/wpa_supplicant_8/wpa_supplicant
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -5807,6 +5807,11 @@ static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
* Doing it here as it determines whether l2_packet_init() will be done
* during wpa_supplicant_driver_init().
*/
+
+ if (strstr(wpa_s->ifname, "wlan")) {
+ wpa_s->drv_flags = wpa_s->drv_flags | WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE;
+ }
8、wifi驱动识别与检测
这里有两种方式,一种是强制设置(一个SDK只能支持一种wifi驱动,不建议使用),一种是自适应识别。
(1)强制设置:android\device\softwinner\XXX\BoardConfig.mk 中对wifi的几个变量进行强制设置(这里的xxx是方案名)
文件路径:android/device/softwinner/{DEVICE}/{PRODUCT}
BoardConfig.mk 文件决定 android 要加载哪一款 Wi‑Fi 模组,以及是否支持蓝牙
# wifi and bt configuration
# 1. Wifi Configuration
BOARD_WIFI_VENDOR := xxx //Wi‑Fi 模组厂商
BOARD_USR_WIFI := xxx // Wi‑Fi 模组型号
WIFI_DRIVER_MODULE_PATH := "/vendor/lib/modules/xxx.ko" // Wi‑Fi 驱动 ko 的路径
WIFI_DRIVER_MODULE_NAME := "xxx" // Wi‑Fi 驱动名称 (加载驱动后 lsmod 的名字)
WIFI_DRIVER_MODULE_ARG := "" // Wi‑Fi 驱动加载所需参数
# 2. Bluetooth Configuration
BOARD_BLUETOOTH_VENDOR := xxx // 蓝牙模组厂商
BOARD_HAVE_BLUETOOTH_NAME := xxx //蓝牙模组型号
(2)自适应识别:android/hardware/aw/wireless/hwinfo/libhwinfo.c 中加入"ssv6x5x"即可完成自动识别
9、重新编译测试
完成以上步骤后,开始进行编译,解决编译问题打包完成后,开始测试wifi的基本功能。