歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> zd1211 在Ubuntu 10.04 LTS上的 master mode 的實現

zd1211 在Ubuntu 10.04 LTS上的 master mode 的實現

日期:2017/2/28 16:34:31   编辑:Linux教程

手上有一個 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/[email protected]/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個,從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
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都解決了的方法。。。
Copyright © Linux教程網 All Rights Reserved