]> sigrok.org Git - libsigrokdecode.git/commitdiff
usb_request: Handle CONTROL transfer protocol stalls
authorStefan Brüns <redacted>
Sat, 22 Jul 2017 17:54:59 +0000 (19:54 +0200)
committerStefan Brüns <redacted>
Sat, 22 Jul 2017 17:54:59 +0000 (19:54 +0200)
According to the USB 2.0 spec, 8.5.3.4, a protocol stall condition lasts
until the next SETUP transfer. On reception of the SETUP, adjust the end
sample accordingly, and flush the previous CONTROL transfer.

decoders/usb_request/pd.py

index 5d2d47d3e6f239603ada770674f80b023b031fba..76e015b93d52fcb9a32d040f0cbb184096b5d5fc 100644 (file)
@@ -179,6 +179,14 @@ class Decoder(srd.Decoder):
         request_end = self.handshake in ('ACK', 'STALL', 'timeout')
         ep = self.transaction_ep
         addr = self.transaction_addr
+
+        # Handle protocol STALLs, condition lasts until next SETUP transfer (8.5.3.4)
+        if self.transaction_type == 'SETUP' and (addr, ep) in self.request:
+            request = self.request[(addr,ep)]
+            if request['type'] in ('SETUP IN', 'SETUP OUT'):
+                request['es'] = self.ss_transaction
+                self.handle_request(0, 1)
+
         if not (addr, ep) in self.request:
             self.request[(addr, ep)] = {'setup_data': [], 'data': [],
                 'type': None, 'ss': self.ss_transaction, 'es': None,
@@ -187,6 +195,9 @@ class Decoder(srd.Decoder):
             request_started = 1
         request = self.request[(addr,ep)]
 
+        if request_end:
+            request['handshake'] = self.handshake
+
         # BULK or INTERRUPT transfer
         if request['type'] in (None, 'BULK IN') and self.transaction_type == 'IN':
             request['type'] = 'BULK IN'
@@ -251,7 +262,7 @@ class Decoder(srd.Decoder):
             s += ' ]['
         for b in request['data']:
             s += ' %02X' % b
-        s += ' ] : %s' % self.handshake
+        s += ' ] : %s' % request['handshake']
         return s
 
     def handle_request(self, request_start, request_end):