可选的特殊处理

在批量操作中传输的数据包由 USB 规范定义为 8、16、32、64 或 512 字节大小,其中 512 字节选项仅适用于高速传输。 然而,对于某些系统设计,应用软件在单个操作中从端点读取大量数据可能比在单个 USB 操作中传输更方便。 一个特殊的例子是,在某些情况下,同一端点用于 512 字节的高速传输,但在其他情况下用于全速传输。 在全速运行时,单个操作中传输的最大数据量仅为 64 字节。
为适应这种情况,MUSBMHDRC 包含一个“Rx 批量数据包组合”配置选项,如果选择该选项,MUSBMHDRC 会在应用软件读取之前将通过 USB 总线接收的数据包合并为更大的数据包。
在此选项下,端点的 RxMaxP 寄存器增加到 16 位,寄存器的低 11 位定义每个单独传输的有效负载,而高 5 位定义一个乘法器。 然后,MUSBMHDRC 会将其接收到的适当数量的 USB 数据包合并到 FIFO 中大小为乘数 × 有效负载的单个数据包中,然后置位 RxPktRdy 以提醒应用软件存在要在 FIFO 中读取的数据包。 结果包的大小在 RxCount 中报告。 从应用软件的角度来看,产生的操作与接收单个 USB 数据包没有区别,只是读取数据包的大小不同。
该功能是作为配置选项而不是标准功能提供的,因为它增加了门数。
注意:此功能仅适用于 Bulk 端点,根据 USB 规范,有效负载必须是
8、16、32、64 或 512 字节,其中 512 字节选项仅适用于高速传输。 RxMaxP 寄存器中记录的有效负载还必须与端点的标准端点描述符的 wMaxPacketSize 字段匹配。 相关的 FIFO 也必须足够大以容纳合并的数据包。
另请注意,仅当接收到指定数量的数据包或接收到“短”USB 数据包(即小于端点指定有效负载的数据包)时,才会设置 RxPktRdy。 如果使用协议,端点接收的批量传输是记录的有效载荷大小的倍数,并且没有短数据包来终止它,则不应将 RxMaxP 寄存器编程为期望的数据包比传输中的数据包多(否则软件 传输结束时不会中断)。

附加操作

MUSBMHDRC 内核会自动响应 USB 总线上的某些条件或主机的操作。 详情如下:
在以下情况下,MUSBMHDRC 内核将自动向控制传输发出 STALL 握手:

  1. 主机在控制传输的 OUT 数据阶段发送的数据多于在 SETUP 阶段的设备请求中指定的数据。
    当 CPU 卸载最后一个 OUT 数据包并设置 DataEnd 后主机发送 OUT 令牌(而不是 IN 令牌)时,MUSBMHDRC 会检测到这种情况。
  2. 主机在控制传输的 IN 数据阶段请求的数据多于在 SETUP 阶段的设备请求中指定的数据。
    在 CPU 清除 TxPktRdy 并设置 DataEnd 以响应主机对本应是最后一个数据包发出的 ACK 后,主机发送 IN 令牌(而不是 OUT 令牌)时,MUSBMHDRC 会检测到这种情况。
  3. 主机使用 OUT 数据令牌发送超过 MaxP 数据。
  4. 主机为 OUT 状态阶段发送一个以上零长度的数据包。

控制传输中的零长度数据包

一个零长度的 OUT 数据包用于指示控制传输的结束。 在正常操作中,只有在设备请求的整个长度被传输后(即 CPU 设置 DataEnd 后)才能接收此类数据包。 但是,如果主机在传输设备请求的整个长度之前发送了一个长度为零的 OUT 数据包,则这表明传输提前结束。 在这种情况下,MUSBMHDRC 将自动刷新 CPU 加载的任何 IN 令牌,准备好从 FIFO 中的数据阶段,并设置 SetupEnd。

外设模式挂起

