1. 程式人生 > >android之wifi移植全過程(一)

android之wifi移植全過程(一)

硬體環境                                     WIFI模組:Marvell8686 SDIO WIFI                               開發板:S5PC100                              軟體環境                                Linux 2.6.29  Android 2.1 專案目標:實現WIFI上網功能、並對WIFI休眠進行改善。 專案開發流程: 硬體分析:對Marvell8686 SDIO WIFI模組硬體工作特性瞭解和分析 工作原理分析:對Marvel8686 SDIO WIFI工作原理進行分析 Android WIFI框架分析:對Android WIFI系統框架分析 進行原始碼分析、編寫、修改及編譯 除錯、並完善 一、1.編譯核心,生成驅動模組
     在核心的根目錄下執行make
     生成libertas.ko 和libertas_sdio.ko
     [*] Networking support  ---> 
         [*]   Wireless  ---> 
                 --- Wireless                                               
                <*>   Improved wireless configuration API                  
                 [*]     cfg80211 regulatory debugging                       
                 [*]     nl80211 new netlink interface support                                                                              
                 -*-   Common routines for IEEE802.11 drivers   
         Device Drivers  --->  
         [*] Network device support  ---> 
                Wireless LAN  --->  
               <*>   Marvell 8xxx Libertas WLAN driver support              (注:編譯進核心,若模組則是:libertas.ko)       
               <M>     Marvell Libertas 8385 and 8686 SDIO 802.11b/g cards  (注:編譯成libertas_sdio.ko)
    
     2.編譯核心,確保支援sd卡
        Device Drivers  ---
           <*> MMC/SD/SDIO card support  --->
             --- MMC/SD/SDIO card support                                    
             [*]   MMC debugging                                             
             [ ]   Allow unsafe resume (DANGEROUS)                           
             [*]   MMC embedded SDIO device support (EXPERIMENTAL)           
             [ ]   Enable paranoid SD card initialization (EXPERIMENTAL)     
                   *** MMC/SD/SDIO Card Drivers ***                          
             <*>   MMC block device driver                                   
             [*]     Use bounce buffer for simple hosts                      
             [ ]     Deferr MMC layer resume until I/O is requested          
             < >   SDIO UART/GPS class support                              
             < >   MMC host test driver                                       
                   *** MMC/SD/SDIO Host Controller Drivers ***               
             <*>   Secure Digital Host 
       3.make zImage
         make modules
        (libertas_sdio.ko在drivers/net/wireless/libertas目錄下)
二、製作測試工具(使用靜態編譯)
    現在,sd卡支援了,驅動以核心自帶的以模組的方式編譯得到。
    接下來先編譯幾個測試工具。
    測試無線網絡卡用無線工具iwconfig iwlist等命令是通過開源軟體wireless_tools_29.rar編譯得到。        
    步驟:
    1.解壓。由於這的是win32的壓縮包,先在windows底下解壓,再拷貝到Ubuntu下。
    2.修改Makefile:
           8   PREFIX = ./tools  //指定安裝路徑                  
           12  CC = arm-linux-gnu-gcc (和編譯你的檔案系統所用保持一致,需要注意的是,如果在執行sudo make 就要該編譯鏈的絕對路 徑)                                                                                                      
           14  AR = arm-linux-gnu-ar  
          
           #BUILD_STATIC = y          -->    BUILD_STATIC = y                                       
           #BUILD_STRIPPING = y       -->    BUILD_STRIPPING = y  
          
 
           CFLAGS=-Os -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow \         
                 -Wpointer-arith -Wcast-qual -Winline -I.
           在這後面新增新行:                             
           CFLAGS += -static
          
    3.make
    4.make install
      由於我是在當前目錄下(PREFIX = ./tools) 產生的這個tools資料夾,
      檢視有:
      lib sbin usr
      lib目錄,libiw.a靜態庫 ;而sbin目錄為一些網路工具,如:iwlist、iwconfig等
      到裡面的sbin目錄底下,
      $file iwlist  輸出資訊:iwlist: ELF 32-bit LSB executable, ARM, version 1, statically linked, for GNU/Linux 2.4.3, strippe
      確保是靜態的。
     
      然後將這些命令複製到android檔案系統的/system/busybox/bin(就是out/target/prodruct/fs100/system/busybox/bin)
      或者system/bin(就是out/target/prodruct/fs100/system/bin)目錄下就可以使用這些命令了。 
 
 三、將韌體放到指定目錄下。
     1.mkdir /system/etc/firmware(就是out/target/prodruct/fs100/system/etc/firmware)
     2.cp sd8686.bin sd8686_helper.bin  out/target/prodruct/fs100/system/etc/firmware
 
 四、測試,sdio卡是否可用。
     如果已經編譯好了檔案系統,就可以跳過第一步。
     1.編譯android系統。
               1)在檔案系統根目錄下執行:
              
