0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

聊一聊以太網(wǎng)發(fā)送描述符

路科驗(yàn)證 ? 來(lái)源:開(kāi)心果 Need Car ? 2024-10-22 15:09 ? 次閱讀

以下文章來(lái)源于開(kāi)心果 Need Car ,作者開(kāi)心果 Need Car

相對(duì)于其他總線,以太網(wǎng)的知識(shí)龐雜,當(dāng)然,可獲取的資料也豐富。以太網(wǎng)的知識(shí)從驅(qū)動(dòng)層到上層協(xié)議棧,很難一下消化,所以,不妨從點(diǎn)開(kāi)始,不斷地拓展和鏈接,從而形成完整地以太網(wǎng)知識(shí)框架,進(jìn)而更好地解決工程問(wèn)題。

本文,從通信出發(fā),聊一聊以太網(wǎng)發(fā)送描述符(Transmit Descriptor)。

提示:基于TC4xx討論。

1、Transmit Descriptor

我們知道:相比與CAN、Lin等總線,以太網(wǎng)的數(shù)據(jù)吞吐量比較大,eg:1500bytes。如果讓CPU干數(shù)據(jù)搬運(yùn)工作,尤其大量數(shù)據(jù)搬運(yùn)工作,這有點(diǎn)"屈才"。所以,系統(tǒng)設(shè)計(jì)中,為了最大程度的釋放CPU,在以太網(wǎng)的數(shù)據(jù)搬運(yùn)中,會(huì)使用專門(mén)的DMA(Direct Memory Access)搬運(yùn)。如果想讓DMA知道如何搬運(yùn)數(shù)據(jù),就需要提前告知其搬運(yùn)規(guī)則,因此,描述符(Descriptor)應(yīng)用而生。對(duì)于以太網(wǎng)數(shù)據(jù)發(fā)送,則使用Transmit Descriptor描述以太網(wǎng)數(shù)據(jù)的發(fā)送規(guī)則。

Transmit Descriptor有兩種格式:Read格式和Write-Back格式。Transmit Descriptor Read Format如下所示:

wKgaoWcXT9CAB5n2AAEoCfUAxoQ615.jpg

如上圖,在進(jìn)行數(shù)據(jù)發(fā)送時(shí),需要注意字節(jié)序(單片機(jī)一般是小端模式),而如上的描述符可能需要大端處理。

Transmit Normal Descriptor (Write-Back Format),示意如下:

wKgaoWcXT9CAaQ0vAAE0OwXdKFc336.jpg

當(dāng)DMA完成數(shù)據(jù)搬運(yùn)以后,會(huì)對(duì)描述符進(jìn)行寫(xiě)回操作,主要操作TDES3的OWN和DESC STATUS位域,將發(fā)送狀態(tài)反饋給Application。

(一)Application與DMA的"握手"

描述符是Application與DMA之間的紐帶,Application通過(guò)描述符將待發(fā)送的信息填充到Transmit Descriptor中,DMA通過(guò)判斷DES3.OWN獲取發(fā)送請(qǐng)求。即:Application需要發(fā)送數(shù)據(jù)時(shí),將數(shù)據(jù)地址放入Buffer1(對(duì)應(yīng)DES0),同時(shí),將一些控制信息寫(xiě)入可用的Transmit Descriptor中,最后,設(shè)置DES3.OWN = 1,請(qǐng)求DMA發(fā)送數(shù)據(jù),這一步可以看作:Application將操作后的發(fā)送描述符控制權(quán)交給DMA;當(dāng)DMA發(fā)送完數(shù)據(jù)以后,將對(duì)應(yīng)發(fā)送描述符的DES3.OWN復(fù)位(=0),這一步可以看作:DMA將目標(biāo)描述符的控制權(quán)返還給Application。通過(guò)DES3.OWN,Application與DMA進(jìn)行交流,也就是"握手"動(dòng)作,進(jìn)而保證數(shù)據(jù)有序交互,示意如下:

wKgaoWcXT9CANVLXAAFnY_O-7Wg298.jpg

DMA發(fā)送完成或者接收完成,一般會(huì)有中斷觸發(fā),如果有特殊操作,也可以在中斷回調(diào)函數(shù)中處理。

2、描述符鏈表

實(shí)際使用中,常常使用環(huán)形DMA描述符結(jié)構(gòu)(DMA Descriptor Ring),示意如下:

wKgZoWcXT9CAC4eRAAEGAND0FV4093.jpg

如上結(jié)構(gòu),大家并不陌生。這里,我們需要注意一些細(xì)節(jié)。

(一)描述符間隔

