陳侃松+邵沖+張丹+張滿意+何林桂
摘 要:針對當下比較通用的USB_WiFi無線通信芯片在嵌入式系統開發應用中的具體要求,分析 Linux系統下基于ARM9處理芯片S3C2440 的USB_ WiFi驅動程序。結合 S3C2440與AR9271的接口電路設計、USB_WiFi驅動程序體系結構移植了USB無線設備驅動,并分析了數據傳輸的具體過程。根據實驗結論,該WiFi驅動程序能夠實現預期目標,并可用于應用系統的開發。
關鍵詞:WiFi無線通信;Linux;S3C2440;驅動程序;無線網絡設備
中圖分類號:TP393 文獻標識碼:A 文章編號:2095-1302(2015)05-00-02
0 引 言
隨著科技的進步, 基于802.11系列協議的WiFi無線保真通信技術迅猛發展,使得WiFi技術能夠應用在多種不同的嵌入式設備上,并方便的連接運營商提供的接入點。WiFi與其他無線通信技術相比, 擁有組網靈活,數據傳輸速度快,傳輸距離遠的特性。在已部署WiFi網絡的范圍內搭建WSN網絡非常靈活而且組網成本不高。
1 WiFi技術和平臺介紹
1.1 硬件平臺總體設計
如圖1所示,能達到本文需求的無線傳輸系統由S3C2440控制器、WiFi無線網卡和上位機組成。測試系統將輸入的數據傳輸給中心處理芯片S3C2440,S3C2440將得到的數據儲存到存儲器,并對數據進行處理,然后由USB接口將封裝的數據通過WiFi網絡建立起的無線通信鏈路,傳送到遠端上位機。
圖 1 硬件平臺設計圖
1.2 USB接口電路設計
S3C2440處理器通過USB接口與Atheros AR9271無線網卡的USB接口連接,實現數據的傳輸和接收。其中,數據的發送端是S3C2440。針對設備對系統資源需求的不同,在USB規范中規定了4種不同的數據傳輸方式,這里使用實時傳輸方式。這種傳輸方式可以連續不斷地在S3C2440與USB設備之間傳輸數據。S3C2440的DN0、DP0引腳分別與AR9271的DM、DP引腳相連接;DN與DP輸出的是一對差分信號。
2 WiFi驅動程序移植
2.1 WiFi驅動體系結構
AR9271無線網卡正常工作所需要的驅動程序主要包括兩部分:WLAN驅動和USB接口驅動。WLAN驅動的作用在整個數據接收和傳輸的過程中非常重要,它既要接收從應用層傳來的數據,把數據從USB接口轉發到S3C2440平臺;又要響應S3C2440平臺傳過來的中斷,借助USB驅動程序注冊的接口函數,讀取硬件緩沖區的數據流,傳遞數據到應用層。內核啟動后,會自動加載AR9271的固件htc_9271.fw,它在S3C2440平臺根文件系統的/lib/firmware目錄下。它的主要作用是控制WiFi硬件上的接口,完成802.11數據幀和802.3數據幀之間的轉換和實現數據緩沖。由此可見, WiFi無線網卡設備在Linux中是被當作一般的以太網設備來識別。
2.2 USB接口驅動分析
USB接口初始化函數由ath9k_hif_usb_init入口,ath9k_hif_usb_exit出口。ath9k_hif_usb_init所做的工作,就是通過usb_register函數將ath9k_hif_usb驅動掛入到內核USB驅動鏈中。
ath9k_hif_usb_probe函數是最重要的,主要用于設備的探測以及所需內核資源的初始化。ath9k_hif_usb_suspend和ath9k_hif_usb_resume主要是處理電源管理相關工作,如收到suspend時以怎樣的低功耗工作,以及resume如何恢復等。
ath9k_hif_usb_disconnect是當USB設備從系統中移除之后會調用的接口。rtusb_usb_id是驅動支持的USB設備ID。
ath9k_hif_usb_driver結構體初始化時向內核注冊完之后,驅動就會掃描USB總線,查找是否有此驅動相應的設備在總線上,如果有設備,就會調用probe函數;或者驅動初始化后,再把設備插到系統上,此時也會從USB總線的中斷觸發到ath9k_hif_usb_driver的probe函數。兩種調用的觸發方式不同。
2.3 無線網卡驅動分析
2.3.1 Probe函數分析
ath9k_hif_usb_driver中的probe函數作用是測試當前驅動是否支持接入的USB設備。如果支持該USB設備,則調用interface_to_usbdev()函數先獲取該接口的信息,再讓udev結構體指針指向這段信息,使用kzalloc()函數為該USB設備分配空間,用hif_device_usb *hif_dev指針接收。然后把設備信息、接口信息、設備ID賦值給分配的USB設備:
hif_dev->udev = udev;
hif_dev->interface = interface;
hif_dev->usb_device_id = id;
接著probe 函數調用 usb_set_intfdata(struct usb_interface *intf, void *data)函數,這個函數的第一個參數是通過probe函數接收的要支持USB設備接口的數據結構的指針,第二個參數是內核中自己分配的描述該USB設備的結構體指針。 這個函數主要的作用是把接口和本驅動要用到的USB設備結構體建立連接。通過probe(struct usb_interface *interface,const struct usb_device_id *id)函數和上面一系列的分析我們可以看出來,一個設備對應一個驅動。
在這一系列工作完成后,通過init_completion(&hif_dev->fw_done)函數把它放入等待隊列,等待加載與之相對應的固件。
2.3.2 數據的傳輸
USB無線網卡與其它接口無線網卡不一樣的地方是,USB無線網卡是ath9k_hif_usb_rx_cb()函數通過查詢來確定是否需要讀取數據,而不是使用中斷方式。當USB設備需要傳輸數據給其它無線設備時,ath9k_hif_usb_alloc_rx_urbs()函數會分配一個URB結構體,然后由ath9k_hif_usb_rx_cb()函數向USB核心發送一個讀請求,以便它能夠及時響應。當準備發送數據時,802.11協議層會構造并填充kb_buff結構體來描述將要發送的數據包,并調用hif_usb_send()函數來發送該數據包;這個函數的另一個作用是根據數據包的長度把它分割成USB設備能夠傳輸的長度,然后構造寫請求URB,再發送到USB核心,當USB設備從系統中移除后,就會調用ath9k_hif_usb_disconnect()函數,釋放已經分配的系統資源,注銷該設備。
3 結 語
作為目前無線網絡應用最廣泛的技術,在S3C2440平臺上WiFi驅動的移植非常具有實際意義。本文分析移植了基于Linux系統的USB接口WiFi驅動程序的具體過程,且測試可用。這為其他的嵌入式平臺WiFi驅動提供了參考。
參考文獻
[1]劉欣.基于物聯網的遠程家庭監健康控監護系統網絡的研究[D].北京: 北京郵電大學, 2011.
[2] Rajesh N, H Sarojadevi. Emerging Trends in Video Surveillance Applications[C]. Proceedings of International Conference on Software and Computer Applications, 2011:220-224.
[3]馮麗芳,孫俊,周俊華,等. 基于ARM9的網絡視頻監控系統實現[J].電力自動化設備,2010,26(10):95-97.
[4]李霏,王讓定,徐霽.基于嵌入式Linux的多路視頻監控系統的設計[J].寧波大學學報,2007,20(2): 151-154.
[5]楊望,宋牟平,陳鵬.嵌入式網絡實時視頻監控系統的設計[J].江南大學學報,2008,7(5):516-520.