In order to reach 192MBits/s on an isochronous IN endpipe I have a large buffer holding the data and expect that the HS controller sends this buffer autonomously - sending three 1024 byte packets in each microframe:
24 micro frames a ms = 24kBytes data per ms, = 24MBytes/s (192M Bits/s).
However it is not functioning autonomously and also doesn't send full multiple frames in a microframe and so I am wondering what causes this?
It should be straightforward by filling out the queue header as follows:
1. Maximum Packet Length is 1024 bytes (maximum allowed for HS isochronous)
2. The 'large' data buffer is pointed to by the Buffer pointers (each page aligned on a 4k boundary)
3. The Mult setting is set to 3 - send 3 frames per microframe interval.
4. Total Bytes is the size of the large buffer (eg. 16k)
Expected is that the HS USB device sends 3 x 1024 bytes per microframe and repeats until all 16k has been sent - then it retires.
What however happens is that it sends three transfers in the first microframe - the first of 1024 bytes (as expected) but the second with 128 bytes and a third for zero bytes (and stops sending anything else in following microframes). I have no explanation as to why it would do that and not send 3 x 1024?
If I just send one frame per microframe it sends just the single 1024 byte package and retires.
Therefore the other question is why it retires after one frame rather than continuing until the Total Bytes count has reached zero and sending data until the count has decremented to zero - potentially sending a smaller final frame if the buffer size is not divisible by 1024 (which is what is expected)?