当 USB 上 3 ms 没有发生任何活动时,MUSBMHDRC 将进入挂起模式。 如果 Suspend 中断已使能,此时将产生中断。 在挂起模式下,SUSPENDM 输出将变为低电平(如果启用):
这可用于将 PHY 置于挂起模式。 此外,POWERDWN 输出被置位:该信号可用于停止 CLK,从而在此状态下节省功耗。 POWERDWN 然后保持有效,直到从总线上移除电源(指示设备已断开连接)或在总线上检测到恢复信号或复位信号。
当检测到恢复信号时,MUSBMHDRC 将退出挂起模式并将 SUSPENDM 拉高。 作为响应,PHY 应该被取消挂起。 如果启用 Resume 中断,将产生中断。 CPU 还可以通过设置 Power 寄存器中的 Resume 位来强制 MUSBMHDRC 退出挂起模式。 当该位置位时,MUSBMHDRC 将退出挂起模式并将恢复信号驱动到总线上。 CPU 应在 10 ms(最长 15 ms)后清除该位以结束 Resume 信号。
当 CPU 退出挂起模式时,不会产生恢复中断。

8.4.5 SOF

当 MUSBMHDRC 在外设模式下运行时,它应该在全速模式下每毫秒接收一次来自主机的 Start-Of-Frame 数据包,在高速模式下每 125 微秒一次。
当接收到 SOF 数据包时,将数据包中包含的 11 位帧号写入帧寄存器,并在 SOF_PULSE 上产生一个持续一个 CLK 位周期的输出脉冲。 还会生成 SOF 中断(如果在 IntrUSBE 寄存器中启用)。
一旦 MUSBMHDRC 开始接收 SOF 数据包,它预计每毫秒(或每 125 微秒)一个。 如果在 1.00358 ms(或 125.125 µs)后没有收到 SOF 数据包,则假定数据包已丢失,并且尽管未更新帧寄存器,但仍会生成 SOF_PULSE(以及 SOF 中断,如果启用)。 MUSBMHDRC 将继续每毫秒(或 125 微秒)生成一个 SOF_PULSE,并在再次成功接收到这些数据包时将这些脉冲重新同步到接收到的 SOF 数据包。

作为主机操作

当主机模式位 (DevCtl.D2) 设置为“1”时,MUSBMHDRC 作为主机运行,用于与另一个 USB 设备进行点对点通信,或者当连接到集线器时,用于与整个范围的多点设置中的设备。支持高速、全速和低速 USB 功能,既可用于点对点通信,也可用于通过集线器进行操作。 (必要时,内核会自动执行必要的事务转换,以允许低速或全速设备与 USB 2.0 集线器一起使用。)
支持控制、批量、同步或中断事务。
本节介绍当 MUSBMHDRC 用作主机时应用的关于 Tx 端点、Rx 端点、事务调度、进入/退出挂起模式和复位的内核操作。在核心连接到集线器的情况下,会自动选择主机模式。 MUSBMHDRC 在主机模式下运行点对点的条件。

多点配置的设备设置

仅当在配置 GUI 中启用多点配置时,以下设置要求才适用于核心。
如果未启用多点选项,则不应执行以下设置。
在作为主机访问任何设备之前——无论是用于点对点通信还是通过集线器进行多点通信,都需要为每个使用的 Rx 或 Tx 端点设置相关的 RxFuncAddr 或 TxFuncAddr 寄存器以记录功能。
在作为主机访问任何设备之前——无论是用于点对点通信还是通过集线器进行多点通信,都需要为每个使用的 Rx 或 Tx 端点设置相关的 RxFuncAddr 或 TxFuncAddr 寄存器,以记录被访问的设备。 在全速或低速设备通过高速 USB 2.0 集线器连接到 MUSBMHDRC 的情况下,集线器地址和集线器端口的详细信息也需要记录在相应的 RxHubAddr/TxHubAddr RxHubPort/TxHubPort 寄存器中。 这允许核心支持拆分事务。
此外,设备运行的速度(高、满或低)需要记录在设备访问的每个端点的 Type0(端点 0)、TxType 或 RxType 寄存器中。RxFuncAddr、TxFuncAddr、RxHubAddr、TxHubAddr、RxHubPort、TxHubPort 都是 7 位读/写寄存器。
对于多点通信,应注意这些寄存器中的设置记录了内核端点的当前分配给与连接设备相关的功能。 为了最大限度地增加支持的设备数量,MUSBMHDRC 允许动态更改此分配——只需更新这些寄存器中记录的地址和速度信息。
端点对设备功能的分配的任何更改都需要在受影响端点上的任何正在进行的事务完成之后进行。

