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傳輸接口代碼