帳號:
密碼:
最新動態
產業快訊
CTIMES / 文章 /
嵌入式乙太網路控制晶片技術介紹
 

【作者: 宇誠】   2002年05月05日 星期日

瀏覽人次:【10639】

嵌入式系統是網路控制晶片的新舞台

Internet硬體、軟體的迅速發展,使得網路用戶呈倍數增加。在使用通用處理器(GPU)進行上網的同時,各種家電設備、PDA、儀器儀表、工業生產中的數據採集與控制等設備正在逐漸地走向網路化,以便共享Internet中龐大的資源。而乙太網路經過20年的發展,成為當今Internet中底層鏈接不可缺少的部分。


嵌入式設備的價格、體積及即時性等方面,在某些應用領域,尤其是網路化開發上有著標準處理器無法比擬的優點。在網路化開發的過程中,首先要解決的就是與乙太網路的連接問題,亦即如何將通用處理器的網路連接裝置(乙太網路控制器)應用於嵌入式網路的開發。目前市面上有許多廠牌的乙太網路控制晶片,可是其中大多耗電量高、功能複雜,不適用於價格低廉的嵌入式系統之中。因此,有必要在選擇之前,仔細思考。


乙太網路控制器簡介

適用於嵌入式系統的乙太網路控制器之性能,大致如下所述:


一、主要性能

● 適應於Ethernet II 、IEEE 802.3 、10Base5、10Base2、10BaseT;


● 支援8位元、16位元數據線;


● 全雙工,收發可同時達到10Mbps的速率,具有休眠模式,以降低功耗;


● 內建16KB的SRAM,用於收發緩衝,降低對主處理器的速度要求;


● 可連接同軸電纜(BNC)和雙絞線,並可自動檢測所連接的媒介類型;


● 腳數少、封裝簡單,且可以縮小主機板尺寸。


二、內部架構

按數據鏈路的不同,可以將乙太網路控制器內部劃分為遠端DMA(remote DMA)通道和本地DMA(local DMA)通道兩個部分。本地DMA完成控制器與網路線的數據交換,主處理器(Host)收發數據只需對遠端DMA操作。當主處理器要向乙太網路發送數據時,先將一訊框(frame)數據經過遠端DMA通道,送到乙太網路控制器中的發送緩存記憶體(Ring Buffer),然後發出傳送命令。乙太網路控制器在送出前一訊框的數據後,繼而完成此訊框的發送。乙太網路控制器接收到的數據通過MAC比較、CRC校驗後,由FIFO存到接收緩衝區,收滿一訊框後,以中斷或暫存器標誌的方式通知主處理器。原理如(圖一)所示。



《圖一 乙太網路控制器的原理圖》
《圖一 乙太網路控制器的原理圖》

在(圖一)中,接收邏輯在接收時脈的控制下,將串行數據組成位元組送到FIFO和CRC;發送邏輯將FIFO送來的位元組在發送時脈的控制下逐步按位移出,並送到CRC;CRC邏輯在接收時對輸入的數據進行CRC校驗,將結果與訊框尾的CRC比較,如不同,該訊框數據將被拒收,在發送時CRC對訊框數據產生CRC,並附加在數據尾傳送;位址識別邏輯對接收訊框的目的位址與預先設置的本地實體位址進行比較,如不同且不滿足廣播位址(broadcast address)的設定要求,該訊框數據將被拒收;FIFO邏輯對收發的數據作16個位元組的緩衝,以減少對本地DMA請求的頻率。


三、數據訊框的組成

標準的IEEE 802.3數據訊框由以下幾個部分組成︰前導位(preamble)、訊框起始位(SFD)、目的地位址(destination)、來源位址(source)、數據長度(length)、數據(data)、訊框校驗字(FCS)。如(圖二)所示,數據欄位的大小可從46B(Byte)到1,500B(Byte),如一組要傳送的數據為46Byte,就用零補足;超過1500Byte時,需要拆成多個訊框傳送。


前導位、訊框起始位和訊框校驗字僅供控制器本身用,主處理器收到的數據訊框的組成依次包括︰接收狀態(1Byte )、下一訊框的頁位址指標(1Byte)、目的地位址(6Byte)、來源位址(6Byte)、數據長度/訊框類型(2Byte)、數據。數據長度/訊框類型的值小於或等於1500Byte時,表示數據欄位的長度;反之,表示數據訊框的類型。如值依次為 0x08,0x00,表示數據為IP訊框;值依次為0x08,0x06 ,表示數據為ARP訊框。


《圖二 EEE802.3訊框的組成》
《圖二 EEE802.3訊框的組成》

四、乙太網路控制器的DMA操作

