1. 程式人生 > >關於Realtek RTL8188EU wifi移植要知道的

關於Realtek RTL8188EU wifi移植要知道的


    目前可以使用wireless-tools 或wpa_supplicant工具來配置無線網路。請記住重要的一點是,對無線網路的配置是全域性性的,而非針對具體的介面。
    wpa_supplicant是一個較好的選擇,但缺點是它不支援所有的驅動。請瀏覽wpa_supplicant網站獲得它所支援的驅動列表。
    另外,wpa_supplicant目前只能連線到那些你已經配置好ESSID的無線網路,它可以讓您連線到那些使用WPA的AP。wireless-tools支援幾乎所有的無線網絡卡和驅動,
    但它不能連線到那些只支援WPA的AP。
 1. wireless tools工具安裝
    (1)tar zxvf wireless_tools.30.rtl.tar.gz 
    (2)cp wireless_tools.30.rtl <ANDROID_SDK>/external/ 
    (3)cd <ANDROID_SDK> 
    (4)make iwconfig iwlist iwpriv 將生成的iwconfig、iwlist、iwpriv push到開發板/system/bin中
 2. wpa_supplicant工具的交叉編譯
    一般的Linux版本里麵包含wpa_supplicant和wpa_cli.
    wpa_supplicant是一個開源專案,已經被移植到Linux,Windows以及很多嵌入式系統上。它是WPA的應用層認證客戶端,負責完成認證相關的登入、加密等工作。
    wpa_supplicant是一個獨立執行的守護程序,其核心是一個訊息迴圈,在訊息迴圈中處理WPA狀態機、控制命令、驅動事件、配置資訊等。
    經過編譯後的wpa_supplicant源程式可以看到兩個主要的可執行工具:wpa_supplicant 和 wpa_cli。
    wpa_supplicant是核心程式,它和wpa_cli的關係就是服務和客戶端的關係:後臺執行wpa_supplicant,使用 wpa_cli來搜尋、設定、和連線網路。
    Android使用一個修改版wpa_supplicant作為daemon來控制WIFI,它是一個安全中介軟體,程式碼位於external/wpa_supplicant,
    為各種無線網絡卡提供統一的安全機制,wpa_supplicant是通過socket與hardware/libhardware_legacy/wifi/wifi.c通訊 
    Wpa_supplicant作用:1、讀取配置檔案 2、初始化配置引數,驅動函式 3、讓驅動scan當前所有的bssid 4、檢查掃描的引數是否和使用者設定的想否 5、如果相符,通知驅動進行許可權 認證操作 6、連上AP
    在init.amber3.rc裡執行:wpa_supplicant /system/bin/wpa_supplicant -Dnl80211 -iwlan0 -c/data/misc/wifi/wpa_supplicant.conf  -B    //後臺執行
    其中/system/bin/wpa_supplicant :是 wpa_supplicant可執行程式的path;
 3.load wifi driver    
    首先需要講解一下,在android4.0之後,wifi的工作方式基本都採用的是比較標準的nl80211方式,以前的wext方式現在使用的已經很少了。
    wext:supplicant通過wext直接給wifi driver下命令,即不通過kernel,所以一般以wext工作的driver是不需要load cfg80211.ko的,這個cfg80211.ko就是kernel裡面的wireless部分,主要對接supplicant和driver的。
    nl80211:supplicant的命令以nl80211的方式下給kernel,經過kernel再發送給driver,這樣子做的好處是supplicant和driver之間的通訊方式更加標準話,是以後的主流方式,我後面講的driver都是以這種方式工作的。

    既然是nl80211,那麼首先需要build kernel,得到cfg80211.ko,然後用build過的kernel來build driver,得到具體的driver ko,這裡面為了區分具體型號的ko,我把名字假設為8188eu.ko。

    拿到兩個ko之後load driver的準備工作就做完了,現在把兩個ko copy到平臺的/system/lib/modules/路徑下,這個是android ko的存放路徑。

4.本人在除錯wifi中遇到的一些問題

     (1)  完全依據Realtek給出的使用者手冊中進行移植時,會出現錯誤,原因是沒有載入cfg80211.ko,這是因為手冊中用wifi_realtek.c檔案但是這裡面載入wifi只是載入了8818eu.ko,沒有載入cfg80211.ko,其次使用者手冊中也未提及/rtl8188eu資料夾下要根據自己的系統更改Makefile的一些引數。

    (2) 後來沒有使用wifi_realtek.c檔案而是使用了wifi.c檔案,按照官方文件中提供的方法配置相關引數即順利調通。

    (3) 開始調試出現wifi開啟兩分鐘後就自動關閉,wifi開啟時,用lsmod可以看到8188eu.ko被載入,當WiFi斷開後檢視lsmod就自動解除安裝,於是懷疑可能是驅動載入的問題。又檢查一遍引數設定,發現一些錯誤以後,重新燒寫後發現wifi這次直接打不開,檢視列印一直提示insmod 失敗,後來直接讓驅動內部的insmod直接返回0,進行手動載入,但是直接手動載入也是提示init_module失敗,後來就試著先載入cfg80211.ko,接著再載入8188eu.ko,wifi就正常執行。於是直接在init.amber3.rc中載入兩者即可,但是有時關閉wifi後打不開wifi,後來才研究了下wifi.c 發現wifi.c裡面函式自動載入了這兩項,才除錯ok! 

    下面是部分命令除錯wifi:
      # ifconfig wlan0 up
      # busybox ifconfig 
        iwconfig
        cat /proc/net/dev
     1. wpa_supplicant -Dnl80211 -iwlan0 -c /data/misc/wifi/wpa_supplicant.conf -B
     2. wpa_cli -p /wlan0  scan
     3. wpa_cli -p /wlan0  remove_network 0
     4. wpa_cli -p  /wlan0 ap_scan 1