本文轉(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ū)動實際就是圍繞著準備描述符來進行的,這種機制使得驅(qū)動代碼的編寫比較簡單了,軟件通過描述符高速硬件DMA怎么做即可,剩下的就交給硬件DMA了,這樣效率非常高。
二.收發(fā)驅(qū)動
2.1發(fā)送
Current是硬件維護的指針,Current表示硬件當(dāng)前操作的描述符,如果該描述符不是OWN BY DMA則停止。
Inx是軟件維護的指針,軟件寫完一個描述符Inx遞增,如果Inx追趕上了Current,即遇到了OWN BY DMA的描述符也停止。
開始時指針如下,Current,Inx都從Base開始,注意current需要啟動后才能讀到值,初始化后是0,所以這里編程需要注意
軟件準備n個描述待發(fā)送,黃色部分,并設(shè)置這些描述符OWN BY DMA,啟動DMA,硬件開始處理這些描述符
比如硬件處理完一個描述符后,繼續(xù)處理后面的
硬件處理完,Current追上了Inx,停止DMA
當(dāng)然Current在發(fā)送的時候,軟件又可以從Inx往后面準備描述符,相當(dāng)于Inx是生產(chǎn)者,生產(chǎn)描述符,Current是消費者,消費描述符,這樣就可以不間斷的進行發(fā)送。
/**
2.2接收
接收和發(fā)送類似
初始化時先將所有描述符設(shè)置為接收狀態(tài),且設(shè)置產(chǎn)生IOC中斷,并啟動DMA。
如下所示黃色描述符都是表示準備接收數(shù)據(jù)。
在收到一包數(shù)據(jù)后,產(chǎn)生中斷,如下描述符0即接收到數(shù)據(jù)的描述符,變?yōu)榉荗WN BY DMA,軟件查詢該描述符可以獲取到接收數(shù)據(jù)長度等信息,進行處理。
軟件處理完描述符0之后,又可以將其設(shè)置為接收狀態(tài)OWN BY DMA以便接收繼續(xù)接收。
以上是接收比軟件處理的慢,所以Current一直追不上Inx,如果接收比軟件處理的快,
則Current會追上Inx而停止。
比如如下
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è)置標志,主線程主循環(huán)中接收信號量或標志才調(diào)用該函數(shù)進行接收處理。
三.接收調(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 確認回寫狀態(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 確認接收狀態(tài)
如果以上描述符都正確但是還是沒有數(shù)據(jù),確認接收是否正在工作
查看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)
3.4 檢查過濾等其他設(shè)置
如果以上還未收到,檢查過兩次設(shè)置,最好設(shè)置為RA接收所有包,
確認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 確認回寫狀態(tài)
(gdb) p /x tx_desc
$2 = {{des0 = 0x200bdc0, des1 = 0x0, des2 = 0x8000002a, des3 = 0x30000000} }
(gdb)
4.3 確認發(fā)送狀態(tài)
如果以上描述符都正確但是還是沒有數(shù)據(jù),確認接收是否正在工作
查看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)
4.4 檢查發(fā)送數(shù)據(jù)等
檢查發(fā)送數(shù)據(jù)是否又64字節(jié)以上,可以配置CPC自動添加CRC和填充。
確認DMA的ST使能了發(fā)送等。
五.總結(jié)
收發(fā)驅(qū)動實際就是對描述符的操作,需要了解描述符環(huán)形結(jié)構(gòu),軟件硬件分別是怎么實用描述符的。另外也需要了解相關(guān)寄存器,描述符格式等,了解如何去調(diào)試收發(fā)過程。
審核編輯 黃宇
-
嵌入式
+關(guān)注
關(guān)注
5082文章
19123瀏覽量
305143 -
以太網(wǎng)
+關(guān)注
關(guān)注
40文章
5424瀏覽量
171700 -
調(diào)試
+關(guān)注
關(guān)注
7文章
578瀏覽量
33936 -
驅(qū)動開發(fā)
+關(guān)注
關(guān)注
0文章
130瀏覽量
12077
發(fā)布評論請先 登錄
相關(guān)推薦
評論