☰
【官方原创】LAT6041 STM32MP1x USB OTG FIFO设置
2026/10/22 2:13:33 网站建设 项目流程

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 外设模式下的FIFO

OTG工作在Host还是Peripheral模式下FIFO的组织形式有所不同,这里只关注外设模式下的情况。

  • 所有OUT端点共享相同的一个RAM FIFO

OTG使用单个接收FIFO,当这个FIFO有足够的空间时,接收所有OUT端点过来的数据,直到FIFO被占满,后续事务才会被NAK。接收FIFO的大小在OTG_GRXFSIZ中配置。

  • 每个IN端点都分配一个专用的FIFO

与OUT端点不同,每个IN端点需要单独配置TxFIFO,其中EP0的配置寄存器为OTG_DIEPTXF0,另外8个IN端点的配置寄存器为OTG_DIEPTXFx(x=0~7)。

如图1所示,Peripheral模式下的OTG FIFO框架。

▲ 图 1 STM32MP1x设备模式下的USB FIFO

2.2 FIFO 的分配

接收FIFO的分配,应用程序必须为SETUP数据包分配RAM

  • 必须在接收FIFO中为控制端点的SETUP数据包保留10个位置。USB核不会使用这些为SETUP数据包保留的位置来写入任何其他数据。

  • 必须为全局OUT NAK分配一个位置。

  • 状态信息与每个接收的数据包一起写入FIFO。因此,接收数据包必须至少分配(最大数据包大小/4)+1的空间。如果启用了多个等时端点,则至少必须分配两个(最大数据包大小/4)+1的空间以接收连续的数据包。通常建议分配两个(最大数据包大小/4)+1的空间,以便在前一个数据包传输到CPU时,USB可以接收后续数据包。

  • 对于每个端点的最后一个数据包,传输完成的状态信息也会被推送到FIFO。建议为每个OUT端点分配一个位置。

配置RxFIFO=(5*控制端点数量+8)+((最大USB数据包大小/4)+1用于状态信息)+(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/4=128字。

另外一个Notify IN端点,用于传输通知信息,最大包是64byte,按两倍配置,设为32字,同样地,一个ACM接口,需要支持一个OUT端点,两个IN端点,与NCM类似,翻开ACM驱动的端点设置,可以看到Maxpacket size是512byte,因此,需要增加配置一个g-tx-fifo-size是512/4=128字,这样三个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*4=280,这里设置为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 - 保留所有权利

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询