作为主机的事务处理

当 MUSBMHDRC 作为主机运行时,IN 事务的处理方式与 MUSBMHDRC 作为外设运行时处理 OUT 事务的方式类似,只是事务需要首先通过设置 RxCSR 中的 ReqPkt 位来启动 . 这向事务调度程序指示此端点上有一个活动事务。 然后事务调度程序将一个 IN 令牌发送到目标函数。
当接收到数据包并将其放入 Rx FIFO 时,RxCSR 中的 RxPktRdy 位会置位,并且会生成相应的 Rx 端点中断(如果已启用)以表示现在可以从 FIFO 中卸载数据包。
当数据包被卸载后,RxPktRdy 应该被清除。 RxCSR 寄存器中的 AutoClear 位可用于在已从 FIFO 卸载最大大小的数据包时自动清除 RxPktRdy(有例外,请参见寄存器说明)

RxCSR 中还有一个 AutoReq 位,当 RxPktRdy 位清零时,它会自动设置 ReqPkt 位。 AutoClear 和 AutoReq 位可与 DMA 控制器一起使用,以执行完整的批量传输,而无需 CPU 干预。
如果要传输已知数量的 MaxP 数据包,则应在与端点关联的 RqPktCount 寄存器中设置该数量(参见第 3.8.1 节)。 内核在每次请求后递减 RqPktCount 寄存器中的值。 当值从 1 递减到 0 时,AutoReq 位被清除以防止尝试任何进一步的事务。 对于传输大小未知的情况,RqPktCount 应设置为零。 然后 AutoReq 将保持设置状态,直到通过接收短数据包(即小于 MaxP)清除,例如可能在批量传输结束时发生。

RxCSR 中还有一个 AutoReq 位,当 RxPktRdy 位清零时,它会自动设置 ReqPkt 位。 AutoClear 和 AutoReq 位可与 DMA 控制器一起使用,以执行完整的批量传输,而无需 CPU 干预。
如果要传输已知数量的 MaxP 数据包,则应在与端点关联的 RqPktCount 寄存器中设置该数量(参见第 3.8.1 节)。 内核在每次请求后递减 RqPktCount 寄存器中的值。 当值从 1 递减到 0 时,AutoReq 位被清除以防止尝试任何进一步的事务。 对于传输大小未知的情况,RqPktCount 应设置为零。 然后 AutoReq 将保持设置状态,直到通过接收短数据包(即小于 MaxP)清除,例如可能在批量传输结束时发生。

如果目标函数使用 NAK 响应 Bulk/Interrupt IN 令牌,则 MUSBMHDRC 将继续重试事务,直到达到已设置的任何 NAK 限制。但是,如果目标函数以 STALL 响应,MUSBMHDRC 将不会重试事务,而是会通过设置 RxCSR 寄存器中的 RxStall 位来中断 CPU。如果目标函数在要求的时间内没有响应 IN 令牌(或数据包中存在 CRC 或位填充错误),则 MUSBMHDRC 将重试事务。如果在 3 次尝试后目标函数仍未响应,则 MUSBMHDRC 将清除 ReqPkt 位并用 RxCSR 中的 Error 位设置中断 CPU。注意:在高带宽中断事务的情况下,主机将在单个微帧期间尝试 2 或 3 个事务,并在收到所有数据包后产生中断。如果目标未确认这些事务中的任何一个,则在同一微帧期间将不会尝试进一步的事务。
注意:在任何微帧中发送的 USB 数据包的数量将取决于要传输的数据量,并通过用于各个数据包的 PID 来指示。 如果在微帧结束时还没有接收到指定数量的数据包,则 RxCSR 寄存器中的 IncompRx 位将被设置以指示 FIFO 中的数据不完整。 同样,如果接收到错误数据类型的数据包,则 RxCSR 寄存器的 PID 错误位将被设置。 但是,在每种情况下,仍会产生中断以允许从 FIFO 中读取已接收的数据。

作为主机的输出事务处理