[email protected]:~/anrdoid/fs/android_system$
. ./build/envsetup.sh
             注意這裡兩個’.’  之間有一個空格,第一個’.’指定用當前 shell 解析這個指令碼,否則不能執行。
            2)配置板級資訊:
            [email protected]:~/anrdoid/fs/android_system$ tapas
            就是上一步執行結束之後匯出到環境變數裡的命令,專門用來配置板級資訊的。
             Build for the simulator or the device?
                    1. Device
                   2. Simulator
            Which would you like? [1] 1
            Build type choices are:
                   1. release
                   2. debug
            Which would you like? [1] 1
            Which product would you like? [fs100] fs100
            Variant choices are:
                   1. user
                   2. userdebug
                   3. eng
            Which would you like? [eng] eng
           
            確保輸出的配置資訊為:
            PLATFORM_VERSION_CODENAME=REL
            PLATFORM_VERSION=2.1-update1 
            TARGET_PRODUCT=fs_s5pc100    
            TARGET_BUILD_VARIANT=eng     
            TARGET_SIMULATOR=false       
            TARGET_BUILD_TYPE=release    
            TARGET_ARCH=arm              
            HOST_ARCH=x86                
            HOST_OS=linux                
            HOST_BUILD_TYPE=release      
            BUILD_ID= ERE27              
           
            3)開始編譯(如果不能找到 mm,執行”source build/envsetup.sh”):
           
[email protected]:~/anrdoid/fs/android_system$
mm
   
   2.重新生成檔案系統映象。
     [email protected]:~/anrdoid/fs/android_system$ ./make_fs100_yaffs2_image.sh
     就會在 Android 原始碼根目錄下生成目錄“fs100_root”,這個目錄就是編譯生成的 Android 檔案系統, 
     除錯時可以直接把這個目錄作為 NFS-Server 的目錄。還會生成一個“fs100_root.img”檔案,這個檔案就
     是 Android的 yaffs2 格式的映象,可以燒寫到 Nand Flash 上。
       這裡我是燒寫上fs100_root.img.
    
     3.手動載入驅動。
       由於sdio8686。需要載入兩個.ko(libertas.ko、libertas_sdio.ko) 檔案。
       上面linertas.ko的模組,我已經編進核心。
       所以我只需執行:
       1)/# insmod libertas_sdio.ko  
       輸出資訊:
       libertas_sdio: Libertas SDIO driver                                
     libertas_sdio: Copyright Pierre Ossman                             
     __func__ = if_sdio_prog_helper                                     
     libertas_sdio mmc1:0001:1: firmware: requesting sd8686_helper.bin  
     init: untracked pid 2137 exited                                    
     libertas_sdio mmc1:0001:1: firmware: requesting sd8686.bin         
     init: untracked pid 2140 exited                                    
     libertas: 00:0b:6c:91:a3:f6, fw 9.70.3p24, cap 0x00000303          
     libertas: unidentified region code; using the default (USA)        
     wlan0 (libertas_sdio): not using net_device_ops yet                
     libertas: PREP_CMD: command 0x00a3 failed: 2                       
     libertas: PREP_CMD: command 0x00a3 failed: 2                       
     libertas: wlan0: Marvell WLAN 802.11 adapter                       
    2)/# ifconfig -a 
       (要是提示:-a: No such device,則輸入命令:system/busybox/sbin/ifconfig -a)   
    檢視是否檢測到無線網絡卡                          
           有如下資訊說明檢測到無線網絡卡                                   
             wlan0     Link encap:Ethernet  HWaddr 00:0B:6C:91:A3:F6      
                       BROADCAST MULTICAST  MTU:1500  Metric:1            
                       RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
                       TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
                       collisions:0 txqueuelen:1000                       
                       RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)             
    3)測試: 
         /#ifconfig wlan0 up                                                                                                          
        /#iwlist wlan0 scanning                                                                                                         
        /#iwconfig wlan0 essid "fs100"                                                                                                  
        /#ifconfig wlan0 192.168.1.99 netmask 255.255.255.0 up (靜態分配ip,
         也可以動態分配,用DHCP)
         /#route add default gw 192.168.1.1(無線路由)
         /#ping 192.168.1.1           
    4)能夠ping通後,說明sdio8686 wifi網絡卡沒有問題
   
