前言
DWC2即新思(Synopsys )的DesignWare® Cores USB 2.0 HiSpeed On-The-Go (OTG)控制器IP,被大量使用。从linux的内核源码驱动中就带DWC2的驱动(新思官方维护),可以看出其使用的非常多。
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/usb/dwc2?h=v6.4-rc1
本文先对其功能特征进行简介,以便有一个整体概念的理解。内容基本都是参考自文档《DesignWare Cores USB 2.0 Hi-Speed On-TheGo (OTG)Databook》
DWC2的特征介绍
组件
DWC2的IP目前是版本4,其IP基本的组件是DWC USB 2.0 HS OTG Controller v4,
还有其他几个是需要单独购买license才能添加的,前两个都是低功耗相关的,从此也可以看出要达到某些极致的性能(比如低功耗)肯定是要付出更高代价的。这就是技术壁垒带来的高附加值,需要额外购买也是理所当然,别人开发肯定技术投入也是更高的。感叹一下什么时候我们的各行各业的技术水平能做到这样的按功能点和特征收费就好了,只能说努力吧。
DWC USB HSOTG Hibernate
DWC USB HSOTG HSIC-LPM
DWC USB UTMI-to-UTMI Bridge
框架
整体框架如下图,浅蓝色部分是根据配置决定,黑色部分是所有配置都有的:
对于软件编写来说也要了解下其架构
DMA 部分
如图的上面部分,
可以选择内部的DMA控制器,此时内部DMA控制器(AHB主控器)使控制器能够充当AHB上的主控器,以便在AHB之间传输数据,即在AHB左侧的Memory和SPRAM之间搬运数据。即对应的接口AHB Master I/F。
内部DMA控制器与外部DMA控制器只能二选一(如图标示的Either or none),当然也可以没有DMA那就只能CPU通过AHB总线进行数据搬运。
如果选择外部DMA控制器则可以选择DesignWare 的DW_ahb_dmac或者ARM DMA控制器PrimeCell之类的DMA控制器连接到DWC_otg控制器。专用传输FIFO操作(Dedicated Transmit FIFO,IP配置OTG_EN_DED_TX_FIFO=1)时不能选择外部DMA。
DMA是软件编程需要重点理解的内容。
AHB总线部分
如图左边部分,这一部分主要是CPU和DWC交互。
AHB Slave I/F:AHB从接口,即DWC控制器是从设备,CPU通过该接口对DWC的控制和状态寄存器(CSR)、数据FIFO和队列进行读写访问。
AHB Master I/F:在上面的DMA部分描述, 使能DMA时,DMA是主设备,负责在系统的memory和内部的RAM之间搬运数据。
RAM部分
如图下面部分,对于软件角度来说就是DWC和软件围绕着RAM在进行数据交互。
外部单端口FIFO RAM(SPRAM)用于事务数据存储,可配置,32至32768 x 35位宽(32个数据位加3个控制位)。
DataFIFO RAM/IF:数据缓存FIFO RAM接口,DWC_otg控制器上的发送和接收FIFO接口用于将数据移入和移出数据FIFO RAM。
这些传输分为周期性传输(用于等时传输ISO和中断传输)或非周期传输(用于批量传输和控制传输).
所有主机输入和设备输出传输使用一个单口接收FIFO。
非周期性主机OUT传输公用一个Tx FIFO。
周期性主机OUT传输,可以选择一个独立周期传输FIFO。
设备模式下IN端点可选公用非周期性Tx FIFO,和多个周期性TxFIFO
用于周期性/非周期性设备IN传输的每个IN端点可选专用Tx FIFO
主机模式中断OUT和设备模式中断IN(仅在Shared FIFO 操作模式)传输可以编程为通过非周期传输FIFO或周期传输FIFO。
注:在Shared FIFO模式,对于采用Control-Bulk-Interrupt (CBI)协议的大容量存储设备,中断IN端点不使用周期端点(通常用于批量数据传输结束时的状态更新)。当单个大容量存储设备连接后,且软件可以预测何时接收到IN中断,则可以通过非周期性传输FIFO控制器发送该IN中断,节省一个周期FIFO和相关内存。
接口部分
如图右边是接口部分,可以配置支持至少一个或者同时支持多个接口,注意这里的配置是指的IP的配置,而不是软件的编程配置。
支持UTMI+ Level 3 PHY 接口 (Revision 1.0 or HSIC)
UTMI+PHY可以是单向或双向的,可以配置为8-、16-或8/16位数据总线,IP配置为8/16位数据总线时软件可以通过寄存器动态配置选择8位还是16位。
UTMI+接口可以配置为与符合修订版1.0的PHY或符合HSIC的PHY一起工作。
ULPI PHY 接口 (Revision 1.1)
ULPI PHY可以是单向或双向的,具有8位SDR或4位DDR总线(软件可动态配置)
这里顺便提一下:ULPI接口引脚少,一般用于外置PHY的情况或者FPGA原型验证阶段,而UTMI接口引脚多,一般PHY集成在SOC内时使用。
USB 1.1全速串行收发器接口
USB 1.1全速串行收发器可以具有专用接口,也可以在芯片外PHY的UTMI+或ULPI接口上共享引脚(软件可配)
IP配置使能了IC_USB时,全速串行收发器接口可以配置为USB 1.1 6P/3P接口或IC_USB接口。
IC_USB接口是一个额外的专用接口。此接口不能和UTMI+或ULPI的引脚共享。无论FS引脚共享选项如何,IC_USB一旦配置使能,接口总是可用的。IC_USB接口是一个附加功能,需要额外的DWC-HSOTGFS-ICUSB许可证。
DWC_otg控制器可以支持两个并行端口(例如,与专用FS 1.1并行的UTMI+)。但是,两个端口不能同时运行。在任何给定的时间,只有一个端口处于活动状态。从一个端口切换到另一个端口时,应用程序必须提供软件复位(这里编程需要注意,不过一般也不会做切换,实际一般都是固定一个接口)。
其他可选接口
供应商控制接口可以访问ULPI和UTMI+ PHY寄存器
I2C接口,用于USB 1.1 FS模式下的OTG控制
通用I/O (GPIO)接口
SOF更新翻转接口(不用于DWC otg)
SOF输入计数接口(不用于DWC otg)
用于设备和主机模式的基于描述符的分散/聚集DMA控制器(Descriptor-Based Scatter/Gather DMA)。(不支持Descriptor-BasedCongruent-Sequential DMA)。
这里有必要提一下Descriptor-Based Scatter/Gather DMA就是DMA界的上乘武功,一般的MDA只能一次搬运一处区域,而它则能按照链表的形式处理一系列区块,这在USB做大数据量传输时非常方便,可以大大解放CPU提高效率,尤其是在UVC等需要ISO传输尤其是大带宽的ISO传输处理时更能体现其威力,可以大大提高性能。但是Host Scatter Gather DMA不支持hubs (split transfers),Split transfers只支持Host Buffer DMA (Internal DMA) 。
l作为设备模式时的多处理器中断
此功能支持端点相关中断屏蔽寄存器和来自于控制器的端点相关的中断信号。此功能可以在多处理器环境中使用,每个端点都可以由不同的处理器控制。
特征
一般特征
支持OTG2.0和OTG1.3,软件可配.OTG2.0支持ADP (Attach detection Protocol)。
OTG2.0和OTG1.3的区别是前者支持Attach Detection Protocol (ADP) ,后者不支持
前者支持Accessory Charger Adapter (ACA) (需要配置使能BC Support =1)。
支持High-Speed (HS, 480-Mbps),Full-Speed (FS, 12-Mbps),Low-Speed (LS, 1.5-Mbps)。
诸多低功耗相关配置选项。
支持多种DMA和非DMA操作方式。
MAC-Phy之间支持多种接口。
AHB和PHY接口支持使用不同的时钟,以简化集成。
包括控制端0在内,一共最多支持16个双向端点。
DWC_otg作为设备使用UTMI+ PHY时不支持低速。
支持Session Request Protocol (SRP)。
支持Host Negotiation Protocol (HNP)。
最多支持16个主机通道。在主机模式下,当需要支持的设备的端点数量大于支持的主机通道数,软件可以重新编程通道来支持多达127个设备,每个设备有32个端点(IN + OUT),最多4,064个端点。
Host Buffer DMA模式, Slave 模式, External DMA模式支持外部HUB连接。
注意:DWC_otg 在Host Scatter Gather DMA模式不支持split transfers。只有Buffer DMA模式支持通用根集线器。
包括自动ping功能。
支持低速模式下的Keep-Alive和高速/全速模式下的SOFs。
配置特征
使用coreConsultant实用程序根据用户需求配置控制器
能够为低功耗模式选择多个电源轨
多种DMA操作模式的选择
选择所需的Mac-Phy接口类型
应用接口特征
通过AHB的应用程序接口:AHB从接口,用于访问控制和状态寄存器(CSRs)、数据FIFO和队列。可选的AHB主接口,内部DMA使能时给Data FIFO访问使用。特定配置下AHB时钟最高可达270MHz。
AHB总线上只支持32位数据。
支持通过pin配置小端或者大端模式。
AHB从接口支持INCR4, INCR8, INCR16, INCR和SINGLE传输。
AHB主接口支持拆分、重试和错误AHB响应。AHB从机接口上不产生拆分和重试响应。
DMA模式AHB主接口支持软件配置AHB Burst类型。
选择INCR4则控制器使用INCR/INCR4, 或Single。
选择INCR8则控制器一般使用INCR8,但是传输的开始和最后根据大小可能使用INCR 和Single。
选择INCR16则控制器一般使用INCR16,但是传输的开始和最后根据大小可能使用INCR 和Single。
只能处理固定的burst address对齐,比如INCR16则地址的位[5:0]都要是0。注意:这里INCR16单位是WORD(4B),所以16x4=64B,即低6位为0。
在AHB主接口上可生成AHB忙周期。
可处理1KB的边界。
MAC-PHY接口特征
MAC-PHY接口接控制器访问PHY芯片的接口。
支持以下接口
UTMI 8/16,ULPI,HSIC,IC_USB (Low/Full速),FS 和UTMI共享。
支持UTMI+ Level 3 接口(Revision 1.0, February 25th, 2004). 8-, 16-, 和 8/16-位数据总线。
支持ULPI接口 (Revision 1.1rc, September 1st, 2004), 8-位 SDR, 4-bit DDR, 6-pin Serial, 3-pin Serial 和 Carkit。
UTMI+ L3 和 ULPI可同时存在,由软件选择,或者直接配置只使用一种。
只有在选择了UTMI+的情况下,才能选择HSIC接口。否则无法选择HSIC接口。HSIC需要额外的DWC-HSOTG-HSIC授权。
I2C接口(用于支持Mini USB Analog Carkit Interface Specification, CEA-936, Revision 2)。不适用于其他设备。
支持UTMI-to-UTMI Bridge。
系统Memory特征
支持Slave, 外部DMA 控制器接口, 或者内部DMA 模式。
使用内部DMA模式时还支持Descriptor-Based Scatter/Gather DMA。
与外部DMA控制器的接口可选;数据通过AHB从机接口传输。
Non-DWORD对齐支持
主机模式:
Scatter Gather DMA模式,IN和OUT传输,支持缓冲区的Non-DWORD对齐。
Buffer DMA 和 Slave 模式,IN和OUT传输,不支持缓冲区的Non-DWORD对齐。
设备模式:
Scatter Gather DMA模式,IN和OUT传输,支持缓冲区的Non-DWORD对齐。
Buffer DMA 和 Slave 模式,IN和OUT传输,不支持缓冲区的Non-DWORD对齐。
注意:对Non-DWORD对齐的支持是针对缓冲区的,不是描述符,描述符必须WORD对齐。
内部Memory特征
在Slave和DMA模式,可以配置支持每个设备的IN端点都使用一个固定的传输FIFO。每个FIFO可以保存多个包。
包括一个可选的接口支持Remote Memory,用于向控制器发出系统上DMA写入完成事件的信号。
支持给端点进行包级别的动态FIFO分配,以支持小FIFO,和灵活高效利用FIFO。
利用单端口RAM替代双端口RAM以减少面积和功耗。
支持传输时动态修改端点FIFO的大小。
支持端点FIFO可不是2的指数倍对齐,以利用连续的存储位置。
在主机和设备模式下共享硬件寄存器,以减少门数。
设备模式时如果选择dedicated Tx FIFO,DMA模式收发都支持阈值。阈值可以通过全局寄存器配置,支持阈值AHB时钟必须60MHz以上。
所谓的Dedicated FIFO即设备模式的每个IN端点都有自己独立的传输FIFO。
Shared FIFO 即非周期IN端点共享一个TX FIFO ,周期端点有独立的FIFO。
软件特征
为了减少门数和提供灵活性,一些特征由软件去实现
软件协助硬件进行设备模式非周期IN排序(仅适用于Shared FIFO操作)。
软件处理USB命令(检测SETUP事务,并将其命令有效载荷转发给应用程序进行解析)。
软件处理USB错误。
功耗优化特征
有源时钟门控功能:允许控制器通过在USB和AHB数据流之间的IDLE时段内,在控制器的模块内门控AHB和PHY时钟,来降低动态功耗。同样也可以在SPRAM未使用时门控RAM的时钟输出。
支持Link Power Management (LPM)(需要额外的DWC-HSOTG-LPM授权)。以增加在面向USB Audio Class 3.0目标的Audio数据流处理L1请求时的灵活性。
几个节能功能,包括两个用于高级电源管理的电源轨。可以根据自己的要求选择以下任何节能选项:
时钟门控
部分断电
休眠:在休眠(当OTG_EN_PWROPT=2或3时启用)中,包含大约95%门数的DWC_OTG_core模块可以在挂起Suspend期间在主机和设备模式下进行电源门控。DWC_otg_pmu能够在挂起期间检测恢复、远程唤醒、SRP或连接,并在控制器处于休眠状态时唤醒应用程序。
扩展休眠:在扩展休眠(当OTG_EN_PWROPT=3时启用)中,DWC_OTG_wpc_slv、DWC_OTG_power_dn和DWC_oting_pmu模块被电源门控,此功能仅在设备模式下受支持。DWC_otg_piu模块能够检测Resume,并可以通过NAK握手响应IN/OUT令牌,并存储一个Setup数据包,直到应用程序上电。此功能在整个SoC和CPU被电源门控并且USB模块的一部分上电的情况下,从主机检测活动非常有效。
休眠和扩展休眠都需要额外的DWC-HSOTG-HIBERNATION 授权。
USB Suspend, LPM, 和Session-Off模式支持PHY时钟门控。
USB Suspend和Session-Off模式支持AHB时钟门控。
USB Suspend和 Session-Off模式支持部分掉电。
层次结构支持多个电源轨,以便在挂起期间启用休眠功能。
输入信号需要powered-off的块驱动到安全的0.
Data FIFO RAM不使用的时关闭片选。
Data FIFO RAM支持时钟门控。
设备和主机模式都支持在USB Suspend, LPM, 和 Session-Off 模式时切换到32-KHz低频时钟。
总结
这一篇先对控制器的特征有一个大致的整体了解,对这些整体的框架了解也有助于后续的各模块部分的了解,对软件开发也有一些参考意义。