当 MUSBMHDRC 作为主机运行时,OUT 事务的处理方式与 MUSBMHDRC 作为外设运行时 IN 事务的处理方式类似。

当每个数据包加载到 TxFIFO 中时,需要设置 TxCSR 寄存器中的 TxPktRdy 位。 同样,设置 TxCSR 中的 AutoSet 位(如果适用)将导致 TxPktRdy 在最大大小的数据包已加载到 FIFO 时自动设置。 此外,AutoSet 可以与 DMA 控制器一起使用,在没有 CPU 干预的情况下执行完整的批量传输。

如果目标函数以 NAK 响应 OUT 令牌,则 MUSBMHDRC 将继续重试事务,直到达到已设置的任何 NAK 限制。 但是,如果目标函数以 STALL 响应,MUSBMHDRC 将不会重试事务,而是会通过设置 TxCSR 寄存器中的 RxStall 位来中断 CPU。 如果目标函数在要求的时间内没有响应 OUT 令牌(或者数据包中存在 CRC 或位填充错误),则 MUSBMHDRC 将重试事务。 如果在 3 次尝试后目标函数仍未响应,则 MUSBMHDRC 将刷新 FIFO 并用 TxCSR 中的错误位中断 CPU。

事务调度

当作为主机运行时,MUSBMHDRC 保持了一个帧/微帧计数器。 如果目标函数是全速或高速设备,MUSBMHDRC 会在每帧/微帧开始时自动发送一个 SOF/uSOF 数据包。 如果目标函数是一个低速设备,则将在总线上传输一个“K”状态以充当“保持活动”状态,以阻止低速设备进入挂起模式。
在发送 SOF/uSOF 数据包后,MUSBMHDRC 将循环通过所有已配置端点寻找活动事务。 活动事务定义为设置了 ReqPkt 位的 Rx 端点或设置了 TxPktRdy 位和/或 FIFONotEmpty 位的 Tx 端点。

只有在帧/微帧的第一个事务调度程序周期中找到并且该端点的间隔计数器已倒计时至零时,才会启动活动的同步或中断事务。这确保每个端点每 n 帧/微帧仅发生一个中断/同步事务(如果选择了高带宽支持,则最多发生三个),其中 n 是通过该端点的 TxInterval/RxInterval 寄存器设置的间隔。

如果帧/微帧中有足够的时间在下一个 SOF/uSOF 数据包到期之前完成事务,则将立即启动活动的批量事务。如果需要重试事务(例如,因为接收到 NAK 或目标函数没有响应),则在事务调度程序首先检查所有其他端点的活动事务之前,不会重试事务。这可确保发送大量 NAK 的端点不会阻塞总线上的其他事务。核心还允许用户指定在端点超时之前可以从特定目标接收 NAK 的时间长度限制。

MUSBMHDRC 直到总线至少在最小包间延迟内处于非活动状态才会启动事务。 它也不会启动事务,除非它可以在帧结束之前完成。 如果总线在帧结束时仍然处于活动状态,则 MUSBMHDRC 将假定它所连接的功能发生故障,并将暂停所有事务并产生一个 babble 中断。

主机模式挂起

如果电源寄存器中的 SuspendMode 位置位,MUSBMHDRC 将完成当前事务,然后停止事务调度程序和帧计数器。 不会启动进一步的事务,也不会生成 SOF 数据包。
要退出挂起模式,CPU 应设置 Resume 位并清除 Power 寄存器中的 Suspend 位。 当 Resume 位为高时,MUSBMHDRC 将在总线上生成 Resume 信号。 20 ms 后,CPU 应清除 Resume 位,此时将启动帧计数器和事务调度程序。
在挂起模式下,如果启用,SUSPENDM 输出也将变为低电平:这可用于关闭 USB 驱动器。此外,POWERDWN 输出有效:此信号可用于停止 CLK,从而在 这种状态。
但是,如果要支持远程唤醒,则必须保持 PHY 的电源,以便 MUSBMHDRC 可以检测总线上的恢复信号。