當(dāng)使用多個(gè)描述符時(shí),描述符之間可以設(shè)置間隔(eg:DMA_Ch(#i)_Control寄存器的DSL位域,Descriptor Skip Length)。間隔設(shè)置多少需要根據(jù)手冊(cè)要求,本文可以設(shè)置的數(shù)據(jù)間隔:DWord(8 byte)的整數(shù)倍,如果DSL = 0,則意味著描述符間沒(méi)有間隔。

(二)發(fā)送描述符操作的寄存器

理解以太網(wǎng)發(fā)送,還需要理解與描述符操作相關(guān)的寄存器。本文聚焦發(fā)送相關(guān)的幾個(gè)DMA寄存器:

DMA_CHi_TXDESC_LIST_ADDRESS:發(fā)送描述符的基地址,指向發(fā)送描述符鏈表的第一個(gè)描述符,初始化時(shí)賦值;

DMA_CHi_CURRENT_APP_TXDESC:當(dāng)前發(fā)送描述符,指向DMA當(dāng)前可用的描述符;

DMA_CHi_TXDESC_RING_LENGTH:存放發(fā)送描述符長(zhǎng)度,可使用長(zhǎng)度 = n + 1(n是寄存器中存儲(chǔ)的實(shí)際值);

DMA_CHi_TXDESC_TAIL_POINTER:發(fā)送描述符尾指針,每次請(qǐng)求發(fā)送以太網(wǎng)Frame后,需要Application更新Transmit Descriptor地址,即:指向下一個(gè)可用的空閑描述符地址。

如果Current Descriptor Pointer == Descriptor Tail Pointer,則DMA會(huì)自動(dòng)掛起(Suspend),停止數(shù)據(jù)搬運(yùn)。當(dāng)Application再次請(qǐng)求數(shù)據(jù)發(fā)送時(shí),需要向Descriptor Tail Pointer中寫(xiě)入發(fā)送信息,偏移Descriptor Tail Pointer,使其滿足:Current Descriptor Pointer < Descriptor Tail Pointer。如果Descriptor Tail Pointer偏移到尾部,則重新回到Descriptor Base Address。

3、以太網(wǎng)幀發(fā)送流程

以太網(wǎng)Frame的發(fā)送流程,示意如下:

wKgaoWcXT9CAbkJuAAEGpYWHq2M236.jpg

具體發(fā)送流程解讀:

1、Application通過(guò)DMA_CHi_CURRENT_APP_TXDESC寄存器獲取當(dāng)前可用的發(fā)送描述符地址,將發(fā)送信息填充到可用的發(fā)送描述符中,即:告知DMA搬運(yùn)規(guī)則。之后,Application將TDES3.OWN置位(=1),請(qǐng)求發(fā)送數(shù)據(jù);

2、DMA能否搬運(yùn)數(shù)據(jù),需要判斷DMA的工作模式,如果DMA處于Stop模式,需要重新啟動(dòng)DMA。通過(guò)判斷DMA_CHj_Status (j=0-7)的TPS(Transmit Process Stopped)位域確認(rèn)其是否處于Stop模式。具體描述:如果TPS == 1,表示DMA處于Stop模式,需要向TPS位域?qū)?清除,同時(shí),進(jìn)行DMA使能操作。當(dāng)然,還可以進(jìn)一步的檢查其他信息,eg:TBU(Transmit Buffer Unavailable);

3、當(dāng)Application將描述符的控制權(quán)交給DMA以后,還需要Transmit Poll Demand,即:向DMA_CHi_TXDESC_TAIL_POINTER寄存器寫(xiě)入信息,一般寫(xiě)入下一個(gè)可用發(fā)送描述符地址,讓DMA脫離掛起狀態(tài),去查詢待處理的發(fā)送描述符信息;

4、當(dāng)DMA發(fā)送完數(shù)據(jù)以后,DMA_CHi_CURRENT_APP_TXDESC寄存器的發(fā)送描述符地址自動(dòng)偏移一個(gè),如果Current Descriptor Pointer < Descriptor Tail Pointer,DMA繼續(xù)發(fā)送數(shù)據(jù);如果Current Descriptor Pointer == Descriptor Tail Pointer,DMA隨即掛起(Suspend),停止數(shù)據(jù)搬運(yùn),同時(shí),數(shù)據(jù)的發(fā)送狀態(tài)回寫(xiě)(write-back)到TDES3中。

數(shù)據(jù)的發(fā)送流程關(guān)鍵步驟如上,理解了數(shù)據(jù)發(fā)送,也就不難理解數(shù)據(jù)的接收過(guò)程。

(一)DMA狀態(tài)變化流程

1、以太網(wǎng)專用DMA初始化以后,如果沒(méi)有數(shù)據(jù)發(fā)送,進(jìn)入Suspend狀態(tài)。此時(shí),DMA_CHi_TXDESC_TAIL_POINTER指向空,示意如下:

wKgZoWcXT9CAdrdAAADE9PyMb58896.jpg

2、Application請(qǐng)求發(fā)送數(shù)據(jù)時(shí),從DMA_CHi_CURRENT_APP_TXDESC寄存器獲取可用的發(fā)送描述符地址,填充發(fā)送規(guī)則。向DMA_CHi_TXDESC_TAIL_POINTER寄存器寫(xiě)入下一個(gè)可用描述符地址,使其滿足Current Descriptor Pointer < Descriptor Tail Pointer,即:觸發(fā)DMA發(fā)送,示意如下:

wKgZoWcXT9CAXFylAADP1trQ5OQ824.jpg

3、Frame發(fā)送完成以后,DMA_CHi_CURRENT_APP_TXDESC寄存器中的可用描述符地址,自動(dòng)向后偏移一個(gè),使得Current Descriptor Pointer == Descriptor Tail Pointer,DMA隨即掛起(Suspend),示意如下:

wKgZoWcXT9CAXVq6AADXa2h2AbE498.jpg

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 以太網(wǎng)
    +關(guān)注

    關(guān)注

    40

    文章

    5341

    瀏覽量

    170767
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10803

    瀏覽量

    210778
  • 通信
    +關(guān)注

    關(guān)注

    18

    文章

    5947

    瀏覽量

    135771
  • 總線
    +關(guān)注

    關(guān)注

    10

    文章

    2857

    瀏覽量

    87893

原文標(biāo)題:深刻理解以太網(wǎng)發(fā)送,必經(jīng)DMA Transmit Descriptor

文章出處:【微信號(hào):Rocker-IC,微信公眾號(hào):路科驗(yàn)證】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    簡(jiǎn)談基于FPGA的千兆以太網(wǎng)

    大家好,又到了學(xué)習(xí)時(shí)間了,學(xué)習(xí)使人快樂(lè)。今天我們來(lái)簡(jiǎn)單的聊以太網(wǎng),以太網(wǎng)在FPGA學(xué)習(xí)中屬于比較高級(jí)的內(nèi)容了,有些同學(xué)肯定會(huì)感覺(jué)以太網(wǎng)學(xué)
    的頭像 發(fā)表于 08-05 10:28 ?1.3w次閱讀
    簡(jiǎn)談基于FPGA的千兆<b class='flag-5'>以太網(wǎng)</b>

    基于DWC_ether_qos的以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-描述符鏈表介紹

    本文轉(zhuǎn)自公眾號(hào)歡迎關(guān)注 .描述符概述 1.0 前言 對(duì)于DWC Ethernet QoS驅(qū)動(dòng)的編寫(xiě)來(lái)說(shuō),初始化完成之后,核心操作就是DMA的描述符鏈表配置(linked list
    的頭像 發(fā)表于 08-30 09:39 ?4296次閱讀
    基于DWC_ether_qos的<b class='flag-5'>以太網(wǎng)</b>驅(qū)動(dòng)開(kāi)發(fā)-<b class='flag-5'>描述符</b>鏈表介紹

    107以太網(wǎng)DMA發(fā)送描述符不成功是怎么回事?

    int DES3;}ETH_DMA_Desc;__align(4) ETH_DMA_Desc TxDes[2];單個(gè)描述符發(fā)送正常,代碼:void ETH_Tx_Des_Init(void){ int i; TxDes[0].DES0 = (0
    發(fā)表于 10-08 06:57

    以太網(wǎng)數(shù)據(jù)幀的發(fā)送描述符隊(duì)列是什么意思?

    這個(gè)描述符是什么呀,類似linux系統(tǒng)的文件描述符
    發(fā)表于 05-26 06:15

    以太網(wǎng)描述符ETH_DMATxDesc_OWN異常

    stm32 以太網(wǎng)發(fā)送段時(shí)間后發(fā)送描述符狀態(tài)直為DMA擁有,造成
    發(fā)表于 07-07 14:08

    NUC980的網(wǎng)口的發(fā)送描述符的緩沖區(qū)地址要求4字節(jié)對(duì)齊的問(wèn)題求解

    NUC980的網(wǎng)口的發(fā)送描述符的緩沖區(qū)地址要求 4字節(jié)對(duì)齊的問(wèn)題,因?yàn)槲矣玫膮f(xié)議棧里面要求IP數(shù)據(jù)段4字節(jié)對(duì)齊,加上以太網(wǎng)14字節(jié),如果發(fā)送
    發(fā)表于 06-13 07:01

    NUC980的網(wǎng)口的發(fā)送描述符的緩沖區(qū)地址要求4字節(jié)對(duì)齊的問(wèn)題求解

    NUC980的網(wǎng)口的發(fā)送描述符的緩沖區(qū)地址要求 4字節(jié)對(duì)齊的問(wèn)題,因?yàn)槲矣玫膮f(xié)議棧里面要求IP數(shù)據(jù)段4字節(jié)對(duì)齊,加上以太網(wǎng)14字節(jié),如果發(fā)送
    發(fā)表于 06-27 07:34

    關(guān)于NUC980的網(wǎng)口的發(fā)送描述符的緩沖區(qū)地址要求4字節(jié)對(duì)齊的問(wèn)題

    NUC980的網(wǎng)口的發(fā)送描述符的緩沖區(qū)地址要求 4字節(jié)對(duì)齊的問(wèn)題,因?yàn)槲矣玫膮f(xié)議棧里面要求IP數(shù)據(jù)段4字節(jié)對(duì)齊,加上以太網(wǎng)14字節(jié),如果發(fā)送
    發(fā)表于 09-04 06:44

    USB HID報(bào)告及報(bào)告描述符簡(jiǎn)介

    在USB中,USB HOST是通過(guò)各種描述符來(lái)識(shí)別設(shè)備的,有設(shè)備描述符,配置描述符,接口描述符,端點(diǎn)描述符,字符串
    發(fā)表于 04-12 11:13 ?3999次閱讀

    Descriptor描述符解釋

    Descriptor即描述符,是個(gè)完整的數(shù)據(jù)結(jié)構(gòu),可以通過(guò)C語(yǔ)言等編程實(shí)現(xiàn),并存儲(chǔ)在USB設(shè)備中,用于描述個(gè)USB設(shè)備的所有屬性,USB主機(jī)是通過(guò)
    發(fā)表于 07-16 09:39 ?2612次閱讀

    USB設(shè)備鍵值表描述符說(shuō)明資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是USB設(shè)備鍵值表描述符說(shuō)明資料免費(fèi)下載包括了:1.設(shè)備描述符的結(jié)構(gòu),2. 配置描述符的結(jié)構(gòu),3. 接口描述符的結(jié)構(gòu),4. HID
    發(fā)表于 07-16 16:56 ?35次下載
    USB設(shè)備鍵值表<b class='flag-5'>描述符</b>說(shuō)明資料免費(fèi)下載

    USB各描述符之間的依賴是怎么樣的

    USB 是個(gè)通用的總線,端口都是統(tǒng)的。但是USB 設(shè)備卻各種各樣,例如USB 鼠標(biāo), USB鍵盤(pán), U盤(pán)等等,那么USB 主機(jī)是如何識(shí)別出不同的設(shè)備的呢?這就要依賴于描述符了。USB 的描述符主要有設(shè)備
    發(fā)表于 07-23 16:53 ?8次下載
    USB各<b class='flag-5'>描述符</b>之間的依賴是怎么樣的

    Linux系統(tǒng)編程中的文件描述符調(diào)用

    文件描述符 進(jìn)程每打開(kāi)個(gè)文件的時(shí)候,會(huì)獲得該文件的文件描述符,而后續(xù)的讀寫(xiě)操作都把文件描述符作為參數(shù)。在用戶空間或者內(nèi)核空間,都是通過(guò)文件描述符
    的頭像 發(fā)表于 09-02 09:50 ?1634次閱讀
    Linux系統(tǒng)編程中的文件<b class='flag-5'>描述符</b>調(diào)用

    基于DWC_ether_qos的以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-描述符格式介紹

    前面我們介紹了描述符鏈表的工作模式,重點(diǎn)是了解環(huán)形鏈表是如何環(huán)形的,以及相關(guān)的寄存器。驅(qū)動(dòng)編寫(xiě)就需要更進(jìn)步,了解描述符的具體內(nèi)容,即4個(gè)描述符的每個(gè)字段的含義。
    的頭像 發(fā)表于 09-04 14:14 ?2299次閱讀
    基于DWC_ether_qos的<b class='flag-5'>以太網(wǎng)</b>驅(qū)動(dòng)開(kāi)發(fā)-<b class='flag-5'>描述符</b>格式介紹

    Python的優(yōu)雅之處:Descriptor(描述符

    語(yǔ)法糖的實(shí)現(xiàn)上也有使用到(在下面的文章會(huì)一一介紹)。 當(dāng)你點(diǎn)進(jìn)這篇文章時(shí) 你也許沒(méi)學(xué)過(guò)描述符,甚至沒(méi)聽(tīng)過(guò)描述符。 或者你對(duì)描述符只是知半解 無(wú)論你是哪種,本篇都將帶你全面的學(xué)習(xí)
    的頭像 發(fā)表于 11-02 10:52 ?951次閱讀
    Python的優(yōu)雅之處:Descriptor(<b class='flag-5'>描述符</b>)