五、測試wpa_supplicant。
  因為現在的無線wifi網路大多是wpa加密。 所以需要用到wpa_supplicant。
    android系統中也自帶有wpa_supplicant。
    wifi的大致架構是這樣的,app-->java framework-->|jni|-->c++ framework -->wifi.c -->wpa_supplicant-->sdio8686.
    所以我們要先測試低層先通了,因此,就得先測試確保wpa_supplicant和sdio8686通了的。
    我們編譯android系統時,就已經把自帶的wpa_supplicant和wpa_cli編譯好並放到system/bin目錄下了.
    1.配置wpa_supplicant。
    在
[email protected]:~/anrdoid/fs/android_system/external/wpa_supplicant/
在目錄下有個wpa_supplicant.conf。
    將wpa_supplicant.conf放到out/target/product/fs100/system/etc 目錄下。如果是燒到板子上的話,需要重燒板子。
    要是以網路掛載的方式,則放到相應的目錄。
    #vim /rootfs/filesystem/etc/wpa_supplicant.conf          
                                                             
    修改內容如下:                                           
                                                             
    # WPA-PSK/TKIP                                           
                                                             
     ctrl_interface=/var/run/wpa_supplicant                   
                                                             
     network={                                                
                     ssid="fs100"     //填寫無線網路的的使用者名稱
                      key_mgmt=WPA-PSK                         
                      proto=WPA                                
                     pairwise=TKIP                            
                     group=TKIP                               
                     psk="1234567890" //填寫密碼              
     }                                                        
   
    2.#mkdir –p /var/run/wpa_supplicant
    3.確認是否載入驅動。
     用ifconfig -a檢視是否已經建立wlan0這個節點。
      沒有就把驅動載入進核心。
    4.建立連線暗文密碼(PSK密碼),通過明碼轉換                                                                    
      #cd /etc (該目錄下要有 wpa_supplicant.conf)                                                                                                  
      #wpa_passphrase fs100 1234567890 >> wpa_supplicant.conf                                                   
      此時將在wpa_supplicant.conf檔案中生成:                                                                    
      network={                                                                                                  
            ssid="fs100"                                                                                        
            #psk="1234567890" //此物為路由器中設定的人類能讀得懂的密碼,供我們使用                               
            psk=d290464a66df8541cee4f100627446177ee7ce5d9eb36981e4dff412730b2d5a //這個又1234567890轉換後的psk密碼
      }                                                                                                          
       -----------------------------------------------------------------------------------------------------<----
       ---->遇到問題:在測試過程中要用到wpa_passphrase這個命令程式。但是android並沒提供wpa_passphrase       <----
       ---->這命令,我只通過wpa_supplicant-0.7.3這個原始碼包編譯出這個命令。但是這個命令在開發板上執行        <----
       ---->不了(編譯鏈不對)。我又找到android原始碼中有wpa_passphrase.c,而編譯出來的路徑下通過find         <----
       ---->命令去找這個wpa_passphrase又找不到。                                                            <----
       ---->解決辦法:同過分析wpa_passphrase.c才發現,裡面就短短的一個mian函式。有個提示                    <----
       ---->usage: wpa_passphrase <ssid> [passphrase]\n""\nIf passphrase is left out, it will be read from "<----
     ---->"stdin\n                                                                                        <----
       ---->現在不用我說都知道了吧!所以這個在哪執行都可以,這命令就是為了通過ssid和passphrase得到暗文。    <----
       ---->所以我在Ubuntu底下直接執行:wpa_passphrase fs100 1234567890                                     <----
       ---->同樣輸出資訊:network= {                                                                         <----                             
       ---->                          ssid="fs100"                                                          <----                             
       ---->                          #psk="1234567890"                                                     <----
       ---->                          psk=d290464a66df8541cee4f100627446177ee7ce5d9eb36981e4dff412730b2d5a  <----
       ---->                    }                                                                           <----                             
       -----------------------------------------------------------------------------------------------------<----- 
     5.然後修改wpa_supplicant.conf配置檔案,把 psk="1234567890" 這一行明文密碼改成生成的暗文密碼,即:
               psk=d290464a66df8541cee4f100627446177ee7ce5d9eb36981e4dff412730b2d5a                  
                                                                                                     
       其它生成的多餘資訊刪除,最後wpa_supplicant.conf檔案如下:                                     
       # WPA-PSK/TKIP                                                                                
                                                                                              
       ctrl_interface=/var/run/wpa_supplicant                                                        
                                                                                              
       network={                                                                                     
                  ssid="FS2410"     //填寫無線網路的的使用者名稱                                         
                  key_mgmt=WPA-PSK                                                                   
                  proto=WPA                                                                          
                  pairwise=TKIP                                                                      
                  group=TKIP                                                                         
                 psk=d290464a66df8541cee4f100627446177ee7ce5d9eb36981e4dff412730b2d5a               
       }
      
     6.連結AP:
             在開發板終端輸入wpa_supplicant回車,會顯示幫助資訊,最後有個:                        
             example:                                                                             
                   wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant.conf                       
             拷貝example用法,執行:                                                              
             # wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant.conf &(需要一直放在後臺執行)   
             列印資訊有:                                                                         
             Trying to associate with 00:26:f2:0d:5a:c4 (SSID='fs100' freq=2412 MHz)             
             Associated with 00:23:68:28:4e:a8                                                    
             CTRL-EVENT-DISCONNECTED bssid=00:23:68:28:4e:a8 reason=0                             
             Associated with 00:26:f2:0d:5a:c4                                                    
             WPA: Key negotiation completed with 00:26:f2:0d:5a:c4 [PTK=TKIP GTK=TKIP]            
             CTRL-EVENT-CONNECTED - Connection to 00:26:f2:0d:5a:c4 completed (auth) [id=0 id_str=]
                                                                                           
             分配IP地址:                                                                         
             #ifconfig wlan0 192.168.1.5  //也可以動態分配 dhclient wlan0                         
             再ping下閘道器,是否連線成功:                                                         
             #ping 192.168.1.1                                                                    
                                                                                            
             3 packets transmitted, 3 packets received, 0% packet loss                            
             round-trip min/avg/max = 17.627/20.023/24.631 ms                                     
             ……                                                                                 
                                                                                            
             無線網絡卡連線成功!

