EHCI/USB Split Transactions
Posted: Tue Oct 31, 2023 2:33 am
Hi,
so my question is what should a split transaction for a "get descriptor"(device descriptor) request look if this is
what the request to a high-speed device looks like:
QueueHead:
-------------
0x00031502
0x1008E000
0x40000000
Overlay:
0x00000000
0x00032000
0x00000001
...
TD1 0x32000 (Setup):
------------------------
0x00033000
0x00034000
0x00080E80
0x00035000
0x00036000
0x00037000
0x00038000
0x00039000
TD2 0x33000 (Data):
-----------------------
0x00034000
0x00034000
0x80080D80
0x00036000
0x00037000
0x00038000
0x00039000
0x0003A000
TD3 0x34000 (Handshake):
------------------------------
0x00000001
0x00000001
0x80000C80
0x00000000
0x00000000
0x00000000
0x00000000
0x00000000
Setup Buffer Content - 0x35000:
----------------------------------
0x01000680
0x00080000
This is what i am assuming a start-split should look like:
I have set the control endpoint flag, appropriate speed of the device i want to talk to(low speed),
also the hubs address and port(to which it is attached to) in the QH. The TD's have the
"Split Transaction State" bit in the status byte set to 0 for "Do Start Split":
QueueHead:
-------------
0x00031502
0x1808C000
0x40810000
Overlay:
0x00000000
0x00032000
0x00000001
...
TD1 - 0x32000 (Setup):
--------------------------
0x00033000
0x00034000
0x00080E80
0x00035000
0x00036000
0x00037000
0x00038000
0x00039000
TD2 - 0x33000 (Data):
------------------ ------
0x00034000
0x00034000
0x80080D80
0x00036000
0x00037000
0x00038000
0x00039000
0x0003A000
TD3 - 0x34000 (Handshake):
--------------------------------
0x00000001
0x00000001
0x80000C80
0x00000000
0x00000000
0x00000000
0x00000000
0x00000000
Setup Buffer Content - 0x35000:
------------------------------------
0x01000680
0x00080000
Above is an image of part of the documentation for the split transactions in the USB 2.0 document.
According to the document Start Split transactions can consist of 2,3, or 4 packets depending on transfer
type and direction. Does this mean that the start split token must have its own TD, then making it 4 TD's.
But if I look at the structure of the QH and TD's there is no way to send a SSplit PID token on its own.
I am assuming that it gets sent with the all three TD's?
If I am correct on the above "start-split", would the complete-split look like this:
QueueHead:
-------------
0x00031502
0x1808C000
0x40810000
Overlay:
0x00000000
0x00032000
0x00000001
...
TD1 - 0x32000 (Setup):
--------------------------
0x00033000
0x00033000
0x00080E82
0x00035000
0x00036000
0x00037000
0x00038000
0x00039000
TD2 - 0x33000 (Data):
------------------ ------
0x00000001
0x00000001
0x80080D82
0x00036000
0x00037000
0x00038000
0x00039000
0x0003A000
Setup Buffer Content - 0x35000:
------------------------------------
0x01000680
0x00080000
Thanks in advance for any help.
so my question is what should a split transaction for a "get descriptor"(device descriptor) request look if this is
what the request to a high-speed device looks like:
QueueHead:
-------------
0x00031502
0x1008E000
0x40000000
Overlay:
0x00000000
0x00032000
0x00000001
...
TD1 0x32000 (Setup):
------------------------
0x00033000
0x00034000
0x00080E80
0x00035000
0x00036000
0x00037000
0x00038000
0x00039000
TD2 0x33000 (Data):
-----------------------
0x00034000
0x00034000
0x80080D80
0x00036000
0x00037000
0x00038000
0x00039000
0x0003A000
TD3 0x34000 (Handshake):
------------------------------
0x00000001
0x00000001
0x80000C80
0x00000000
0x00000000
0x00000000
0x00000000
0x00000000
Setup Buffer Content - 0x35000:
----------------------------------
0x01000680
0x00080000
This is what i am assuming a start-split should look like:
I have set the control endpoint flag, appropriate speed of the device i want to talk to(low speed),
also the hubs address and port(to which it is attached to) in the QH. The TD's have the
"Split Transaction State" bit in the status byte set to 0 for "Do Start Split":
QueueHead:
-------------
0x00031502
0x1808C000
0x40810000
Overlay:
0x00000000
0x00032000
0x00000001
...
TD1 - 0x32000 (Setup):
--------------------------
0x00033000
0x00034000
0x00080E80
0x00035000
0x00036000
0x00037000
0x00038000
0x00039000
TD2 - 0x33000 (Data):
------------------ ------
0x00034000
0x00034000
0x80080D80
0x00036000
0x00037000
0x00038000
0x00039000
0x0003A000
TD3 - 0x34000 (Handshake):
--------------------------------
0x00000001
0x00000001
0x80000C80
0x00000000
0x00000000
0x00000000
0x00000000
0x00000000
Setup Buffer Content - 0x35000:
------------------------------------
0x01000680
0x00080000
Above is an image of part of the documentation for the split transactions in the USB 2.0 document.
According to the document Start Split transactions can consist of 2,3, or 4 packets depending on transfer
type and direction. Does this mean that the start split token must have its own TD, then making it 4 TD's.
But if I look at the structure of the QH and TD's there is no way to send a SSplit PID token on its own.
I am assuming that it gets sent with the all three TD's?
If I am correct on the above "start-split", would the complete-split look like this:
QueueHead:
-------------
0x00031502
0x1808C000
0x40810000
Overlay:
0x00000000
0x00032000
0x00000001
...
TD1 - 0x32000 (Setup):
--------------------------
0x00033000
0x00033000
0x00080E82
0x00035000
0x00036000
0x00037000
0x00038000
0x00039000
TD2 - 0x33000 (Data):
------------------ ------
0x00000001
0x00000001
0x80080D82
0x00036000
0x00037000
0x00038000
0x00039000
0x0003A000
Setup Buffer Content - 0x35000:
------------------------------------
0x01000680
0x00080000
Thanks in advance for any help.