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ā)-收發(fā)驅(qū)動編寫與調(diào)試

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

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

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

https://mp.weixin.qq.com/s/NXKiBsNvhMG_bCruEeqmtg

一.前言

前面已經(jīng)介紹了環(huán)形描述符的工作方式和描述符的具體格式。收發(fā)的驅(qū)動實際就是圍繞著準(zhǔn)備描述符來進(jìn)行的,這種機制使得驅(qū)動代碼的編寫比較簡單了,軟件通過描述符高速硬件DMA怎么做即可,剩下的就交給硬件DMA了,這樣效率非常高。

二.收發(fā)驅(qū)動

2.1發(fā)送

Current是硬件維護(hù)的指針,Current表示硬件當(dāng)前操作的描述符,如果該描述符不是OWN BY DMA則停止。

Inx是軟件維護(hù)的指針,軟件寫完一個描述符Inx遞增,如果Inx追趕上了Current,即遇到了OWN BY DMA的描述符也停止。

開始時指針如下,Current,Inx都從Base開始,注意current需要啟動后才能讀到值,初始化后是0,所以這里編程需要注意

wKgaomT2hgmADaIUAABCBsgW8uA618.png

軟件準(zhǔn)備n個描述待發(fā)送,黃色部分,并設(shè)置這些描述符OWN BY DMA,啟動DMA,硬件開始處理這些描述符

wKgZomT2hgqAStIRAABzDTuFg4c354.png

比如硬件處理完一個描述符后,繼續(xù)處理后面的

wKgZomT2hhCAIxtrAABkiGfpRw4398.png

硬件處理完,Current追上了Inx,停止DMA

wKgaomT2hhCAONSFAABjyn92SRQ449.png

當(dāng)然Current在發(fā)送的時候,軟件又可以從Inx往后面準(zhǔn)備描述符,相當(dāng)于Inx是生產(chǎn)者,生產(chǎn)描述符,Current是消費者,消費描述符,這樣就可以不間斷的進(jìn)行發(fā)送。

