編輯:Android開發實例
開發板是三星 S5PV210,Android 2.2
需要到 Realtek 官網下載最新的驅動 v3.1.2590。最開始用v3.0 的驅動,這個是Realtek工程師直接提供的,遇到2個問題:(1)加載驅動模塊(insmod)時,報內核虛擬內存分配失敗,要求增加虛擬內存。開發板物理內存為1G,啟動內核時加vmalloc=512M後,該問題消失,驅動模塊能夠成功加載,但出現新的問題:(2)在掃描AP時,Android界面顯示“不能掃描”,驅動程序打印log顯示下載firmware失敗,查看驅動程序源碼發現,8192cu的驅動中包含了firmware二進制,運行時通過查表來取得firmware,但輪詢超時,導致模塊初始化失敗
Realtek的驅動程序源碼包中包含了Android參考實現,只需對路徑等配置性的部分根據開發板實際情況進行修改即可
測試表明,v3.1驅動同樣存在insmod時虛擬內存分配失敗的問題,需要在內核啟動參數中增加vmalloc參數。對S5PV210開發板來說,修改u-boot的內核啟動參數
路徑:include/configs/smdkv210single.h
修改:
#define CONFIG_BOOTARGS "root=/dev/mtdblock4 rootfstype=yaffs2 init=/init console=ttySAC0,115200 vmalloc=512M"
解壓縮驅動程序源碼包,需要修改Makefile文件。首先增加Android平台
...
CONFIG_PLATFORM_I386_PC = n
CONFIG_PLATFORM_ANDROID_X86 = n
CONFIG_PLATFORM_ANDROID = y
CONFIG_PLATFORM_ARM_S3C2K4 = n
CONFIG_PLATFORM_ARM_PXA2XX = n
...
然後增加Android平台的配置
ifeq ($(CONFIG_PLATFORM_ANDROID), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
ARCH := arm
CROSS_COMPILE := /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
KVER := 2.6.32.9
KSRC ?= /home/toor/v21/kernel
MODULE_NAME := wlan
endif
其中交叉編譯工具、內核版本和源碼路徑,要與實際匹配
模塊名稱默認為8192cu,這裡將其修改為wlan,與後面Android wifi中的模塊名相匹配
執行
make
在當前目錄下生成 wlan.ko
路徑為:vendor/sec/utv210/AndroidBoard.mk
將 wlan.ko 文件拷貝到vendor/sec/utv210/lib/module/ 下。AndroidBoard.mk中增加下面一行,這樣在build Android時會將wlan.ko放到 /modules/ 目錄下
PRODUCT_COPY_FILES += \
vendor/sec/sec_proprietary/smdkc110/conf/egl.cfg:system/lib/egl/egl.cfg \
vendor/sec/$(TARGET_DEVICE)/lib/module/pvrsrvkm.ko:root/modules/pvrsrvkm.ko \
vendor/sec/$(TARGET_DEVICE)/lib/module/s3c_lcd.ko:root/modules/s3c_lcd.ko \
vendor/sec/$(TARGET_DEVICE)/lib/module/s3c_bc.ko:root/modules/s3c_bc.ko \
vendor/sec/$(TARGET_DEVICE)/lib/module/wlan.ko:root/modules/wlan.ko \
vendor/sec/$(TARGET_DEVICE)/lib/libEGL_POWERVR_SGX540_120.so:system/lib/egl/libEGL_POWERVR_SGX540_120.so \
vendor/sec/$(TARGET_DEVICE)/lib/libGLESv1_CM_POWERVR_SGX540_120.so:system/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so \
...
路徑為:vendor/sec/utv210/BoardConfig.mk
在末尾增加下面一行,這是編譯Realtek驅動必須的
BOARD_USES_REALTEK_WIFI := true
路徑為:vendor/sec/utv210/conf/init.rc
啟動wpa_supplicant 服務
service wpa_supplicant /system/bin/wpa_supplicant -Dwext -iwlan0 -c/data/misc/wifi/wpa_supplicant.conf
group wifi inet
disabled
oneshot
啟動dhcpd服務
service dhcpcd /system/bin/dhcpcd -ABKL
group system dhcp
disabled
oneshot
確認wifi相關文件系統結構和權限正確
# create basic filesystem structure
mkdir /data/misc 01771 system misc
mkdir /data/misc/bluetoothd 0770 bluetooth bluetooth
mkdir /data/misc/bluetooth 0770 system system
mkdir /data/misc/keystore 0700 keystore keystore
mkdir /data/misc/vpn 0770 system system
mkdir /data/misc/systemkeys 0700 system system
mkdir /data/misc/vpn/profiles 0770 system system
# give system access to wpa_supplicant.conf for backup and restore
mkdir /data/misc/wifi 0770 wifi wifi
chmod 0770 /data/misc/wifi
chmod 0660 /data/misc/wifi/wpa_supplicant.conf
mkdir /data/local 0771 shell shell
mkdir /data/local/tmp 0771 shell shell
mkdir /data/data 0771 system system
mkdir /data/app-private 0771 system system
mkdir /data/app 0771 system system
mkdir /data/property 0700 root root
#create wifi folders
mkdir /system/etc/wifi 0770 wifi wifi
chmod 0777 /system/etc/wifi
chmod 0666 /system/etc/wifi/wpa_supplicant.conf
chown wifi wifi /system/etc/wifi/wpa_supplicant.conf
#wpa_supplicant socket
mkdir /data/system/ 0771 system system
mkdir /data/system/wpa_supplicant 0771 wifi wifi
chmod 0771 /data/system/wpa_supplicant
#wpa_supplicant control socket for android wifi.c
mkdir /data/misc/wifi 0770 wifi wifi
mkdir /data/misc/wifi/sockets 0770 wifi wifi
chmod 0770 /data/misc/wifi
chmod 0660 /data/misc/wifi/wpa_supplicant.conf
#for dhcpd
mkdir /data/misc/dhcp 0777 dhcp dhcp
chown dhcp dhcp /data/misc/dhcp
chmod 0777 /system/etc/dhcpcd/dhcpcd.conf
chmod 0777 /system/etc/dhcpcd/dhcpcd-run-hooks
將Realtek驅動源碼包中 external\wpa_supplicant\ 下的3個文件(Android.mk、driver_wext.c、vendor.h)覆蓋到Android external/wpa_supplicant/ 下
修改vendor/sec/utv210/conf/wpa_supplicant.conf文件內容為
update_config=1
ctrl_interface=DIR=/data/misc/wifi/wpa_supplicant GROUP=wifi
ap_scan=1
將Realtek驅動源碼包中 external\dhcpcd\ 下的3個文件(Android.mk、client_realtek.c、logger_realtek.c)覆蓋到Android源碼 external/dhcpcd/ 下
修改vendor/sec/utv210/conf/dhcpcd.conf 文件內容為
interface wlan0
option subnet_mask, routers, domain_name_servers
將 Realtek Android 參考代碼 hardware\libhardware_legacy\wifi\ 下的文件(Android.mk、wifi_realtek.c)覆蓋到 Android 源碼 hardware/libhardware_legacy/wifi 下
修改 wifi_realtek.c,確認網絡接口名、模塊名、配置路徑等正確
#define WIFI_DRIVER_IFNAME "wlan%d"
#define WIFI_DRIVER_IFNAME_AP "wlap%d"
#define WIFI_DRIVER_IFNAME_DISABLE "disable%d"
#ifndef WIFI_DRIVER_MODULE_PATH
// #define WIFI_DRIVER_MODULE_PATH "/system/wifi/wlan.ko"
#define WIFI_DRIVER_MODULE_PATH "/modules/wlan.ko"
#endif
#ifndef WIFI_DRIVER_MODULE_NAME
#define WIFI_DRIVER_MODULE_NAME "wlan"
#endif
static const char WPA_SUPPLICANT_NAME[] = "wpa_supplicant";
static const char WPA_SUPP_PROP_NAME[] = "init.svc.wpa_supplicant";
static const char WPA_SUPP_CTRL_DIR[] = "/data/misc/wifi/wpa_supplicant";
static const char WPA_SUPP_CONFIG_TEMPLATE[] = "/system/etc/wifi/wpa_supplicant.conf";
static const char WPA_SUPP_CONFIG_FILE[] = "/data/misc/wifi/wpa_supplicant.conf";
That's it!
由於Realtek提供了比較完全的參考代碼,整個移植的過程非常簡單,以至於像我這樣的“非專業人士”也可以順利地完成
關於Android WiFi移植,有一篇文章具有參考價值:PaNiC Random Rant (or how we used to call it: .plan): Porting WiFi drivers to Android
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
Android平台有三種網絡接口可以使用,他們分別是:java.net.*(標准Java接口)、Org.apache接口和Android.net.*(Androi
首先我們先來看一看效果圖,第一個效果圖是一個最普通的側滑菜單,我們一會兒會先做出這種側滑菜單,然後再在此基礎上實現另外兩個效果 第一種 第二種
前面walfred已經介紹了使用apktool對apk進行逆向編譯,通過apktool我們的確可以反編譯已經序列化後的AndroidManifest.xml和資源