wifi无线网卡移植到andorid
不久前移植過ranlink公司的wifi無線網卡,發現網上的一些文檔不完整或者對一些碰到的問題沒有說明,在此詳細說明一,本人將其移植到android系統上碰到了不少的問題,修改了驅動及框架代碼,費了兩周多的時間才完全搞好。
一. ? Android平臺Wifi的基本代碼路徑
1.???????Wpa_supplicant源碼部分
external/wpa_supplicant_6/
生成庫libwpa_client.so和守護進程wpa_supplicant
2.???????Wifi的HAL層代碼
位于hardware/libhardware_legary/wifi/
3.???????Wifi的JNI部分
位于frameworks/base/core/jni/android_net_wifi_Wifi.cpp
4.???????JAVA部分
位于frameworks/base/services/java/com/android/server/
????????frameworks/base/wifi/java/android/net/wifi/
5.???????wifi設置部分
位于packages/apps/Settings/src/com/android/settings/wifi/
二. ?linux內核配置
在原有android內核支持情況下,增加wifi內核配置,具體配置如下:
1.???????Networkingsupport? --->Wireless下增加802.11 協議棧的支持
2.???????USB 支持WIFI的配置
USB 支持WIFI 的配置選項位于Device Drivers>USB support 配置菜單下USB Wireless
Device Management support。
3.???????用戶空間的mdev 和firmware 支持配置
進入DeviceDriver > Generic Driver Options 配置菜單,按照下圖所示配置用戶空間
的mdev 和firmware支持。
4.???????WIFI 設備支持配置
DeviceDrivers? ---> Network devicesupport? ---> Wireless LAN? ---> Ralink driver support--->Ralinkrt2800 (USB) support (EXPERIMENTAL) --->rt2800usb - Include support forrt30xx (USB) devices
以及Wireless LAN 目錄里IEEE 802.11 for Host AP (Prism2/2.5/3 andWEP/TKIP/CCMP)都選擇上,目的是打開CONFIG_WIRELESS_EXT=y?CONFIG_WEXT_PRIV=y
三. 驅動配置與編譯
1.???????修改驅動SDK包中的配置文件
1.1???修改env.mk,將RT28xx_DIR 設為當前目錄,RT28xx_DIR = $(shell pwd)。
1.2???修改makefile中對應的kernel與交叉編譯器路徑
1.3???修改os/linux目錄下config.mk中gcc 與 ld變量
1.4???打開os/linux目錄下config.mk中HAS_WPA_SUPPLICANT與HAS_NATIVE_WPA_SUPPLICANT_SUPPORT宏
2.???????修改驅動SDK包中的驅動源碼
2.1???將rt_linux.h中的RTUSB_URB_ALLOC_BUFFER與RTUSB_URB_FREE_BUFFER宏修改,定義如下
#define RTUSB_URB_ALLOC_BUFFER(pUsb_Dev,BufSize, pDma_addr)???? usb_alloc_coherent(pUsb_Dev,BufSize, GFP_ATOMIC, pDma_addr)
#defineRTUSB_URB_FREE_BUFFER(pUsb_Dev, BufSize, pTransferBuf, Dma_addr)?????? usb_free_coherent(pUsb_Dev, BufSize,pTransferBuf, Dma_addr)
2.2???修改rt_main_dev.c,直接將MainVirtualIF_close函數放空,return? 0,解決不能反復關閉wifi問題。
2.3???修改rt_linux.c里RtmpOSNetDevAttach函數里增加devname賦值。strcpy( pNetDev->name, "mlan0");注:(此處所用的名字要與上層使用的節點名保持一致,在此說明一下上層主要有這幾處用到節點名:
1,\frameworks\base\wifi\java\android\net\wifiWifiStateTracker.java
2,init.rc啟動wpa_supplicant守護進程里面與啟動dhcpcd服務
3,dhcpcd服務配置文件,dhcpcd.conf里面
4,init.rc設置setprop wifi.interface "mlan0")
3.???????編譯方法
Source env.mk;make;即可,驅動是在的路徑為os/linux下的rt3070sta.ko。
此處所用的驅動名字應與HAL層wifi.c所指定驅動名保持一致
四. Wap_supplicant相關配置
3.1???Wpa_supplicant.conf配置文件的修改
ctrl_interface=DIR=/data/system/wpa_supplicantGROUP=wifi #這個路徑在wifi.c中用到
3.2???整個環境必須要讓wext類型相關代碼進行編譯。也就是要打開wext相關的宏CONFIG_DRIVER_WEXT。??即在device/hisi/Hi3716C/BoardConfig.mk中添加:
????? BOARD_HAVE_WIFI := true
????? BOARD_WPA_SUPPLICANT_DRIVER := WEXT
該配置的作用是使external/wpa_supplicant/Android.mk設置WPA_BUILD_SUPPLICANT為true。
3.3???在init.rc里面增加啟動wpa_supplicant守護進程及dhcpcd進程
3.4???在init.rc里面增加wifi相關文件的權限設定,設置如下:
chmod 0771 /system/etc/wifi
????? chmod 0660/system/etc/wifi/wpa_supplicant.conf
????? chown wifiwifi /system/etc/wifi/wpa_supplicant.conf #wifi的原始配置文件
?????
????? #wpa_supplicantsocket
????? mkdir/data/system/wpa_supplicant 0770 wifi wifi
????? chmod 0771/data/system/wpa_supplicant? #放置wifiinterface的地方
????? mkdir/data/misc/wifi 0770 wifi wifi
???
????? chmod 0771/data/misc/wifi
chmod 0660 /data/misc/wifi/wpa_supplicant.conf? #wifi的配置文件,將由wpa_supplicant根據實際配置寫入該文件
????? chown wifiwifi /data/misc/wifi
????? chown wifiwifi /data/misc/wifi/wpa_supplicant.conf
????? mkdir/data/misc/wifi/sockets 0770 wifi wifi? #與上層通過socket通信的路徑
?????
????? cp/system/etc/wifi/wpa_supplicant.conf /data/misc/wifi/
?????
????? mkdir/data/misc/dhcp 0777 dhcp dhcp
????? chown dhcpdhcp /data/misc/dhcp
?????
????? # Preparefor wifi
??? setpropwifi.interface "mlan0"
??? ????? setprop wlan.driver.status "ok"
3.5???啟動wpa_supplicant守護進程與dhcpcd服務
在init.rc里面添加wpa_supplicant啟動:
service wpa_supplicant/system/bin/logwrapper /system/bin/wpa_supplicant \
???-Dwext -imlan0 -c/data/misc/wifi/wpa_supplicant.conf -dd
????? ?????? user root
????? ?????? group system wifi inet
????? ?????? socket wpa_mlan0 dgram 660 wifi wifi
????? ?????? disable
?????? ?????? ?????? oneshot
?????? 在init.rc里面添加dhcpcd啟動:
service dhcpcd /system/bin/logwrapper/system/bin/dhcpcd -d -B wlan0
???????? disabled
???????? oneshot
3.6???在init.godbox.rc里增加dns設置
Setprop net.dns1 192.168.10.247
Setprop net.dns2 192.168.10.248
?
五. wifi移植所需在android系統添加的一些文件
4.1???添加wifi的wpa_supplicant.conf配置文件
放置目錄與hardware/libhardware_legacy/wifi/wifi.c中的目錄保持一致
4.2???添加驅動的配置文件
在system/etc/Wireless/RT2870STA目錄放置配置文件RT2870STA.dat,與rt_linux.h中配置文件的路徑保持一致。
4.3???添加dhcpcd啟動配置文件
設置/system/etc/dhcpcd/dhcpcd.conf的配置為:
????? interface mlan0
????? option subnet_mask, routers,domain_name_servers?
七. 其它平臺移植記錄
6.1????內核
內核的修改如上述第二大點內核配置
6.2????Wpa_supplicant
將wpa_supplicant_6編譯打開
Wpa_supplicant 主要是在device/hisi/Hi3716C/BoardConfig.mk中添加:
????? BOARD_HAVE_WIFI := true
????? BOARD_WPA_SUPPLICANT_DRIVER := WEXT
???????? 以及在wpa_supplicant_6 里面的.config增加ANDROID=y
總結
以上是生活随笔為你收集整理的wifi无线网卡移植到andorid的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android编译产生的apk或so不安
- 下一篇: android init.rc语法标准