十一月19

編譯 ZD1211 無線網卡驅動

關於如何編譯 ZD1211/ZD1211B 晶片的 USB 無線網卡 driver,經常在各大討論區及 BBS 看到有人提出相同的問題,因此來寫個教學。
前往 ZD1211 專案網站可以知道目前有三種版本的驅動,其中建議使用 zd1211rw 這個版本,因為它持續在更新且已納入 Linux 2.6.18 以後的 kernel 裡。zd1211rw 支援這三種晶片:

ZyDAS ZD1211
ZyDAS ZD1211B
Atheros AR5007UG

不過既然都已經納入 kernel 了為什麼還要編譯驅動?因為還是有很多產品的 USB ID 不能被 zd1211rw 所辨識(我的 PCI GW-US54GXS 就是),當然就沒辦法驅動囉!這篇要做的就是從 kernel 裡的 zd1211rw source code 加入對應的 USB ID,主機環境是 ubuntu 7.10,其他版本應該也差不多。
首先要安裝編譯相關套件 & 下載 linux source
$ sudo apt-get install build-essential kernel-package linux-source
切換至 src 目錄並解開 linux source
$ [...]


九月9

Linux 自動配置主設備號

在撰寫 Linux 設備驅動程式的時候,如果指定主設備號(MAJOR)為 0,就可以利用 alloc_chrdev_region() 函式讓系統自動分配一個可用 MAJOR 給裝置,程式片段:
#define DEV_NAME "LED" //設備名稱int DEV_MAJOR = 0; //主設備號int DEV_MINOR = 0; //次設備號int count = 1;dev_t led_dev;/*  Dynamic assign major */result = alloc_chrdev_region(&led_dev, DEV_MAJOR, count, DEV_NAME);DEV_MAJOR = MAJOR(led_dev);
這樣驅動寫好後載入核心執行,就會分配到一個 MAJOR,可利用 cat /proc/devices 查看,但是如果要存取這個設備,還需要手動用 mknod 在 /dev 建立設備檔,但問題是怎麼知道分配到的設備號碼是什麼?這裡利用一個 shell script 搭配 awk 來達成。
#!/bin/shmodule = "LED" // /proc/device 顯示的名稱device = "LED" // [...]