隨著電子信息技術的發展,嵌入式系統應用到了社會生活的各個角落。后PC時代是嵌入式和網絡化的時代,將分散在各處的嵌入式設備連接到網絡成為近年來以及未來的發展趨勢,隨時隨地都能通過網絡去控制這些智能設備,在多種嵌入式設備之間進行數據通信,例如信息終端、信息家電等。
用戶可以通過信息終端從網絡服務商提供的服務中搜索并瀏覽有用的信息,實現全面交流和互動,實現新型的信息金融終端的概念,同時,用戶也可享受到網上金融信息、網上購物、視頻會議等其他服務。
本文提出了一種基于Linux 2.4操作系統平臺和Intel PXA255處理器的網絡設備驅動設計方案,分析了其軟硬件實現以及Linux下網絡設備驅動的特性。
1 網卡設備
本方案使用的CS8900A是一款低功耗的網絡控制器,包含一塊片上 RAM、10BASE-T接收和發送濾波器、ISA總線接口,提供了多種性能和配置選項,它獨立的包頁(packet page)體系結構能自適應改變網絡通信模式和可用的系統資源,提高了系統效率。該控制器支持IEEE 802.3的10 Mbit/s模式,全雙工單片以太網解決方案。主要模塊有:一個直接ISA總線接口;一個802.3 MAC引擎,處理以太網幀發送和接收的各個方面;集成4 kB的頁可緩沖存儲器,將發送和接收的幀完全緩沖在網卡中;一個串口EEPROM接口;完全模擬前端10BASE-T(10 Mbit/s)和AUI(粗纜網卡接口)。
2 Linux驅動
Linux驅動分為字符設備、塊設備和網絡設備驅動。字符設備是能夠像字節流一樣被訪問的設備,大多數字符設備只能被順序訪問。塊設備驅動程序提供面向塊的設備的訪問,這種設備以隨機訪問的方式傳輸數據,并且數據總是具有固定大小的塊,這些塊中包含了2的幾次冪字節的數據,硬盤就是典型的塊設備。
在Linux中,字符設備和塊設備都是通過文件系統節點被訪問,塊驅動程序除了向內核提供與字符驅動程序相同的接口外,還提供了專門面向塊驅動設備的接口。
網絡接口在系統中的角色與一個已掛裝的塊設備非常相似。塊設備將自己注冊到blk_dev數組以及其他內核結構中,然后通過自己的request函數在發生請求時“發送”和“接收”數據塊。同樣,網絡接口也必須在特定的數據結構中注冊自己,以便在與外界交換數據包時被調用。但是,塊設備接口與網絡數據包發送接口之間存在不同。普通的文件操作對網絡接口來說沒有任何意義,因此,Unix的“所有東西都是文件”這一思想無法應用于網絡接口。這樣,網絡接口存在于它們自己的名字空間中,同時導出一組不同的操作。同一網絡接口可以由幾百個套接字同時復用。塊沒備驅動只對來自內核的請求做出響應,而網絡驅動程序卻異步地接收來自外界的數據包。
網絡驅動程序同時必須支持大量的管理任務,例如設置地址、修改傳輸參數以及維護流量和錯誤統計等。網絡驅動程序的API反映了這種需求。此外,網絡驅動程序與內核其余部分之間每次交互處理的是一個網絡數據包,因此,驅動程序無需關心協議問題。
3 實現方案
3.1 硬件連接
硬件平臺使用Intel PXA255處理器作為主機,工作頻率400 MHz,網卡的品振為20 MHz,網卡的數據線和地址線通過緩沖后與CPU直接相連。
網卡的讀寫使能引腳IOR/IOW信號主要由CPU采用Flash存儲器的方式給出,與PWE和MOE兩個引腳分別連接,其有效時間由CPU內部的寄存器配置而得。
網卡內部寄存器使能引腳AEN由CPU片選腳E_CS組合得出,而網卡復位引腳則通過CPU的一個GPIO口給出。
從電路中可以看出只使用了4根地址線,因此,對網卡中的寄存器的訪問采用packet page寄存器間接尋址,即通過地址線先對packet page訪問,將欲訪問的寄存器R的偏移地址送到packet page寄存器中,然后通過數據線去讀或者寫此寄存器。
3.2 軟件實現
網卡驅動可看做是連接網絡層與實際網絡設備的一個軟件層。在網卡設備驅動中,通過維護一個名為net_device結構的dev指針來實現上層對驅動程序的訪問。這個結構包括了對管理網絡設備所必須完成的操作,包括設備的打開、關閉、發送數據、接收數據、獲得狀態、設置網卡地址、處理超時等。
以下主要介紹這些操作的實現,包括設備的初始化和注銷、對中斷事件的處理。
3.2.1 設備初始化
由于需要通過Memory模式訪問網卡設備,因此需要配置存儲器控制寄存器VLIO(Variable Latency)模式。關聯設備的初始化探測函數cirrus_probe,在cirrus_probe函數中主要是填充該設備的Dev結構。網絡接口探測方式不同,所以不能在編澤階段進行Dev結構的設置。這樣從Dev→init返回時,Dev結構中就應該填充正確的值。Dev結構中包含相關的網卡操作函數的指針,為上層調用網卡驅動提供方法。內核提供了ethr_setup函數,可處理以太網的某些缺省設置。在探測函數中還要分配net_device的priv字段,該字段所指向的數據項通常包含接口上的統計信息。用戶可以在任何時刻通過調用ifconfig獲得統計數據,向內核注冊網絡設備驅動程序。
這里簡要介紹網絡設備驅動中兩個重要的結構體:Linux內核提供的統一網絡設備結構net_device,定義了系統統一的訪問接口,此結構體位于網絡驅動層的核心地位;net_device_stats結構體用來記錄網絡驅動發送和接收數據量的統計信息,例如發送包的數目以及丟失包的數目。當應用程序需要獲得接口的統計信息時,將調用該方法。
3.2.2 設備的注銷
設備的注銷過程與設備初始化的過程相反,釋放網卡的地址空間及網卡驅動使用的其他相關資源,注銷網絡設備的Dev結構。
3.2.3 中斷處理
網卡工作有輪循和中斷兩種模式。輪循模式會大量占用CPU資源,影響嵌入式系統性能,因此這里選擇中斷模式。有5種情況會觸發中斷,每種情況對應不同的中斷寄存器,中斷發生會將某一模式寄存器的相應位置位,并且把這種模式寄存器中的內容映射到中斷狀態寄存器。當有中斷事件發生后,進入中斷例程,首先讀取中斷狀態寄存器的內容,然后根據其中的信息判斷是哪種情況觸發的中斷,最后進入相應的分支進行處理。
3.2.4 對5種中斷狀態的處理
1) 接收幀
當網卡接收到數據就會觸發一次中斷,在中斷例程中調用接收包的函數cirrus_receive。首先讀取接收的狀態和長度,使用dev_alloc_skb分配一段足夠大小的緩沖區,得到該包的網絡協議ID號,在一個申請好的sK_buff的緩沖區中保留一塊空間,這個空間一般是用做下一層協議的頭空間;接著將網卡接收緩沖區中的數據讀到skb緩沖區中,再使用netif_rx通知上層協定有新的封包傳人。當一個封包傳送完成后,必須將緩沖區釋放。
2) 發送幀
當主機要發送數據時調用hard_start_xmit方法將數據放人外發隊列,而此方法關聯的函數就是cirrus_send_start。內核處理后的每個數據包位于一個套接字緩沖區(struct sK_buff)結構,核心處理的每個包包含在一個套接字緩沖區結構,輸入輸出緩沖區都是sk_buff結構的鏈表,傳遞給hard_start_xmit的套接字緩沖區含有物理包,它具有傳輸層的包頭。接口不需要修改被發送的數據。實際的硬件接口是異步傳輸數據包的,硬件中有緩沖區以保存要外發的數據包,但是此緩沖空間非常有限。在此函數中首先通知上層表明硬件緩沖區已經用完不要再送封包下來,然后向網卡發命令表示要開始發送數據并且指明發送數據的長度,接著讀BusST寄存器判斷當前網卡狀態,如果主機中的發送緩沖區可用,則將SKB中數據發到網卡的緩沖區中,最后釋放SKB。如果網卡將數據發送成功,則會觸發一次中斷,在中斷處理例程中將net_device_stats結構體中的tx_packets(表示發送的包的個數)元素遞增并通知上層可繼續送包下來。
3) BufEvent
Buffer事件當RxMiss置位表示由于數據從緩沖區中搬移到主機速度較慢而丟失了一些接收的幀,讀寄存器獲取丟失的包的數目。當TxUnderrun置位表示在幀結束前網卡運行已過時。改變網絡狀態結構體中對應元素的值,接著通知上層可往下發送包數據。
4) TxCOL
當傳輸出現沖突錯誤時,通過讀寄存器值得到當前沖突的個數,加到統計結構體中的對應元素值上。
5) RxMISS
讀寄存器獲取丟失幀的個數。
3.2.5 傳輸超時的處理
驅動程序要處理硬件不能正確響應的情況,比如中斷丟失或者接口工作異常等。網絡系統使用大量定時器控制的多個狀態機之間流轉來檢測傳輸超時,因此本驅動程序中無需自己檢測超時間題而只是通過net_device結構的watchdog_timeo字段設置超時劇期為10 ms,對于一般的傳輸超時,此值能滿足要求。當檢測到系統時間超過設備傳輸開始的時間至少1個超時周期,網絡層將調用cirrus_transmit_timeout方法,解決超時所要做的工作,主要是在統計信息中標記該錯誤,同時調用netif_wake_queue重新啟動傳輸隊列。
3.2.6 測試結果
網絡設備驅動測試主要從底層硬件測試和上層網絡測試兩個方面進行。底層硬件測試使用如下方法:在內存中開辟兩塊區域M1、M2,并按照網絡包的格式設置初始值,將M1中的數據通過網卡發送出去,但是以回環方式,最終還是由主機端接收到,存放到M2中,再將M2中的數據通過網卡發送出去,并接收回來。經過多次循環,比較最終的數據包和先前設置的數據包是否一致,經過此項測試表明在最底層數據發送和接收無誤。上層網絡測試使用如下方法:目標機和PC端通過網線相連,目標機端丌啟pure-ftp服務,主機端使用FlashFXP軟件,從主機分別傳送不同大小(從0 MB到20 MB)文件到目標機,再從目標機傳送到主機,執行多次比較傳送文件是否有誤,并計算網絡傳送速度。測試結果表明網卡驅動能較好地實現網絡應用的功能,速度達到2 Mbit/s~5 Mbit/s。
4 結束語
本文提出了一種基于嵌入式Linux的網卡驅動實現方案,并介紹了Linux下網絡設備驅動的一些特性。此方案已應用到基于Intel PXA255處理器的金融信息終端研發中,使用和測試表明此方案穩定可靠,也可為其他嵌人式系統的網絡設備開發提供一定的參考。
責任編輯:gt
-
處理器
+關注
關注
68文章
19259瀏覽量
229652 -
控制器
+關注
關注
112文章
16332瀏覽量
177808 -
接口
+關注
關注
33文章
8575瀏覽量
151015
發布評論請先 登錄
相關推薦
評論