相關推薦

androidwifi移植全過程

硬體環境                                     WIFI模組:Marvell8686 SDIO WIFI                               開發板:S5PC100                        

androidwifi移植全過程

一、1.編譯核心,生成驅動模組      在核心的根目錄下執行make      生成libertas.ko 和libertas_sdio.ko      [*] Networking support  --->            [*]   Wireless  --->           

AndroidActivity系列總結--Activity概述

本文內容建立 Activity實現使用者介面在清單檔案中宣告 Activity啟動 Activity啟動 Activity 以獲得結果結束 Activity管理 Activity 生命週期實現生命週期回撥儲存 Activity 狀態處理配置變更協調 Activity 是一個應用元件,使用者可與其提供的螢幕進行

Android自動化Monkey環境搭建

OS 安卓系統 我們 cmd 工具 jdk 自動化 monk 檢查 從事測試行業兩年了,一直很喜歡研究新技術,但是最近有點慵懶。正好公司新出了產品,督促我學習monkey用來測其穩定性。 網上搜索了很久,內容總是很零散,通常需要找幾篇文章才能搭好環境。特寫此文,一篇文章搞定

Android 動畫】動畫詳解補間動畫

前言 :之前很早就想寫寫Android 的動畫,最近剛好有時間,大概聊一聊安卓動畫。 我個人習慣將動畫分為:補間動畫(透明度、旋轉、位移、縮放)、幀動畫、和屬性動畫,這一篇,我們先說說補間動畫。 補間動畫這個詞出於flash,在兩個關鍵幀(可以理解成動畫開始和結束)中間需要做“補

Android編譯系統分析幾個關鍵點

已開通新的部落格,後續文字都會發到新部落格 http://www.0xfree.top Android 編譯系統解析系列文件 解析lunch的執行過程以及make執行過程中include檔案的順序 Android編譯系統分析之lunch分析 Android

