Android移植之WIFI

來源:互聯網
上載者:User

原文地址::http://blog.chinaunix.net/space.php?uid=741742&do=blog&id=359299

 

 

1. 前言

       硬體平台: marvel 310

       軟體平台: maemo4

       核心: 2.6.28 (經過 marvel 的移植)

2. 移植思想

1,  WIFI 模組本身和 cpu 之間的介面;

       我們的模組和 cpu 之間的介面是 sdio 的,也就是說必須要先保證 SDIO 本身是工作的;

2,  WIFI 模組本身的上電時序;

       模組都有它自己的規律,所以必須要根據 spec 瞭解它本身的上電過程,嚴格遵守;

3,  乙太網路介面的建立;

       我們的 WIFI 模組本身是建立在 SDIO 口之上的,而對上都是提供乙太網路介面的,所以必須要保證這個介面以及建立;

4,  特殊處理;

       不同的模組都有它特別的地方,比如我們用的是 8686 和 compo 也就是說它和藍芽共用天線,所以需要在初始化的時候做特殊的處理,發送特殊的命令,才能工作;

3. 移植過程

1,  sdio 本身是通過 gpio 口類比的,所以需要對 gpio 口進行配置

       static mfp_cfg_t littleton_mmc3_pins[] = {

       GPIO7_2_MMC3_DAT0,

       GPIO8_2_MMC3_DAT1,

       GPIO9_2_MMC3_DAT2,

       GPIO10_2_MMC3_DAT3,

       GPIO103_MMC3_CLK,

       GPIO105_MMC3_CMD,

       };

       void pxa3xx_enable_mmc3_pins(void)

{

       pxa3xx_mfp_config(ARRAY_AND_SIZE(littleton_mmc3_pins));

}

       在 littleton_init ()函數裡面添加下面這一行:

       pxa3xx_enable_mmc3_pins();

2,  wifi 模組本身的初始化

#define MFP_WIFI_V18_ENABLE     (GPIO26_GPIO)

#define MFP_WLAN_RESETN                  (GPIO99_GPIO)

#define WIFI_WAKEUP_HOST          (GPIO104_GPIO) /*error must be changed*/

#define WLAN_ENABLE_PIN          26

#define WLAN_RESET_PIN            99

 

#define M200_B

#ifdef M200_B

#define BT_RESET_PIN                 EXT1_GPIO(1)

#define BT_RESET_GPIO             (GPIO1_2_GPIO)

#else

#define BT_RESET_GPIO                  (GPIO6_2_GPIO)

#define BT_RESET_PIN                 EXT1_GPIO(6)

#endif

 

static  mfp_cfg_t lin2008_wifibt_pins[] = {

MFP_WIFI_V18_ENABLE,

MFP_WLAN_RESETN,

WIFI_WAKEUP_HOST,/*wakeup host*/

};

static  mfp_cfg_t lin2008_wifibt_pins2[] = {

MFP_WIFI_V18_ENABLE,

};

static int wifibt_power_status;

int lin2008_poweron_wifibt_board(void)

{

       if (!wifibt_power_status) {

              pxa3xx_mfp_config(ARRAY_AND_SIZE(lin2008_wifibt_pins));

                               

              gpio_direction_output(WLAN_ENABLE_PIN, 1);

              gpio_direction_output(WLAN_RESET_PIN, 1);

                  gpio_direction_output(BT_RESET_PIN,1);

              mdelay(1);

                  gpio_direction_output(BT_RESET_PIN, 0);

                  gpio_direction_output(WLAN_RESET_PIN, 0);

 

       // bt need > 5 ms to reset

                  mdelay(5);

                  gpio_direction_output(BT_RESET_PIN, 1);

                  gpio_direction_output(WLAN_RESET_PIN, 1);

 

              wifibt_power_status++;

              return 0;

       }

       wifibt_power_status++;

       return 1;

}

 

 

 

int lin2008_poweroff_wifibt_board(void)

{

       wifibt_power_status--;

       if (!wifibt_power_status) {

              pxa3xx_mfp_config(ARRAY_AND_SIZE(lin2008_wifibt_pins2));

              gpio_direction_output(WLAN_ENABLE_PIN, 0);

              return 0;

       }

       return 1;

}

3, 乙太網路介面的建立

       這裡在 android 平台上要做特殊的處理,也就是 firmware 的位置要放好,否則載入 firmware 始終不成功,那麼乙太網路介面就不會被建立了;

       需要把 helper_sd.bin 放在 /etc/firmware/ 下面;

       把 sd8686.bin 放在 /etc/firmware/mrvl 下面;

