目前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的驱动。