一般我們拿到的android源代碼中wifi應用層部分是好的, 主要是wifi芯片的驅動要移植並添加進去.
wifi驅動的移植, 以realtek的8188etv為例
到官網下載相應的驅動, 解壓后可以看到其中有很多的文檔, 應用工具和不同android版本的驅動源代碼.
根據自己的android版本選擇對應的驅動, 我的是4.0的用的是android_reference_codes_ICS_nl80211目錄下的驅動
這個目錄下還有一個文檔, 跟移植相關的, 一定要好好看啦, 很重要的
進入驅動源代碼的根目錄, 打開Makefile文件, 修改並添加一下代碼
- CONFIG_PLATFORM_I386_PC = n #修改的
- CONFIG_PLATFORM_ARM_S5PV210 = y #添加的
復制代碼
- ifeq ($(CONFIG_PLATFORM_ARM_S5PV210), y)
- EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN #-DCONFIG_MINIMAL_MEMORY_USAGE
- EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 #這個很重要的, 不添加的話android下的wpa_supplicant_8不能與驅動正常溝通啦, 也可以在autoconf_rtl8188e_usb_linux.h中修改, 我的是usb接口的wifi模塊, sdio接口的是autoconf_rtl8189e_sdio_linux.h
- ARCH ?= arm
- CROSS_COMPILE ?= /opt/s210x/arm-2009q3/bin/arm-none-linux-gnueabi- #交叉編譯工具
- KVER:= 3.0.8 #內核版本
- KSRC ?= /opt/x210_ics_rtm_v12/kernel/ #內核根目錄
- MODULE_NAME := wlan #模塊名
- endif
復制代碼
現在就可以make啦
wifi應用層的移植, xxx為你的硬件平台
將make得到的wlan.ko靠到android源代碼根目錄下的vendor/xxx/lib/modules 目錄下.
看看android源代碼根目錄下的device/samsung/xxx目錄和其子目錄下有沒有wlan.ko, 有的話就刪除它, 並在相應的device.mk文件中刪除相應的語句. (其實把移植的wlan.ko放在這里也行的啦)
下面的移植只關心c/c++代碼和配置文件部分, 和java相關的不改
external目錄下的wpa_supplicant_8是與驅動溝通的工具, android就是通過它來與wifi通信的, 我們只移植與wifi驅動包中不同的文件到這個目錄下,
可以使用Meld(linux下的gui化文件比較工具)比較兩個目錄. hardware 和 system目錄的移植方法也一樣.
device/samsung/xxx目錄是平台相關的目錄, 這里主要修改BoardConfig.mk device.mk 和 init.xxx.rc(根據device中的PRODUCT_COPY_FILES 確定) 三個配置文件
在device.mk中的PRODUCT_COPY_FILES條目中添加一下代碼
frameworks/base/data/etc/android.hardware.wifi.xml:system/etc/permissions/android.hardware.wifi.xml \
frameworks/base/data/etc/android.hardware.wifi.direct.xml:system/etc/permissions/android.hardware.wifi.direct.xml
PRODUCT_PROPERTY_OVERRIDES := \
wifi.interface=wlan0
在BoardConfig.mk中添加一下代碼
- #Add for wifi
- BOARD_WIFI_VENDOR := realtek
- ifeq ($(BOARD_WIFI_VENDOR), ti)
- WPA_SUPPLICANT_VERSION := VER_0_8_X
- #BOARD_WPA_SUPPLICANT_DRIVER := WEXT #
- BOARD_WPA_SUPPLICANT_DRIVER := NL80211 #wifi驅動使用的是NL80211, 這里當然就是NL80211而不是WEXT
- BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_rtl
- BOARD_HOSTAPD_DRIVER := NL80211 <span style="font-family: Arial, Helvetica, sans-serif;">#wifi驅動使用的是NL80211, 這里當然就是NL80211而不是WEXT</span>
-
- 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 := rtl8188es
-
- WIFI_DRIVER_MODULE_NAME := wlan
- WIFI_DRIVER_MODULE_PATH := "/system/lib/modules/wlan.ko"
-
- WIFI_DRIVER_MODULE_ARG := ""
- WIFI_FIRMWARE_LOADER := ""
- WIFI_DRIVER_FW_PATH_STA := ""
- WIFI_DRIVER_FW_PATH_AP := ""
- WIFI_DRIVER_FW_PATH_P2P := ""
- WIFI_DRIVER_FW_PATH_PARAM := ""
- endif
復制代碼
在init.xxx.rc中添加一下代碼
- on post-fs-data
- # we will remap this as /mnt/sdcard with the sdcard fuse tool
- mkdir /data/media 0775 media_rw media_rw
- chown media_rw media_rw /data/media
- setprop vold.post_fs_data_done 1
- mkdir /data/misc/dhcp 0770 dhcp dhcp
- chown dhcp dhcp /data/misc/dhcp
- mkdir /data/misc/wifi/sockets 0770 wifi wifi
-
- service wpa_supplicant /system/bin/wpa_supplicant -Dnl80211 -iwlan0 -c/system/etc/wifi/wpa_supplicant.conf #wifi驅動中是nl80211,這里也一樣是nl80211
- socket wpa_wlan0 dgram 660 wifi wifi # android private socket
- group wifi inet
- disabled
- oneshot
-
- service dhcpcd_wlan0 /system/bin/dhcpcd -d -f /system/etc/dhcpcd/dhcpcd.conf wlan0
- group system dhcp
- disabled
- oneshot
-
- service dhcpcd /system/bin/dhcpcd -d -f /system/etc/dhcpcd/dhcpcd.conf wlan0
- group system dhcp
- disabled
- oneshot
復制代碼