X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=decoders%2Fi2c%2Fi2c.py;h=816fd790baa33fb4ca0d2091390911ad4b91596a;hb=7a1712c4fd07f64222079acd5ec3fa3348a5cb15;hp=16bd6c36c9c7e9866f2cb51aaf89e59b5bdb33f0;hpb=a2c2afd9357fab233a4f09531618faa81d54d4d9;p=libsigrokdecode.git diff --git a/decoders/i2c/i2c.py b/decoders/i2c/i2c.py index 16bd6c3..816fd79 100644 --- a/decoders/i2c/i2c.py +++ b/decoders/i2c/i2c.py @@ -129,6 +129,7 @@ class Decoder(srd.Decoder): {'id': 'scl', 'name': 'SCL', 'desc': 'Serial clock line'}, {'id': 'sda', 'name': 'SDA', 'desc': 'Serial data line'}, ] + extra_probes = [] options = { 'addressing': ['Slave addressing (in bits)', 7], # 7 or 10 } @@ -144,19 +145,16 @@ class Decoder(srd.Decoder): ] def __init__(self, **kwargs): - self.samplecnt = 0 + self.startsample = -1 + self.samplenum = None self.bitcount = 0 self.databyte = 0 self.wr = -1 - self.startsample = -1 self.is_repeat_start = 0 self.state = FIND_START self.oldscl = None self.oldsda = None - # Set protocol decoder option defaults. - self.addressing = Decoder.options['addressing'][1] - def start(self, metadata): self.out_proto = self.add(srd.OUTPUT_PROTO, 'i2c') self.out_ann = self.add(srd.OUTPUT_ANN, 'i2c') @@ -183,8 +181,9 @@ class Decoder(srd.Decoder): return False def found_start(self, scl, sda): - cmd = 'START REPEAT' if (self.is_repeat_start == 1) else 'START' + self.startsample = self.samplenum + cmd = 'START REPEAT' if (self.is_repeat_start == 1) else 'START' self.put(self.out_proto, [cmd, None, None]) self.put(self.out_ann, [ANN_SHIFTED, [protocol[cmd][0]]]) self.put(self.out_ann, [ANN_SHIFTED_SHORT, [protocol[cmd][1]]]) @@ -194,19 +193,17 @@ class Decoder(srd.Decoder): self.is_repeat_start = 1 self.wr = -1 + # Gather 8 bits of data plus the ACK/NACK bit. def found_address_or_data(self, scl, sda): - # Gather 8 bits of data plus the ACK/NACK bit. - - if self.startsample == -1: - # TODO: Should be samplenum, as received from the feed. - self.startsample = self.samplecnt - self.bitcount += 1 - # Address and data are transmitted MSB-first. self.databyte <<= 1 self.databyte |= sda + if self.bitcount == 0: + self.startsample = self.samplenum + # Return if we haven't collected all 8 + 1 bits, yet. + self.bitcount += 1 if self.bitcount != 9: return @@ -256,6 +253,8 @@ class Decoder(srd.Decoder): pass def found_stop(self, scl, sda): + self.startsample = self.samplenum + self.put(self.out_proto, ['STOP', None, None]) self.put(self.out_ann, [ANN_SHIFTED, [protocol['STOP'][0]]]) self.put(self.out_ann, [ANN_SHIFTED_SHORT, [protocol['STOP'][1]]]) @@ -266,12 +265,11 @@ class Decoder(srd.Decoder): def put(self, output_id, data): # Inject sample range into the call up to sigrok. - # TODO: 0-0 sample range for now. - super(Decoder, self).put(0, 0, output_id, data) + super(Decoder, self).put(self.startsample, self.samplenum, output_id, data) def decode(self, ss, es, data): for samplenum, (scl, sda) in data: - self.samplecnt += 1 + self.samplenum = samplenum # First sample: Save SCL/SDA value. if self.oldscl == None: @@ -296,8 +294,7 @@ class Decoder(srd.Decoder): elif self.is_stop_condition(scl, sda): self.found_stop(scl, sda) else: - # TODO: Error? - pass + raise Exception('Invalid state %d' % self.STATE) # Save current SDA/SCL values for the next round. self.oldscl = scl