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

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

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

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

嵌入式USB開發(fā) ? 來源:嵌入式USB開發(fā) ? 作者:嵌入式USB開發(fā) ? 2023-08-30 09:39 ? 次閱讀

本文轉(zhuǎn)自公眾號歡迎關(guān)注

一.描述符概述

1.0 前言

對于DWC Ethernet QoS驅(qū)動的編寫來說,初始化完成之后,核心操作就是DMA的描述符鏈表配置(linked list of descriptors)。DMA根據(jù)描述符鏈表自動在FIFO和用戶指定的緩存之間搬運數(shù)據(jù)。對于熟悉新思的IP的用戶來說,這種套路會有似曾相識的感覺,沒錯新思的大部分高速IP的數(shù)據(jù)流都是這么處理的,比如在DWC2 USB的IP中就是Scatter/Gather DMA,叫法不一樣,實現(xiàn)和思想基本是一樣的。這種方式可以解放CPU,使用DMA根據(jù)描述符鏈表搬運數(shù)據(jù),對于高速數(shù)據(jù)流的流式處理有利,相對單個描述符的DMA,鏈表式描述符一次可以處理更多數(shù)據(jù)更高效,且能夠?qū)崿F(xiàn)環(huán)形不間斷流式處理。

參考手冊《21 Descriptors》

1.1描述符類型

Normal Descriptor: 描述要傳輸?shù)臄?shù)據(jù)包和其控制信息。包含兩個緩沖區(qū)和兩個地址指針,這種設(shè)計以實現(xiàn)較大的靈活性,支持不同的內(nèi)存管理方案。

Context Descriptor: 描述要傳輸?shù)臄?shù)據(jù)包的控制信息。

注意:單個數(shù)據(jù)包可以使用的描述符數(shù)量沒有限制,雖然這里沒有限制,但是受限于Ring_Length寄存器,描述符鏈表實際最多只能配置為0x3FF即1024個描述符。

1.2描述符結(jié)構(gòu)

描述鏈表整體看是一個環(huán)形結(jié)構(gòu)即到了描述符的末尾可以繞回.

圖片

有一些寄存器對該環(huán)形描述符進(jìn)行定義

1.2.1描述符的顆粒(間隙)

收發(fā)都是一樣的

圖片

上述描述Descriptor n本身的大小是固定的即RDES0~RDES3,4個WORD(根據(jù)不同的總線寬度和大小端,有不同的layout,但是其大小總是4個WORD大小,見后面說明).

