X-Git-Url: https://sigrok.org/gitweb/?p=libsigrokdecode.git;a=blobdiff_plain;f=decoders%2Fusb_signalling%2Fpd.py;h=70ada3767af7c10fd140f78246c416bf709a4d7c;hp=3272cbf713c19abbe07cf908c1a6b706f5d86b94;hb=5bb55598a1868113513f737b2714bcd6e48aa9b3;hpb=24c74fd30fb161837c5f8b01baf3c0fe2dfa4ed5 diff --git a/decoders/usb_signalling/pd.py b/decoders/usb_signalling/pd.py index 3272cbf..70ada37 100644 --- a/decoders/usb_signalling/pd.py +++ b/decoders/usb_signalling/pd.py @@ -1,8 +1,8 @@ ## -## This file is part of the sigrok project. +## This file is part of the libsigrokdecode project. ## ## Copyright (C) 2011 Gareth McMullin -## Copyright (C) 2012 Uwe Hermann +## Copyright (C) 2012-2013 Uwe Hermann ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by @@ -40,12 +40,17 @@ symbols_fs = { (1, 1): 'SE1', } +bitrates = { + 'low-speed': 1500000, # 1.5Mb/s (+/- 1.5%) + 'full-speed': 12000000, # 12Mb/s (+/- 0.25%) +} + class Decoder(srd.Decoder): api_version = 1 id = 'usb_signalling' name = 'USB signalling' longname = 'Universal Serial Bus (LS/FS) signalling' - desc = 'USB 1.x (low-speed and full-speed) signalling protocol.' + desc = 'USB (low-speed and full-speed) signalling protocol.' license = 'gplv2+' inputs = ['logic'] outputs = ['usb_signalling'] @@ -67,16 +72,25 @@ class Decoder(srd.Decoder): self.scount = 0 self.packet = '' self.syms = [] + self.bitrate = None + self.bitwidth = None self.oldpins = None def start(self, metadata): - self.samplerate = metadata['samplerate'] self.out_proto = self.add(srd.OUTPUT_PROTO, 'usb_signalling') self.out_ann = self.add(srd.OUTPUT_ANN, 'usb_signalling') + self.bitrate = bitrates[self.options['signalling']] + self.bitwidth = float(metadata['samplerate']) / float(self.bitrate) def report(self): pass + def putp(self, data): + self.put(self.samplenum, self.samplenum, self.out_proto, data) + + def putx(self, data): + self.put(self.samplenum, self.samplenum, self.out_ann, data) + def decode(self, ss, es, data): for (self.samplenum, pins) in data: @@ -95,8 +109,8 @@ class Decoder(srd.Decoder): elif self.options['signalling'] == 'full-speed': sym = symbols_fs[dp, dm] - self.put(0, 0, self.out_ann, [0, [sym]]) - self.put(0, 0, self.out_proto, ['SYM', sym]) + self.putx([0, [sym]]) + self.putp(['SYM', sym]) # Wait for a symbol change (i.e., change in D+/D- lines). if sym == self.sym: @@ -105,33 +119,28 @@ class Decoder(srd.Decoder): ## # Debug code: ## self.syms.append(sym + ' ') ## if len(self.syms) == 16: - ## self.put(0, 0, self.out_ann, [0, [''.join(self.syms)]]) + ## self.putx([0, [''.join(self.syms)]]) ## self.syms = [] # continue # How many bits since the last transition? if self.packet != '' or self.sym != 'J': - if self.options['signalling'] == 'low-speed': - bitrate = 1500000 # 1.5Mb/s (+/- 1.5%) - elif self.options['signalling'] == 'full-speed': - bitrate = 12000000 # 12Mb/s (+/- 0.25%) - bitcount = int((self.scount - 1) * bitrate / self.samplerate) + bitcount = int((self.scount - 1) / self.bitwidth) else: bitcount = 0 if self.sym == 'SE0': if bitcount == 1: # End-Of-Packet (EOP) - # self.put(0, 0, self.out_ann, - # [0, [packet_decode(self.packet), self.packet]]) + # self.putx([0, [packet_decode(self.packet), self.packet]]) if self.packet != '': # FIXME? - self.put(0, 0, self.out_ann, [0, ['PACKET: %s' % self.packet]]) - self.put(0, 0, self.out_proto, ['PACKET', self.packet]) + self.putx([0, ['PACKET: %s' % self.packet]]) + self.putp(['PACKET', self.packet]) else: # Longer than EOP, assume reset. - self.put(0, 0, self.out_ann, [0, ['RESET']]) - self.put(0, 0, self.out_proto, ['RESET', None]) - # self.put(0, 0, self.out_ann, [0, [self.packet]]) + self.putx([0, ['RESET']]) + self.putp(['RESET', None]) + # self.putx([0, [self.packet]]) self.scount = 0 self.sym = sym self.packet = '' @@ -144,8 +153,8 @@ class Decoder(srd.Decoder): if bitcount < 6 and sym != 'SE0': self.packet += '0' elif bitcount > 6: - self.put(0, 0, self.out_ann, [0, ['BIT STUFF ERROR']]) - self.put(0, 0, self.out_proto, ['BIT STUFF ERROR', None]) + self.putx([0, ['BIT STUFF ERROR']]) + self.putp(['BIT STUFF ERROR', None]) self.scount = 0 self.sym = sym