zd1211 在Ubuntu 10.04 LTS上的 master mode 的实现


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


zd1211rw:

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

rw的驱动在linux 2.1.18-rc1之后就内置了,一般的用户可以无须自己去找驱动,就能用上 zd1211zd1211b的无线网卡。但是,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) ,里面有提及如何实现 zd1211master 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内核上编译,就需要对旧版本的源码进行 PatchHin-Tak Leung一共做了2个版本的Patch: ar2524-3.0.0.56 zd1211-2.22.0 ar2524zd1211的一个衍生版本,同样是使用 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个,从00010012,其中 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是不是在里面,如果没有,加进去。加进去的时候要区分: zd1211bzd1211是不同的,要看清楚再加。修改完,保存,退出。 编译前还有一个工作要做(其实也可以在编译后做),就把原本的zd1211rwblacklist了: sudo vi /etc/modprobe.d/blacklist.conf ,在最后加入 blacklist zd1211rw 。接着sudo rm /lib/firmware/zd1211/zd* ,把 zd1211rwfirmware也删掉。当然,最好先备份一下,以免以后后悔了。 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
lo no 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都解决了的方法。。。

相关内容