ledsup-083a用的網(wǎng)絡(luò)芯片是rtl8019as,但是在移植u-boot到開發(fā)板的時候,網(wǎng)絡(luò)的移植出了一點(diǎn)問題。所以想看看rtl8019as這個網(wǎng)卡是如何工作的,很不幸的是,正如網(wǎng)絡(luò)上很多人說的那樣,rtl8019的文檔及其的爛,真的不是一般的爛。基本上看過它的文檔,跟沒看過沒什么區(qū)別。現(xiàn)將網(wǎng)絡(luò)同步時鐘的網(wǎng)卡工作過程詳細(xì)講述一下。
rtl8019as網(wǎng)卡的功能:
一句話來說,網(wǎng)卡所完成的功能就是收發(fā)數(shù)據(jù)。
接收功能:從網(wǎng)絡(luò)上接收數(shù)據(jù),然后存儲于網(wǎng)卡內(nèi)部的RAM(本網(wǎng)卡為16KB)中,然后觸發(fā)中斷,通知CPU來取走數(shù)據(jù)。
發(fā)送功能:CPU發(fā)送的數(shù)據(jù)被復(fù)制到網(wǎng)卡內(nèi)部的RAM中,然后網(wǎng)卡自主的在網(wǎng)絡(luò)上發(fā)送這些數(shù)據(jù)。
由此可見,對于程序員來說,網(wǎng)卡其實(shí)就是一片內(nèi)存區(qū)域。程序員對網(wǎng)卡的操作實(shí)際上可以認(rèn)為是對內(nèi)存的讀寫操作。當(dāng)網(wǎng)絡(luò)上有數(shù)據(jù)傳來時,LED時鐘網(wǎng)卡存儲這些數(shù)據(jù)到內(nèi)存,并通知CPU到內(nèi)存的相應(yīng)位置取相應(yīng)大小的數(shù)據(jù)。當(dāng)時鐘CPU想向網(wǎng)絡(luò)上傳輸數(shù)據(jù)時,只需要將數(shù)據(jù)寫入網(wǎng)卡的內(nèi)存,然后給網(wǎng)卡一個"發(fā)送"命令即可。就是這么簡單。
很明顯的,網(wǎng)絡(luò)數(shù)據(jù)是一個層次性很強(qiáng)的東西,OSI就規(guī)定了網(wǎng)絡(luò)的7層協(xié)議,TCP/IP規(guī)定了5層協(xié)議,從數(shù)據(jù)上來說,tcp幀作為IP幀的數(shù)據(jù)被打包進(jìn)IP幀,而IP幀又作為以太網(wǎng)幀的數(shù)據(jù)被打包進(jìn)以太網(wǎng)幀。如上所述,CPU跟網(wǎng)卡的交互就是數(shù)據(jù)的讀和寫"數(shù)據(jù)",但是,這個數(shù)據(jù)到底是什么數(shù)據(jù)呢?我們該怎么理解從同步時鐘的網(wǎng)卡中接收到的二進(jìn)制數(shù)據(jù)呢?我應(yīng)該認(rèn)為它是一幀IP幀,還是一幀以太網(wǎng)幀呢?我們寫內(nèi)存來發(fā)送數(shù)據(jù),那么,我們發(fā)送的應(yīng)該是什么格式的數(shù)據(jù)呢?我們是打包成IP數(shù)據(jù),還是需要打包成以太網(wǎng)數(shù)據(jù)呢?接收和發(fā)送的數(shù)據(jù)的幀格式并不一樣,如下圖所示:
由上圖可見,LED電子時鐘只需要將如上圖所示的IP幀寫入RAM中,其余的就叫給網(wǎng)卡去辦就可以了。而接收的數(shù)據(jù),其實(shí)是一個修改過了的IP幀,整體還是在IP這個層次上。由此可見,對于網(wǎng)絡(luò)數(shù)據(jù),應(yīng)用層程序只需要處理到IP層,將數(shù)據(jù)打包成變形的IP幀即可。至于將IP幀打包成以太網(wǎng)幀然后在網(wǎng)絡(luò)上傳輸,這些功能都是時鐘網(wǎng)卡自己完成的。接收數(shù)據(jù)也是一樣,從網(wǎng)卡的RAM中接收到的數(shù)據(jù)就是變形的IP幀,至于底層的物理鏈路數(shù)據(jù)和以太幀的解析,這些都是網(wǎng)卡完成的。也就是說,IP層以下的處理,對于程序員來說,是透明的。
時鐘網(wǎng)絡(luò)組件聯(lián)網(wǎng)同步芯片RTL8019AS寄存器介紹:
1、rtl8019as的工作機(jī)制以及原理:
網(wǎng)絡(luò)時鐘接收:rtl8019as的RAM是一個循環(huán)RAM空間,當(dāng)網(wǎng)卡從網(wǎng)絡(luò)上接收到數(shù)據(jù)后,會按照RAM地址從小到大依次存放接收到的數(shù)據(jù)。但是RAM的空間只有16K,而且,有一部分還是劃為用來做發(fā)送緩存,另外的那一部分才是用來做接收緩存的。當(dāng)網(wǎng)絡(luò)上的數(shù)據(jù)超過了緩存的大小怎么辦呢?這里就需要介紹一些,rtl8019as的RAM是一種循環(huán)RAM,所謂循環(huán)RAM,比如說用來做接收緩存的RAM的頁是從50頁~80頁,接收的數(shù)據(jù)從第50頁開始存放,一直存放到第80頁。當(dāng)接收的數(shù)據(jù)過多,超過了上限的第80頁時,再接收到的數(shù)據(jù)就會重新從第50頁開始依次從低到高存放!當(dāng)然,時鐘CPU也在同時的從RAM中讀取走數(shù)據(jù),所以只要安排得當(dāng),采用循環(huán)RAM,還是有可能不會將原先的數(shù)據(jù)沖掉的。而且RAM的利用率將會得到提高。那么怎么樣才叫安排得當(dāng)呢?在實(shí)際的機(jī)制中,引入了CURR和BNRY這兩個"指針"(兩個實(shí)際的寄存器)。這兩個寄存器都是存放的RAM的頁地址(rtl8019as也是以頁為單位存儲的)CURR表示如果網(wǎng)卡接收到了數(shù)據(jù),應(yīng)該從CURR頁開始存放。而且這個CURR寄存器的值是網(wǎng)卡自動為它賦值的,每填滿一個頁,CURR寄存器的值就增加1,表示下一次有數(shù)據(jù)來的時候從下一個頁開始存放。BNRY表示,CPU已經(jīng)從RAM中接收的數(shù)據(jù),到BNRY頁為止,就是BNRY+1頁的數(shù)據(jù)還沒有被CPU取走。CPU下來再來取數(shù)據(jù)的時候就應(yīng)該從BNRY+1頁來取數(shù)據(jù)。那么可以想見,當(dāng)網(wǎng)卡從網(wǎng)絡(luò)上接收到數(shù)據(jù),已經(jīng)超過了接收緩沖的上限,重新從下限開始存放的時候,只要我不存放到超過BNRY頁,都是不會引起將原來被有被CPU取走的數(shù)據(jù)覆蓋的,不是么?正是這樣。這真是一個很好的方法啊。
網(wǎng)絡(luò)時鐘發(fā)送:相對于接收,發(fā)送功能就要簡單一點(diǎn)了。應(yīng)用程序只需要將數(shù)據(jù)寫入到RAM中,想網(wǎng)卡發(fā)出發(fā)送命令即可完成數(shù)據(jù)向網(wǎng)絡(luò)的發(fā)送了(置RD2,RD1,RD0的值為011即可),當(dāng)網(wǎng)口通知CPU有數(shù)據(jù)到來,或者CPU檢測到RAM中有數(shù)據(jù)需要讀取的時候,設(shè)置兩個地址值RSAR和RBCR。RSAR0,1:要讀取的數(shù)據(jù)的起始地址,RBCR0,1:要讀取的數(shù)據(jù)的大小(可以以字節(jié)為單位),然后我們從數(shù)據(jù)寄存器中讀取數(shù)據(jù),每讀取一次,數(shù)據(jù)寄存器中所指向的地址就會增加1。其寄存器變化原理圖如下:
仟漁 | / |
所有評論僅代表網(wǎng)友意見,與本站立場無關(guān)。