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