大多數傳統的乙太網路控制器是針對PC的匯流排線路設計的。如要將它們應用在嵌入式設備中,則需考慮其硬體和軟體設計上的特殊性。嵌入式設備的主處理器可利用記憶體映射方法,將乙太網路控制器內16個I/O位址上的暫存器映射到嵌入式作業系統來,這樣就可以用程式來操控乙太網路控制器。乙太網路控制器的暫存器位址如(表一)所列。


乙太網路控制器的DMA有兩種:本地(local)DMA和遠端(remote)DMA。本地DMA負責執行乙太網路控制器內FIFO到SRAM緩衝記憶體的數據收發;遠端DMA與平時所說的DMA有點不同。


乙太網路控制器的本地DMA操作是由控制器本身完成的,而其遠端(remote)DMA並不是在無主處理器的參與下,數據能自動從緩衝記憶體移到主處理器的記憶體中,它的操作機制是這樣的︰主處理器先將適當值賦與romote DMA的起始位址暫存器RSAR0、RSAR1和位元組計數器RBCR0、RBCR1,然後在乙太網路控制器的DMA I/O位址上讀寫指定位址上的數據。local DMA則由TPSR、TBCR0、TBCR1三個暫存器來完成發送工作。


乙太網路控制器內建的16KB SRAM可劃分為接收緩衝和發送緩衝兩個部分。緩衝以頁(page)為單位,每頁256個位元組,16KB的SRAM的頁範圍規定在0x40~0x80,由PSTART 和PSTOP暫存器來設定接收緩衝頁的範圍。CURR指向接收到的訊框的起始頁,Boundary指向還未讀取的訊框之起始頁(亦即下一訊框的頁位址)。當CURR到達了接收緩衝頁的底部,即與PSTOP相等時,CURR又會自動指到PSTART處。因此,這16KB SRAM是設計成環狀緩衝區,以達到可再使用的目的。與DMA有關的暫存器可區分成三大類,如(圖三)所示,分別是:本地DMA發送暫存器、本地DMA接收暫存器、遠端(收發)暫存器。圖三對設計乙太網路驅動程式者而言,是非常重要的,設計者必須先了解這些暫存器的功能,才能正確地對乙太網路控制器編程。



《表一 乙太網路控制器之核心暫存器位址》
《表一 乙太網路控制器之核心暫存器位址》
《圖三 與DMA有關的暫存器》
《圖三 與DMA有關的暫存器》

乙太網路控制器的硬體電路設計

目前區域網路大多採用雙絞線(UTP)為通信媒介。(圖四)為MOTOROLA的龍珠(Dragonball)處理器MC68VZ328(以下簡稱VZ328)和RTL8019AS乙太網路控制器的連接電路。RTL8019AS的工作電壓為5V,而VZ328的工作電壓為3.3V,所以RTL8019AS的輸出需要電平的轉換。


在(圖四)中,此電壓的轉換由U2 74F163245 完成。讀數據時,D[0:15]數據經U2 送到VZ328;寫數據時,D[0:15]送到RTL8019AS。RTL8019AS在重置(reset)的上升沿鎖定(latch)IOCS16腳的電平,其值決定數據匯流排的大小︰高電平時為16位元,低電平時為8位元。由於此RTL8019AS沒有外接初始化的EPROM,所以在重置時,命令暫存器(CR)的I/O位址為內定(default)值0X300,所以,為滿足RTL8019AS的ISA時序,A5~A19的連接必須使其位址鎖定在0X300,否則,就無法擷取到RTL8019AS的暫存器。INT0中斷腳經電平轉換U4接到VZ328的IRQ6。VZ328以I/O方式擷取RTL8019AS,所以僅需要A[0:4]位址線、接高電平關閉其MEMORY方式。


《圖四 RTL8019AS與68VZ328連接電路》
《圖四 RTL8019AS與68VZ328連接電路》

乙太網路控制器的軟體編程

對乙太網路控制器的軟體操作,是由查詢(polling)和中斷(interrupt)兩種方式完成的。


在查詢方式下,主程序通過CURR和Boundary兩個暫存器的值來判斷是否收到一個訊框數據。當Boundary與CURR不等時,說明接收緩衝區接收到了新的訊框,主程序從數據埠(data port)讀取數據後,以讀取訊框的第二個位元組(下一訊框的頁位址)更新Boundary,主程序循環跟蹤CURR和Boundary直到數據被完全讀取。


主程序在發送一個訊框數據時,先要查看CR暫存器裡面的TXP位元是否為1,以判斷上一個訊框是否正在被發送;亦即,若發射機(transmitter)正在忙碌中,就不可發送下一個訊框。如果TXP位元為0,就依次向數據埠寫入一個位元組。


