Android系統如何移植wpa_supplicant及wifi驅動
一、WPA_SUPPLICANT簡介
1. 什麼是wpa_supplicant
wpa_supplicant is a WPA Supplicant for Linux, BSD, Mac OS X, and Windows with support for WPA and WPA2 (IEEE 802.11i / RSN). It is suitable for both desktop/laptop computers and embedded systems. Supplicant is the IEEE 802.1X/WPA component that is used in the client stations. It implements key negotiation with a WPA Authenticator and it controls the roaming and IEEE 802.11 authentication/association of the wlan driver.
wpa_supplicant is designed to be a "daemon" program that runs in the background and acts as the backend component controlling the wireless connection. wpa_supplicant supports separate frontend programs and a text-based frontend (wpa_cli) and a GUI (wpa_gui) are included with wpa_supplicant.
wpa_supplicant uses a flexible build configuration that can be used to select which features are included. This allows minimal code size (from ca. 50 kB binary for WPA/WPA2-Personal and 130 kB binary for WPA/WPA2-Enterprise without debugging code to 450 kB with most features and full debugging support; these example sizes are from a build for x86 target).
2. 支援的WPA/IEEE 802.11i feature
WPA-PSK ("WPA-Personal")WPA with EAP (e.g., with RADIUS authentication server) ("WPA-Enterprise")key management for CCMP, TKIP, WEP104, WEP40WPA and full IEEE 802.11i/RSN/WPA2RSN: PMKSA caching, pre-authenticationIEEE 802.11rIEEE 802.11wWi-Fi Protected Setup (WPS) 3. 支援的無線無線網絡卡和驅動4. WPA如何和AP建立聯絡
wpa_supplicant requests the kernel driver to scan neighboring BSSeswpa_supplicant selects a BSS based on its configurationwpa_supplicant requests the kernel driver to associate with the chosen BSSif WPA-EAP: integrated IEEE 802.1X Supplicant completes EAP authentication with the authentication server (proxied by the Authenticator in the AP)If WPA-EAP: master key is received from the IEEE 802.1X SupplicantIf WPA-PSK: wpa_supplicant uses PSK as the master session keywpa_supplicant completes WPA 4-Way Handshake and Group Key Handshake with the Authenticator (AP). WPA2 has integrated the initial Group Key Handshake into the 4-Way Handshake.wpa_supplicant configures encryption keys for unicast and broadcastnormal data packets can be transmitted and received二、移植wpa_supplicant和wifi驅動的步驟
1. 將廠商提供的HAL程式碼複製到hardware目錄下,並修改Makefile
例如:realteck、broadcom、ti、qcomm等。
2. 修改ANDROID_SDK /device/<soc_vendor_name>/<board_name>/目錄下的BoardConfig.mk
例如:
BOARD_WIFI_VENDOR := realtek
ifeq ($(BOARD_WIFI_VENDOR), realtek)
WPA_SUPPLICANT_VERSION := VER_0_8_X
BOARD_WPA_SUPPLICANT_DRIVER := NL80211
CONFIG_DRIVER_WEXT :=y
BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_rtl
BOARD_HOSTAPD_DRIVER := NL80211
BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_rtl
BOARD_WLAN_DEVICE := rtl8192cu
#BOARD_WLAN_DEVICE := rtl8192du
#BOARD_WLAN_DEVICE := rtl8192ce
#BOARD_WLAN_DEVICE := rtl8192de
#BOARD_WLAN_DEVICE := rtl8723as
#BOARD_WLAN_DEVICE := rtl8723au
#BOARD_WLAN_DEVICE := rtl8189es
#BOARD_WLAN_DEVICE := rtl8723bs
#BOARD_WLAN_DEVICE := rtl8723bu
WIFI_DRIVER_MODULE_NAME := "wlan"
WIFI_DRIVER_MODULE_PATH := "/system/lib/modules/wlan.ko"
WIFI_DRIVER_MODULE_ARG := "ifname=wlan0 if2name=p2p0"
endif
3. 修改ANDROID_SDK/device/<soc_vendor_name>/<board_name>/目錄下的init.xxx.rc
例如:
service rtw_suppl_con /system/bin/wpa_supplicant \
-ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf \
-e/data/misc/wifi/entropy.bin -N \
-iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \
-O/data/misc/wifi/sockets \
[email protected]:wpa_wlan0
class main
socket wpa_wlan0 dgram 660 wifi wifi
disabled
oneshot
service rtw_suppl /system/bin/wpa_supplicant \
-iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \
-O/data/misc/wifi/sockets \
-e/data/misc/wifi/entropy.bin
[email protected]:wpa_wlan0
class main
socket wpa_wlan0 dgram 660 wifi wifi
disabled
service dhcpcd_wlan0 /system/bin/dhcpcd -aABDKL
class main
disabled
oneshot
service dhcpcd_p2p /system/bin/dhcpcd -aABKL
class main
disabled
oneshot
service iprenew_wlan0 /system/bin/dhcpcd -n
class main
disabled
oneshot
service iprenew_p2p /system/bin/dhcpcd -n
class main
disabled
oneshot
4. 修改ANDROID_SDK/device/<soc_vendor_name>/<board_name>/目錄下的device.mk
例如:
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.wifi.xml:system/etc/permissions/android.hardware.
wifi.xml
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.wifi.direct.xml:system/etc/permissions/android.hard
ware.wifi.direct.xml
PRODUCT_PROPERTY_OVERRIDES += \
wifi.interface=wlan0
5. 修改ANDROID_SDK/frameworks/base/core/res/res/values/config.xml,配置wifi網路屬性
<string-array translatable="false" name="networkAttributes">
<item>"wifi,1,1,1,-1,true"</item>
<item>"bluetooth,7,7,0,-1,true"</item>
<item>"ethernet,9,9,2,-1,true"</item>
</string-array>
<string-array translatable="false" name="radioAttributes">
<item>"1,1"</item>
<item>"7,1"</item>
<item>"9,1"</item>
</string-array>
<string-array translatable="false" name="config_tether_wifi_regexs">
<item>"wlan0"</item>
</string-array>
<integer-array translatable="false" name="config_tether_upstream_types">
<item>1</item>
<item>9</item>
</integer-array>
6. 將廠商提供的WPA_SUPPLICANT替換到ANDROID_SDK/external/wpa_suppliant_8目錄下
7. 編譯wifi驅動,將驅動配置成模組載入的方式,將生成的ko檔案存放到BoardConfig.mk裡面設定的ko檔案路徑下,並確認驅動模組名稱一致
三、常用除錯命令和技巧
1. 除錯命令
通過wpa_cli命令可以檢測wpa_supplicant的執行狀態
- PING:心跳檢測命令。客戶端用它判斷WPAS是否工作正常。WPAS收到”PING”命令後需要回復“PONG”。
- MIB:客戶端用該命令獲取裝置的MIB資訊。
- STATUS:客戶端用該命令來獲取WPAS的工作狀態。
- ADD_NETWORK:為WPAS新增一個新的無線網路。它將返回此新無線網路的id(從0開始)。注意:此network id非常重要,客戶端後續將通過它來指明自己想操作的無線網路。
- SET_NETWORK <network id> <variable> <value>:network id是無線網路的id。此命令用於設定指定無線網路的資訊。其中variable為引數名,value為引數的值。
- ENABLE_NETWORK <network id>:使能某個無線網路。此命令最終將促使WPAS發起一系列操作以加入該無線網路。
2. 除錯技巧
可以在wpa_supplicant裡面增加一些log來跟蹤指令的下發流程。
通過在命令列終端輸入getprop init.svc.wpa_servername 來檢查wpa_supplicant程序是否在執行。
wpa_supplicant起來後,可以通過檢視wpa_cli ping或者wpa_cli status來檢測wpa_suppliant通道是否正常。
檢查/system/etc/wifi/wpa_supplicant.conf和/data/misc/wifi/wpa_supplicant.conf中ctrl_interface是否正確。
檢查/dev/socket/wpa_wlan0、/data/misc/wifi/sockets/wlan0、/data/misc/wifi/sockets/p2p、wpa_ctrl_*等節點是否成功建立。
通過lsmod檢查驅動模組是否成功載入。
通過檢視/sys/class/rfkill/目錄下是否生成rfkill*節點判斷驅動載入過程是否OK。
相關推薦
Android系統如何移植wpa_supplicant及wifi驅動
一、WPA_SUPPLICANT簡介 1. 什麼是wpa_supplicant wpa_supplicant is a WPA Supplicant for Linux, BSD, Mac OS X, and Windows with support for WPA a
Android系統移植:驅動篇
音視頻 理念 rom 利用 定時 垃圾回收 ipc track 進程間 【導語】在Android系統移植中,有很重要的一個部分工作,就是為新平臺上的硬件設備移植驅動程序。因為Android系統是基於Linux kernel內核構建,所以這裏說的移植驅動程序,其實就是
Android系統(114)---Android 系統移植驅動篇
【導語】在Android系統移植中,有很重要的一個部分工作,就是為新平臺上的硬體裝置移植驅動程式。因為Android系統是基於Linux kernel核心構建,所以這裡說的移植驅動程式,其實就是基於Android系統平臺開發適應移動裝置的Linux核心驅動程式。一. Android系統中Linux核心與裝置驅
android系統移植之按鍵驅動篇
平臺:MX53_QSB開發板 MX53_QSB開發板上一起有四個按鍵,分別為RESET,POWER,USER1,USER2。其中RESET為純硬體復位按鍵,無須軟體控制。POWER,USER1,USER2三個按鍵均需要程式控制。預設BSP包中將三個按鈕全設定為上升和下降沿
Android系統架構圖及各層介紹
Android的系統架構採用了分層架構的思想,如圖1所示。從上層到底層共包括四層,分別是應用程式程式層、應用框架層、系統庫和Android執行時和Linux核心。 圖1:Android系統架構圖 每層功能簡要介紹如下: 一 應用程式層
Android系統分割槽理解及分割槽目錄細解【轉】
本文轉載自:https://blog.csdn.net/u010001503/article/details/51853822 Android 通常有以下分割槽: System分割槽: 就是我們刷ROM的分割槽 Data分割槽: 分割槽就是我們裝APK的分割槽 Catch分割槽
Android系統架構特點及優劣分析
Android 架構分析 首先要注意到,Android系統有著極短的開發時間,因此Android在架構上有著四處借鑑的特點。 Android分為四個層,從低到高分別是linux核心層、系統執行庫層、應用程式框架層和應用程式層。在最底層,Android使用了L
Android系統移植與平臺開發(五)- 編譯Android原始碼
2.3編譯Android原始碼 Android原始碼體積非常龐大,由Dalvik虛擬機器、Linux核心、編譯系統、框架程式碼、Android定製C庫、測試套件、系統應用程式等部分組成,在編譯Android原始碼之前,必須要先掌握Android原始碼的組成。 2.3.1An
Android系統移植與平臺開發(八)- HAL Stub框架分析
HAL stub的框架比較簡單,三個結構體、兩個常量、一個函式,簡稱321架構,它的定義在:@hardware/libhardware/include/hardware/hardware.h@hardware/libhardware/hardware.c/* 每一個硬體都通
Android系統移植與除錯之-------)如何修改Android系統預設顯示
1、首先解決【設定】介面預設顯示【開發者選項】的問題 檢視原始碼:packages/apps/Settings/src/com/android/settings/SettingsActivity.java 在updateTilesList(List target)方法中,可以找到【開發
Android系統移植與平臺開發(七)- 初識HAL
1. HAL的module與stubHAL(Hardware AbstractLayer)硬體抽象層是Google開發的Android系統裡上層應用對底層硬體操作遮蔽一個軟體層次,說白了,就是上層的應用不用關心底層硬體具體如何工作的,只要向上層提供一個統一的介面即可
Android系統移植與除錯之------->Amlogic方案編譯步驟
這個命令是用來將envsetup.sh裡的所有用到的命令載入到環境變數裡去,我們來分析下它。 envsetup.sh裡的主要命令如下: function help() # 顯示幫助資訊 function get_abs_build_var()# 獲取絕對變數 function get_build_var()
Android系統移植與平臺開發(九)- JNI介紹
JNI是在學習Android HAL時必須要面臨一個知識點,如果你不瞭解它的機制,不瞭解它的使用方式,你會被原生代碼繞的暈頭轉向,JNI作為一箇中間語言的翻譯官在執行Java程式碼的Android中有著重要的意義,這兒的內容比較多,也是最基本的,如果想徹底瞭解JNI的機制,請
Android系統分割槽理解及分割槽目錄細解
Android 通常有以下分割槽: System分割槽: 就是我們刷ROM的分割槽 Data分割槽: 分割槽就是我們裝APK的分割槽 Catch分割槽:是快取分割槽 SDCard分割槽:就是掛載的SD卡。 我們可以在adb中使用df 來檢視分割槽情況。 1、跨分割槽不能用 MV命令來拷
Android系統移植(一)-讓android系統在目標平臺上執行起來【轉】
Android系統由於用的是linux核心,因此核心移植和嵌入式linux核心移植差異不大,過程如下: (1)移植boot-loader和linux2.6核心到目標平臺上,讓linux核心可以啟動起來,基本的驅動允許正常。此過程完全是嵌入式linux的開發,這裡直接跳過。
Android系統移植總結
學習Android系統移植已經一年有餘,至今也未能學得精髓,android的博大精深大家皆知,前面的路還很漫長,還等著我們繼續前行。根據前期所學以及參與專案實戰獲取到的經驗,把自己所掌握的,所理解的記錄成文,一來算是對所學知識的一個總結,二來給剛開始研究Android系統移
Android系統--事件讀取及分發
1. 簡介 WindowManagerService分發事件是通過它的InputManager來完成的。 在初始化時,各部分狀態如下: • InputManager.InputReader:正在睡眠等待事件的發生 • Inpu
android系統移植emmc記錄(總)
[ 2.439190] mmcblk0: p1 p2 p3 p4 [ 2.479149] VFS: Cannot open root device "mmcblk0p2" or unknown-block(179,2) [ 2.484751] Please append a correc
Android系統移植之arm移植步驟
Android Porting Steps for ARMhe following are the porting steps.0. Setting Compiler- Environment variables for ARM compiler- export ARCH=a
Android 藍芽通訊及WiFi開發
在我們正常的Android藍芽功能開發步驟中,一般要經過系統許可權和藍芽開關狀態監測、裝置掃描、裝置連線、藍芽資料通訊這幾個過程。 在Android 4.3系統之後,我們可以使用藍芽4.0(低功耗藍芽),它最主要的特點是低功耗,普及率高。現在所說的藍芽裝置,大