Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Realtek 8192cu 驅動移植到 Android 2.2

Realtek 8192cu 驅動移植到 Android 2.2

編輯: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參考實現,只需對路徑等配置性的部分根據開發板實際情況進行修改即可

關於vmalloc的補充說明

測試表明,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

修改開發板配置

AndroidBoard.mk

路徑為: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 \
...

BoardConfig.mk

路徑為:vendor/sec/utv210/BoardConfig.mk

在末尾增加下面一行,這是編譯Realtek驅動必須的

BOARD_USES_REALTEK_WIFI := true

init.rc

路徑為: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

代碼移植

wpa_supplicant

將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

dhcpcd

將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

wifi HAL

將 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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved