UM10360 All information provided in this document is subject to legal disclaimers. © NXP B.V. 2013. All rights reserved.
User manual Rev. 3 — 19 December 2013  261 of 841
NXP Semiconductors
UM10360
Chapter 11: LPC176x/5x USB device controller
DMA operation is not supported for physical endpoints 0 and 1 (default control endpoints).
11.15.5.2 Finding DMA Descriptor
When there is a trigger for a DMA transfer for an endpoint, the DMA engine will first 
determine whether a new descriptor has to the fetched or not. A new descriptor does not 
have to be fetched if the last packet transferred was for the same endpoint and the DD is 
not yet in the retired state. An internal flag called DMA_PROCEED is used to identify this 
condition (see Section 11.15.5.4 “
Optimizing descriptor fetch” on page 261).
If a new descriptor has to be read, the DMA engine will calculate the location of the DDP 
for this endpoint and will fetch the start address of the DD from this location. A DD start 
address at location zero is considered invalid. In this case the NDDR interrupt is raised. 
All other word-aligned addresses are considered valid.
When the DD is fetched, the DD status word (word 3) is read first and the status of the 
DD_retired bit is checked. If not set, DDP points to a valid DD. If DD_retired is set, the 
DMA engine will read the control word (word 1) of the DD.
If Next_DD_valid bit is set, the DMA engine will fetch the Next_DD_pointer field (word 0) 
of the DD and load it to the DDP. The new DDP is written to the UDCA area.
The full DD (4 words) will then be fetched from the address in the DDP. The DD will give 
the details of the DMA transfer to be done. The DMA engine will load its hardware 
resources with the information fetched from the DD (start address, DMA count etc.).
If Next_DD_valid is not set and DD_retired bit is set, the DMA engine raises the NDDR 
interrupt for this endpoint and clears the corresponding EPxx_DMA_ENABLE bit.
11.15.5.3 Transferring the data
For OUT endpoints, the current packet is read from the EP_RAM by the DMA Engine and 
transferred to on-chip RAM memory locations starting from DMA_buffer_start_addr. For 
IN endpoints, the data is fetched from on-chip RAM at DMA_buffer_start_addr and written 
to the EP_RAM. The DMA_buffer_start_addr and Present_DMA_count fields are updated 
after each packet is transferred.
11.15.5.4 Optimizing descriptor fetch
A DMA transfer normally involves multiple packet transfers. Hardware will not re-fetch a 
new DD from memory unless the endpoint changes. To indicate an ongoing multi-packet 
transfer, hardware sets an internal flag called DMA_PROCEED.
The DMA_PROCEED flag is cleared after the required number of bytes specified in the 
DMA_buffer_length field is transferred. It is also cleared when the software writes into the 
USBEpDMADis register. The ability to clear the DMA_PROCEED flag allows software to 
force the DD to be re-fetched for the next packet transfer. Writing all zeros into the 
USBEpDMADis register clears the DMA_PROCEED flag without disabling DMA operation 
for any endpoint.
11.15.5.5 Ending the packet transfer
On completing a packet transfer, the DMA engine writes back the DD with updated status 
information to the same memory location from where it was read. The 
DMA_buffer_start_addr, Present_DMA_count, and the DD_status fields in the DD are 
updated.