WiFi驱动移植到Linux

  • 格式:docx
  • 大小:21.06 KB
  • 文档页数:10

下载文档原格式

  / 10
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

linux下移植之WIFI驱动

2010-05-14 22:27

1.前言

硬件平台: imx27+sd8686

软件平台: linux

内核: 2.6.27

2.移植思想

1, WIFI 模块本身和 cpu 之间的接口;

我们的模块和 cpu 之间的接口是 sdio 的,也就是说必须要先保证SDIO 本身是工作的,与SD卡,MMC属于同类型。主要用到这几个GPIO引脚SD0...SD3,SD2_CMD,SD2_CLK,以及复位引脚PB24.

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,

};

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) {

mxc_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(10);

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) {

mxc_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 放在 /lib/firmware/mrvl 下面(若没有,则创建一个);

把 sd8686.bin 放在 /lib/firmware/mrvl 下面(同上);

4,特殊的处理

对于 8686 模块需要做特殊的处理,在注册完以太网接口以后,需