stmmac描述符的结构和初始化

stmmac 描述符(Descriptors)

stmmac的描述符有两个个模式,分别是ring模式和chain模式,根据特性的不同支持,描述符又有以下3个形式norm、Alternate 、 Enhanced。下面主要讲下ring模式下的Enhanced描述符结构,以及比较重要的位。stmmac的收发的描述符相同位的含义有些差别,所以我们分开分析下描述符的初始化

​ 0.描述符几个关键要素

  • OWN,用来表示描述符的状态,相当于Intel网卡里的DD位

  • buf地址,指明网卡将收到的数据包放到哪里

  • 状态信息

  1. 术语

    OWN:当此位置位时,表明这个描述符是属于DMA的,DMA可以访问。在host设置好接收、发送描述符后把OWN置位,DMA会自动的把收到的描述符放到描述符指定的地址并把OWN复位,表示数据包以及放到host的内存了,此时host可以进行包处理。

    ring:是指描述符在内存中的排布,ring模式所有的描述符都在连续的物理内存上

    chain :是指描述符在内存中的排布,chain模式下描述符地址不再连续,下一个描述符的物理地址由描述符中的DES3指明

Receive Descriptor

接收描述符的结构如下图。如果没有开启extend status和timestamp则只需要关注DES0~DES3,此时描述符大小为16Byte

在这里插入图片描述

对于接收描述符的初始化以下步骤是必要的

  1. 申请一块内存连续内存内存地址要对齐到stmmac的bus wide,内存大小为N*32Byte。这块内存用来存放N个接收描述符。
  2. 获取这块内存起始地址的物理地址A。
  3. 将物理地址A写入到DMA的3号寄存器(Receive Descriptor List Address Register)
  4. 申请N块内存,并获得每块内存的起始物理地址,分别填入到每个描述符的RDES2,同时将这块内存的大小写入到描述符的RDES1[12:0]
  5. 把每个填写好RDES2和RDES1[12:0]描述符的OWN位置位
  6. 在填充最后一个描述符时还需要将RDES0的[8]置位,让网卡知道这是最后一个描述符了,网卡在处理完这个描述符后会自动跳转到第一个去

Transmit Descriptor

发送描述符的结构如下图

在这里插入图片描述

对于发送描述符的初始化只需要将OWN位复位即可,下面讲下要发包时对描述符的初始化

  1. 获取数据包起始地址的物理地址,将物理地址填入到TDES2,并将需要发送的数据大小写入到TDES1[12:0]
  2. 如果数据包大小小于8K则将TDES0[29]、TDES0[28]置位,这两位分别是LS(Last Segment)、FS(First Segment)
  3. 如果数据包大小大于8K则需要填写使用多个描述符,在最后一个将LS置位
  4. 填写完毕后把OWN位置位
  5. 向DMA的1号寄存器写入任意数,启动DMA的发送

注意
以上填入DES2的物理地址需要是32位的物理地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android中利用productFlavors配置多渠道