4, 特殊的處理

       對於 8686 模組需要做特殊的處理,在註冊完乙太網路介面以後,需要添加下面這段話 :

       {

     #define BCA_CFG_NUM_OF_MODES          4

     #define BCA_CFG_SINGLE_ANT_WITH_COEX      0

     #define BCA_CFG_DUAL_ANT_WITH_COEX    1

     #define BCA_CFG_SINGLE_ANT_FOR_BT_ONLY    2

     #define BCA_CFG_MRVL_DEFAULT          3

 

     #define BCA_CONFIG BCA_CFG_SINGLE_ANT_WITH_COEX

     static u32 BCACfgTbl[BCA_CFG_NUM_OF_MODES][3] = {

       //0xA5F0,     0xA58C,  0xA5A0

       { 0xa027181c, 0x40214, 0xd24d}, //Mode 0: Single ANT with COEX enable

       { 0xa027181c, 0x40211, 0xd24d}, //Mode 1: Dual ANT with COEX enable

       { 0xa027181c, 0x40222, 0xd21c}, //Mode 2: single ANT for BT only

       { 0xa027801d, 0x18000, 0xd21c}, //Mode 3: Marvell default

     };

    

     wlan_offset_value    RegBuffer;    

    

     RegBuffer.offset = (0xA5F0);

     RegBuffer.value  = BCACfgTbl[BCA_CONFIG][0];

      wlan_prepare_cmd(priv,

                     HostCmd_CMD_MAC_REG_ACCESS,

                     HostCmd_ACT_GEN_SET,

                     HostCmd_OPTION_WAITFORRSP,

                     0,&RegBuffer);

 

     RegBuffer.offset =(0xA58C);

     RegBuffer.value  = BCACfgTbl[BCA_CONFIG][1];

     wlan_prepare_cmd(priv,

                     HostCmd_CMD_MAC_REG_ACCESS,

                     HostCmd_ACT_GEN_SET,

                     HostCmd_OPTION_WAITFORRSP,

                     0,&RegBuffer);

 

 

     RegBuffer.offset = (0xA5A0);

     RegBuffer.value  = BCACfgTbl[BCA_CONFIG][2];

     wlan_prepare_cmd(priv,

                     HostCmd_CMD_MAC_REG_ACCESS,

                     HostCmd_ACT_GEN_SET,

                     HostCmd_OPTION_WAITFORRSP,

                     0,&RegBuffer);

}

基本上這樣就可以工作了;

4.              其它問題

              Sdio 口預設是用的 3.2V 這裡需要修改相關的地方強制設成是 1.8V ,否則 SDIO 介面將無法工作;

              Android 平台上需要移植一些上層軟體才能驗證,比如 iwconfig , iwlist , wpa_supplicant 等。

       測試步驟:

              iwlist mlan0 scan

              如果能掃描到 AP 那麼證明基本已經 OK 了;

              wpa_supplicant -Dwext –imlan0 -c/etc/wpa.conf &

              dhcpcd mlan0 ;

              這樣的話,就可以 ping 通 IP 位址了;

5. 常見問題

1,  WIFI 驅動註冊 sdio 驅動的時候出錯,也就是 probe 函數未被調用?

       需要檢查 sdio 裝置本身是否被檢測到,核心是通過發送特定的命令來檢測是 sdio 還是 SD 記憶卡還是 mmc 的,

       在 mmc_rescan 函數裡面可以看到 sdio 裝置的載入過程,有可能就是你的電壓設定不對;

2,  乙太網路介面一直出不來或者說 firmware 載入失敗?

       這裡需要確保 firmware 是否正確被載入,很可能是它找不到對應的 firmware ,可以通過添加列印資訊看看,它的路徑到底是在什麼地方,對於 wifi 來說 helper_sd.bin 需要放在 /etc/firmware/ 下面,而 sd8686.bin 需要放在 /etc/firmware/mrvl 下面;

3,  一切正常,但是調用 iwlist mlan0 scan 的時候,掃描不到任何結果?

       這時候需要做特殊的處理,比如共存代碼的設定,是否正常等,通常可以判斷有沒有中斷上來,以此區分到底是模組和 cpu 的串連問題還是模組本身的設定問題;

4,  工作一段時間後不正常

       這個有可能是藍芽模組需要進行初始化,因為它們是共用天線,有時候不起藍芽模組對應的 40M 時鐘就不起來;

6. 後記

       作者 :wylhistory

       連絡方式: wylhistory@gmail.com

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.