Android四大元件Service全面解析

 在小杰的上一篇博文中給大家講了一下Android四大元件之一的Activity,也是最重要的,這一篇文章,給大家講一下Service。 什麼是Service  Service是Android的四大元件之一應用廣泛,它是一個能在後臺進行一個長時間的操作並且不提供使用者介面

Android使用Android-query框架進行開發

開發Android使用Android-query框架能夠快速的,比傳統開發android所要編寫的程式碼要少得很多,容易閱讀等優勢。  以下內容是我學習的一些心得分享: 第一節:   // 必須實現AQuery這個類 AQuery aq = new AQuery(view);// 按順序分析:取得xm

Android中的Http通訊Http協議基本知識

寫了這麼久的專案,幾乎每個專案都用到了網路請求,不對,是所有的專案。一直沒有對這一塊做過詳細的總結,今天結合一些網上的資料以及自己的理解,來談談Http。廢話不多說,直奔正題吧...... 我們如果想要真正的瞭解Http,我們必須要知道什麼是Http? 一、什麼是Http?

Android測試】LogCat命令列

預備知識   首先還是先了解一下上節沒有提到的知識,我覺得還是比較重要的,就是log分類的幾種級別(prority):   v (verbose)  d (debug)   i  (information)   w (warning)   e (error)   這

Android開發實戰——ProgressDialog的使用

ProgressDialog的使用 Android原生的ProgressDialog分為兩類 1. 一類是進度條不明確的 2. 另一類是進度條明確的 展示的形式有圓形和水平進度條 注意:對於不明確的進度條才可以設定Indeterminate為tru

Android百度地圖開發初體驗

    做關於位置或者定位的app的時候免不了使用地圖功能,本人最近由於專案的需求需要使用百度地圖的一些功能,所以這幾天研究了一下,現寫一下blog記錄一下,歡迎大家評論指正!一、申請AK(API Key)    要想使用百度地圖sdk,就必須申請一個百度地圖的api key

android自定義view學習時尚錶盤

最近在學習自定義view,順便謝謝自己的路程,後面回首看看以前的自己有多菜。。。。下方的是實現圖,首先需要說明的是,這個效果是看了一遍部落格,然後自己想著去實現,並給出此部落格:點選開啟連結正文:首先學習自定義view需要稍稍入門一下,然後是各種函式的使用,以及大量的練習,至

Android FM模組學習四原始碼解析

  前一章我們瞭解了FM手動調頻,接下來我們要分析FM模組用到的原始碼。此原始碼是基於高通平臺的,別的平臺都大同小異,只不過是平臺自己作了些小改動而已。    首先要看的當然是主activity,

python框架 Tornado 學習筆記

tornado pythontornado 一個簡單的服務器的例子:首先,我們需要安裝 tornado ,安裝比較簡單: pip install tornado 測試安裝是否成功,可以打開python 終端,輸入: import tornado.https

python大法二-一些基礎

計算機編程 python 獨立博客 hello 解釋器 個人獨立博客出處:http://www.xbman.cn/出處:http://www.xbman.cn/article/3Python是一種解釋性計算機編程語言。采用縮進式語法,寫起來的感覺有點像排了版的shell,這裏要註意寫pyt

android入門 — 多線程

xtend 分享 調用 管理 ava 導致 ui線程 rec thread   android中的一些耗時操作,例如網絡請求,如果不能及時響應,就會導致主線程被阻塞,出現ANR,非常影響用戶體驗,所以一些耗時的操作,我們會想辦法放在子線程中去完成。   android的U

Android實現音樂播放器

simple ani call ket 打開文件 界面 方式 .cn 點擊 Graphical User Interface 本篇文章記錄了我實現Android簡單音樂播放器的過程,(一)中介紹了怎麽構建音樂播放器的前端頁面。首先大家看一下,界面最後是這樣的(界面有

LinuxUbuntu環境配置

sogou home ade -- linux下 安裝 linux64 x64 inux Linux下的搜狗輸入法安裝: 1.搜狗官網下載Linux64bit版本文件,默認在/home/username/Downloads目錄下。 2.cd /home/username/D

數據結構二叉樹

reorder system style 序列 urn creat 編寫程序 space ont 設計和編寫程序,按照輸入的遍歷要求(即先序、中序和後序)完成對二叉樹的遍歷,並輸出相應遍歷條件下的樹結點序列。 1 //遞歸實現 2 #include