WiFi驱动移植到Linux.docx
《WiFi驱动移植到Linux.docx》由会员分享,可在线阅读,更多相关《WiFi驱动移植到Linux.docx(8页珍藏版)》请在冰豆网上搜索。
![WiFi驱动移植到Linux.docx](https://file1.bdocx.com/fileroot1/2022-12/14/9a82d9bb-06d4-4796-af81-0ac8ba1cfda5/9a82d9bb-06d4-4796-af81-0ac8ba1cfda51.gif)
WiFi驱动移植到Linux
linux下移植之WIFI驱动
2010-05-1422:
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口进行配置;
staticmfp_cfg_tlittleton_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模块本身的初始化;
#defineMFP_WIFI_V18_ENABLE (GPIO26_GPIO)
#defineMFP_WLAN_RESETN (GPIO99_GPIO)
#defineWIFI_WAKEUP_HOST (GPIO104_GPIO)/*errormustbechanged*/
#defineWLAN_ENABLE_PIN 26
#defineWLAN_RESET_PIN 99
#defineM200_B
#ifdefM200_B
#defineBT_RESET_PIN EXT1_GPIO
(1)
#defineBT_RESET_GPIO (GPIO1_2_GPIO)
#else
#defineBT_RESET_GPIO (GPIO6_2_GPIO)
#defineBT_RESET_PIN EXT1_GPIO(6)
#endif
staticmfp_cfg_tlin2008_wifibt_pins[]={
MFP_WIFI_V18_ENABLE,
MFP_WLAN_RESETN,
WIFI_WAKEUP_HOST,/*wakeuphost*/
};
staticmfp_cfg_tlin2008_wifibt_pins2[]={
MFP_WIFI_V18_ENABLE,
};
staticintwifibt_power_status;
intlin2008_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);
//btneed>5mstoreset
mdelay(5);
gpio_direction_output(BT_RESET_PIN,1);
gpio_direction_output(WLAN_RESET_PIN,1);
wifibt_power_status++;
return0;
}
wifibt_power_status++;
return1;
}
intlin2008_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);
return0;
}
return1;
}
3,以太网接口的创建
这里在android平台上要做特殊的处理,也就是firmware的位置要放好,否则加载firmware始终不成功,那么以太网接口就不会被创建了;
需要把helper_sd.bin放在/lib/firmware/mrvl下面(若没有,则创建一个);
把sd8686.bin放在/lib/firmware/mrvl下面(同上);
4,特殊的处理
对于8686模块需要做特殊的处理,在注册完以太网接口以后,需要添加下面这段话:
{
#defineBCA_CFG_NUM_OF_MODES 4
#defineBCA_CFG_SINGLE_ANT_WITH_COEX 0
#defineBCA_CFG_DUAL_ANT_WITH_COEX 1
#defineBCA_CFG_SINGLE_ANT_FOR_BT_ONLY 2
#defineBCA_CFG_MRVL_DEFAULT 3
#defineBCA_CONFIGBCA_CFG_SINGLE_ANT_WITH_COEX
staticu32BCACfgTbl[BCA_CFG_NUM_OF_MODES][3]={
//0xA5F0, 0xA58C,0xA5A0
{0xa027181c,0x40214,0xd24d},//Mode0:
SingleANTwithCOEXenable
{0xa027181c,0x40211,0xd24d},//Mode1:
DualANTwithCOEXenable
{0xa027181c,0x40222,0xd21c},//Mode2:
singleANTforBTonly
{0xa027801d,0x18000,0xd21c},//Mode3:
Marvelldefault
};
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等。
测试步骤:
ifconfigeth0up
iwlisteth0scanning
如果能扫描到AP那么证明基本已经OK了;
iwconfigeth0
iwlisteth0freq
可以查看设备的相关信息,查看各项是否正常。
现在,就可以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,一切正常,但是调用iwlisteth0scanning的时候,扫描不到任何结果,出现NOscanresults?
这时候需要做特殊的处理,比如共存代码的设置,是否正常等,通常可以判断有没有中断上来,以此区分到底是模块和cpu的连接问题还是模块本身的设置问题;
4,工作一段时间后不正常
这个有可能是蓝牙模块需要进行初始化,因为它们是共用天线,有时候不起蓝牙模块对应的40M时钟就不起来;
本人参照:
此博客而移植成功的。
在此感谢wylhistory!
linux--嵌入式linux下wifi无线网卡驱动
插入模块驱动
[root@WEIYANwifi]$insmodzd1211rw.ko
usb1-1:
resetfullspeedUSBdeviceusings3c2410-ohciandaddress3
zd1211rw1-1:
1.0:
phy2
usbcore:
registerednewinterfacedriverzd1211rw
打开无线网卡
[root@WEIYANwifi]$ifconfigwlan0up
zd1211rw1-1:
1.0:
firmwareversion4725
zd1211rw1-1:
1.0:
zd1211bchip0ace:
1215v4810full00-1d-0fUW2453_RFpa0-7---
扫描频道
[root@WEIYANwifi]$./wftools/iwlistwlan0scanning
wlan0 Scancompleted:
Cell01-Address:
00:
0E:
4E:
81:
02:
4D
ESSID:
"WEIYAN"
Mode:
Master
Channel:
6
Frequency:
2.437GHz(Channel6)
Quality=11/100 Signallevel=62/100
Encryptionkey:
off
BitRates:
1Mb/s;2Mb/s;5.5Mb/s;11Mb/s
Extra:
tsf=00000000004c3c37
设置essid和无线网卡ip地址,并关闭原来的dm9000
[root@WEIYANwifi]$./wftools/iwconfigwlan0essidWEIYAN
[root@WEIYANwifi]$./wftools/iwconfigwlan0192.168.1.100
[root@WEIYANwifi]$ifconfigeth0down
测试与路由的连通性
[root@WEIYANwifi]$ping192.168.1.254
PING192.168.1.254(192.168.1.254):
56databytes
64bytesfrom192.168.1.254:
seq=0ttl=255time=10.997ms
64bytesfrom192.168.1.254:
seq=1ttl=255time=4.399ms
64bytesfrom192.168.1.254:
seq=2ttl=255time=3.915ms
通过无线网卡的nfs挂载测试
[root@WEIYANwifi]$mount-tnfs-onolock192.168.1.108:
/new_disk/tftp//mnt
[root@WEIYANwifi]$ls/mnt
1.mp3 g_file_storage.ko mplayer tslib.tar.gz
2.mpg gspca.ko mplayer_no_v4l u-boot.bin
3.wav led_drv.ko rootfs.jffs2 uImage
abxtest madplay rootfs.yaffs2
通过无线网卡播放mp3
[root@WEIYANwifi]$/opt/madplay/mnt/1.mp3
MPEGAudioDecoder0.15.2(beta)-Copyright(C)2000-2004RobertLeslieetal.
UDA1341:
audio_set_dsp_speed:
44100prescaler:
99
Title:
05.ForeverLove
192k
Artist:
王力宏
Orchestra:
CoUDA1341:
audio_set_dsp_speed:
22050prescaler:
231
nductor:
Lyricist:
Album:
心中的日月
Track:
05
Year:
2004
Publisher:
Genre:
Pop
Station:
Comment:
清晰
1039framesdecoded(0:
00:
27.1),+0.8dBpeakamplitude,40clippedsamples
通过无线网卡播放视频
[root@WEIYANwifi]$/opt/mplayer/mnt/2.mpg-acmad
MPlayer1.0rc2-3.4.1(C)2000-2007MPlayerTeam
CPU:
ARM
Playing/mnt/2.mpg.
MPEG-PSfileformatdetected.
VIDEO:
MPEG1 384x288 (aspect1) 29.970fps 1638.4kbps(204.8kbyte/s)
==========================================================================
Openingvideodecoder:
[mpegpes]MPEG1/2Videopassthrough
A:
25.9V:
26.1A-V:
-0.149ct:
1.128782/78279%47%17.5%4280
Exiting...(Endoffile)