0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于DWC_ether_qos的以太网驱动开发-收发驱动编写与调试

嵌入式USB开发 来源:嵌入式Lee 作者:嵌入式Lee 2023-09-05 08:47 次阅读

本文转自公众号,欢迎关注

基于DWC_ether_qos的以太网驱动开发-收发驱动编写与调试 (qq.com)

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

一.前言

前面已经介绍了环形描述符的工作方式和描述符的具体格式。收发的驱动实际就是围绕着准备描述符来进行的,这种机制使得驱动代码的编写比较简单了,软件通过描述符高速硬件DMA怎么做即可,剩下的就交给硬件DMA了,这样效率非常高。

二.收发驱动

2.1发送

Current是硬件维护的指针,Current表示硬件当前操作的描述符,如果该描述符不是OWN BY DMA则停止。

Inx是软件维护的指针,软件写完一个描述符Inx递增,如果Inx追赶上了Current,即遇到了OWN BY DMA的描述符也停止。

开始时指针如下,Current,Inx都从Base开始,注意current需要启动后才能读到值,初始化后是0,所以这里编程需要注意

wKgaomT2hgmADaIUAABCBsgW8uA618.png

软件准备n个描述待发送,黄色部分,并设置这些描述符OWN BY DMA,启动DMA,硬件开始处理这些描述符

wKgZomT2hgqAStIRAABzDTuFg4c354.png

比如硬件处理完一个描述符后,继续处理后面的

wKgZomT2hhCAIxtrAABkiGfpRw4398.png

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

wKgaomT2hhCAONSFAABjyn92SRQ449.png

当然Current在发送的时候,软件又可以从Inx往后面准备描述符,相当于Inx是生产者,生产描述符,Current是消费者,消费描述符,这样就可以不间断的进行发送。

