基于DWC2的USB驱动开发-0x03 DWC2 USB2.0 IP 架构介绍之接口和协议时序 (qq.com)
前言
这部分以一些典型的传输为例,介绍控制器的处理过程。这部分内容比较重要,对于时序的理解有助于软件编写,尤其了解整个过程的先后顺序,逻辑,比如什么时候产生中断,什么时候硬件做什么,什么时候软件做什么,这些都是驱动编写需要了解的。可以慢慢,细细品,后面编写软件调试过程还会结合寄存器状态,结合调试过程不断加深理解。
控制写
如下以设备模式,DMA操作方式,16位utmi接口,SetAddress的Setup阶段为例
注意以上5个关键过程
- 软件使能OUT端口,设置好DMA,准备好接收数据。
- HOST发送Setup包过来,控制器收到并且硬件自动回复ACK。
- 控制器通过DMA将Setup包的内容搬运到系统memory。
- 然后控制器自动设置NAK位,NAK所有的IN和OUT端点,不再接收令牌包。
这里硬件自动NAK进行流控, 为什么这里要硬件自动NAK呢,这是为了避免持续的setup导致异常,因为由软件中断服务中再进行NAK比较慢,所以必须硬件做。所以驱动编写一定要知道哪些是硬件做的哪些需要软件做。
- 产生接收setup中断, 软件读出setup内容进行解析,然后清除NAK位,重新使能端口进行接收。
如下是状态阶段
SetAddress没有数据阶段,前面的Setup数据流是HOST->DEV,所以状态阶段数据流是DEV->HOST,即HOST过来IN请求数据,DEV返回0长包。
- 软件使能IN端点,配置DMA发送0长包。
- 控制器认为此时数据还未就绪所以NAK主机的IN请求。
- 控制器产生发送空中断。
- HOST继续IN请求,此时控制器准备好了数据,所以返回了0长包。
- 控制器产生发送完中断,即0长包发送完通知软件处理。
以上几点一些个人理解暂时不确定:
为什么1已经使能了IN端点,配置好DMA了,2时间点在1的后面为什么还是NAK,这里应该是软件DMA配置好,使能IN端点了,但是DMA还没将0长数据包更新到TxFIFO(虽然0长包不需要复制负载数据但是还是有包头包尾CRC等需要准备),所以此时还没有数据可以发送到USB总线上去所以是NAK
3这里产生发送空中断指的是缓冲区空,而不是指的总线数据发送完,所谓的缓冲区空即软件可以继续配置下一个DMA准备下一个DMA搬运了。此时数据已经就绪到TxFIFO随时都可以发送到USB总线了。
所以4这里 HOST再来IN请求时控制器就可以返回0长包了
然后5这里就产生发送完中断(这里应该是真正的总线上数据发送完)。
所以什么时候产生什么中断是编程需要了解的非常重要。
设备模式BULK OUT
这里顺便提一下USB中的IN和OUT是以HOST的角度去说的。
比如IN指的是数据DEV->HOST
OUT指的是数据HOST->DEV。
不管是设备端还是主机端都是这个角度说的。
如下以包长为1的BULK OUT传输,DMA模式为例
- 软件设置好DMA,使能OUT端点.
- HOST发送一个1字节长的BULK OUT包,控制器因为已经就绪接收,所以ACK该包,接收的数据在接收缓冲区。
- 控制器通过DMA将接收缓冲区的数据搬运到系统memory。
- 控制器产生接收完成中断。中断中就可以对数据进行处理。
设备模式BULK IN
如下以包长为1的BULK IN传输,DMA模式为例。
- 此时发送FIFO中没有数据,所以HOST来IN请求时,控制器返回NAK
- 控制器产生TXFIFO空中断,表示TXFIFO中没有数据了,可以准备发送数据了。
- 软件配置好DMA和使能IN端点。
- 控制器通过DMA将数据从系统memory搬运到TXFIFO中。在完成搬运前都是NAK主机的IN。
- 完成数据搬运到FIFO,FIFO中有数据了,此时HOST再来IN,则控制器将缓冲区的数据发送到USB总线上去。
- 控制器产生发送完中断。
设备模式Interrupt OUT
以下以设备模式,DMA操作,中断OUT传输252字节数据。和BULK OUT类似。
- 软件配置好DMA和使能OUT端点。
- 控制器接收HOST发送的数据到接收缓冲区,并ACK。
- 控制器通过DMA将接收缓冲区的数据搬运到系统memory。
- 产生接收完成中断。软件可以处理数据了。
设备模式Isochronous IN
以下以设备模式DMA方式的ISO IN传输为例
- SOF令牌,ISO的传输以SOF微帧为单位进行。
- 控制器产生SOF中断。
- 软件设置好DMA使能IN端点。
- IN端点使能后,控制器开始通过DMA将系统memory的数据搬运到发送FIFO中去。
- 下一个SOF到来并产生SOF中断
- 本次SOF的HSOT的IN请求,设备的FIFO中已经准备好数据所以可以发送到总线上去给HOST。
- 产生发送完中断。
主机模式 Isochronous IN
以下以主机模式DMA方式的ISO IN传输为例
应用程序必须在传输之前安排一个(微)帧的传输。
- 控制器产生SOF中断。
- 软件配置好通道信息以准备接收下一个微帧的数据。
- 下一个SOF中断。
- 控制发送IN请求并接收设备返回的数据。
- 控制器将接收到的数据通过DMA搬运到系统memory中。
- 控制器产生接收完成中断。
主机模式Slave操作方式Bulk Out传输
以主机模式 Slave操作方式 Bulk Out传输1个字节数据为例。
Slave模式需要CPU通过AHB总线去写数据到发送FIFO,而不是DMA自动搬运。
- 控制初始化配置好BULK OUT的通道。
- 软件将数据写入TXFIFO中。
- 控制器发送TXFIFO中的数据。
- 发送完产生中断。
总结
以上以各种典型的传输时序图为例介绍了控制器的处理过程,把这部分放在开始写代码之前也是为了先有一个大概的整体了解,才能确定程序的框架流程如何设计。
-
控制器
+关注
关注
112文章
16185浏览量
177329 -
寄存器
+关注
关注
31文章
5308浏览量
119975 -
接口
+关注
关注
33文章
8486浏览量
150803 -
usb
+关注
关注
60文章
7888浏览量
263918 -
驱动开发
+关注
关注
0文章
130浏览量
12061 -
DWC2
+关注
关注
0文章
35浏览量
119
发布评论请先 登录
相关推荐
评论