build.gradle(app)设置 android {flavorDimensions "default"productFlavors{//不同渠道360{dimension "default"//替换AndroidManifest中的值manifestPlaceholders [channel_value:"360"]}qq{dimension "default"//替换AndroidManif…

Ubuntu服务器安装snmpd(用于监控宝)

2019独角兽企业重金招聘Python工程师标准>>> 一、安装snmpd: sudo apt-get install snmpd 二、修改配置文件 vi /etc/snmp/snmpd.conf 找到这样的两行 agentAddress udp:127.0.0.1:161 #agentAddress udp:161,udp6:[::1]:161 将他们的注释交换一下 #…

安卓APP_ 四大基本组件(1)—— Activity

摘自:安卓APP_ 四大基本组件(1)—— Activity 作者:丶PURSUING 发布时间: 2021-04-22 15:56:18 网址:https://blog.csdn.net/weixin_44742824/article/details/116006048 配合菜鸟教程食用效果更佳&#xf…

bootdefault和configuration_springboot常用注解、包引入和自动配置功能解读

springboot使用起来确实很方便,做到开箱即用,减少了许多繁琐的配置。不过在使用过程中时常会想,为啥会这样方便,springboot为我们做哪些工作。或者是我们在使用的过程中,会遇到springboot不满足的情况,我们…

radare2 常用操作总结

radare2 简介 radare2是一个用C语言编写的跨平台的二进制分析工具,支持ARM、MIPS、X86等平台,支持分析多种格式的二进制文件如ELF、Mach-O、Fatmach-O, PE、PE、 MZ、 COFF等,同时也支持多种操作系统如Windows (since XP)、GNU/Linux、GNU/D…

Could NOT find SDL_image (missing:SDL_IMAGE_LIBRARIES SDL_IMAGE_INCLUDE_DIRS)

sudo apt-get install libsdl-image1.2-dev转载于:https://www.cnblogs.com/sea-stream/p/9792496.html

Erlang TCP Socket的接收进程的2种方案

转自:http://blog.csdn.net/summerhust/article/details/8740973 一旦打开了一个使用TCP连接的套接字,它就始终保持打开状态,直至任何一方关闭它或因为一个错误而终止。在建立一个连接时,一般为…

序列化与反序列化(1)Serializable —— Java原生态方法

摘自:序列化与反序列化(1)Serializable —— Java原生态方法 作者:丶PURSUING 发布时间: 2021-05-08 19:20:21 网址:https://blog.csdn.net/weixin_44742824/article/details/116503261 本文为学习笔记&…

极路由4刷机

准备工作 https://www.right.com.cn/forum/thread-161906-1-1.html https://breed.hackpascal.net/ 在第二个链接里下载路由器对应的breed固件,固件的说明见第一个链接,下文以极路由4为例演示 由于极路由官方挂了,无法进行root&#xff0…

背景颜色及背景图片相关的属性

1.background-color   设置背景颜色,取颜色值   注意:     1.所有元素默认的背景颜色都是透明色,新建窗口的白色不是body的背景色,是浏览器渲染的     2. 背景颜色从边框位置开始绘制     3. 如果元素添加内边距&…

评论安装_评论送|机电安装监理质量控制要点130页

来源:网络整理, 如有侵权请联系删除因本文篇幅有限,只能展示60页,全部130页需要您对本文进行精彩评论或者转发分享,加微信dahe0608送给您本文的ppt原件因本文篇幅有限,只能展示60页,全部130页需…

积跬步-java任职要求

2019独角兽企业重金招聘Python工程师标准>>> 1.JAVA基础扎实,熟悉io、多线程、集合等基础框架,熟悉分布式、缓存、消息、搜索等机制; 2.四年以上使用java进行web开发的经验,熟练使用spring 、MVC等框架,熟悉…

MIPS内联汇编

0X0 近几天使用内联汇编来完成部分功能,下面总结下基础知识点,以便以后查询 语法基本结构 __asm__ __volatile__("汇编语句\n\t""汇编语句\n\t":输出寄存器:输入寄存器:寄存器破坏表);‘:’把内联汇编分割为了4个部分 第一部分 如…

安卓APP_ 控件(11)webView —— 简单应用:显示网页

摘自:安卓APP_ 控件(11)webView —— 简单应用:显示网页 作者:丶PURSUING 发布时间: 2021-05-11 11:50:52 网址:https://blog.csdn.net/weixin_44742824/article/details/116602469 目录 简单了…

Python 抓取数据存储到Mysql中

# -*- coding: utf-8 -*- import os,sys import requests import bs4 import pymysql#import MySQLdb#连接MYSQL数据库 db pymysql.connect(host127.0.0.1,userroot,passwordmysql,dbtest,port3306,charsetutf8) #db MySQLdb.connect(127.0.0.1,root,mysql,test,coon.set_cha…

ios 去掉底部状态栏_iOS 隐藏状态栏

1.整个项目隐藏状态栏在Targets->General->勾选中Hide status bar2.单个界面隐藏状态栏,例如登录注册页面1.首先在info.plist里面View controller-based status bar appearance 设置为 NO.2.在需要调控状态栏的ViewController类中添加以下代码://进入时隐藏-(void)viewWi…

QT应用开发基础

目录前言Windows上搭建开发环境C基础什么是C什么是面向对象,什么又是面向过程c的灵魂:c的类对象:类的实例化怎么访问类的成员类的函数成员类的访问修饰符函数的重载构造函数和析构函数类的继承虚函数和纯虚函数制作一个简单的QT界面创建工程U…

meson构建系统

简介 Meson是一个构建系统,它被设计成在不牺牲性能的前提下尽可能的友好。这方面的主要工具是用户用来描述构建结构的自定义语言。这种语言的主要设计目标是简单、清晰和简洁。很多灵感都来自于Python编程语言,它被认为是非常易读的,即使对以…

射灯安装方法图解_江苏天筑不锈钢雕塑厂家格栅射灯安装方法,格栅射灯安装注意事项...

格栅射灯安装方法,您是否已经学会了呢?不管您会不会,今天江苏天筑不锈钢雕塑厂家就结合这个问题,一起来为大家详细介绍这部分内容的一些相关的注意事项,南方的天气比较潮湿,所以我们尽量不要把格栅射灯安装…

在centos8 stream启用 Extra Packages

前言 最近把一台机器装了centos8 stream,centos8 的维护周期将会在2021-12-31结束 而centos8 stream和centos8有什么区别呢?我参考官方的描述简单总结下 由下游变更到上游 centos8是RHEL的rebuild版本,所以是处在下游的,意思是收…