]> sigrok.org Git - libsigrokdecode.git/commitdiff
usb_request: Fix some decoding errors
authorStefan Brüns <redacted>
Mon, 17 Jun 2019 17:51:29 +0000 (19:51 +0200)
committerStefan Brüns <redacted>
Mon, 17 Jun 2019 17:51:29 +0000 (19:51 +0200)
Append OUT data only if it has been ACKed. OUT transfers (BULK OUT or
CONTROL transfer DATA stage) are typically NACKed to create backpressure.

Always keep IN and OUT transfers separate. On the physical layer, the
endpoint number only uses 4 bits, and IN and OUT use separate tokens.
In case the transfer is an IN transfer, set the high bit as used in the
endpoint descriptors (i.e. 0x81 is IN enpoint 1, 0x01 is OUT endpoint 1).

decoders/usb_request/pd.py

index 49b0b3501dcc272a315375e9d185a01d4ee60941..25ee4c5878629f748b5ee9137ff2698ff769e694 100644 (file)
@@ -211,7 +211,8 @@ class Decoder(srd.Decoder):
             self.handle_request(request_started, request_end)
         elif request['type'] in (None, 'BULK OUT') and self.transaction_type == 'OUT':
             request['type'] = 'BULK OUT'
             self.handle_request(request_started, request_end)
         elif request['type'] in (None, 'BULK OUT') and self.transaction_type == 'OUT':
             request['type'] = 'BULK OUT'
-            request['data'] += self.transaction_data
+            if self.handshake == 'ACK':
+                request['data'] += self.transaction_data
             self.handle_request(request_started, request_end)
 
         # CONTROL, SETUP stage
             self.handle_request(request_started, request_end)
 
         # CONTROL, SETUP stage
@@ -231,7 +232,8 @@ class Decoder(srd.Decoder):
             request['data'] += self.transaction_data
 
         elif request['type'] == 'SETUP OUT' and self.transaction_type == 'OUT':
             request['data'] += self.transaction_data
 
         elif request['type'] == 'SETUP OUT' and self.transaction_type == 'OUT':
-            request['data'] += self.transaction_data
+            if self.handshake == 'ACK':
+                request['data'] += self.transaction_data
             if request['wLength'] == len(request['data']):
                 self.handle_request(1, 0)
 
             if request['wLength'] == len(request['data']):
                 self.handle_request(1, 0)
 
@@ -339,6 +341,8 @@ class Decoder(srd.Decoder):
             self.es_transaction = es
             self.transaction_state = 'TOKEN RECEIVED'
             self.transaction_ep = ep
             self.es_transaction = es
             self.transaction_state = 'TOKEN RECEIVED'
             self.transaction_ep = ep
+            if ep > 0 and pname == 'IN':
+                self.transaction_ep = ep + 0x80
             self.transaction_addr = addr
             self.transaction_type = pname # IN OUT SETUP
 
             self.transaction_addr = addr
             self.transaction_type = pname # IN OUT SETUP