/**

2.2接收

接收和發(fā)送類似

初始化時先將所有描述符設(shè)置為接收狀態(tài),且設(shè)置產(chǎn)生IOC中斷,并啟動DMA。

如下所示黃色描述符都是表示準(zhǔn)備接收數(shù)據(jù)。

wKgZomT2hhCAGbRyAABOFD4-5Nk195.png

在收到一包數(shù)據(jù)后,產(chǎn)生中斷,如下描述符0即接收到數(shù)據(jù)的描述符,變?yōu)榉荗WN BY DMA,軟件查詢該描述符可以獲取到接收數(shù)據(jù)長度等信息,進(jìn)行處理。

wKgaomT2hhGAVQJEAABNl1Rk9tU888.png

軟件處理完描述符0之后,又可以將其設(shè)置為接收狀態(tài)OWN BY DMA以便接收繼續(xù)接收。

wKgZomT2hhGARjRmAABOmAX8Se8143.png

以上是接收比軟件處理的慢,所以Current一直追不上Inx,如果接收比軟件處理的快,

則Current會追上Inx而停止。

比如如下

wKgaomT2hhGATASnAABGcS8SCyM522.png

int iot_eth_receive_handle(eth_ctrl_t *p_ctrl,eth_rcv_data_pf cb)

接收由于要處理包數(shù)據(jù)所以花費時間比較大,一般不在中斷中處理數(shù)據(jù),也就是不在中斷中調(diào)用iot_eth_receive_handle,而是查詢方式調(diào)用iot_eth_receive_handle,或者接收IOC中斷時中斷中發(fā)送信號量或者設(shè)置標(biāo)志,主線程主循環(huán)中接收信號量或標(biāo)志才調(diào)用該函數(shù)進(jìn)行接收處理。

三.接收調(diào)試

收發(fā)數(shù)據(jù)流參考https://mp.weixin.qq.com/s/klrHhaLMM_0W3FGVwHXFkA

的驗證過程嗎,按照MAC回環(huán),PHY回環(huán),和PC通訊的過程測試。

3.1檢查描述符相關(guān)

接收調(diào)試主要關(guān)注以下描述符相關(guān)寄存器

檢查RxDesc_List,RxDesc_Tail 是否設(shè)置正確,檢查RxDesc_Ring_Length描述符個數(shù)是否設(shè)置正確。檢查RxDesc和RxBuffer是否遞增變化。

(gdb) x /28xw 0x01161100

0x1161100: 0x00000000 0x00100001 0x00100be1 0x00000000

0x1161110: 0x00000000 0x0200c120 0x00000000 0x0200bd00

RxDesc_List

0x1161120: 0x0200c510 0x00000000 0x0200bd00 0x0000003f

RxDesc_Tail

0x1161130: 0x00000001 0x0000c8c3 0x00000000 0x00000000

RxDesc_Ring_Length

0x1161140: 0x00000000 0x0200c510 0x00000000 0x0200bd10

RxDesc

0x1161150: 0x00000000 0x0200bd20 0x00000000 0x0200b710

RxBuffer

0x1161160: 0x00000000 0x00000000 0x00000000 0x00000000

(gdb)

0x111C RxDesc_List

0x1128 RxDesc_Tail

0x1130 RxDesc_Ring_Length

0x114C RxDesc

0x115C RxBuffer

3.2 確認(rèn)回寫狀態(tài)和緩存數(shù)據(jù)是否有

(gdb) p rx_desc

$5 = {{

des0 = 0x200b120,

des1 = 0x0,

des2 = 0x0,

des3 = 0xc1000000

}, {

des0 = 0x200b710,

des1 = 0x0,

des2 = 0x0,

des3 = 0xc1000000

}}

(gdb) p /x rx_buffer

$6 = {0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0x0, 0x42, 0xaa, 0x55 , 0x15, 0x13, 0x86, 0x4a, 0x50, 0x0, 0x0, 0x30, 0x50, 0x0, 0x0, 0x30, 0x50, 0x0, 0x0, 0x30, 0x50, 0x0, 0x0, 0x30, 0x50, 0x0, 0x0, 0x30, 0x50, 0x0, 0x0, 0x30, 0x50, 0x0, 0x0, 0x30, 0x50, 0x0, 0x0, 0x30, 0x50, 0x0, 0x0, 0x30, 0x50, 0x0, 0x0, 0x30, 0x50, 0x0, 0x0, 0x30, 0x50, 0x0, 0x0, 0x30, 0x0 , 0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0x0, 0x42, 0xaa, 0x55, 0x15, 0x13, 0x86, 0x4a, 0x50, 0x0, 0x0, 0x30, 0x50, 0x0, 0x0, 0x30, 0x50, 0x0, 0x0, 0x30, 0x50, 0x0, 0x0, 0x30, 0x50, 0x0, 0x0, 0x30, 0x50, 0x0, 0x0, 0x30, 0x50, 0x0, 0x0, 0x30, 0x50, 0x0, 0x0, 0x30, 0x50, 0x0, 0x0, 0x30, 0x50, 0x0, 0x0, 0x30, 0x50, 0x0, 0x0, 0x30, 0x50, 0x0, 0x0, 0x30, 0x0 }

(gdb)

3.3 確認(rèn)接收狀態(tài)

如果以上描述符都正確但是還是沒有數(shù)據(jù),確認(rèn)接收是否正在工作

查看DMA_Debug_Status0寄存器

RPS0是3表示Running

(gdb) x /20xw 0x01161000

0x1161000: 0x00003000 0x00000001 0x00000000 0x00006300

DMA_Debug_Status0

0x1161010: 0x00000000 0x00000000 0x00000000 0x00000000

0x1161020: 0x00000000 0x00000000 0x00000000 0x00000000

0x1161030: 0x00000000 0x00000000 0x00000000 0x00000000

0x1161040: 0x00000000 0x00000000 0x00000000 0x00000000

(gdb)

wKgZomT2hhKAMeEbAAIR7Z72goU851.png

3.4 檢查過濾等其他設(shè)置

如果以上還未收到,檢查過兩次設(shè)置,最好設(shè)置為RA接收所有包,

確認(rèn)DMA的SR是否使能等。

四.發(fā)送調(diào)試

和接收類似

4.1 檢查描述符

檢查如下寄存器設(shè)置,看TxDesc是否遞增

(gdb) x /28xw 0x01161100

0x1161100: 0x00000000 0x00100001 0x00100be1 0x00000000

0x1161110: 0x00000000 0x0200c1200x00000000 0x0200bd00

TxDesc_List

0x1161120: 0x0200c3d00x00000000 0x0200bd20 0x0000003f

TxDesc_Tail Ring_Length

0x1161130: 0x00000001 0x0000c8c3 0x00000000 0x00000000

0x1161140: 0x00000000 0x0200c3d00x00000000 0x0200bd10

TxDesc

0x1161150: 0x00000000 0x0200bd200x00000000 0x0200b710

TxBuffer

0x1161160: 0x00000000 0x00000000 0x00000000 0x00000000

(gdb)

4.2 確認(rèn)回寫狀態(tài)

(gdb) p /x tx_desc

$2 = {{des0 = 0x200bdc0, des1 = 0x0, des2 = 0x8000002a, des3 = 0x30000000} }

(gdb)

4.3 確認(rèn)發(fā)送狀態(tài)

如果以上描述符都正確但是還是沒有數(shù)據(jù),確認(rèn)接收是否正在工作

查看DMA_Debug_Status0寄存器

(gdb) x /20xw 0x01161000

0x1161000: 0x00002000 0x00000001 0x00000001 0x00006400

DMA_Debug_Status0

0x1161010: 0x00000000 0x00000000 0x00000000 0x00000000

0x1161020: 0x00000000 0x00000000 0x00000000 0x00000000

0x1161030: 0x00000000 0x00000000 0x00000000 0x00000000

0x1161040: 0x00000000 0x00000000 0x00000000 0x00000000

(gdb)

wKgZomT2hhKAMeEbAAIR7Z72goU851.png

4.4 檢查發(fā)送數(shù)據(jù)等

檢查發(fā)送數(shù)據(jù)是否又64字節(jié)以上,可以配置CPC自動添加CRC和填充。

確認(rèn)DMA的ST使能了發(fā)送等。

五.總結(jié)

收發(fā)驅(qū)動實際就是對描述符的操作,需要了解描述符環(huán)形結(jié)構(gòu),軟件硬件分別是怎么實用描述符的。另外也需要了解相關(guān)寄存器,描述符格式等,了解如何去調(diào)試收發(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
  • 調(diào)試
    +關(guān)注

    關(guān)注

    7

    文章

    571

    瀏覽量

    33872
  • 驅(qū)動開發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    130

    瀏覽量

    12059
收藏 人收藏

    評論

    相關(guān)推薦

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

    本文轉(zhuǎn)自公眾號,歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-MAC幀格式介紹 (qq.com) 一.前言 ? 在以太網(wǎng)
    的頭像 發(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幀格式介紹

    基于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 ?3559次閱讀
    基于<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><b class='flag-5'>編寫</b>與測試

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

    本文轉(zhuǎn)自公眾號歡迎關(guān)注 一.描述符概述 1.0 前言 對于DWC Ethernet QoS驅(qū)動編寫來說,初始化完成之后,核心操作就是DMA的描述符鏈表配置(linked list
    的頭像 發(fā)表于 08-30 09:39 ?4301次閱讀
    基于<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ā)-數(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ā)-無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.weixin.qq.com/s
    的頭像 發(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的堆管理介紹

    基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-LWIP的堆(內(nèi)存池)未對齊導(dǎo)致問題的案例分享

    本文轉(zhuǎn)自公眾號歡迎關(guān)注 https://mp.weixin.qq.com/s/ErIa2ss2YZLGYbSwoJEzog 一.?前言 內(nèi)存未對齊訪問問題這個已經(jīng)是老生常談的問題了, 由于LWIP的堆管理中也用到了地址(指針)強制轉(zhuǎn)換所以也會遇到這個問題。對于老手比較容易發(fā)現(xiàn),對于新手可能會比較疑惑。所以也單獨分享一個案例吧,權(quán)當(dāng)一個小的check list的case。 二.?問題 Lwipopts.h中MEM_ALIGNMENT可以配置堆對齊大小,有問題時是配置為1 #define MEM_ALIGNMENT 1U 異常時打印寄存器如下,當(dāng)然不同平臺異常時如何獲取上下
    的頭像 發(fā)表于 09-09 08:44 ?1642次閱讀
    基于<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的堆(內(nèi)存池)未對齊導(dǎo)致問題的案例分享

    基于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)試
    的頭像 發(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><b class='flag-5'>調(diào)試</b>

    基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-LWIP的ICMP模塊介紹與PING收發(fā)

    本文轉(zhuǎn)自公眾號歡迎關(guān)注 https://mp.weixin.qq.com/s/6MTNop3zBKdQ-gabbWo63Q 一. 前言 ICMP即Internet Control Message Protocol因特網(wǎng)控制消息協(xié)議。 ICMP是網(wǎng)絡(luò)層協(xié)議,IP不可分割的一部分。 ICMP用于報告數(shù)據(jù)報處理中的錯誤,比如以下情況下時發(fā)送ICMP消息:當(dāng)數(shù)據(jù)報無法到達(dá)其目的地時,當(dāng)網(wǎng)關(guān)沒有轉(zhuǎn)發(fā)數(shù)據(jù)報的緩沖能力時,以及當(dāng)網(wǎng)關(guān)可以指示主機在較短的路由上發(fā)送數(shù)據(jù)時。 互聯(lián)網(wǎng)協(xié)議的設(shè)計并不是絕對可靠的。ICMP這些控制消息的目的是提供有關(guān)通信環(huán)境中問題的反饋
    的頭像 發(fā)表于 09-18 17:51 ?1781次閱讀
    基于<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的ICMP模塊介紹與PING<b class='flag-5'>收發(fā)</b>測

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

    本文描述Synopsys設(shè)計軟件核心以太網(wǎng)服務(wù)質(zhì)量DWC以太網(wǎng)QoS核心5.10A。DWC以太網(wǎng)
    發(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)的以太網(wǎng)
    發(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ā)-軟復(fù)位介紹與問題案例

    一般模塊都會有軟復(fù)位的功能,軟復(fù)位在驅(qū)動編寫中很重要。一般初始化時執(zhí)行軟復(fù)位使得模塊進(jìn)入確定的初始狀態(tài)以提高可靠性,異常時也可以重新初始化來恢復(fù),所以軟復(fù)位在驅(qū)動中一般是必須要做的動作。
    的頭像 發(fā)表于 09-02 09:17 ?1494次閱讀
    基于<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ù)位介紹與問題案例

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

    前面我們介紹了描述符鏈表的工作模式,重點是了解環(huán)形鏈表是如何環(huán)形的,以及相關(guān)的寄存器。驅(qū)動編寫就需要更進(jìn)一步,了解描述符的具體內(nèi)容,即4個描述符的每個字段的含義。
    的頭像 發(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>-描述符格式介紹