/**

2.2接收

接收和发送类似

初始化时先将所有描述符设置为接收状态,且设置产生IOC中断,并启动DMA。

如下所示黄色描述符都是表示准备接收数据。

wKgZomT2hhCAGbRyAABOFD4-5Nk195.png

在收到一包数据后,产生中断,如下描述符0即接收到数据的描述符,变为非OWN BY DMA,软件查询该描述符可以获取到接收数据长度等信息,进行处理。

wKgaomT2hhGAVQJEAABNl1Rk9tU888.png

软件处理完描述符0之后,又可以将其设置为接收状态OWN BY DMA以便接收继续接收。

wKgZomT2hhGARjRmAABOmAX8Se8143.png

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

则Current会追上Inx而停止。

比如如下

wKgaomT2hhGATASnAABGcS8SCyM522.png

int iot_eth_receive_handle(eth_ctrl_t *p_ctrl,eth_rcv_data_pf cb)

接收由于要处理包数据所以花费时间比较大,一般不在中断中处理数据,也就是不在中断中调用iot_eth_receive_handle,而是查询方式调用iot_eth_receive_handle,或者接收IOC中断时中断中发送信号量或者设置标志,主线程主循环中接收信号量或标志才调用该函数进行接收处理。

三.接收调试

收发数据流参考https://mp.weixin.qq.com/s/klrHhaLMM_0W3FGVwHXFkA

的验证过程吗,按照MAC回环,PHY回环,和PC通讯的过程测试。

3.1检查描述符相关

接收调试主要关注以下描述符相关寄存器

检查RxDesc_ListRxDesc_Tail 是否设置正确,检查RxDesc_Ring_Length描述符个数是否设置正确。检查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 确认回写状态和缓存数据是否有

(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 确认接收状态

如果以上描述符都正确但是还是没有数据,确认接收是否正在工作

查看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 检查过滤等其他设置

如果以上还未收到,检查过两次设置,最好设置为RA接收所有包,

确认DMA的SR是否使能等。

四.发送调试

和接收类似

4.1 检查描述符

检查如下寄存器设置,看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 确认回写状态

(gdb) p /x tx_desc

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

(gdb)

4.3 确认发送状态

如果以上描述符都正确但是还是没有数据,确认接收是否正在工作

查看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 检查发送数据等

检查发送数据是否又64字节以上,可以配置CPC自动添加CRC和填充。

确认DMA的ST使能了发送等。

五.总结

收发驱动实际就是对描述符的操作,需要了解描述符环形结构,软件硬件分别是怎么实用描述符的。另外也需要了解相关寄存器,描述符格式等,了解如何去调试收发过程。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5056

    文章

    18955

    浏览量

    301677
  • 以太网
    +关注

    关注

    40

    文章

    5334

    浏览量

    170710
  • 调试
    +关注

    关注

    7

    文章

    571

    浏览量

    33857
  • 驱动开发
    +关注

    关注

    0

    文章

    130

    浏览量

    12058
收藏 人收藏

    评论

    相关推荐

    基于DWC_ether_qos以太网驱动开发-MAC帧格式介绍

    本文转自公众号,欢迎关注 基于DWC_ether_qos以太网驱动开发-MAC帧格式介绍 (qq.com) 一.前言   在以太网
    的头像 发表于 08-30 09:23 2157次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-MAC帧格式介绍

    基于DWC_ether_qos以太网驱动开发-MDIO驱动编写与测试

    本文转自公众号欢迎关注 基于DWC_ether_qos以太网驱动开发-MDIO驱动编写与测试
    的头像 发表于 08-30 09:37 3540次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-MDIO<b class='flag-5'>驱动</b><b class='flag-5'>编写</b>与测试

    基于DWC_ether_qos以太网驱动开发-描述符链表介绍

    本文转自公众号欢迎关注 一.描述符概述 1.0 前言 对于DWC Ethernet QoS驱动编写来说,初始化完成之后,核心操作就是DMA的描述符链表配置(linked list
    的头像 发表于 08-30 09:39 4266次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-描述符链表介绍

    基于DWC_ether_qos以太网驱动开发-数据流验证过程

    转自公众号欢迎关注 https://mp.weixin.qq.com/s/klrHhaLMM_0W3FGVwHXFkA 基于DWC_ether_qos以太网驱动开发-数据流验证过程
    的头像 发表于 08-31 08:41 1842次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-数据流验证过程

    基于DWC_ether_qos以太网驱动开发-无OS环境移植LWIP

    本文转自公众号欢迎关注 基于DWC_ether_qos以太网驱动开发-无OS环境移植LWIP (qq.com) https://mp.weixin.qq.com/s
    的头像 发表于 09-06 08:40 1454次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-无OS环境移植LWIP

    基于DWC_ether_qos以太网驱动开发-LWIP的堆管理介绍

    本文转自公众号欢迎关注 基于DWC_ether_qos以太网驱动开发-LWIP的堆管理介绍 (qq.com) https://mp.weixin.qq.com/s
    的头像 发表于 09-08 08:40 1171次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-LWIP的堆管理介绍

    基于DWC_ether_qos以太网驱动开发-LWIP的堆(内存池)未对齐导致问题的案例分享

    本文转自公众号欢迎关注 https://mp.weixin.qq.com/s/ErIa2ss2YZLGYbSwoJEzog 一. 前言 内存未对齐访问问题这个已经是老生常谈的问题了, 由于LWIP的堆管理中也用到了地址(指针)强制转换所以也会遇到这个问题。对于老手比较容易发现,对于新手可能会比较疑惑。所以也单独分享一个案例吧,权当一个小的check list的case。 二. 问题 Lwipopts.h中MEM_ALIGNMENT可以配置堆对齐大小,有问题时是配置为1 #define MEM_ALIGNMENT 1U 异常时打印寄存器如下,当然不同平台异常时如何获取上下
    的头像 发表于 09-09 08:44 1635次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-LWIP的堆(内存池)未对齐导致问题的案例分享

    基于DWC_ether_qos以太网驱动开发-RTOS环境移植LWIP与性能测试

    本文转自公众号,欢迎关注 基于DWC_ether_qos以太网驱动开发-RTOS环境移植LWIP与性能测试 (qq.com) https://mp.weixin.qq.com/s
    的头像 发表于 09-11 11:20 1854次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-RTOS环境移植LWIP与性能测试

    基于DWC_ether_qos以太网驱动开发-LWIP在PC上进行开发调试

    本文转自公众号欢迎关注 基于DWC_ether_qos以太网驱动开发-LWIP在PC上进行开发调试
    的头像 发表于 09-11 08:40 1844次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-LWIP在PC上进行<b class='flag-5'>开发</b><b class='flag-5'>调试</b>

    基于DWC_ether_qos以太网驱动开发-LWIP的ICMP模块介绍与PING收发

    本文转自公众号欢迎关注 https://mp.weixin.qq.com/s/6MTNop3zBKdQ-gabbWo63Q 一. 前言 ICMP即Internet Control Message Protocol因特网控制消息协议。 ICMP是网络层协议,IP不可分割的一部分。 ICMP用于报告数据报处理中的错误,比如以下情况下时发送ICMP消息:当数据报无法到达其目的地时,当网关没有转发数据报的缓冲能力时,以及当网关可以指示主机在较短的路由上发送数据时。 互联网协议的设计并不是绝对可靠的。ICMP这些控制消息的目的是提供有关通信环境中问题的反馈
    的头像 发表于 09-18 17:51 1765次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-LWIP的ICMP模块介绍与PING<b class='flag-5'>收发</b>测

    设计软件核心以太网服务质量数据手册免费下载

    本文描述Synopsys设计软件核心以太网服务质量DWC以太网QoS核心5.10A。DWC以太网
    发表于 10-23 08:00 16次下载
    设计软件核心<b class='flag-5'>以太网</b>服务质量数据手册免费下载

    DesignWare核心以太网服务质量数据本

      本文档介绍Synopsys DesignWare核心以太网服务质量(DWC_Ethernet_qos)核心,5.10a。DWC_Ethernet_qos实现了与MAC层相关的以太网
    发表于 03-31 15:11 3次下载

    基于DWC_ether_qos以太网驱动开发-包过滤

    以太网上数据非常多,如果所有数据都接收交给软件去处理软件负载会非常重,所以一般只需要接收发给自己的数据即可
    的头像 发表于 09-02 09:19 1560次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-包过滤

    基于DWC_ether_qos以太网驱动开发-软复位介绍与问题案例

    一般模块都会有软复位的功能,软复位在驱动编写中很重要。一般初始化时执行软复位使得模块进入确定的初始状态以提高可靠性,异常时也可以重新初始化来恢复,所以软复位在驱动中一般是必须要做的动作。
    的头像 发表于 09-02 09:17 1463次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-软复位介绍与问题案例

    基于DWC_ether_qos以太网驱动开发-描述符格式介绍

    前面我们介绍了描述符链表的工作模式,重点是了解环形链表是如何环形的,以及相关的寄存器。驱动编写就需要更进一步,了解描述符的具体内容,即4个描述符的每个字段的含义。
    的头像 发表于 09-04 14:14 2252次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-描述符格式介绍