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

PXA255處理器與CF卡的接口設(shè)計(jì)

基于PXA255的自動(dòng)聚焦及圖像采集模塊設(shè)計(jì)

PXA255處理器在WinCE系統(tǒng)下的BootLoader的設(shè)計(jì)與實(shí)現(xiàn)

探究PXA255的VoIP語(yǔ)音傳輸系統(tǒng)

評(píng)論