]> sigrok.org Git - libsigrokdecode.git/blobdiff - decoders/mdio/pd.py
decoders: Add/update tags for each PD.
[libsigrokdecode.git] / decoders / mdio / pd.py
index 98e76e840776c81aa86a84c5943ca0983befe30e..8e970b1db5d2888cb835ad1b4febe4862a229802 100644 (file)
@@ -29,7 +29,7 @@
 import sigrokdecode as srd
 
 class Decoder(srd.Decoder):
-    api_version = 2
+    api_version = 3
     id = 'mdio'
     name = 'MDIO'
     longname = 'Management Data Input/Output'
@@ -37,6 +37,7 @@ class Decoder(srd.Decoder):
     license = 'bsd'
     inputs = ['logic']
     outputs = ['mdio']
+    tags = ['Networking']
     channels = (
         {'id': 'mdc', 'name': 'MDC', 'desc': 'Clock'},
         {'id': 'mdio', 'name': 'MDIO', 'desc': 'Data'},
@@ -62,7 +63,9 @@ class Decoder(srd.Decoder):
     )
 
     def __init__(self):
-        self.last_mdc = 1
+        self.reset()
+
+    def reset(self):
         self.illegal_bus = 0
         self.samplenum = -1
         self.clause45_addr = -1 # Clause 45 is context sensitive.
@@ -77,6 +80,9 @@ class Decoder(srd.Decoder):
         if self.options['show_debug_bits'] == 'yes':
             self.put(ss, es, self.out_ann, [1, ['%d' % (self.bitcount - 1), '%d' % ((self.bitcount - 1) % 10)]])
 
+    def putff(self, data):
+        self.put(self.ss_frame_field, self.samplenum, self.out_ann, data)
+
     def putdata(self):
         self.put(self.ss_frame_field, self.mdiobits[0][2], self.out_ann,
                  [2, ['DATA: %04X' % self.data, 'DATA', 'D']])
@@ -90,7 +96,7 @@ class Decoder(srd.Decoder):
             if self.clause45 and self.clause45_addr != -1:
                 decoded_min += str.format('ADDR: %04X ' % self.clause45_addr)
             elif self.clause45:
-                decoded_min += str.format('ADDR: UKWN ' % self.clause45_addr)
+                decoded_min += str.format('ADDR: UKWN ')
 
             if self.clause45 and self.opcode > 1 \
             or (not self.clause45 and self.opcode):
@@ -194,8 +200,7 @@ class Decoder(srd.Decoder):
                 st = ['ST (Clause 45)', 'ST 45']
             else:
                 st = ['ST (Clause 22)', 'ST 22']
-            self.put(self.ss_frame_field, self.samplenum, self.out_ann,
-                     [2, st + ['ST', 'S']])
+            self.putff([2, st + ['ST', 'S']])
             self.ss_frame_field = self.samplenum
 
             if mdio:
@@ -225,11 +230,9 @@ class Decoder(srd.Decoder):
                     op = ['OP: READ', 'OP: R']
             else:
                 op = ['OP: READ', 'OP: R'] if self.opcode else ['OP: WRITE', 'OP: W']
-            self.put(self.ss_frame_field, self.samplenum, self.out_ann,
-                     [2, op + ['OP', 'O']])
+            self.putff([2, op + ['OP', 'O']])
             if self.op_invalid:
-                self.put(self.ss_frame_field, self.samplenum, self.out_ann,
-                         [4, ['OP %s' % self.op_invalid, 'OP', 'O']])
+                self.putff([4, ['OP %s' % self.op_invalid, 'OP', 'O']])
             self.ss_frame_field = self.samplenum
         self.portad_bits -= 1
         self.portad |= mdio << self.portad_bits
@@ -243,8 +246,7 @@ class Decoder(srd.Decoder):
                 prtad = ['PRTAD: %02d' % self.portad, 'PRT', 'P']
             else:
                 prtad = ['PHYAD: %02d' % self.portad, 'PHY', 'P']
-            self.put(self.ss_frame_field, self.samplenum, self.out_ann,
-                     [2, prtad])
+            self.putff([2, prtad])
             self.ss_frame_field = self.samplenum
         self.devad_bits -= 1
         self.devad |= mdio << self.devad_bits
@@ -258,8 +260,7 @@ class Decoder(srd.Decoder):
                 regad = ['DEVAD: %02d' % self.devad, 'DEV', 'D']
             else:
                 regad = ['REGAD: %02d' % self.devad, 'REG', 'R']
-            self.put(self.ss_frame_field, self.samplenum, self.out_ann,
-                     [2, regad])
+            self.putff([2, regad])
             self.ss_frame_field = self.samplenum
             if mdio != 1 and ((self.clause45 and self.opcode < 2)
             or (not self.clause45 and self.opcode == 0)):
@@ -275,11 +276,9 @@ class Decoder(srd.Decoder):
     def state_DATA(self, mdio):
         if self.data == -1:
             self.data = 0
-            self.put(self.ss_frame_field, self.samplenum, self.out_ann,
-                     [2, ['TA', 'T']])
+            self.putff([2, ['TA', 'T']])
             if self.ta_invalid:
-                self.put(self.ss_frame_field, self.samplenum, self.out_ann,
-                         [4, ['TA%s' % self.ta_invalid, 'TA', 'T']])
+                self.putff([4, ['TA%s' % self.ta_invalid, 'TA', 'T']])
             self.ss_frame_field = self.samplenum
         self.data_bits -= 1
         self.data |= mdio << self.data_bits
@@ -320,14 +319,8 @@ class Decoder(srd.Decoder):
 
         self.process_state(self.state, mdio)
 
-    def decode(self, ss, es, data):
-        for (self.samplenum, pins) in data:
-            # Ignore identical samples early on (for performance reasons).
-            if self.last_mdc == pins[0]:
-                continue
-            self.last_mdc = pins[0]
-            if pins[0] == 0: # Check for rising edge.
-                continue
-
-            # Found the correct clock edge, now get/handle the bit(s).
+    def decode(self):
+        while True:
+            # Process pin state upon rising MDC edge.
+            pins = self.wait({0: 'r'})
             self.handle_bit(pins[1])