數據埠就是乙太網路控制器裡面的輸出入通訊埠(I/O Port),要傳到主機或來自主機的系統數據全部都在此數據埠裡(在NE2000暫存器0x18~0x1F位址上)。亦即,此數據埠是內部系統收發數據的樞紐,而硬體收發器則是將乙太網路數據傳到FIFO中或將FIFO中的數據傳到乙太網路上,兩者的功能不同,傳輸方向也不同,千萬不可混淆。


在即時多工的環境下,一般採用中斷方式來處理乙太網路控制器的收發,而中斷方式又可區分成硬體和軟體中斷兩種。當中斷處理程序(ISR)回應乙太網路控制器的中斷時,在ISR的入口,根據讀取到的中斷狀態暫存器(ISR)之值來確定程序的走向。


1.初始化

開機重置(power-on reset)信號接在乙太網路控制器的重置接腳上,因此當開機後,乙太網路控制器一直會處於重置狀態,直到驅動程式發出開始命令(Start Command)為止。這可確保在初始化時,乙太網路控制器不會收發任何封包,並順利完成所有暫存器的初次設定。初始化完成後,在CR暫存器裡的STA位元會被設為1,促使乙太網路控制器能夠開始收發封包。本地DMA暫存器的初始化步驟如下所述:


(1) 硬體重置(hardware reset)。


(2) 進入第0頁的CR(寫入21h),此為軟體重置。


(3) 對DCR初始化。


(4) 對RBCR初始化。


(5) 對RCR初始化。


(6) 將乙太網路控制器置於回環模式(loopback mode),TCR=02h或04h。


(7) 接收緩衝區(receive buffer ring)初始化。包含BNDRY、PSTRAT、PSTOP、TPSR的初始化。


(8) 清除ISR的值(寫入FFh)。


(9) 對IMR初始化。


(10) 進入第1頁的CR(寫入61h)。對PAR0~5、MAR0~7、CURR初始化。


(11) 將乙太網路控制器置於開始模式(CR=22h)。


(12) 對TCR初始化(寫入00h)。


(13) 將乙太網路控制器置於第0頁。


建立緩衝區(buffer ring)

緩衝記憶體的基本單元是「頁」(page),每頁大小為256Bytes。目前最通用的網路卡驅動程式都是源自於Novell NE2000驅動程式,其作法是將接收緩衝區(Rx buffer ring)置於發送緩衝區(Tx buffer ring)之後,如(圖五)所示。而且為了提高發送效率,特別使用兩個發送緩衝區,每個發送緩衝區具有6頁(1536Bytes),用以暫存一個完整的乙太封包(ethernet packet)。TPSR指向發送緩衝區的起始頁位址,這兩個發送緩衝區裡的數據是輪流被傳送的;當一個發送頁正在傳送數據時,另一個發送頁可以載入數據,等待下次發送。


《圖五 》
《圖五 》

3. 驅動程式

從NE2000驅動程式(driver)的執行邏輯,就可以清楚了解乙太網路控制器的運作原理。從軟體設計的觀點而言,因為乙太網路控制器需處理主機系統數據和網路數據,所以,需要一個唯一且重要的主資料結構(data structure)來虛擬乙太網路控制器,在此稱之為snic,每個使用NE2000模式的乙太網路控制器都需要此資料結構。這裡所謂的「虛擬」(virtual),其實就是「編程」(programming),是由電子數位化後,所帶來的好處。藉由數位化電路,就可以將任何硬體,當然包含乙太網路控制器,虛擬為軟體;也就是,能將大自然的物理性質或現象(硬體)比擬為人們可以操控的軟體。snic應有的內部元素如下所示:


struct snic {
int iobase;
int pstart, pstop, wordlength, current_page;
nic_stat stat;
void (*notify)(packet_buffer *newpacket);
packet_buffer tx_packet[MAX_TX], *last_tx;
char busy, send, sending;
};

snic能夠支援多個網路卡共同使用一個NE2000驅動程式,這只要對snic賦予不同的元素值即可。這也是因為「數位虛擬化」後,所帶來的好處。在snic中,iobase是非常重要的,因為它是NE2000暫存器的基準位址(base address),NE2000全部的暫存器位址都是由它得出來的。在初始化時,必須賦予它正確的基準位址值,此值是由主機上的CPU和作業系統對周邊裝置所規劃的,但是,在驅動程式中,必須以程式碼方式(hard code),明確地賦予,否則將無法正確地操控乙太網路控制器。sinc的全部元素分別敘述如下:


  • ● iobase - 網路控制器的基準位址。


  • ● pstart - 循環緩衝區中的第一頁位址。


  • ● pstop - 循環緩衝區中的最後一頁位址。


  • ● wordlength - 若主系統匯流排為8位元,則填入1,若為16位元,則填入2。


  • ● current_page - 在循環緩衝區中,目前接收頁的位址。


  • ● stat - 統計資料,唯一個次資料結構。


  • ● notify - 是一個位址指標,指向「接收事件子程式」(receive event routine)。此子程式必須預先在主程式中註冊,例如:使用nic_register_notify()來註冊。當在循環緩衝區中的已接收數據被送到主機記憶體後,就可呼叫此「接收事件子程式」,通知上層軟體立即處理這些數據。


  • ● tx_packet[] - 是一個封包緩衝陣列(array of packet buffers),用來傳送封包。


  • ● last_tx - 是一個指標,指向傳送封包的緩衝位址。


  • ● busy - 傳送封包用的旗標(flag),若為1,表示目前正在傳送中。


  • ● send - 是傳送封包緩衝陣列(tx_packet[])裡的索引值,用來表示目前的傳送封包在緩衝陣列裡的排序。


  • ● sending - 傳送封包時,此值為1;反則為0。



