歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

雷凌Ralink 2070 移植到Android記錄

最近一段時間移植了ralink 2070的驅動到Android上面,網上雖然有ralink的移植文章,但是我按照步驟移植,還是出現了一些問題,比如識別不到網卡,搜不到網絡等問題,所以我把移植的大概步驟記錄下來,用於以後查詢,下面就是大概的移植步驟

1    在ralink官網http://www.ralinktech.com/en/index.php下載驅動2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO源碼,
需要在rtusb_dev_id.c的數組裡面rtusb_dev_id[]裡面增加{USB_DEVICE(0x148F,0x2070)},不然會造成加載驅動的時候識別不到設備,
因為USB驅動識別是根據idVendor和idProduct來識別設備的,2070的設備號為idVendor=148f, idProduct=2070。
進入根目錄修改makefile,選擇CHIPSET = 3070,PLATFORM = 5VT,設置交叉編譯環境
ifeq ($(PLATFORM),5VT)
LINUX_SRC = /home/Ubuntu/tcc8902/android/kernel
CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
endif
需要修改/os/linux/config.mk
HAS_WPA_SUPPLICANT=y
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y
EXTRA_CFLAGS :
-D__LINUX_ARM_ARCH__=6
-march=armv6
-mtune=arm1176jzf-s
還需要去掉-mabi=apcs-gnu選項,不然會造成加載驅動死機重啟,網上的一篇移植文章有提到。

2   編譯好rt3070sta.ko,將其放到/system/lib/modules/目錄下面,還有就是需要將官方提供的RT2870STA.dat拷貝到/etc/Wireless/RT2870STA/供驅動使用

3   由於tcc8900默認的wifi模塊是atheros,所以我還修改了wifi_atheros.c的int wifi_load_driver()函數
int wifi_load_driver()
{
    char driver_status[PROPERTY_VALUE_MAX];
    int count = 100; /* wait at most 20 seconds for completion */

    if (check_driver_loaded()) {
        return 0;
    }

    if (insmod(DRIVER_MODULE_PATH, DRIVER_MODULE_ARG) < 0)
        return -1;

    if (strcmp(FIRMWARE_LOADER,"") == 0) {
        usleep(WIFI_DRIVER_LOADER_DELAY);
        property_set(DRIVER_PROP_NAME, "ok");
    }
    else {
        property_set("ctl.start", FIRMWARE_LOADER);
    }
    sched_yield();
    while (count-- > 0) {
        if (property_get(DRIVER_PROP_NAME, driver_status, NULL)) {
            if (strcmp(driver_status, "ok") == 0)
                return 0;
            else if (strcmp(DRIVER_PROP_NAME, "failed") == 0) {
                wifi_unload_driver();
                LOGE("DRIVER_PROP_NAME failed");
                //property_set(DRIVER_PROP_NAME, "ok");
                return -1;
            }
        }
        usleep(200000);
    }
   property_set(DRIVER_PROP_NAME, "timeout");
   wifi_unload_driver();
    return -1;
}
這裡有一個問題需要注意,就是static const char IFACE_DIR[]= "/data/system/wpa_supplicant";這裡的路徑一定要和wpa_supplicant.conf裡面的
ctrl_interface=DIR=/data/system/wpa_supplicant相同,不然會造成"/data/system/wpa_supplicant/ra0": No such file or directory這個錯誤,這個問題困擾我了很久,
權限問題也會引起這個問題。

4     需要更改init.rc文件,裡面需要更改權限問題,
chmod 0777 /system/etc/wifi/wpa_supplicant.conf
chown wifi wifi /system/etc/wifi/wpa_supplicant.conf
mkdir /data/misc/wifi/wapi_certificate 0777 wifi wifi
mkdir /data/misc/dhcp 0777 dhcp dhcp
chown dhcp dhcp /data/misc/dhcp
mkdir /data/misc/wifi/sockets 0777 wifi wifi
mkdir /data/misc/wifi/wpa_supplicant 0777 wifi wifi
mkdir /data/misc/wifi/hostapd 0777 wifi wifi
mkdir /data/misc/wifi 0777 wifi wifi
setprop wifi.interface ra0
setprop wlan.driver.script "wifi_sta_up.sh"
setprop wlan.driver.path "/system/wifi"
chmod 0777 /data/misc/wifi
chmod 0777 /data/misc/wifi/wpa_supplicant.conf
chown wifi wifi /data/misc/wifi
chown wifi wifi /data/misc/wifi/wpa_supplicant.conf
chown wifi wifi /system/etc/wifi

mkdir /data/system/wpa_supplicant 0777 wifi wifi
chmod 0777 /data/system/wpa_supplicant
chown wifi wifi /data/system/wpa_supplicant

5    按照上面的步驟,通過手動加載驅動
insmod /system/lib/modules/rt3070sta.ko
ifconfig ra0 up
wpa_supplicant -dd -Dwext -ira0 -c /system/etc/wifi/wpa_supplicant.conf&
iwlist ra0 scanning
基本上就可以搜索到網絡了,但是要通過android設置裡面的wifi setting去控制wifi的使能,還是會出現
/data/system/wpa_supplicant/ra0": No such file or directory錯誤,但是在搜索的過程中,如果手動的輸入ifconfig ra0 up命令,就可以搜到網絡
說明在wpa_supplicant調用的過程中沒有打開ralink,於是我在wpa_ctrl.c文件的wpa_ctrl_open函數的開頭增加了
對ra0打開的調用,       
        struct ifreq ifr;
        os_memset(&ifr,0,sizeof(struct ifreq));
        strncpy(ifr.ifr_name,"ra0",IFNAMSIZ);
        setflags(ctrl->s,&ifr,IFF_UP,0);
        usleep(10000);

重新編譯,燒錄程序,然後通過android wifi setting終於能夠搜到網絡,鏈接也能上網了。但是為什麼wpa_supplicant在啟動的沒能打開ra0,現在還沒搞明白,也希望高手
能指點一下。

以上就是移植的大概過程。

Copyright © Linux教程網 All Rights Reserved