隨著Internet的飛速發展,從WAN到MAN,再到LAN,PAN,這些技術已逐漸成熟。目前,各類網絡中增長潛力的是無線網絡,采用無線局域網(WLAN)來拓展現有網絡,獲得在有效區域內部移動接入網絡的能力,是目前網絡應用研究的熱點之一。紅外網絡通信具有無需申請頻率使用權、成本低廉、連接方便、簡單易用和結構緊湊等特點,使之與藍牙、802111(Wi2Fi)一樣,成為三種的短距離無線數據通信的標準。
Linux是目前活力的操作系統之一,其對各類計算機架構的兼容和支持,強健的網絡功能,獨特的自由軟件的特征,近幾年發展勢頭極為迅猛,它的各種商業、非商業的版本,廣泛應用于企業資源管理、嵌入式系統開發、網絡運作等各個領域,基于Linux的各種應用開發成為目前的主流技術之一。
2 IrDA標準簡介
紅外通信是以紅外線作為載體來傳送數據信息的,要使各種設備能夠通過紅外口隨意連接,需有一個統一的軟硬件規范。成立于1993年的紅外線數據協會IrDA(InfraredDataAssociation)初制定的IrDA1.0,簡稱為SIR(SerialI
nfraRed),是基于HP2SIR開發出來的一種異步、半雙工的紅外通信方式,它依托系統中的異步通信收發器(UART),通過對串行數據脈沖的波形壓縮和對所接收的光信號電脈沖的波形擴展這一編碼解碼過程(3ˆ16EnDec)實現紅外數據傳輸,但通信速率只有11512kbˆs。IrDA1.1(也稱FIR,FastInfrared,1996年底推出)由于不依托UART,通信速率可達4Mbˆs,它采用了全新的4×10-6調制解調,即通過分析脈沖的相位來辨別所傳輸的數據信息。目前許多嵌入式處理器中的紅外口兼容了SIR和FIR二種標準,即根據使用時通信速率的選定,自動套用不同的標準。
IrDA標準包括3個基本的規范和協議:紅外物理層規范(IrPHY)、紅外數據鏈路訪問協議(IrLAP)和紅外鏈接管理協議IrLMP。物理層規范制定了紅外通信硬件設計上的目標和要求,IrLAP和IrLMP為二個軟件層,負責對鏈接進行設置、管理和維護。IrLAP是為IrDA設備提供基本鏈接層連接的協議,在HDLC和SDLC基礎上擴充了一些獨特的紅外通訊特性,提供連接制定、數據轉移、流控制等功能,并具有紅外線媒質獨特屬性的附加特點。IrLMP取決于連接的關系和由IrLAP提供的處理特性,它允許多個Ir設備連接,并可運行超過一個以上的IrLAP,解決在搜尋IrLAP中的地址沖突,處理在多個設備中的重復地址并產生新的地址,給出連接操作的信息(IAS)。
3 Linux網絡設備的驅動
由于IrDA不是單純的串口物理通信規范,而是一種網絡傳輸控制標準。Linux必須按網絡設備驅動方法來組織紅外數據的網絡傳輸。Linux網絡驅動程序的體系結構如圖1所示。
3.1 初始化
網絡設備的初始化主要是由device數據結構中的init函數指針所指的初始化函數來完成的,當內核啟動或加載網絡驅動模塊的時候,就會調用初始化過程。首先檢測網絡物理設備是否存在,這是通過檢測物理設備的硬件特征來完成(系統中的紅外串行接口),然后再對設備進行資源配置,隨后構造設備的device數據結構,用檢測到的數值對device中的變量初始化。向Linux內核中注冊該設備并申請內存空間。
3.2 數據包的發送和接收
數據包的發送和接收是實現Linux網絡驅動程序中兩個關鍵的過程。圖1中明確反映了網絡數據包的傳輸過程:首先在網絡設備驅動加載時,通過device域中的init函數指針調用網絡設備的初始化函數對設備進行初始化,如果操作成功就可以通過device域中的open函數指針調用網絡設備的打開函數打開設備,再通過device域中的建立硬件包頭函數指針hard_header來建立硬件包頭信息。通過協議接口層函數dev_queue_xmit來調用device域中的hard_start_xmit函數指針來完成數據包的發送。該函數將把存放在套接字緩沖區中的數據發送到物理設備,該緩沖區是由數據結構sk_buff來表示的。
數據包的接收是通過中斷機制來完成的,當有數據到達時,就產生中斷信號,網絡設備驅動功能層就調用中斷處理程序,該中斷處理的核心工作是數據包的接收,然后網絡協議接口層調用netifrx函數,把接收到的數據包傳輸到網絡協議的上層進行處理。
3.3 實現模式
實現Linux網絡設備驅動功能主要有兩種形式。一是通過內核來進行加載,內核啟動時即加載網絡設備驅動程序,內核啟
動完成后,網絡驅動功能隨之實現;二是通過模塊加載的形式。在此著重對靈活性更強的模塊加載形式進行討論。
模塊設計是Linux中特有的技術,它使Linux內核功能更容易擴展和裁剪,并使各類設備驅動的開發模式化。模塊加載網絡驅動程序的設計步驟是:首先通過模塊加載命令insmod把網絡設備驅動程序插入到內核之中,然后insmod將調用init_module()函數對網絡設備的init函數指針初始化,通過調用register_netdev()函數在Linux系統中注冊該網絡設備。如果成功,再調用init函數指針所指的網絡設備初始化函數對設備初始化,并將設備的device數據結構插入到dev_base鏈表的末尾。通過執行模塊卸載命令rmmod來調用網絡驅動程序中的cleanup_module()函數對網絡驅動程序模塊卸載。具體實現過程如圖2所示。
4 應用實例
下面以在PXA255處理器實現紅外網絡通信的實例,介紹基于Linux開發的流程和實現方法。
4.1 PXA255的紅外通信接口
PXA255是InterlXScale構架系列中的一款CPU,我們使用的IntelPXA250開發板提供了全面的軟硬件開發環境。PXA255處理器提供了對紅外通信的支持,其與紅外口相關的板級寄存器如表1所示。
4.2 紅外口的驅動程序
4.2.1 紅外模塊加載和紅外設備的初始化
把紅外模塊加載到Linux系統網絡設備中,并定義紅外設備的中斷,初始化紅外接口,其實現函數pxa250irdainit的代碼為:
采用中斷進行紅外數據外的接收,數據不易丟失和溢出,實時性更強。任一新的接受數據到達都觸發中斷,其波特率值決定觸發的中斷類型是SIR還是FIR。中斷處理程序首先判斷傳輸中是否出錯,隨后根據LSR中接受數據位的標志DR,將接收數據存入接收緩沖區rxbuff。
當內核要發送一個數據包時,調用pxa250sirtransmit函數(假設采用SIR發送),首先禁止接收,并關閉中斷,隨后根據LSR中發送數據請求位TDRQ狀態,將發送緩沖區txbuff中數據逐一發送。
紅外口網絡應用的開發與常規網絡設備的應用極為相似,采用套接字,建立通信雙方的虛擬連接。支持IrDA的Socket稱為IrSock,在Linux中,每一種協議都有自己的網絡地址數據結構,均以sockaddr_開頭。
IrSock的數據結構與一般網絡設備的套接字結構稍有不同,在net/irda.h中定義:
5 結 論
目前各類嵌入式設備的開發大量應用無線通信技術,在需要個人特制網絡、點到點交換的場合,采用Ir2DA技術無疑是合適的。許多小型移動設備,如PDA、手機、信息家電等都廣泛應用紅外通信技術。基于Linux對紅外網絡通信的開發對當今嵌入式系統的應用研究具有較強的實用性和借鑒作用。