目前sourceforge網站上提供了Linux 2.6.18版本核心的sdiostack補丁,使用此補丁後可以編譯出供Atheros SDIO wifi v1.0模組使用的驅動。
首先選擇工作目錄(例如目前使用者的個人目錄/home/~),此後的操作都在此目錄下進行。下面以Samsung S3C2410平台為例介紹驅動編譯過程,使用的交叉編譯工具為arm-linux-gcc v3.4.6。
1. 下載核心壓縮包並解壓。
tar zxvf linux-2.6.18.tar.gz
2. 下載sdiostack驅動並解壓至核心源碼目錄,補丁包含5個patch檔案和1個series檔案,按照series檔案中的順序依次打補丁。
tar zxvf sdio-linux-2.6.18.tar.gz -C linux-2.6.18/
cd linux-2.6.18/
patch -p1 < common_atheros_sdiostack.patch
patch -p1 < common_atheros_sdiostack_shcd.patch
patch -p1 < common_atheros_sdiostack_functions.patch
patch -p1 < common_atheros_sdiostack_sample_fd.patch
patch -p1 < common_atheros_sdiostack_benchmark.patch
patch -p1 < common_atheros_sdiostack_ar6000_wlan.patch
3. 可以從配置路徑拷貝s3c2410配置模板後再對其修改。
cp arch/arm/configs/s3c2410_defconfig .config
需要開啟Device Drivers-->Plug and Play support-->Plug and Play support選項支援PnP。
需要開啟Device Drivers-->Network device support-->Wireless LAN (non-hamradio)--> Wireless LAN drivers (non-hamradio) & Wireless Extensions選項,否則無法找到wireless_send_event函數定義。
make menuconfig
4. drivers/pnp/resource.c中的request_dma和free_dma函數需要刪除,不然在稍後的編譯中會造成缺少定義的錯誤(我始終未能讓resource.c成功的找到這兩個相關的dma函數實現,最後只能注釋掉了,如果有瞭解的朋友,希望能告訴我正確的做法)。然後開始核心編譯操作。
make
5. 最後在drivers/sdio/對應目錄下產生驅動各個模組。sdiostack補丁中只提供了很少幾種平台的hcd模組代碼,如果缺少對應目標平台的代碼,還需要自己移植。以下4個模組為必須的最小配置。
lib/sdio_lib.ko
busdriver/sdio_busdriver.ko
function/wlan/ar6000/ar6000.ko
hcd/s3c2412/sdio_s3c2410_hcd.ko
注意:編譯sdiostack驅動時使用的核心版本需要和目標平台上的核心版本一致,如果不是2.6.18版本的核心,在打補丁過程中可能會有提示資訊,可以根據提示資訊手工修改。不同平台的核心配置選項也會有所不同,可能需要對配置做少許調整。一般來說,補丁中包含的hcd模組代碼不能滿足需要,所以要想最終能使用SDIO WIFI網卡,最困難的地方在於如何擷取缺少的這一部分的代碼。MontaVista也提供了一個補丁下載,我沒有用過這個補丁,但是其中包含的sdiostack文檔是很好的資料。如果希望使用Atheros SDIO wifi v2.0,可以看看openmoko補丁。下一步,我將嘗試編譯wifi v2.0的驅動。