X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=decoders%2Fi2c.py;h=f0a95b79fd334b1dc6d9e2ca875b0dee988694fe;hb=d0a0ed032e0120140a28e93ac42753786bf0087b;hp=15ef9c617dfb1526f6baf17914d71f2eca578cd5;hpb=bf1c3f4db0ffbc05f29f81541c551c691ccd2ba7;p=libsigrokdecode.git diff --git a/decoders/i2c.py b/decoders/i2c.py index 15ef9c6..f0a95b7 100644 --- a/decoders/i2c.py +++ b/decoders/i2c.py @@ -69,28 +69,26 @@ # TODO: Handle multiple different I2C devices on same bus # -> we need to decode multiple protocols at the same time. -# -# I2C protocol output format: -# -# The protocol output consists of a (Python) list of I2C "packets", each of -# which is of the form -# -# [, , ] -# -# is one of: -# - 'START' (START condition) -# - 'START_REPEAT' (Repeated START) -# - 'ADDRESS_READ' (Slave address, read) -# - 'ADDRESS_WRITE' (Slave address, write) -# - 'DATA_READ' (Data, read) -# - 'DATA_WRITE' (Data, write) -# - 'STOP' (STOP condition) -# -# is the data or address byte associated with the ADDRESS_* and DATA_* -# command. For START, START_REPEAT and STOP, this is None. -# -# is either 'ACK' or 'NACK', but may also be None. -# +''' +Protocol output format: + +I2C packet: +[, , ] + + is one of: + - 'START' (START condition) + - 'START REPEAT' (Repeated START) + - 'ADDRESS READ' (Address, read) + - 'ADDRESS WRITE' (Address, write) + - 'DATA READ' (Data, read) + - 'DATA WRITE' (Data, write) + - 'STOP' (STOP condition) + + is the data or address byte associated with the 'ADDRESS*' and 'DATA*' +command. For 'START', 'START REPEAT' and 'STOP', this is None. + + is either 'ACK' or 'NACK', but may also be None. +''' import sigrokdecode as srd @@ -102,14 +100,14 @@ ANN_RAW = 2 # Values are verbose and short annotation, respectively. protocol = { 'START': ['START', 'S'], - 'START_REPEAT': ['START REPEAT', 'Sr'], + 'START REPEAT': ['START REPEAT', 'Sr'], 'STOP': ['STOP', 'P'], 'ACK': ['ACK', 'A'], 'NACK': ['NACK', 'N'], - 'ADDRESS_READ': ['ADDRESS READ', 'AR'], - 'ADDRESS_WRITE': ['ADDRESS WRITE', 'AW'], - 'DATA_READ': ['DATA READ', 'DR'], - 'DATA_WRITE': ['DATA WRITE', 'DW'], + 'ADDRESS READ': ['ADDRESS READ', 'AR'], + 'ADDRESS WRITE': ['ADDRESS WRITE', 'AW'], + 'DATA READ': ['DATA READ', 'DR'], + 'DATA WRITE': ['DATA WRITE', 'DW'], } # States @@ -120,11 +118,9 @@ FIND_DATA = 2 class Decoder(srd.Decoder): id = 'i2c' name = 'I2C' - longname = 'Inter-Integrated Circuit (I2C) bus' + longname = 'Inter-Integrated Circuit' desc = 'I2C is a two-wire, multi-master, serial bus.' longdesc = '...' - author = 'Uwe Hermann' - email = 'uwe@hermann-uwe.de' license = 'gplv2+' inputs = ['logic'] outputs = ['i2c'] @@ -133,7 +129,7 @@ class Decoder(srd.Decoder): {'id': 'sda', 'name': 'SDA', 'desc': 'Serial data line'}, ] options = { - 'address-space': ['Address space (in bits)', 7], + 'addressing': ['Slave addressing (in bits)', 7], # 7 or 10 } annotations = [ # ANN_SHIFTED @@ -157,6 +153,9 @@ class Decoder(srd.Decoder): 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,7 +182,7 @@ class Decoder(srd.Decoder): return False def found_start(self, scl, sda): - cmd = 'START_REPEAT' if (self.is_repeat_start == 1) else 'START' + 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]]]) @@ -231,25 +230,19 @@ class Decoder(srd.Decoder): ack_bit = 'NACK' if (sda == 1) else 'ACK' if self.state == FIND_ADDRESS and self.wr == 1: - cmd = 'ADDRESS_WRITE' + cmd = 'ADDRESS WRITE' elif self.state == FIND_ADDRESS and self.wr == 0: - cmd = 'ADDRESS_READ' + cmd = 'ADDRESS READ' elif self.state == FIND_DATA and self.wr == 1: - cmd = 'DATA_WRITE' + cmd = 'DATA WRITE' elif self.state == FIND_DATA and self.wr == 0: - cmd = 'DATA_READ' + cmd = 'DATA READ' self.put(self.out_proto, [cmd, d, ack_bit]) - self.put(self.out_ann, [ANN_SHIFTED, [ - '%s' % protocol[cmd][0], - '0x%02x' % d, - '%s' % protocol[ack_bit][0]] - ]) - self.put(self.out_ann, [ANN_SHIFTED_SHORT, [ - '%s' % protocol[cmd][1], - '0x%02x' % d, - '%s' % protocol[ack_bit][1]] - ]) + self.put(self.out_ann, [ANN_SHIFTED, + [protocol[cmd][0], '0x%02x' % d, protocol[ack_bit][0]]]) + self.put(self.out_ann, [ANN_SHIFTED_SHORT, + [protocol[cmd][1], '0x%02x' % d, protocol[ack_bit][1]]]) self.bitcount = self.databyte = 0 self.startsample = -1 @@ -275,7 +268,7 @@ class Decoder(srd.Decoder): # TODO: 0-0 sample range for now. super(Decoder, self).put(0, 0, output_id, data) - def decode(self, timeoffset, duration, data): + def decode(self, ss, es, data): for samplenum, (scl, sda) in data: self.samplecnt += 1