X-Git-Url: https://sigrok.org/gitweb/?p=libsigrokdecode.git;a=blobdiff_plain;f=decoders%2Fusb_signalling%2Fpd.py;h=4bf74b6ddaab6b93b9f4dec619da2de35a85063b;hp=583984068d6735dce4f802e5f08e36644933ba21;hb=7dc75721f38ce781db1b8d512d626024acf35b59;hpb=50bd5d259677faf87bb3408e111d0e833d7ba9b4 diff --git a/decoders/usb_signalling/pd.py b/decoders/usb_signalling/pd.py index 5839840..4bf74b6 100644 --- a/decoders/usb_signalling/pd.py +++ b/decoders/usb_signalling/pd.py @@ -2,7 +2,7 @@ ## 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 @@ -25,19 +25,26 @@ import sigrokdecode as srd # Low-/full-speed symbols (used as states of our state machine, too). # Note: Low-speed J and K are inverted compared to the full-speed J and K! -symbols_ls = { +symbols = { + 'low-speed': { # (, ): (0, 0): 'SE0', (1, 0): 'K', (0, 1): 'J', (1, 1): 'SE1', -} -symbols_fs = { + }, + 'full-speed': { # (, ): (0, 0): 'SE0', (1, 0): 'J', (0, 1): 'K', (1, 1): 'SE1', + }, +} + +bitrates = { + 'low-speed': 1500000, # 1.5Mb/s (+/- 1.5%) + 'full-speed': 12000000, # 12Mb/s (+/- 0.25%) } class Decoder(srd.Decoder): @@ -67,16 +74,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: @@ -90,13 +106,10 @@ class Decoder(srd.Decoder): continue self.oldpins, (dp, dm) = pins, pins - if self.options['signalling'] == 'low-speed': - sym = symbols_ls[dp, dm] - elif self.options['signalling'] == 'full-speed': - sym = symbols_fs[dp, dm] + sym = symbols[self.options['signalling']][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 +118,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 +152,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