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位的物理地址

stmmac描述符的结构和初始化相关推荐

  1. 【Linux 内核 内存管理】虚拟地址空间布局架构 ② ( 用户虚拟地址空间组成 | 内存描述符 mm_struct 结构体源码 )

    文章目录 一.用户虚拟地址空间组成 二.内存描述符 mm_struct 结构体源码 一.用户虚拟地址空间组成 " 用户虚拟地址空间 " 包括以下区域 : ① 代码段 ② 数据段 ③ ...

  2. 【Linux 内核 内存管理】虚拟地址空间布局架构 ③ ( 内存描述符 mm_struct 结构体成员分析 | mmap | mm_rb | task_size | pgd | mm_users )

    文章目录 一.mm_struct 结构体成员分析 1.mmap 成员 2.mm_rb 成员 3.get_unmapped_area 函数指针 4.task_size 成员 5.pgd 成员 6.mm_ ...

  3. 【Linux 内核 内存管理】Linux 内核堆内存管理 ① ( 堆内存管理 | 内存描述符 mm_struct 结构体 | mm_struct 结构体中的 start_brk、brk 成员 )

    文章目录 一.堆内存管理 二.内存描述符 mm_struct 结构体 三.mm_struct 结构体中的 start_brk.brk 成员 一.堆内存管理 Linux 操作系统中的 " 堆内 ...

  4. Linux进程描述符task_struct结构体简析

    进程是处于执行期的程序以及它所管理的资源(如打开的文件.挂起的信号.进程状态.地址空间等等)的总称 Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个 ...

  5. Linux进程描述符task_struct结构体详解--Linux进程的管理与调度(一)

    转自:http://blog.csdn.net/gatieme/article/details/51383272 日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 Linux- ...

  6. USB(六)-HID(报告描述符的结构实现)

    USB HID设备是通过报告(report)来传输数据的,报告有输入报告和输出报告.输入报告是USB设备发送给主机:输出报告是主机发送给USB设备. 报告描述符是用来描述一个报告的结构以及该报告里面的 ...

  7. 深入理解Linux进程描述符task_struct结构体

    进程是处于执行期的程序以及它所管理的资源(如打开的文件.挂起的信号.进程状态.地址空间等等)的总称.注意,程序并不是进程,实际上两个或多个进程不仅有可能执行同一程序,而且还有可能共享地址空间等资源. ...

  8. Linux进程描述符task_struct结构体

    进程是处于执行期的程序以及它所管理的资源(如打开的文件.挂起的信号.进程状态.地址空间等等)的总称.进程的两个基本元素是程序和代码相关的数据集,进程是一种动态描述,但是并不代表所有的进程都在运行.每个 ...

  9. python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解

    2019独角兽企业重金招聘Python工程师标准>>> 1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过 ...

最新文章

  1. AI键盘侠来了:DeepMind开始训练智能体像人一样「玩」电脑
  2. 打印折痕方向(二叉树应用)
  3. 增加数据库控制文件命令
  4. linux php不能写文件内容,php 在linux系统下写出文件问题
  5. Python笔试题汇总
  6. Java编程学习指南(带学习经验)
  7. 洛谷试炼场:单词接龙
  8. android qq 登录 qq号,手机QQ异常登录怎么办 QQ帐号无法登录解决办法
  9. ad中那个快捷键是重复上一部_PPT中十大快捷键
  10. 为什么红黑树的时间复杂度为lgn——渐进边界的证明
  11. EXCEL技术VBA一键获取SAP系统数据
  12. 一篇文教你使用python Turtle库画出“精美碎花小清新风格树”快来拿代码!
  13. iosxib 设置图片_iOS从Xib中设置样式
  14. ROS noetic rosrun tf view_frames 报错
  15. injected stylesheet注入样式导致el-button内文字为空白
  16. 用cout输出uchar(unsigned char)变量时,没有输出结果怎么办?
  17. 云服务器文件传送,云服务器文件传送工具
  18. 从零开始用Python搭建Socket服务器(初篇)
  19. 暴风影音2007全功能完美版和Symantec Norton的冲突 1
  20. 第六章 相机及其应用 6.3欧拉角、旋转矩形、四元数、应用于Eigen的示例

热门文章

  1. 智能时代 软件赋能——2017中国软件技术大会
  2. Spring Boot实践教程(二):SpringApplication分析
  3. Hadoop Mapreduce分区、分组、二次排序过程详解
  4. Meteor创建示例项目 Simple-todos
  5. sama5d3 环境检测 gpio--yk测试
  6. 比微软kinect更强的视频跟踪算法--TLD跟踪算法介绍
  7. EtherCAT 网站链接
  8. matlab——FFT傅里叶快速变换
  9. 成都计算机中心起名,成都给宝宝起名的地方哪里好
  10. java限制发送短信次数_使用java发送短信验证码码,出现流量限制怎么办?急急急...