linux下移植之WIFI驱动
2010-05-14 22:27
1. 前言 硬件平台: imx27+sd8686 软件平台: linux 内核: 2.6.27 2. 移植思想 1, WIFI 模块本身和 cpu 之间的接口; 我们的模块和 cpu 之间的接口是 sdio 的,也就是说必须要先保证 SDIO 本身是工作的,与SD卡,MMC属于同类型。 主要用到这几个GPIO引脚SD3,SD2_CMD,SD2_CLK,以及复位引脚PB24. 2, WIFI 模块本身的上电时序; 模块都有它自己的规律,所以必须要根据 spec 了解它本身的上电过程,严格遵守; 3, 以太网接口的创建; 我们的 WIFI 模块本身是建立在 SDIO 口之上的,而对上都是提供以太网接口的,所以必须要保证这个接口以及创建; 4, 特殊处理; 不同的模块都有它特别的地方,比如我们用的是 8686 和 compo 也就是说它和蓝牙共用天线,所以需要在初始化的时候做特殊的处理,发送特殊的命令,才能工作; 3. 移植过程 1, sdio 本身是通过 gpio 口模拟的,所以需要对520给男朋友送什么礼物好 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 模块需要做特殊的处理,在注册完以太网接口以后,需要添加下面这段话 : { #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 接口将无法工作; Linux平台上需要移植一些上层软件才能验证,比如 iwconfig , iwlist 等。 测试步骤: ifconfig eth0 up iwlist eth0 scanning 如果能扫描到 AP 那么证明基本已经 OK 了; iwconfig eth0 拍一拍不显示 iwlist eth0 freq 可以查看设备的相关信息,查看各项是否正常。 现在,就可以 ping 通 IP 地址了; 5. 常见问题 1, WIFI 驱动注册 sdio 驱动的时候出错,也就是 probe 函数未被调用? 需要检查 sdio 设备本身是否被检测到,内核是通过发送特定的命令来检测是 sdio 是 SD 卡还是 mmc 的, 在 mmc_rescan 函数里面可以看到 sdio 设备的加载过程,有可能就是你的电压设置不对; 2, 以太网接口一直出不来或者说 firmware 加载失败? 这里需要确保 firmware 是否正确被加载,很可能是它不到对应的 firmware ,可以通过添加打印信息看看,它的路径到底是在什么地方,对于 wifi 来说 helper_sd.bin 需要放在 /lib/firmware/ 下面,而 sd8686.bin 需要放在 /lib/firmware/mrvl 下面; 3, 一切正常,但是调用 iwlist eth0 scanning 的时候,扫描不到任何结果,出现NO scan results? 这时候需要做特殊的处理,比如共存代码的设置,是否正常等,通常可以判断有没有中断上来,以此区分到底是模块和 cpu 的连接问题还是模块本身的设置问题; 4, 工作一段时间后不正常 这个有可能是蓝牙模块需要进行初始化,因为它们是共用天线,有时候不起蓝牙模块对应的 40M 时钟就不起来; 本人参照:blog.chinaunix/u2/67984/showart_2113942.html 此博客而移植成功的。 在此感谢wylhistory! |
linux -- 嵌入式linux下wifi无线网卡驱动
插入模块驱动
[root@WEIYAN wifi]$ insmod zd1211rw.ko
usb 1-1: reset full speed USB device using s3c2410-ohci and address 3
zd1211rw 1-1:1.0: phy2
usbcore: registered new interface driver zd1211rw
[root@WEIYAN wifi]$ insmod zd1211rw.ko
usb 1-1: reset full speed USB device using s3c2410-ohci and address 3
zd1211rw 1-1:1.0: phy2
usbcore: registered new interface driver zd1211rw
打开无线网卡
[root@WEIYAN wifi]$ ifconfig wlan0 up
zd1211rw 1-1:1.0: firmware version 4725
zd1211rw 1-1:1.0: zd1211b chip 0ace:1215 v4810 full 00-1d-0f UW2453_RF pa0 -7---
[root@WEIYAN wifi]$ ifconfig wlan0 up
zd1211rw 1-1:1.0: firmware version 4725
zd1211rw 1-1:1.0: zd1211b chip 0ace:1215 v4810 full 00-1d-0f UW2453_RF pa0 -7---
扫描频道
[root@WEIYAN wifi]$ ./wftools/iwlist wlan0 scanning
wlan0 Scan completed :
Cell 01 - Address: 00:0E:4E:81:02:4D
[root@WEIYAN wifi]$ ./wftools/iwlist wlan0 scanning
wlan0 Scan completed :
Cell 01 - Address: 00:0E:4E:81:02:4D
ESSID:"WEIYAN"
Mode:Master
Channel:6
Frequency:2.437 GHz (Channel 6)
Quality=11/100 Signal level=62/100
Encryption key:off
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s
Extra:tsf=00000000004c3c37
Mode:Master
Channel:6
Frequency:2.437 GHz (Channel 6)
Quality=11/100 Signal level=62/100
Encryption key:off
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s
Extra:tsf=00000000004c3c37
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论