]> sigrok.org Git - libsigrokdecode.git/blobdiff - decoders/usb_request/pd.py
usb*: Minor cosmetics.
[libsigrokdecode.git] / decoders / usb_request / pd.py
index 060929b665d46993da7fd098b1236fa649e2f86d..61dedb16ad1ee5c56fd7174f520f28a7ce95a8cd 100644 (file)
@@ -178,7 +178,7 @@ class Decoder(srd.Decoder):
 
     def handle_transfer(self):
         request_started = 0
-        request_end = self.handshake in ('ACK', 'STALL')
+        request_end = self.handshake in ('ACK', 'STALL', 'timeout')
         ep = self.transaction_ep
         addr = self.transaction_addr
         if not (addr, ep) in self.request:
@@ -270,8 +270,8 @@ class Decoder(srd.Decoder):
             # Issue PCAP 'SUBMIT' packet.
             ts = self.ts_from_samplenum(ss)
             pkt = pcap_usb_pkt(request, ts, True)
-            self.putb(ss, (0, pkt.record_header()))
-            self.putb(ss, (0, pkt.packet()))
+            self.putb(ss, [0, pkt.record_header()])
+            self.putb(ss, [0, pkt.packet()])
 
         if request_end == 1:
             # Write annotation.
@@ -288,8 +288,8 @@ class Decoder(srd.Decoder):
             # Issue PCAP 'COMPLETE' packet.
             ts = self.ts_from_samplenum(es)
             pkt = pcap_usb_pkt(request, ts, False)
-            self.putb(ss, (0, pkt.record_header()))
-            self.putb(ss, (0, pkt.packet()))
+            self.putb(ss, [0, pkt.record_header()])
+            self.putb(ss, [0, pkt.packet()])
             del self.request[(addr, ep)]
 
     def decode(self, ss, es, data):
@@ -306,6 +306,17 @@ class Decoder(srd.Decoder):
         if pcategory == 'TOKEN':
             if pname == 'SOF':
                 return
+            if self.transaction_state == 'TOKEN RECEIVED':
+                transaction_timeout = self.transaction_es
+                # Token length is 35 bits, timeout is 16..18 bit times
+                # (USB 2.0 7.1.19.1).
+                transaction_timeout += int((self.transaction_es - self.transaction_ss) / 2)
+                if ss > transaction_timeout:
+                    self.transaction_es = transaction_timeout
+                    self.handshake = 'timeout'
+                    self.handle_transfer()
+                    self.transaction_state = 'IDLE'
+
             if self.transaction_state != 'IDLE':
                 self.putr(ss, es, [4, ['ERR: received %s token in state %s' %
                     (pname, self.transaction_state)]])
@@ -314,6 +325,7 @@ class Decoder(srd.Decoder):
             sync, pid, addr, ep, crc5 = pinfo
             self.transaction_data = []
             self.transaction_ss = ss
+            self.transaction_es = es
             self.transaction_state = 'TOKEN RECEIVED'
             self.transaction_ep = ep
             self.transaction_addr = addr
@@ -339,6 +351,9 @@ class Decoder(srd.Decoder):
             self.transaction_es = es
             self.handle_transfer()
 
+        elif pname == 'PRE':
+            return
+
         else:
             self.putr(ss, es, [4, ['ERR: received unhandled %s token in state %s' %
                 (pname, self.transaction_state)]])