1.1.2.2 Endpoint Transfer Descriptor(dtd)
Dtd描述需要接收或发送的数据格式,结构如下,
Next link pointer存放下一个dtd所在的物理地址,其中T表示是否是DTD
链表的最后一个DTD.ioc用于设置该DTD传输完之后是否产生xfer complete interrupt,total bytes表示该dtd中待传输或者接收的数据长度,其中page0为数据存放的起始页,每4096一页。Status为dtd的状态,current offset用于保证4k对齐。Frame Number只对等时传输有效。
1.1.3 Device operational model
根据上面的QH和dtd数据结构,实际上已经了解传输的包以及一些传输方式。
如果熟悉了usb的枚举过程,特别是USBtty的枚举过程,操作模型这块是很容易理解的,初始化usb device controller之后,等待枚举过程结束之后 就是bulk传输的过程。这里讲讲两个部分,一个是状态机,这个在枚举过程中占有很重要的位置。
讲过很多的枚举过程,对这个状态转换还是比较清晰的,reset有两部分,当host发送reset命令时,一次是得到device address,另一次reset用于决定是否是HS(因为上电枚举初始化为FS,这个在上电过程中说到)。之后就是以device address为地址的枚举过程。说到枚举过程,这里注意USB device是不主动发送数据的,其实bulk传输有点类似等时传输,枚举过程中,有个设置interval time对于bulk HS而言,就是查询的时间的间隔,在主机端发送接收数据请求给device,而device又没数据发送时,超过3ms之后,就被挂起。
对dtd的管理,上面说到在QH中挂载DTD链表时,在传输完一个个DTD之后,需要一个链表的管理,从而保证DTD的重复使用。实际上管理方式也很简单,多添加两个指针head pointer和 tail pointer即可,如下图所示
1.1 文件组成
1.1.1 源代码结构
相关源代码位于CVS的“mx25/boot/ u-boot-mx25/”目录下,包含下面子目录:
(1) common:系统通用代码
(2) drivers/serial/:usbtty相关通用代码
(3) drivers/usb/gadget/:usb设备相关代码
1.1.2 组成文件
该部分组成文件包括下面文件:
(1)/common/stdio.c:系统通用标准输入输出接口代码
(2)/drivers/usbtty.c: 系统通用USB转tty设备接口代码
(3)/drivers/usb/gadget/mx25_udc.c:USB设备相关代码
(4)/drivers/usb/gadget/core.c:设备枚举和urb传输接口代码