01 引言STM32MP1x系列芯片的USB OTG作为Peripheral时除支持一个双向EP0外另外支持8个端点IN/OUT用于实现控制传输/中断传输/同步传输/批量传输。这些端点共享一部分RAM空间作为FIFO来收发数据。当gadget设备被配置为不同的功能时尤其是配置为多个功能时代码中的默认FIFO设置可能不再适用本篇笔记简述如何根据实际需求修改FIFO配置。02 基本概念STM32MP1x的USB OTG子系统包含4KByte专用RAM这块RAM空间被分配为TxFIFO和RxFIFO分别对应为本机USB发送数据的临时存储以及从总线接收数据的临时存储在Peripheral模式下分别对应为IN端点和OUT端点的FIFO。2.1 外设模式下的FIFOOTG工作在Host还是Peripheral模式下FIFO的组织形式有所不同这里只关注外设模式下的情况。所有OUT端点共享相同的一个RAM FIFOOTG使用单个接收FIFO当这个FIFO有足够的空间时接收所有OUT端点过来的数据直到FIFO被占满后续事务才会被NAK。接收FIFO的大小在OTG_GRXFSIZ中配置。每个IN端点都分配一个专用的FIFO与OUT端点不同每个IN端点需要单独配置TxFIFO其中EP0的配置寄存器为OTG_DIEPTXF0另外8个IN端点的配置寄存器为OTG_DIEPTXFxx0~7。如图1所示Peripheral模式下的OTG FIFO框架。▲ 图 1 STM32MP1x设备模式下的USB FIFO2.2 FIFO 的分配接收FIFO的分配应用程序必须为SETUP数据包分配RAM必须在接收FIFO中为控制端点的SETUP数据包保留10个位置。USB核不会使用这些为SETUP数据包保留的位置来写入任何其他数据。必须为全局OUT NAK分配一个位置。状态信息与每个接收的数据包一起写入FIFO。因此接收数据包必须至少分配最大数据包大小/41的空间。如果启用了多个等时端点则至少必须分配两个最大数据包大小/41的空间以接收连续的数据包。通常建议分配两个最大数据包大小/41的空间以便在前一个数据包传输到CPU时USB可以接收后续数据包。对于每个端点的最后一个数据包传输完成的状态信息也会被推送到FIFO。建议为每个OUT端点分配一个位置。配置RxFIFO5*控制端点数量8((最大USB数据包大小/41用于状态信息2*OUT端点数量1用于全局NAK发送FIFO的分配单独为每个IN端点配置最小的FIFO值为该端点最大数据包。配置TxFIFO最大USB数据包大小/4在硬件允许的情况下增加FIFO的配置可以提升USB的性能但是前面提到OTG内存大小总共为4096字节1024x32位字。其中一部分内存被DMA使用每个通道使用32字节8个字总共9个通道1个接收通道加8个发送通道。这样剩下3808字节952个字可用于USB FIFO。在设备树中以下属性用于FIFO配置。g-rx-fifo-size总RX FIFO (32 bits字);g-np-tx-fifo-size非周期性TX FIFO (32 bits字);g-tx-fifo-size周期性TX FIFO (32 bits字)每个值对应一个IN端点ep1……ep7 (不包括ep0).中断和等时USB端点被称为“周期性”控制和批量USB端点被称为“非周期性”。属性中所有FIFO大小的值之和不得超过952。每个FIFO大小的最小值为16字即使该端点未使用。03 配置示例这里以一个具体实例来演示。假设MP135F的OTG被配置为复合设备实现一个NCM接口和三个ACM接口。其中NCM的驱动要求支持一个OUT端点两个IN端点其中一个传输数据一个做NOTIFY这里OUT端点使用MP135 Gadget设备的RX FIFO对应FIFO配置项是g-rx fifo-size对于传输数据的IN端点对应的配置项是g-tx-fifo-size。查看NCM的端点驱动可以看到Maxpacket size为512 byte所以必须配置一个TxFIFO为512 byte也即g-tx-fifo-size项的值至少有一个最小应配置为512/4128字。另外一个Notify IN端点用于传输通知信息最大包是64byte按两倍配置设为32字同样地一个ACM接口需要支持一个OUT端点两个IN端点与NCM类似翻开ACM驱动的端点设置可以看到Maxpacket size是512byte因此需要增加配置一个g-tx-fifo-size是512/4128字这样三个ACM接口就需要有三个128的配置值。▲ 图 2ACM驱动端点配置配置项目g-tx-fifo-size配置8个IN端点的FIFO值NCM和ACM在注册时自动分配端点号配置时无需考虑一一对应的问题实际上在注册分配端点时程序会自动从数组里查询能够支持自己Maxpacket size的端点然后分配给对应的功能图3配置FIFO代码片段。综上所述只需要保证这个数组里有四个端点的值大于128就可以了。▲ 图 3TxFIFO配置代码片段g-np-tx-fifo-size是共享的非周期性数据主要是控制传输的TxFIFO控制端点最大包是64按两倍配置这个值设置为32。最后g-rx-fifo-size是所有端点共享的把剩下的可用RAM空间都分配给它952 – 32 -32*4 - 128*4280这里设置为256确认其满足2.2章节中RxFIFO的最小配置要求。最终的配置结果为这样即可实现一个OTG做一个NCM加三个ACM的复合设备也可以发现该配置已经分配了所有OTG端点所以这也是STM32MP1x的OTG能够支持的最大复合设备数。点击下载《STM32MP1x USB OTG FIFO设置》原文档。重要通知 - 请仔细阅读意法半导体公司及其子公司 “ST”保留随时对 ST 产品和 / 或本文档进行变更的权利恕不另行通知。买方在订货之前应获取关于 ST 产 品的最新信息。 ST 产品的销售依照订单确认时的相关 ST销售条款。 买方自行负责对 ST 产品的选择和使用 ST 概不承担与应用协助或买方产品设计相关的任何责任。 ST 不对任何知识产权进行任何明示或默示的授权或许可。 转售的 ST 产品如有不同于此处提供的信息的规定将导致 ST 针对该产品授予的任何保证失效。 ST 和 ST 徽标是 ST 的商标。若需 ST 商标的更多信息请参考 www.st.com/trademarks。所有其他产品或服务名称均为其 各自所有者的财产。 本文档是ST中国本地团队的技术性文章旨在交流与分享并期望借此给予客户产品应用上足够的帮助或提醒。若文中内容存有局限或与ST 官网资料不一致请以实际应用验证结果和ST官网最新发布的内容为准。您拥有完全自主权是否采纳本文档包括代码电路图等信息 我们也不承担因使用或采纳本文档内容而导致的任何风险。 本文档中的信息取代本文档所有早期版本中提供的信息。 © 2020 STMicroelectronics - 保留所有权利