红联Linux门户
Linux帮助

zd1211在Ubuntu LTS上的master mode的实现

发布时间:2015-04-27 10:53:27来源:blog.163.com/monk...popo作者:linux人

手上有一个 tiscali 的USB网卡,即大名鼎鼎的”神卡”,这个卡除了能作为一般的b/g无线网卡之外,还能设置成软AP。

zd1211rw:

Ubuntu LTS内含了zd1211的驱动,称为 zd1211rw。这个驱动并不是由厂家提供的,而是一个rewrite的驱动。

rw的驱动在linux 2.1.18-rc1之后就内置了,一般的用户可以无须自己去找驱动,就能用上 zd1211或 zd1211b的无线网卡。但是,rw版本的驱动程序不再提供对AP功能的支持,当使用 sudo iwconfig wlan0 mode master 指令时,报错:

Error for wireless request "Set Mode" (8B06) :
SET failed on device wlan0 ; Invalid argument.

查阅 ubuntu的文档 (https://help.ubuntu.com/community/WifiDocs/MasterMode) ,里面有提及如何实现 zd1211的master mode 的建议: 使用VendorBasedDriver。

VendorBasedDriver:

要使用VendorBasedDriver,需要找到一个合适版本的驱动源码,重新编译加载。按图索骥,从ubuntu document上,首先就找到

http://zd1211.wiki.sourceforge.net/VendorBasedDriver 。

实际上这个版本并不能解决问题,甚至连编译都不能完成。有兴趣的朋友可以试试。

因为这个版本不能成功编译,我只能继续在网上寻找,找到一个更新的zd1211源代码。

http://code.google.com/p/open1211/ 上提供了很新的zd1211源码,据称其代码能完成在 2.6.33上的编译。但是随代码并没有提供完整的说明,我这样的新人仍然没法成功编译从open1211上获得的源码,又一次失败。

编译失败的原因,估计是因为linux内核版本的提高,使源码对内核的声明、引用等不再适用而引起,为了解决这个问题,我改变了在google上的搜索方式,尝试在Linux论坛上寻找解决方法。

http://www.mail-archive.com/zd1211-devs@lists.sourceforge.net/msg01760.html

在这上面有关于 zd1211 在linux 2.6.31上编译失败的讨论。从这里算是找到了问题的基本的解决方法。顺便一提的是,这个地址被墙了,要翻一下才能看到的。

因为讨论还是挺长篇的,我就不复制上来了,找关键的地方说。

Hin-Tak Leung(看名字好像是一位香港人)对 zd1211的源码做了patch。要实现zd1211在高版本的Linux内核上编译,就需要对旧版本的源码进行 Patch。 Hin-Tak Leung一共做了2个版本的Patch: ar2524-3.0.0.56 和 zd1211-2.22.0 。ar2524是zd1211的一个衍生版本,同样是使用 ZyDAS zd1211芯片,因此驱动程序是可以互通的。

我们可以在 http://htl10.users.sourceforge.net/patchsets/ 上下载对应版本的patchset。在 http://www.kernel.org/pub/linux/kernel/people/mcgrof/zd1211/ 上能下载ar2524-3.0.0.56的驱动源码。可惜我找不到 ZD1211LnxDrv_2_22_0_0的驱动。

编译:

首先要确定自己的linux的版本:uname -r ,然后

apt-cache search linux-source:

jx@jx-laptop:~$ apt-cache search linux-source
linux-source - Linux kernel source with Ubuntu patches
linux-source-2.6.32 - Linux kernel source for version 2.6.32 with Ubuntu patches

下载安装内核源代码

sudo apt-get install linux-source-2.6.32  
用apt-get 这个下载不了,后来在ubunto官网下载了 linux-source-2.6.32_2.6.32-22.36_all.deb

sudo ipkg -i linux-source-2.6.32_2.6.32-22.36_all.deb

cd /usr/src
sudo tar jxvf linux-source-2.6.32.tar.bz2
生成文件夹  linux-source-2.6.32

把下载获得的 ar2524-3.0.0.56 和对应的patch解压缩,并用 pacth 命令进行源码patch,如
patch <  0001-xxxx 这样。记得要在 src文件夹里面进行patch操作,不然会出错。Patch一共有11个,从0001到0012,其中 0004是坏的。据说是0004原本太大了,被分拆了。有兴趣的朋友可以自己搜索一下。
Patch之后,准备工作基本上就完成了,为了确认网卡是不是在ar2524的支持范围里面,我要检查一下。
插入网卡,然后lsusb,看看网卡的ID:
Bus 001 Device 008: ID 0ace:1211 ZyDAS 802.11bg

记下 Id后面信息: 0ace 1211 (每个人的网卡可能都会不一样的)。
然后进入 srv文件夹, vi zdusb.c ,找到
/* table of devices that work with this driver */
static struct usb_device_id zd1211_ids [] = {
#ifdef ZD1211B
{ USB_DEVICE(VENDOR_ZYDAS, 0x1215) },
{ USB_DEVICE(VENDOR_ZYDAS, 0xA215) },
#if ZDCONF_FULL_IDS == 1
{ USB_DEVICE(0x0053, 0x5301) },
{ USB_DEVICE(0x0053, 0x5302) },
{ USB_DEVICE(0x2019, 0x5303) }, //Add, 2006.04.17
{ USB_DEVICE(0x0471, 0x1236) },
{ USB_DEVICE(0x050D, 0x4050) },
{ USB_DEVICE(0x050D, 0x705C) },
{ USB_DEVICE(0x0586, 0x340F) },
/* table of devices that work with this driver */

static struct usb_device_id zd1211_ids [] = {

#ifdef ZD1211B

{ USB_DEVICE(VENDOR_ZYDAS, 0x1215) },

{ USB_DEVICE(VENDOR_ZYDAS, 0xA215) },

#if ZDCONF_FULL_IDS == 1

{ USB_DEVICE(0x0053, 0x5301) },

{ USB_DEVICE(0x0053, 0x5302) },

{ USB_DEVICE(0x2019, 0x5303) }, //Add, 2006.04.17

{ USB_DEVICE(0x0471, 0x1236) },

{ USB_DEVICE(0x050D, 0x4050) },

{ USB_DEVICE(0x050D, 0x705C) },

{ USB_DEVICE(0x0586, 0x340F) },

{ USB_DEVICE(0x079B, 0x0062) },

{ USB_DEVICE(0x083A, 0x4505) },

{ USB_DEVICE(0x083A, 0xE501) },

{ USB_DEVICE(0x0BAF, 0x0121) },

{ USB_DEVICE(0x0CDE, 0x001A) },

{ USB_DEVICE(0x0DF6, 0x9075) },

{ USB_DEVICE(0x0F88, 0x3014) },

{ USB_DEVICE(0x079B, 0x0062) },
{ USB_DEVICE(0x083A, 0x4505) },
{ USB_DEVICE(0x083A, 0xE501) },
{ USB_DEVICE(0x0BAF, 0x0121) },
{ USB_DEVICE(0x0CDE, 0x001A) },
{ USB_DEVICE(0x0DF6, 0x9075) },
{ USB_DEVICE(0x0F88, 0x3014) },
{ USB_DEVICE(0x1233, 0x0471) }, /* vid<->pid reversed typo for earlier Philip USB stick? */
{ USB_DEVICE(0x1582, 0x6003) },
{ USB_DEVICE(0x04bb, 0x0938) },
#endif
#elif defined(ZD1211)
{ USB_DEVICE(VENDOR_ZYDAS, PRODUCT_1211) },
{ USB_DEVICE(VENDOR_ZYDAS, PRODUCT_A211) },
#if ZDCONF_FULL_IDS == 1
{ USB_DEVICE(VENDOR_ZYXEL, PRODUCT_G220) },
{ USB_DEVICE(VENDOR_3COM,  PRODUCT_A727) },
{ USB_DEVICE(0x2019, 0xc008) },
{ USB_DEVICE(0x2019, 0xc009) },
{ USB_DEVICE(0x079b, 0x004a) },
{ USB_DEVICE(0x07b8, 0x6001) },
{ USB_DEVICE(0x0b3b, 0x1630) },
{ USB_DEVICE(0x0b3b, 0x5630) },
{ USB_DEVICE(0x0b3b, 0x6630) },
{ USB_DEVICE(0x0cde, 0x0011) },
{ USB_DEVICE(0x0df6, 0x9071) },
{ USB_DEVICE(0x126f, 0xa006) },
{ USB_DEVICE(0x129b, 0x1666) },
{ USB_DEVICE(0x1435, 0x0711) },
{ USB_DEVICE(0x0DF6, 0x9071) },
{ USB_DEVICE(0x0105, 0x145F) },
{ USB_DEVICE(0x0ace, 0x1211) },
#endif

#endif

看看你的网卡的ID是不是在里面,如果没有,加进去。加进去的时候要区分: zd1211b和zd1211是不同的,要看清楚再加。修改完,保存,退出。

编译前还有一个工作要做(其实也可以在编译后做),就把原本的zd1211rw给blacklist了:
 sudo vi /etc/modprobe.d/blacklist.conf ,在最后加入 blacklist zd1211rw 。接着sudo rm  /lib/firmware/zd1211/zd* ,把 zd1211rw的firmware也删掉。当然,最好先备份一下,以免以后后悔了。
blacklist之后,reboot一下。

OK,可以编译了:
在 ar2524drv 文件夹下运行:

sudo make

期间有大量 warning,直接忽略吧。。。眼不见为干净。

记住要用sudo make,不要就make,不然还要手工进行安装 zd1211.ko等等。完了?完了。插卡吧。

Dmesg:

[  183.789784] usb 1-1: new high speed USB device using ehci_hcd and address 2
[  183.967465] usb 1-1: configuration #1 chosen from 1 choice
[  183.998424]
[  183.998442]  _____ _________
[  183.998453] |__  /   _|  _ \  / \  / ___|
[  183.998495]   / / | | | | | |/ _ \ \___ \
[  183.998506]  / /| |_| | |_| / ___ \ ___) |
[  183.998517] /____\__, |____/_/   \_\____/
[  183.998526]  |___/
[  183.998538] zd1211 - version 3.0.0.56
[  184.000173] vendor_id = 0ace
[  184.000195] product_id = 1211
[  184.000219] USB 2.0 Host
[  184.001956] Release Ver = 4330
[  184.002434] EEPORM Ver = 4330
[  184.015447] Finsih download Firmware. Ready to reboot
[  184.301238] PA type: 0
[  184.305927] RFMD RF
[  184.781297] Overwrite CR47 = 0x1E
[  184.861737] zd1205_config: EEP(HWFeature)=0x110
[  184.868787] AllowedChannel = 000107ff
[  184.868852] Region:16
[  185.980995] usbcore: registered new interface driver zd1211

由于每个人的网卡不一样,这里面可能有些信息会不相同。
到现在,网卡的编译和加载就完成了。但是因为编译过程是有很多warning的,不知道驱动能不能用。
用 iwconfig 看看:

jx@jx-laptop:~$ iwconfig
lono wireless extensions.
eth0  no wireless extensions.
ppp0  no wireless extensions.
ath0  802.11b/g NIC  ESSID:"" 
Mode:Managed  Frequency=2.462 GHz  Access Point: Not-Associated  
Bit Rate:0 kb/s  
Retry:on   RTS thr=9999 B   Fragment thr:off
Power Management:off
Link Quality:0  Signal level:0  Noise level:0
Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
Tx excessive retries:0  Invalid misc:3   Missed beacon:0

很好,貌似加载正常。关键的是要试试 master mode,如果不行,就白忙了:
jx@jx-laptop:~$ sudo ifconfig ath0 192.168.1.1 up
jx@jx-laptop:~$ sudo iwconfig ath0 mode master
jx@jx-laptop:~$

用无线网卡搜索一下,能找到一个很奇怪名字的接入点。嘿,成功了!
还有,没完呢!还没验证,还没完全把AP配好。不过,至少master mode 能实现了。
BTW:还是想找一个能把warning都解决了的方法。