MUSBMHDRC USB 2.0 MULTI-POINT DUAL-ROLE CONTROLLER编程指南解读2相关推荐

  1. MUSBMHDRC USB 2.0 编程指南解读4

    可选的DMA控制器 MUSBMHDRC 可以选择包含一个多通道 DMA 控制器,最多可配置 8 个通道. 此 DMA 控制器支持两种 DMA 模式,称为 DMA 模式 0 和 1,它可以处理最大 8k ...

  2. USB 2.0 A型、B型、Mini和Micro接口 type-c 定义及封装

    USB全 称Universal Serial Bus(通用串行总线),目前USB  2.0接口分为四种类型A型.B型.Mini型还有后来补充的Micro型接口,每种接口都分插头和插座两个部分,Micr ...

  3. USB 3.0规范中译本 第2章 术语及缩略语

    原文链接 https://www.cnblogs.com/coryxie/p/3956211.html 本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 本章 ...

  4. AXI USB 2.0设备IP Core指导手册(第一章)

    IP Facts 一.介绍 AXI USB2.0设备核为用户设计提供一个USB接口.该接口适用于以USB为中心的高性能设计.桥接和遗留端口更换操作. 二.特性 1.基于AXI4规范的AXI接口. 2. ...

  5. USB 3.0规范中译本 第5章 机械结构

    原文地址 https://www.cnblogs.com/coryxie/p/3956252.html 本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 本章 ...

  6. USB | 2. 最新USB 4.0规范解析及一致性测试

    Update: 2022 / 10 / 11 USB | 2. 最新USB 4.0规范解析及一致性测试 目录 背景 USB 1.0 - 4.0 Type-C 接口 拓扑结构 USB 4 USB Typ ...

  7. USB 3.0规范中译本 第3章 USB 3.0体系结构概览

    原文链接 https://www.cnblogs.com/coryxie/p/3956220.html 本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 本章 ...

  8. USB 2.0 全速 FULL SPEED 和高速 HIGH SPEED 的区别

    2003年6月份,USB协会重新命名了USB的规格和标准,新命名的USB标准将原先的USB1.1的称呼改成了"USB 2.0 Full Speed"(全速版),同时将原有的USB2 ...

  9. 利用FPGA实现外设通信接口之:利用FPGA实现USB 2.0通信接口

    10.3  利用FPGA实现USB 2.0通信接口 10.3.1  USB 2.0接口的实现方式 利用FPGA来实现USB 2.0接口的方式一般有两种,一是借助外围的USB接口芯片,二是FPGA内部实 ...

最新文章

  1. Linux设备驱动模型概述(Linux device driver model overview)
  2. php中的大括号用法
  3. ubuntu18 安装 chrome
  4. 李嘉诚亲自指导:阿尔法狗战何洁
  5. Django运行SQL语句
  6. oracle之 Got minus one from a read call 与 ORA-27154: post/wait create failed
  7. windows server 2012服务器IIS基本配置
  8. @@IDENTITY与SCOPE_IDENTITY()
  9. 利用 S3-tests 测试 S3 接口兼容性
  10. ctfshow-WEB-web9( MD5加密漏洞绕过)
  11. 申请退款微信php,三:申请退款
  12. 《How to be nubility for coder》
  13. Win10 输入法v模式
  14. QTREE系列1,4,5,6,7 LCT
  15. js动态添加修改删除元素
  16. Java规则引擎Drools急速入门
  17. ROS学习笔记74(TF Using Stamped datatypes with tf::MessageFilter)
  18. matlab从wind获取股票列表,MATLAB自动获取股票价格
  19. 基于javaweb+SpringBoot的大学生实习管理系统(java+SpringBoot+Thymeleaf+html+JQuery+bootstrap)
  20. 计算机专业【本科生】毕业还不如【专科生】?

热门文章

  1. 我开始用心的寂寞妆点着梦的沧桑
  2. python web.py框架 无法正常打开0.0.0.0:8080网页
  3. jetson安装opencv2
  4. python下载安装第三方库
  5. 139、商城业务-nginx-搭建域名访问环境一(反向代理配置)
  6. 区块链司法白皮书重磅发布!
  7. 推荐算法的Python实现——MF(矩阵分解)
  8. PostgreSQL 百亿数据 秒级响应 正则及模糊查询
  9. Ubuntu下安装及卸载JDK
  10. 微博登录设备有python_Python模拟微博登陆,亲测有效