基于DWC2的USB驱动开发-0x03 DWC2 USB2.0 IP 架构介绍之接口和协议时序

描述

本文转自公众号,欢迎关注)

基于DWC2的USB驱动开发-0x03 DWC2 USB2.0 IP 架构介绍之接口和协议时序 (qq.com)

前言

这部分以一些典型的传输为例,介绍控制器的处理过程。这部分内容比较重要,对于时序的理解有助于软件编写,尤其了解整个过程的先后顺序,逻辑,比如什么时候产生中断,什么时候硬件做什么,什么时候软件做什么,这些都是驱动编写需要了解的。可以慢慢,细细品,后面编写软件调试过程还会结合寄存器状态,结合调试过程不断加深理解。

控制写

如下以设备模式,DMA操作方式,16位utmi接口,SetAddress的Setup阶段为例

驱动开发

注意以上5个关键过程

  1. 软件使能OUT端口,设置好DMA,准备好接收数据。
  2. HOST发送Setup包过来,控制器收到并且硬件自动回复ACK。
  3. 控制器通过DMA将Setup包的内容搬运到系统memory。
  4. 然后控制器自动设置NAK位,NAK所有的IN和OUT端点,不再接收令牌包。

这里硬件自动NAK进行流控, 为什么这里要硬件自动NAK呢,这是为了避免持续的setup导致异常,因为由软件中断服务中再进行NAK比较慢,所以必须硬件做。所以驱动编写一定要知道哪些是硬件做的哪些需要软件做。

  1. 产生接收setup中断, 软件读出setup内容进行解析,然后清除NAK位,重新使能端口进行接收。

如下是状态阶段

SetAddress没有数据阶段,前面的Setup数据流是HOST->DEV,所以状态阶段数据流是DEV->HOST,即HOST过来IN请求数据,DEV返回0长包。

驱动开发

  1. 软件使能IN端点,配置DMA发送0长包。
  2. 控制器认为此时数据还未就绪所以NAK主机的IN请求。
  3. 控制器产生发送空中断。
  4. HOST继续IN请求,此时控制器准备好了数据,所以返回了0长包。
  5. 控制器产生发送完中断,即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模式为例

驱动开发

  1. 软件设置好DMA,使能OUT端点.
  2. HOST发送一个1字节长的BULK OUT包,控制器因为已经就绪接收,所以ACK该包,接收的数据在接收缓冲区。
  3. 控制器通过DMA将接收缓冲区的数据搬运到系统memory。
  4. 控制器产生接收完成中断。中断中就可以对数据进行处理。

设备模式BULK IN

如下以包长为1的BULK IN传输,DMA模式为例。

驱动开发

  1. 此时发送FIFO中没有数据,所以HOST来IN请求时,控制器返回NAK
  2. 控制器产生TXFIFO空中断,表示TXFIFO中没有数据了,可以准备发送数据了。
  3. 软件配置好DMA和使能IN端点。
  4. 控制器通过DMA将数据从系统memory搬运到TXFIFO中。在完成搬运前都是NAK主机的IN。
  5. 完成数据搬运到FIFO,FIFO中有数据了,此时HOST再来IN,则控制器将缓冲区的数据发送到USB总线上去。
  6. 控制器产生发送完中断。

设备模式Interrupt OUT

以下以设备模式,DMA操作,中断OUT传输252字节数据。和BULK OUT类似。

驱动开发

  1. 软件配置好DMA和使能OUT端点。
  2. 控制器接收HOST发送的数据到接收缓冲区,并ACK。
  3. 控制器通过DMA将接收缓冲区的数据搬运到系统memory。
  4. 产生接收完成中断。软件可以处理数据了。

设备模式Isochronous IN

以下以设备模式DMA方式的ISO IN传输为例

驱动开发

驱动开发

  1. SOF令牌,ISO的传输以SOF微帧为单位进行。
  2. 控制器产生SOF中断。
  3. 软件设置好DMA使能IN端点。
  4. IN端点使能后,控制器开始通过DMA将系统memory的数据搬运到发送FIFO中去。
  5. 下一个SOF到来并产生SOF中断
  6. 本次SOF的HSOT的IN请求,设备的FIFO中已经准备好数据所以可以发送到总线上去给HOST。
  7. 产生发送完中断。

主机模式 Isochronous IN

以下以主机模式DMA方式的ISO IN传输为例

应用程序必须在传输之前安排一个(微)帧的传输。

驱动开发

驱动开发

  1. 控制器产生SOF中断。
  2. 软件配置好通道信息以准备接收下一个微帧的数据。
  3. 下一个SOF中断。
  4. 控制发送IN请求并接收设备返回的数据。
  5. 控制器将接收到的数据通过DMA搬运到系统memory中。
  6. 控制器产生接收完成中断。

主机模式Slave操作方式Bulk Out传输

以主机模式 Slave操作方式 Bulk Out传输1个字节数据为例。

Slave模式需要CPU通过AHB总线去写数据到发送FIFO,而不是DMA自动搬运。

驱动开发

  1. 控制初始化配置好BULK OUT的通道。
  2. 软件将数据写入TXFIFO中。
  3. 控制器发送TXFIFO中的数据。
  4. 发送完产生中断。

总结

以上以各种典型的传输时序图为例介绍了控制器的处理过程,把这部分放在开始写代码之前也是为了先有一个大概的整体了解,才能确定程序的框架流程如何设计。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分