I'm using T1040’s USB host controller to access a Full Speed (USB 1.1) device.
Here is (very) basically how our periodic transfer descriptors are built:
TD EP# EP Type MaxLen S-mask C-mask
siTD1 EP3 ISO OUT 184 0x01 0x04
siTD2 EP2 ISO OUT 112 0x02 0x08
siTD3 EP6 ISO IN 16 0x04 0x10
qhTD4 EP7 INT OUT 64 0x04 0x10
qhTD5 EP8 INT IN 64 0x04 0x30
qhTD6 EP4 INT IN 8 0x08 0x20
stTD7 EP5 ISO IN 392 0x10 0xC0
and how they are chained together :
siTD1->next_link_ptr = siTD2 | UEH_CT_TYPE_siTD;
siTD2->next_link_ptr = siTD3 | UEH_CT_TYPE_siTD;
siTD3->next_link_ptr = qhTD4 | UEH_CT_TYPE_qhTD;
qhTD4->horiz_link_ptr = qhTD5 | UEH_CT_TYPE_qhTD;
qhTD5->horiz_link_ptr = qhTD6 | UEH_CT_TYPE_qhTD;
qhTD6->horiz_link_ptr = siTD7 | UEH_CT_TYPE_siTD;
The USB device is a custom card for which I expect 7 transactions in one frame (see pic1.jpg in attachment. Time slots 0/1000/2000 are where we observe the SOF)
But what I observe if different (see pic2.jpg in attachment). It appears that:
- S-mask and C-mask are not respected (same result is obtained with all S-mask=0x01 and all C-mask=0x04)
- EP6 and EP5 (both isochronous input data) are delayed in next frame
What does explain this behavior?
Can we force USB host controller to respect the specified scheduling?
If it could help, pic3.jpg is an overview of how we configured USB HC (without connected device here).
I'll be very grateful for any help !