When do USB Hosts require a zero-length IN packet at the end of a Control Read Transfer?

David Grayson picture David Grayson · Sep 18, 2010 · Viewed 11.4k times · Source

I am writing code for a USB device. Suppose the USB host starts a control read transfer to read some data from the device, and the amount of data requested (wLength in the Setup Packet) is a multiple of the Endpoint 0 max packet size. Then after the host has received all the data (in the form of several IN transactions with maximum-sized data packets), will it initiate another IN transaction to see if there is more data even though there can't be more?

Here's an example sequence of events that I am wondering about:

  1. USB enumeration process: max packet size on endpoint 0 is reported to be 64.
  2. SETUP-DATA-ACK transaction starts a control read transfer, wLength = 128.
  3. IN-DATA-ACK transaction delivers first 64 bytes of data to host.
  4. IN-DATA-ACK transaction delivers last 64 bytes of data to host.
  5. IN-DATA-ACK with zero-length DATA packet? Does this transaction ever happen?
  6. OUT-DATA-ACK transaction completes Status Phase of the transfer; transfer is over.

I tested this on my computer (Windows Vista, if it matters) and the answer was no: the host was smart enough to know that no more data can be received from the device, even though all the packets sent by the device were full (maximum size allowed on Endpoint 0). I'm wondering if there are any hosts that are not smart enough, and will try to perform another IN transaction and expect to receive a zero-length data packet.

I think I read the relevant parts of the USB 2.0 and USB 3.0 specifications from usb.org but I did not find this issue addressed. I would appreciate it if someone can point me to the right section in either of those documents.

I know that a zero-length packet can be necessary if the device chooses to send less data than the host requested in wLength.

I know that I could make my code flexible enough to handle either case, but I'm hoping I don't have to.

Thanks to anyone who can answer this question!

Answer

MBR picture MBR · Apr 20, 2012

Read carefully USB specification:

The Data stage of a control transfer from an endpoint to the host is complete when the endpoint does one of the following:

  • Has transferred exactly the amount of data specified during the Setup stage
  • Transfers a packet with a payload size less than wMaxPacketSize or transfers a zero-length packet

So, in your case, when wLength == transfer size, answer is NO, you don't need ZLP.

In case wLength > transfer size, and (transfer size % ep0 size) == 0 answer is YES, you need ZLP.