X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=decoders%2Fusb_request%2Fpd.py;h=a4e357739dc44e1c9399d4f7873c1439c00906ee;hb=92b7b49f6964f57a7d6fc4473645c993cfa4ba52;hp=060929b665d46993da7fd098b1236fa649e2f86d;hpb=bd0e7d2e71e7a05b2bb0686a86a75b8fcb92fd54;p=libsigrokdecode.git diff --git a/decoders/usb_request/pd.py b/decoders/usb_request/pd.py index 060929b..a4e3577 100644 --- a/decoders/usb_request/pd.py +++ b/decoders/usb_request/pd.py @@ -137,8 +137,7 @@ class Decoder(srd.Decoder): ) def __init__(self): - self.samplerate = 8e6 # None - self.secs_per_sample = float(1) / float(self.samplerate) + self.samplerate = None self.request = {} self.request_id = 0 self.transaction_state = 'IDLE' @@ -152,7 +151,7 @@ class Decoder(srd.Decoder): self.put(ss, es, self.out_ann, data) def putb(self, ts, data): - self.put(ts, ts, self.out_bin, data) + self.put(ts, ts, self.out_binary, data) def pcap_global_header(self): # See https://wiki.wireshark.org/Development/LibpcapFileFormat. @@ -173,12 +172,12 @@ class Decoder(srd.Decoder): self.secs_per_sample = float(1) / float(self.samplerate) def start(self): - self.out_bin = self.register(srd.OUTPUT_BINARY) + self.out_binary = self.register(srd.OUTPUT_BINARY) self.out_ann = self.register(srd.OUTPUT_ANN) 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: @@ -242,7 +241,7 @@ class Decoder(srd.Decoder): def write_pcap_header(self): if not self.wrote_pcap_header: - self.put(0, 0, self.out_bin, (0, self.pcap_global_header())) + self.put(0, 0, self.out_binary, [0, self.pcap_global_header()]) self.wrote_pcap_header = True def request_summary(self, request): @@ -270,8 +269,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 +287,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 +305,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 +324,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 +350,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)]])