還支持描述符之間有間隙,間隙的單位根據(jù)總線寬度而定,即32,64,128位總線寬度分別對應(yīng) Word, Dword, Lword為單位,寄存器DMA_CH(#i)_Control的DSL位域即用于描述該間隙。

再次提醒注意,這里的單位是根據(jù)總線寬度而定,不是固定為WORD。

圖片

圖片

比如這里DSL=0,則表示描述符之間沒有間隙,

設(shè)置為1,如果是32位總線則間隙為1 WORD。

圖片

1.2.2描述符的個數(shù)

收發(fā)分別由如下寄存器指定

DMA_CH(#i)_TxDesc_Ring_Length

DMA_CH(#i)_RxDesc_Ring_Length

圖片

圖片

1.2.3描述符的首末地址

1)發(fā)由以下寄存器決定:

基地址

DMA_CHi_Tx_Control的ST=0,即TX停止時才能修改以下寄存器。

DMA_CH(#i)_TxDesc_List_HAddress 發(fā)送描述符鏈表基地址的高位,只有40,48位地址模式才使用。

DMA_CH(#i)_TxDesc_List_Address 發(fā)送描述符鏈表基地址的低位,必須根據(jù)總線寬度按照Word, Dword,Lword對齊,DMA會自動根據(jù)總線寬度忽略低位。

尾地址

DMA_CH(#i)_TxDesc_Tail_Pointer 發(fā)送描述符鏈表尾地址,必須根據(jù)總線寬度按照Word, Dword,Lword對齊。

這里為什么沒有高位寄存器了呢,因為不需要了,高位和DMA_CH(#i)_TxDesc_List_HAddress一樣。

2)收由以下寄存器決定 :

基地址

DMA_CH(#i)_RX_Control 的SR=0,即RX停止時才能修改以下寄存器。

DMA_CH(#i)_RxDesc_List_HAddress 接收描述符鏈表基地址的高位,只有40,48位地址模式才使用。

DMA_CH(#i)_RxDesc_List_Address

接收描述符鏈表基地址的低位,必須根據(jù)總線寬度按照Word, Dword,Lword對齊,DMA會自動根據(jù)總線寬度忽略低位。

尾地址

DMA_CH(#i)_RxDesc_Tail_Pointer接收描述符鏈表尾地址,必須根據(jù)總線寬度按照Word, Dword,Lword對齊。

這里為什么沒有高位寄存器了呢,因為不需要了,高位和DMA_CH(#i)_RxDesc_List_HAddress一樣。

1.2.4當(dāng)前處理的Buffer地址

以下只讀寄存器可以調(diào)試使用,確認(rèn)當(dāng)前處理的描述符對應(yīng)的Buffer地址,reset時這些寄存器會清零。

發(fā)送Buffer

DMA_CH(#i)_Current_App_TxBuffer_H 地址高位

DMA_CH(#i)_Current_App_TxBuffer 地址低位

接收Buffer

DMA_CH(#i)_Current_App_RxBuffer_H

DMA_CH(#i)_Current_App_RxBuffer

需要有收發(fā)數(shù)據(jù)才會更新當(dāng)前處理的Buffer地址。

1.2.5當(dāng)前描述符指針

以下只讀寄存器可以調(diào)試使用,確認(rèn)當(dāng)前處理的描述符,reset時這些寄存器會清零。

發(fā)送

DMA_CH(#i)_Current_App_TxDesc

接收

DMA_CH(#i)_Current_App_RxDesc

Current寄存器是什么時候更新的呢,測試可以知道是寫B(tài)ase寄存器時更新

圖片

進(jìn)一步測試可知是在DMA停止,即DMA_CH(#i)_RX_Control的SR為0時寫DMA_CH(#i)_RxDesc_List_Address 時Current寄存器會自動設(shè)置為DMA_CH(#i)_RxDesc_List_Address的值。如果SR=1則不會。

TX也類似。在DMA工作之后,該寄存器更新為當(dāng)前正在處理的描述符。

1.3描述符的內(nèi)存布局

描述符的大小總是4x4字節(jié)的,但是其布局和總線寬度和大小端有關(guān)。

且必須根據(jù)總線寬度Word, DWord,或 LWord 對齊。

三種總線寬度,2種大小端模式一共有6種組合

32位的大端和小端

圖片

64位小端

圖片

64位大端

圖片

128位小端

圖片

128位大端

圖片

1.4描述鏈表的工作過程

1.4.1環(huán)形結(jié)構(gòu)

圖片

前面介紹的描述符首末地址,當(dāng)前描述符指針和描述符個數(shù)這幾個寄存器決定了鏈表的行為。

DMA可以處理的描述符范圍是:[Base,Tail)

注意[]表示包括本身,()表示不包括本身,即包括Base寄存器對應(yīng)的描述符,不包括Tail寄存器對應(yīng)的描述符。

當(dāng)前描述符指針則從Base到Tail-1的位置遍歷,當(dāng)Current=Tai時DMA停止工作。

同時還受描述符個數(shù)寄存器限制,

如果描述個數(shù)設(shè)置為N,則Current到Base~N-1的位置之后會繞回到Base,即以N個為單位回環(huán),這里假設(shè)Tail是在N個描述符之后的,如果在之前則回環(huán)之前就Current=Tail停止了。

1.4.2停止條件:

Current=Tail

或者Current的位置沒有就緒的描述符,即不是Owned by DMA的描述符。

所以Tail至少要大于base才能傳輸。

1.4.3重啟條件

重啟條件即保證current處的描述符就緒,且current%N

寫Tail寄存器時會觸發(fā)一次硬件的重啟條件檢測,來檢測上述條件。

所以停止了之后讀寫 都需要寫Tail寄存器才能重啟 。

1.4.4幾種情況分析

Tail 指向 N-1位置之后,此時current不可能達(dá)到tail,因為到N-1時就繞回了,

所以停止條件只能是current處的描述符未就緒,即不是Owned by DMA。

此時current不斷回環(huán)遍歷,只要軟件能保證current處的描述符一直就緒,DMA就一直傳輸處理,形成了不間斷的持續(xù)流處理。

圖片

Tail剛好指向N-1位置或者更向前

則當(dāng)current=current后停止。

或者current處的描述符未就緒即停止。

此時沒法形成持續(xù)的流,因為current到了tail之后就會停止。

圖片

1.4.5驅(qū)動的設(shè)計

為了充分利用上述描述符的回環(huán)模式,能夠連續(xù)不斷的收發(fā),需要保證DMA處理完之前就更新好后續(xù)描述符。使得DMA一直有描述符能處理,不至于current處描述符未就緒而導(dǎo)致停止,且tail設(shè)置為在N個描述符之后,這樣current始終不會因為=tail而停止。

要保證連續(xù)不斷的流,需要軟件準(zhǔn)備描述符的速度大于等于DMA處理描述符的速度。

即current處始終有描述符可以處理,所以軟件準(zhǔn)備好的描述符在current及其之后,需要軟件維護(hù)一個變量index記錄當(dāng)前軟件準(zhǔn)備好的描述到了哪。

即current追趕index。

當(dāng)index>current時,[current,index)之間是已經(jīng)準(zhǔn)備好的描述符待DMA處理的,[index,Tail)

[base,current)這兩部分是DMA已經(jīng)處理完,軟件需要更新的描述符。

圖片

當(dāng)index<=current時,[index,current)是DMA已經(jīng)處理完,軟件需要更新的描述符。

[current,Tail),[Base,index)這兩部分是DMA未處理的部分。

圖片

所以驅(qū)動處理流程如下

初始化時先盡可能多的填充好描述符,對于接收可以初始化所有描述符為接收狀態(tài),對于發(fā)送當(dāng)然剛開始可能并不需要發(fā)送很多數(shù)據(jù),那么就需要發(fā)送多少就準(zhǔn)備多少描述符。

然后接收中斷中處理DMA已經(jīng)接收完的描述符,應(yīng)用處理完對應(yīng)的數(shù)據(jù)后再將這些描述符設(shè)置為接收狀態(tài)。

對于發(fā)送則查詢哪些描述符DMA已經(jīng)發(fā)送完就可將其更新為發(fā)送狀態(tài)進(jìn)行發(fā)送。

比如如下開始準(zhǔn)備了n個描述符

圖片

然后啟動DMA傳輸,

此時有兩種情況,一種是硬件處理DMA比如軟件更新描述符塊,還有一種是相反。

后者軟件總是在current追不上index,即軟件更新描述符速度大于硬件處理描述符速度

一段時間后可能就是如下所示

圖片

而前者軟件準(zhǔn)備的慢則current會追上index此時DMA會停止,軟件需要重新準(zhǔn)備描述符并重新配置Tail來重啟DMA。

具體的驅(qū)動代碼后面再詳講。

1.5總結(jié)

以上介紹了描述符鏈表,尤其需要了解環(huán)形鏈表的工作模式何時啟動,何時停止,軟件和硬件如何配合使用環(huán)形鏈表。以及相關(guān)寄存器的值的含義和何時更新。了解以上機制后后面就可以開始編寫驅(qū)動代碼進(jìn)行收發(fā)。下回再詳講。

審核編輯 黃宇

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

    關(guān)注

    5059

    文章

    18974

    瀏覽量

    302062
  • 以太網(wǎng)
    +關(guān)注

    關(guān)注

    40

    文章

    5343

    瀏覽量

    170804
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5294

    瀏覽量

    119816
  • 驅(qū)動
    +關(guān)注

    關(guān)注

    12

    文章

    1818

    瀏覽量

    85110
  • dma
    dma
    +關(guān)注

    關(guān)注

    3

    文章

    556

    瀏覽量

    100347
收藏 人收藏

    評論

    相關(guān)推薦

    基于DWC2的USB驅(qū)動開發(fā)-IAD描述符詳解

    本文轉(zhuǎn)自公眾號,歡迎關(guān)注 基于DWC2的USB驅(qū)動開發(fā)-IAD描述符詳解 (qq.com) 一.? 前言 IAD描述符用于一個設(shè)備功能關(guān)聯(lián)多
    的頭像 發(fā)表于 06-27 08:45 ?5.1w次閱讀
    基于<b class='flag-5'>DWC</b>2的USB<b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-IAD<b class='flag-5'>描述符</b>詳解

    基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-MAC幀格式介紹

    本文轉(zhuǎn)自公眾號,歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-MAC幀格式介紹 (qq.com) 一.前言 ? 在
    的頭像 發(fā)表于 08-30 09:23 ?2174次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-MAC幀格式<b class='flag-5'>介紹</b>

    基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-MDIO驅(qū)動編寫與測試

    本文轉(zhuǎn)自公眾號歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-MDIO驅(qū)動編寫與測試 一.前言
    的頭像 發(fā)表于 08-30 09:37 ?3558次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-MDIO<b class='flag-5'>驅(qū)動</b>編寫與測試

    基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-數(shù)據(jù)流驗證過程

    轉(zhuǎn)自公眾號歡迎關(guān)注 https://mp.weixin.qq.com/s/klrHhaLMM_0W3FGVwHXFkA 基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-數(shù)據(jù)流驗證過程
    的頭像 發(fā)表于 08-31 08:41 ?1862次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-數(shù)據(jù)流驗證過程

    基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-收發(fā)驅(qū)動編寫與調(diào)試

    本文轉(zhuǎn)自公眾號,歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-收發(fā)驅(qū)動編寫與調(diào)試 (qq.com) https://mp.wei
    的頭像 發(fā)表于 09-05 08:47 ?2181次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-收發(fā)<b class='flag-5'>驅(qū)動</b>編寫與調(diào)試

    基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-無OS環(huán)境移植LWIP

    本文轉(zhuǎn)自公眾號歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-無OS環(huán)境移植LWIP (qq.com) https://mp.weixin.qq.com/s
    的頭像 發(fā)表于 09-06 08:40 ?1463次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-無OS環(huán)境移植LWIP

    基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-LWIP的堆管理介紹

    本文轉(zhuǎn)自公眾號歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-LWIP的堆管理介紹 (qq.com) https://mp.wei
    的頭像 發(fā)表于 09-08 08:40 ?1182次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-LWIP的堆管理<b class='flag-5'>介紹</b>

    基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-RTOS環(huán)境移植LWIP與性能測試

    本文轉(zhuǎn)自公眾號,歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-RTOS環(huán)境移植LWIP與性能測試 (qq.com) https://mp.weixin.qq.com/s
    的頭像 發(fā)表于 09-11 11:20 ?1877次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-RTOS環(huán)境移植LWIP與性能測試

    基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-LWIP在PC上進(jìn)行開發(fā)調(diào)試

    本文轉(zhuǎn)自公眾號歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-LWIP在PC上進(jìn)行開發(fā)調(diào)試 (qq.com) https://mp
    的頭像 發(fā)表于 09-11 08:40 ?1866次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-LWIP在PC上進(jìn)行<b class='flag-5'>開發(fā)</b>調(diào)試

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

    stm32 以太網(wǎng)發(fā)送一段時間后發(fā)送描述符狀態(tài)一直為DMA擁有,造成以太網(wǎng)發(fā)送停止,發(fā)送過程中什么原因會造成描述符一直為DMA擁有;(發(fā)送接收同時進(jìn)行,接收為中斷接收)`&a
    發(fā)表于 07-07 14:08

    設(shè)計軟件核心以太網(wǎng)服務(wù)質(zhì)量數(shù)據(jù)手冊免費下載

    本文描述Synopsys設(shè)計軟件核心以太網(wǎng)服務(wù)質(zhì)量DWC以太網(wǎng)QoS核心5.10A。DWC
    發(fā)表于 10-23 08:00 ?16次下載
    設(shè)計軟件核心<b class='flag-5'>以太網(wǎng)</b>服務(wù)質(zhì)量數(shù)據(jù)手冊免費下載

    DesignWare核心以太網(wǎng)服務(wù)質(zhì)量數(shù)據(jù)本

      本文檔介紹Synopsys DesignWare核心以太網(wǎng)服務(wù)質(zhì)量(DWC_Ethernet_qos)核心,5.10a。DWC_Ethernet_qos實現(xiàn)了與MAC層相關(guān)的
    發(fā)表于 03-31 15:11 ?3次下載

    基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-包過濾

    以太網(wǎng)上數(shù)據(jù)非常多,如果所有數(shù)據(jù)都接收交給軟件去處理軟件負(fù)載會非常重,所以一般只需要接收發(fā)給自己的數(shù)據(jù)即可
    的頭像 發(fā)表于 09-02 09:19 ?1592次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-包過濾

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

    前面我們介紹描述符鏈表的工作模式,重點是了解環(huán)形鏈表是如何環(huán)形的,以及相關(guān)的寄存器。驅(qū)動編寫就需要更進(jìn)一步,了解
    的頭像 發(fā)表于 09-04 14:14 ?2336次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-<b class='flag-5'>描述符</b>格式<b class='flag-5'>介紹</b>

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

    相對于其他總線,以太網(wǎng)的知識龐雜,當(dāng)然,可獲取的資料也豐富。以太網(wǎng)的知識從驅(qū)動層到上層協(xié)議棧,很難一下消化,所以,不妨從點開始,不斷地拓展和鏈接,從而形成完整地以太網(wǎng)知識框架,進(jìn)而更好
    的頭像 發(fā)表于 10-22 15:09 ?173次閱讀
    聊一聊<b class='flag-5'>以太網(wǎng)</b>發(fā)送<b class='flag-5'>描述符</b>