]> sigrok.org Git - libsigrokdecode.git/blobdiff - decoders/usb/usb.py
srd: PDs: Kill obsolete 'longdesc' entries.
[libsigrokdecode.git] / decoders / usb / usb.py
index 073fe0114d2824116ec6ff25fb5af60fd6c3aa99..f024f49d233fffd314053b7657aedf79d96a880f 100644 (file)
 ## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
 ##
 
-#
-# USB Full-speed protocol decoder
-#
-# Full-speed USB signalling consists of two signal lines, both driven at 3.3V
-# logic levels. The signals are DP (D+) and DM (D-), and normally operate in
-# differential mode.
-# The state where DP=1,DM=0 is J, the state DP=0,DM=1 is K.
-# A state SE0 is defined where DP=DM=0. This common mode signal is used to
-# signal a reset or end of packet.
-#
-# Data transmitted on the USB is encoded with NRZI. A transition from J to K
-# or vice-versa indicates a logic 0, while no transition indicates a logic 1.
-# If 6 ones are transmitted consecutively, a zero is inserted to force a
-# transition. This is known as bit stuffing. Data is transferred at a rate
-# of 12Mbit/s. The SE0 transmitted to signal an end-of-packet is two bit
-# intervals long.
-#
-# Details:
-# https://en.wikipedia.org/wiki/USB
-# http://www.usb.org/developers/docs/
-#
+# USB (full-speed) protocol decoder
 
 import sigrokdecode as srd
 
-# States
-SE0, J, K, SE1 = 0, 1, 2, 3
-
-# ...
+# Symbols (used as states of our state machine, too)
 syms = {
-        (0, 0): SE0,
-        (1, 0): J,
-        (0, 1): K,
-        (1, 1): SE1,
+        (0, 0): 'SE0',
+        (1, 0): 'J',
+        (0, 1): 'K',
+        (1, 1): 'SE1',
 }
 
 # ...
@@ -105,11 +82,11 @@ def packet_decode(packet):
     return pid + ' ' + data
 
 class Decoder(srd.Decoder):
+    api_version = 1
     id = 'usb'
     name = 'USB'
     longname = 'Universal Serial Bus'
     desc = 'Universal Serial Bus'
-    longdesc = '...longdesc...'
     license = 'gplv2+'
     inputs = ['logic']
     outputs = ['usb']
@@ -117,6 +94,7 @@ class Decoder(srd.Decoder):
         {'id': 'dp', 'name': 'D+', 'desc': 'USB D+ signal'},
         {'id': 'dm', 'name': 'D-', 'desc': 'USB D- signal'},
     ]
+    optional_probes = []
     options = {}
     annotations = [
         ['TODO', 'TODO']
@@ -126,23 +104,24 @@ class Decoder(srd.Decoder):
         pass
 
     def start(self, metadata):
-        self.rate = metadata['samplerate']
+        self.samplerate = metadata['samplerate']
 
         # self.out_proto = self.add(srd.OUTPUT_PROTO, 'usb')
         self.out_ann = self.add(srd.OUTPUT_ANN, 'usb')
 
-        if self.rate < 48000000:
-            raise Exception('Sample rate not sufficient for USB decoding')
+        if self.samplerate < 48000000:
+            raise Exception('Samplerate (%d) not sufficient for USB '
+                            'decoding, need at least 48MHz' % self.samplerate)
 
         # Initialise decoder state.
-        self.sym = J
+        self.sym = 'J'
         self.scount = 0
         self.packet = ''
 
-    def decode(self, ss, es, data):
+    def report(self):
+        pass
 
-        # FIXME
-        # for (samplenum, (dp, dm, x, y, z, a)) in data:
+    def decode(self, ss, es, data):
         for (samplenum, (dm, dp)) in data:
 
             self.scount += 1
@@ -161,12 +140,12 @@ class Decoder(srd.Decoder):
                 continue
 
             # How many bits since the last transition?
-            if self.packet != '' or self.sym != J:
-                bitcount = int((self.scount - 1) * 12000000 / self.rate)
+            if self.packet != '' or self.sym != 'J':
+                bitcount = int((self.scount - 1) * 12000000 / self.samplerate)
             else:
                 bitcount = 0
 
-            if self.sym == SE0:
+            if self.sym == 'SE0':
                 if bitcount == 1:
                     # End-Of-Packet (EOP)
                     self.put(0, 0, self.out_ann,
@@ -183,7 +162,7 @@ class Decoder(srd.Decoder):
             self.packet += '1' * bitcount
 
             # Handle bit stuffing.
-            if bitcount < 6 and sym != SE0:
+            if bitcount < 6 and sym != 'SE0':
                 self.packet += '0'
             elif bitcount > 6:
                 self.put(0, 0, self.out_ann, [0, ['BIT STUFF ERROR']])