Archive

Posts Tagged ‘driver’

編譯 ZD1211 無線網卡驅動

十一月 19th, 2007

關於如何編譯 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
$ cd /usr/src
$ sudo tar -xjvf linux-source-2.6.22.tar.bz2

拷貝 kernel 設定檔(.config) 至 linux source
$ sudo cp linux-headers-2.6.22-14-generic/.config linux-source-2.6.22

編輯 zd_usb.c 加入新 USB ID,可利用 lsusb 指令可以找出網卡的 ID,如:2019:5303
$ cd linux-source-2.6.22
$ sudo vim drivers/net/wireless/zd1211rw/zd_usb.c
在檔案開頭不遠處可以看到一堆 USB ID 號碼,就是要加進這裡面,GW-US54GXS 是 ZD1211B 晶片,所以在 ZD1211B 下方增加一行:
/* ZD1211B */
{ USB_DEVICE(0x2019, 0x5303), .driver_info = DEVICE_ZD1211B },
確認後就存檔離開

開始編譯驅動
$ sudo mkdir .tmp_versions
$ sudo make drivers/net/wireless/zd1211rw/zd1211rw.ko

沒錯誤就會產生 zd1211rw.ko,將它覆蓋原本系統中的
$ sudo cp drivers/net/wireless/zd1211rw/zd1211rw.ko /lib/modules/`uname -r`/kernel/drivers/net/wireless/zd1211rw
$ sudo depmod -a

重開機應該就可以正確驅動了:D

參考資料:
Adding new device IDs to zd1211rw

Linux, Other, 硬體筆記 , , ,

Linux 自動配置主設備號

九月 9th, 2007

在撰寫 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/sh
module = "LED" // /proc/device 顯示的名稱
device = "LED" // /dev 要建立的設備檔名稱

major=`cat /proc/devices | awk "\\$2==\"$module\" {print \\$1}"`
mknod /dev/$device c $major 0 //建立字元設備

然後只要將這個 script 檔案設成啟動時執行就可以囉!

Embedded, Linux , ,