User manual

Table Of Contents
Zynq-7000 AP SoC Technical Reference Manual www.xilinx.com 436
UG585 (v1.11) September 27, 2016
Chapter 15: USB Host, Device, and OTG Controller
If 0 go to step 3.
If 1 continue to step 6.
6. Write usb.USBCMD [ATDTW] bit = 0.
7. If status bit read in (4) is 1 DONE.
8. If status bit read in (4) is 0 then Goto Case 1: step 1.
Transfer Completion
After a dTD has been initialized and the associated endpoint primed the device controller will
execute the transfer upon the host-initiated request. The DCD will be notified with a USB interrupt if
the interrupt on complete bit was set or alternately, the DCD can poll the endpoint complete register
to find when the dTD had been executed. After a dTD has been executed, the DCD can check the
status bits to determine success or failure.
Caution: Multiple dTD can be completed in a single endpoint complete notification. After clearing
the notification, the DCD must search the dTD linked list and retire all dTD’s that have finished
(Active bit cleared).
By reading the status fields of the completed dTD’s, the DCD can determine if the transfers
completed successfully. Success is determined with the following combination of status bits:
Active = 0
Halted = 0
Transaction Error = 0
Data Buffer Error = 0
Should any combination other than the one shown above exist, the DCD must take proper action.
Transfer failure mechanisms are indicated in the device error matrix.
In addition to checking the status bit, the DCD must read the Transfer Bytes field to determine the
actual bytes transferred. When a transfer is complete, the Total Bytes transferred is decremented by
the actual bytes transferred. For Transmit packets, a packet is only complete after the actual bytes
reach 0, but for receive packets, the host might send fewer bytes in the transfer according the USB
variable length packet protocol.
Example: Flushing/De-priming an Endpoint
It is necessary for the DCD to use the flush bit(s) to de-prime one or more endpoints when a USB
device reset is received or when a broken control transfer occurs. There can also be application
specific requirements to stop transfers in progress. The following procedure can be used by the DCD
to stop a transfer in progress and ensure the transfer has stopped:
1. Write a 1 to the corresponding bit(s) in usb.ENDPTFLUSH.
2. Wait until all bits in usb.ENDPTFLUSH are 0.
Software interrupt routine note: This operation can take a large amount of time depending on
the USB bus activity. It is not desirable to have this wait loop within an interrupt service routine.
3. Read usb.ENDPTSTAT to ensure that for all endpoints commanded to be flushed, that the
corresponding bits are now 0. If the corresponding bits are 1 after step #2 has finished, then the