今天先記錄移植官方下載的RT5370驅動程序源碼。內核自帶的驅動的配置方法放到以後的文章中!
一、移植官方下載的驅動程序源碼
***軟件環境:***虛擬機ubuntu12.04
硬件環境: IMX6Q單板 RT5370wifi芯片
先説一下思路:當我們需要移植一個驅動程序的時候,大概有兩種移植的情況:移植內核自帶的驅動程序,移植非內核自帶的驅動程序
這裏先説移植非內核自帶的驅動程序的思路:首先要看源程序的README文件,看別人説的是如何修改與配置。然後一定會修改的文件是Makefile文件(主要是指定編譯工具,內核樹,單板信息等),然後有可能還會需要修改其他配置文件(這與具體的驅動程序有關)。
1. 首先下載驅動程
下載好的驅動程序放到Linux系統,解壓,打開README_STA_usb文件:
=======================================================================
Build Instructions:
====================
1> $tar -xvzf DPB_RT2870_Linux_STA_x.x.x.x.tgz
go to "./DPB_RT2870_Linux_STA_x.x.x.x" directory.
2> In Makefile
set the "MODE = STA" in Makefile and chose the TARGET to Linux by set "TARGET = LINUX"
define the linux kernel source include file path LINUX_SRC
modify to meet your need.
3> In os/linux/config.mk
define the GCC and LD of the target machine
define the compiler flags CFLAGS
modify to meet your need.
** Build for being controlled by NetworkManager or wpa_supplicant wext functions
Please set 'HAS_WPA_SUPPLICANT=y' and 'HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y'.
=> #>cd wpa_supplicant-x.x
=> #>./wpa_supplicant -Dwext -ira0 -c wpa_supplicant.conf -d
** Build for being controlled by WpaSupplicant with Ralink Driver
Please set 'HAS_WPA_SUPPLICANT=y' and 'HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n'.
=> #>cd wpa_supplicant-0.5.7
=> #>./wpa_supplicant -Dralink -ira0 -c wpa_supplicant.conf -d
4> $make
# compile driver source code
# To fix "error: too few arguments to function ˉiwe_stream_add_event"
=> $patch -i os/linux/sta_ioctl.c.patch os/linux/sta_ioctl.c
5> $cp RT2870STA.dat /etc/Wireless/RT2870STA/RT2870STA.dat
6> load driver, go to "os/linux/" directory.
#[kernel 2.4]
# $/sbin/insmod rt2870sta.o
# $/sbin/ifconfig ra0 inet YOUR_IP up
#[kernel 2.6]
# $/sbin/insmod rt2870sta.ko
# $/sbin/ifconfig ra0 inet YOUR_IP up
7> unload driver
$/sbin/ifconfig ra0 down
$/sbin/rmmod rt2870sta
在README_STA_usb文件中找到上述內容,上述內容就是告訴你如何修改編譯驅動程序的。
那麼我們就根據上述7條內容來執行:
(1)解壓
(2)修改Makefile:
打開源代碼程序Makefile,發現MODE = STA TARGET = LINUX 已經是與要求的一樣了,那麼這兩個地方就不用修改!!!
然後找到PLATFORM = SMDK 將它的註釋去掉,用的平台是SMDK,同時註釋掉本身設置的PLATFORM = PC 這句話。
找到:
ifeq ($(PLATFORM),SMDK)
LINUX_SRC = /home/bhushan/itcenter/may28/linux-2.6-samsung
CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-
endif
修改為:
ifeq ($(PLATFORM),SMDK)
LINUX_SRC = /home/zsl/work/system/linux-3.0.35
CROSS_COMPILE = /home/zsl/work/system/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-
endif
#其中LINUX_SRC代表我們開發板使用的Linux操作系統的內核目錄 #
#CROSS_COMPILE代表我們編譯內核用的編譯工具的目錄#
(3)修改os/linux/config.mk
根據文檔:
define the GCC and LD of the target machine
define the compiler flags CFLAGS
查看config.mk發現如下:
CC := $(CROSS_COMPILE)gcc
LD := $(CROSS_COMPILE)ld
$(CROSS_COMPILE)這個是變量引用,在Makefile中這個變量就代表:/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-
所以在這裏就不需要修改!!!
然後找到:
# Support AP-Client function
HAS_APCLI=n
# Support Wpa_Supplicant
HAS_WPA_SUPPLICANT=n
# Support Native WpaSupplicant for Network Maganger
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n
把這幾個值的n全部變成y:
# Support AP-Client function
HAS_APCLI=y
# Support Wpa_Supplicant
HAS_WPA_SUPPLICANT=y
# Support Native WpaSupplicant for Network Maganger
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y
然後文檔中還有説關於wpa_supplicant的操作與使用放到下一篇文章講解!
(4)make
編譯源碼程序,會在os/linux/目錄下生成rt5370sta.ko驅動模塊程序!!!
(5)load driver
裝載驅動程序。裝載驅動程序之前需要
將/os/linux/目錄下的rt5370sta.ko拷貝到開發板上,並將驅動根目錄下的RT2870STA.dat拷貝到開發板的/etc/Wireless/RT2870STA/目錄下,前提是需要自己手動創建/etc/Wireless/RT2870STA/目錄
然後裝載驅動程序
insmod rt5370sta.ko
我的出現如下錯誤:
rt5370sta: Unknown symbol usb_alloc_urb (err 0)
rt5370sta: Unknown symbol usb_free_urb (err 0)
rt5370sta: Unknown symbol usb_alloc_coherent (err 0)
rt5370sta: Unknown symbol usb_register_driver (err 0)
rt5370sta: Unknown symbol usb_put_dev (err 0)
rt5370sta: Unknown symbol usb_get_dev (err 0)
rt5370sta: Unknown symbol usb_submit_urb (err 0)
rt5370sta: Unknown symbol usb_free_coherent (err 0)
rt5370sta: Unknown symbol usb_control_msg (err 0)
rt5370sta: Unknown symbol usb_deregister (err 0)
rt5370sta: Unknown symbol usb_kill_urb (err 0)
insmod: error inserting 'rt5370sta.ko': -1 Unknown symbol in module
這些錯誤都是那些函數無符號,至於為什麼無符號,我查了一下,有可能是沒有聲明GPL協議,需要更改os/linux下的usb_main_dev.c文件,在開頭的地方寫上:
MODULE_LICENSE("GPL");
然後make 重新編譯源碼程序!!!編譯成功
重新加載驅動程序:
insmod rt5370sta.ko
顯示裝載成功!!!
然後我們ifconfig ra0 up
打開ra0後,再ifconfig查看一下:
這説明我們的驅動程序已經可以正常使用了!!!再卸載試一下:
首先:ifconfig ra0 down
然後: rmmod rt5370sta.ko
可以看出,我們的WIFI驅動程序可以正常使用與卸載!!!
那麼接下來的README_STA_usb 文檔中的內容是介紹如何操作使用wpa_supplicant。
這裏説一下wpa_supplicant
wpa_supplicant主要是用來支持WEP,WPA/WPA2和WAPI無線協議和加密認證的,由於linux本身並不支持WPA的加密,所以需要移植wpa_supplicant來使wifi能夠連接WPA加密的無線路由上,簡單的説,wpa_supplicant就是WiFi驅動和用户的中轉站外加對協議和加密認證的支持。