原文地址::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