在NE2000驅動程式之上,為具有拆解(segment)與組合(assemble)IP封包功能之程式,凡設計NE2000驅動程式的廠商都必須另設計一個IP層以上的簡易測試程式,用來分析和檢驗其所開發出來的軟硬體是否正確無誤。一般的嵌入式作業系統雖然都具有完整的TCP/IP軟體堆疊,但是若拿它來做測試,則移植(port)的工作量將會大增。所以,一般的乙太網路卡、晶片設計業者大都只提供簡單的IP層測試程式而已,移植到嵌入式作業系統的工作則交由他們的客戶--最終產品(end product)開發商自行負責。


4. 接收流程

當中斷服務程式發覺ISR暫存器之PRX或RXE值變為1時,表示已接收到一筆網路封包。此時,它會立即呼叫接收子程式,此子程式查詢緩衝區位址,並確定RSR暫存器之PRX值為1,表示在接收封包時,並沒有產生錯誤後,會在數據通訊埠處讀出封包來,並將封包置於新建立的次資料結構packet_data中,最後,通知並交由上層IP軟體來處理此封包。中斷服務程式(Interrupt Service Routine;ISR)必須常駐於作業系統中。此外,因接收溢流(overflow)會將緩衝區中已接收的數據覆蓋掉,所以,必須另設計一個子程式,它能在溢流發生時,可完善保護位於循環緩衝區中已被接收之數據。


5. 傳送流程

傳送流程比較複雜,簡言之,有幾個重要步驟:


(1) IP層軟體已準備好封包,並通知NE2000驅動程式。


(2) 將封包寫入數據通訊埠處。


(3) 判斷CR暫存器的TXP值是否為1,若為1,表示上一筆封包尚未傳完,暫時不能傳送此筆封包。若為0,則可以傳送此筆封包。


(4) 在傳送第一封包時,第二封包也會被準備好(步驟(1)),並寫入數據通訊埠處(步驟(3))。一旦寫入,就重覆步驟(3)。


(5) 當中斷服務程式發覺ISR暫存器之PTX值變為1時,表示第一封包已傳送完畢,此時必須檢查是否尚有第二筆封包要傳送,若發現有封包需傳送,則重覆步驟(3)~ 步驟(5),直到全部封包都傳完為止。


(6) 若中斷服務程式發覺ISR暫存器之TXE值變為1時,表示傳送時產生錯誤,此時呼叫重傳子程式來判斷錯誤狀態,並決定是否要重傳。


結語

以目前的技術市場而言,乙太網路控制晶片的設計門檻已經不高,因為有許多輔助工具可資利用,可是適用於嵌入式系統、而且又整合目前常用的匯流排(PCI)和周邊輸出入介面(USB、PC Card)的乙太網路控制晶片其實並不多,這正是國內業者可以發揮的地方。


相關文章
極速巔峰-Gigabit Ethernet
企業重生應回歸核心商業機制
企業導入1Gbps乙太網路須知
新一代 DSL初探
實現超迷你型網路主機之夢想
comments powered by Disqus
相關討論
  相關新聞
» TI創新車用解決方案 加速實現智慧行車的安全未來
» AMD擴展商用AI PC產品陣容 為專業行動與桌上型系統挹注效能
» 豪威汽車影像感測器高通數位底盤 可用於次代ADAS系統
» 意法半導體擴大3D深度感測布局 打造新一代時間飛行感測器
» AMD第2代Versal系列擴展自調適SoC組合 為AI驅動型系統提供端對端加速


刊登廣告 新聞信箱 讀者信箱 著作權聲明 隱私權聲明 本站介紹

Copyright ©1999-2024 遠播資訊股份有限公司版權所有 Powered by O3  v3.20.2048.18.119.159.150
地址:台北數位產業園區(digiBlock Taipei) 103台北市大同區承德路三段287-2號A棟204室
電話 (02)2585-5526 #0 轉接至總機 /  E-Mail: webmaster@ctimes.com.tw