此文記錄了如何移植android8.1的wifi驅動,并且,在android系統上可以打開和使用wifi,具體是移植了驅動,hal,wpa等,
目錄
- 一、 內核部分代碼移植步驟:
- 二. 移植hal層和framework層的wifi相關代碼.
rk3288 android8.1 rtl8723du wifi移植終于開始了,
一、 內核部分代碼移植步驟:
-
首先,問覃胖子要資料,要能治支持rk3288的wifi資料包,里面包含wifi和藍牙的資料,
是一個壓縮包,我們附件里可以找到,名字叫:567_RTL8723DU_WiFi_linux_v5.6.5.3_35502_COEX20181130-2e2e.20191025.zip. -
解壓此包,看說明,看檔案,先移植驅動,再移植hardware部分和修framework部分,
-
參考網上的資料:https://blog.csdn.net/bhj1119/article/details/51858635
-
先進入內核,make menuconfig配置linux內核:
(1)Networking support —>Wireless下增加802.11 協議堆疊的支持,debug的選項不一定要選上,非debug的選項802.11相關的,應該選上,
--- Wireless
<M> cfg80211 - wireless configuration API
[*] nl80211 testmode command
[ ] enable developer warnings
[ ] cfg80211 regulatory debugging
[*] enable powersave by default
[*] cfg80211 DebugFS entries
[ ] use statically compiled regulatory rules database
[*] cfg80211 wireless extensions compatibility
[*] Wireless extensions sysfs files
-*- Common routines for IEEE802.11 drivers
[ ] lib80211 debugging messages
[*] Allow reconnect while already connected
<M> Generic IEEE 802.11 Networking Stack (mac80211)
[ ] PID controller based rate control algorithm
[*] Minstrel
[*] Minstrel 802.11n support
Default rate control algorithm (Minstrel) --->
[*] Enable mac80211 mesh networking (pre-802.11s) support
[ ] Enable LED triggers
[ ] Export mac80211 internals in DebugFS
[ ] Select mac80211 debugging features --->
(2) 配置內核usb相關,
Device Drivers --->
USB support --->
<*> USB Wireless Device Management support
這個選項一些內核,不一定有,有的選上,支持WIFI,
- 將RTL8723DU_WiFi_linux_v5.6.5.3_35502_COEX20181130-2e2e.20191025/driver下的壓縮包拷貝到 XXX_ANDROID_SDK/kernel/drivers/net/wireless 下,解壓,進入目錄修改其Makefile,編譯wifi驅動模塊,修改動,先找到:CONFIG_PLATFORM_ARM_RK3188,我們參照這個,搜素相關條目,在這個參斬訓礎上修改即可,例如我參照3188添加3288相關編譯:
先修改定義:
CONFIG_PLATFORM_ARM_TCC8930_JB42 = n
CONFIG_PLATFORM_ARM_RK2818 = n
CONFIG_PLATFORM_ARM_RK3066 = n
CONFIG_PLATFORM_ARM_RK3188 = y
##add for test, modified by done lin
CONFIG_PLATFORM_ARM_RK3288 = y
CONFIG_PLATFORM_ARM_URBETTER = n
CONFIG_PLATFORM_ARM_TI_PANDA = n
CONFIG_PLATFORM_MIPS_JZ4760 = n
參照3188的配置部分的說明,在接下來的配置段文本內,添加,注意:CROSS_COMPILE, KSRC這兩個路徑,是絕對路徑,
###################################################################
##add for test,add by lin
ifeq ($(CONFIG_PLATFORM_ARM_RK3288), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ROCKCHIPS
# default setting for Android 4.1, 4.2, 4.3, 4.4
EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
# default setting for Power control
# default setting for Power control
##EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC//delete by lin.add for test,這個有些版本的android可能沒有此功能,我這rk3288沒有,要屏蔽,否則get_cournty_code錯誤,
##此功能是用于并發模式的,我們不需并發模式,所以這個功能可以不編譯進去,
##我的解決方案是注釋掉get_country_codec錯誤代碼,
###if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)) || defined(COMPAT_KERNEL_RELEASE)
##void *wifi_get_country_code(char *ccode)
##{
## RTW_INFO("%s\n", __FUNCTION__);
## if (!ccode)
## return NULL;
## //if (wifi_control_data && wifi_control_data->get_country_code)
## // return wifi_control_data->get_country_code(ccode);
## return NULL;
##}
###endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)) */
##
##
## EXTRA_CFLAGS += -DRTW_SUPPORT_PLATFORM_SHUTDOWN ##注釋掉這個,這個我們的電源是io控制的,不影響使用,不去掉這個反而編譯不過,
# default setting for Special function
ARCH := arm
CROSS_COMPILE := /Disk5/rk3288android8.1/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-
KSRC := /Disk5/rk3288android8.1/kernel
MODULE_NAME := wlan
endif
###################################################################
保存makefile,退出!
- 修改內核的Makefile和Kconfig,使得內核make menuconfig配置選擇可以使用內核,
gedit kernel/drivers/net/wireless/Makefile
檔案末尾,參照文本其他配置的方法,添加文本,注意目錄名字,我的wifi驅動目錄名字是rtl8723DU:
obj-$(CONFIG_RTL8723DU) += rtl8723DU/
gedit ./kernel/drivers/net/wireless/Kconfig
添加:
source "drivers/net/wireless/rtl8723DU/Kconfig"
- 之后,編譯內核,發現內核編譯正常通過,在rtl8723DU成wlan.ko檔案,
到此,內核驅動已經成功移植,
二. 移植hal層和framework層的wifi相關代碼.
-
在廠家給的資料包里面,找到:realtek_wifi_SDK_for_android_O_8.0_20181001.tar.gz,
反正就類似這個名字,里面就有很多安卓版本的資料,記得對應上,例如,我的是安卓8.1的,
解壓這個包,得到一個wlan名字的檔案夾,這個就是android 8.1 HAL層wifi原始碼,我們需要,把它放到 ANDROID_SDK/hardware/realtek目錄下面(原來有這個檔案夾,的要替換,做好備份), -
修改BoardConfig.mk檔案:
gedit ./device/rockchip/rk3288/BoardConfig.mk
添加如下代碼:
BOARD_WIFI_VENDOR := realtek
ifeq ($(BOARD_WIFI_VENDOR), realtek)
WPA_SUPPLICANT_VERSION := VER_0_8_X
BOARD_WPA_SUPPLICANT_DRIVER := NL80211
BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_rtl
BOARD_HOSTAPD_DRIVER := NL80211
BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_rtl
BOARD_WLAN_DEVICE := realtek
endif
- 修改init.rk3288.rc檔案:
gedit ./device/rockchip/rk3288/init.rk3288.rc
在on boot添加下面的代碼,目的是讓android卡機時候可以加載模塊:
exec u:r:vendor_modprobe:s0 root root -- /vendor/bin/toybox_vendor insmod /vendor/modules/wlan.ko ifname=wlan0
同時,在service的地方,添加一個新的service:
service wpa_supplicant /system/vendor/bin/hw/wpa_supplicant \
-iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \
-O/data/misc/wifi/sockets \
-e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0
socket wpa_wlan0 dgram 660 wifi wifi
class main
disabled
oneshot
- 修改device.mk檔案:
gedit ./device/rockchip/rk3288/device.mk
添加:
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.wifi.xml:system/etc/permissions/android.hardware.wifi.xml
-
在同一個device.mk檔案中添加: wifi.interface
Set wifi.interface -
確保Toybox_vendor編譯進系統里,因為busybox用到是gpl協議,所以android改用toybox, BSD協議(有些系統上面可能已經做了,不必要修改)
#ifeq ($(PRODUCT_FULL_TREBLE),true)
############################################
# static version to be installed in /vendor
#
….
LOCAL_MODULE := toybox_vendor
….
include $(BUILD_EXECUTABLE)
#endif
- 修改支持 wifi_hal(有些系統上面可能已經做了,不必要修改)
gedit $ANDROID_SDK/frameworks/opt/net/wifi/libwifi_hal/Android.mk
# Pick a vendor provided HAL implementation library.
# ============================================================
LIB_WIFI_HAL := libwifi-hal-fallback
….
else ifeq ($(BOARD_WLAN_DEVICE), realtek)
# support RTK WIFI HAL
LIB_WIFI_HAL := libwifi-hal-rtk
endif
….
8. 修改manifest.xml, 添加wifi支持,添加supplicant支持(有些系統上面可能已經做了,不必要修改):
gedit ./device/rockchip/rk3288/manifest.xml
<hal format="hidl">
<name>android.hardware.wifi</name>
<transport>hwbinder</transport>
<version>1.0</version>
<interface>
<name>IWifi</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl">
<name>android.hardware.wifi.supplicant</name>
<transport>hwbinder</transport>
<version>1.0</version>
<interface>
<name>ISupplicant</name>
<instance>default</instance>
</interface>
</hal>
- wpa_supplicant組態檔的修改(./external/wpa_supplicant_8/wpa_supplicant/wpa_supplicant.conf):
如果你的wifi驅動版本大于等于 v5.9, 要修改檔案wpa_supplicant.conf:
#Add this parameter
p2p_disabled=1
#Add this parameter
p2p_no_group_iface=1
- 配置系統資源,修改 frameworks/base/core/res/res/values/config.xml,添加如下(下面幾個配置,都是在這個檔案修改,但其實一般都是配置好的):
<string-array translatable="false" name="networkAttributes">
<item>"wifi,1,1,1,-1,true"</item>
<item>"mobile,0,0,0,-1,true"</item>
<item>"mobile_mms,2,0,2,60000,true"</item>
<item>"mobile_supl,3,0,2,60000,true"</item>
<item>"mobile_dun,4,0,2,60000,true"</item>
<item>"mobile_hipri,5,0,3,60000,true"</item>
<item>"mobile_fota,10,0,2,60000,true"</item>
<item>"mobile_ims,11,0,2,60000,true"</item>
<item>"mobile_cbs,12,0,2,60000,true"</item>
<item>"wifi_p2p,13,1,0,-1,true"</item>
<item>"mobile_ia,14,0,2,-1,true"</item>
<item>"mobile_emergency,15,0,2,-1,true"</item>
</string-array>
配置 networkAttributes
To define the system’s available network interfaces, make sure the wifi interface
items is defined in the networkAttributes resource configuration in the config.xml.
For example:
l radioAttributes
To define the system’s available network interfaces, we need to define interface
items for wifi in the radioAttributes resource configuration. For example:
<string-array translatable="false" name="radioAttributes">
<item>"1,1"</item>
<item>"7,1"</item>
<item>"9,1"</item>
....
l config_tether_wifi_regexs
The interfaces set here are tetherable Wi-Fi interfaces which will be used as
interfaces for Wi-Fi LAN port. We use ‘wlan0’ by default when our Wi-Fi is set as
softap mode. So it needs to set ‘wlan0’ here. For example:
<string-array translatable="false" name="config_tether_wifi_regexs">
<item>"wlan0"</item>
</string-array>
l 配置 config_tether_upstream_types
The connection types set here are used as the interfaces for WAN port to connect
to internet. For example, adding Wi-Fi and Ethernet:
<integer-array translatable="false" name="config_tether_upstream_types">
<item>1</item>
<item>9</item>
</integer-array>
l 配置 config_enableWifiDisplay
To enable Wi-Fi Display(Miracast) function, set config_enableWifiDisplay
<bool name="config_enableWifiDisplay">true</bool>
注意,最后面3個步驟的xml配置,其實一般android 8.1已經做好了,我們不需要做,,
- 按照流程走完了,可是還是發現不了wifi,提示出錯? 一毛一樣啊??
為毛?
原來rk自己修改了編譯腳本,
https://blog.csdn.net/kris_fei/article/details/73647370
我們要跟著修改:
ifneq ($(strip $(TARGET_BOARD_PLATFORM)), sofia3gr)
BOARD_CONNECTIVITY_VENDOR := realtek
BOARD_CONNECTIVITY_MODULE := ap6xxx
endif
BOARD_WIFI_VENDOR := realtek
ifeq ($(strip $(BOARD_CONNECTIVITY_VENDOR)), realtek)
BOARD_WPA_SUPPLICANT_DRIVER := NL80211
WPA_SUPPLICANT_VERSION := VER_0_8_X
BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_rtl
BOARD_HOSTAPD_DRIVER := NL80211
BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_rtl
BOARD_WLAN_DEVICE := realtek
endif
- 編譯整個rk3288安卓系統,就可看到wifi打開了!哦,不,我這里還需要開機的時候,打開wifi電源,設定gpio225輸出1!
其實rtl官方提供了整一個開放資料包,里面有原始碼,工具,移植檔案,支持從4.4—9.0版本的wifi移植,這個可以到我的下載區域去下載,記得doneli
https://download.csdn.net/download/mynameislinduan/12837245
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/25571.html
標籤:其他
