X-Git-Url: https://sigrok.org/gitweb/?p=libsigrokdecode.git;a=blobdiff_plain;f=decoders%2Fusb_power_delivery%2Fpd.py;h=58e4e1722711c3a62144265fae4e9ee366bbad83;hp=8baf898dc4c02f2a96425c20d5daf4756ff38b99;hb=df167c0f8ea1b28595e64894a555236c29c3c3de;hpb=4083a3795ea1858232a6f50ce3ba863e21d8896d diff --git a/decoders/usb_power_delivery/pd.py b/decoders/usb_power_delivery/pd.py index 8baf898..58e4e17 100644 --- a/decoders/usb_power_delivery/pd.py +++ b/decoders/usb_power_delivery/pd.py @@ -187,7 +187,6 @@ VDM_CMDS = { } VDM_ACK = ['REQ', 'ACK', 'NAK', 'BSY'] -STORED_PDOS = {} class SamplerateError(Exception): pass @@ -202,7 +201,10 @@ class Decoder(srd.Decoder): inputs = ['logic'] outputs = ['usb_pd'] channels = ( - {'id': 'cc', 'name': 'CC', 'desc': 'Control channel'}, + {'id': 'cc1', 'name': 'CC1', 'desc': 'Configuration Channel 1'}, + ) + optional_channels = ( + {'id': 'cc2', 'name': 'CC2', 'desc': 'Configuration Channel 2'}, ) options = ( {'id': 'fulltext', 'desc': 'full text decoding of the packet', @@ -235,15 +237,21 @@ class Decoder(srd.Decoder): ('raw-data', 'RAW binary data'), ) + stored_pdos = {} + + def get_request(self, rdo): pos = (rdo >> 28) & 7 - op_ma = ((rdo >> 10) & 0x3ff) * 10 - max_ma = (rdo & 0x3ff) * 10 + op_ma = ((rdo >> 10) & 0x3ff) * 0.01 + max_ma = (rdo & 0x3ff) * 0.01 flags = '' for f in sorted(RDO_FLAGS.keys(), reverse = True): if rdo & f: flags += ' [' + RDO_FLAGS[f] + ']' - return '(PDO #%d: %s) %gA (operating) / %gA (max)%s' % (pos, STORED_PDOS[pos], op_ma/1000.0, max_ma/1000.0, flags) + if pos in self.stored_pdos.keys(): + return '(PDO #%d: %s) %gA (operating) / %gA (max)%s' % (pos, self.stored_pdos[pos], op_ma, max_ma, flags) + else: + return '(PDO #%d) %gA (operating) / %gA (max)%s' % (pos, op_ma, max_ma, flags) def get_source_sink_cap(self, pdo, idx): t1 = (pdo >> 30) & 3 @@ -252,29 +260,36 @@ class Decoder(srd.Decoder): mv = ((pdo >> 10) & 0x3ff) * 0.05 ma = ((pdo >> 0) & 0x3ff) * 0.01 p = '%gV %gA (%gW)' % (mv, ma, mv*ma) - STORED_PDOS[idx] = '%s %gV' % (t_name, mv) + self.stored_pdos[idx] = '%s %gV' % (t_name, mv) elif t1 == 1: t_name = 'Battery' minv = ((pdo >> 10) & 0x3ff) * 0.05 maxv = ((pdo >> 20) & 0x3ff) * 0.05 mw = ((pdo >> 0) & 0x3ff) * 0.25 p = '%g/%gV %gW' % (minv, maxv, mw) - STORED_PDOS[idx] = '%s %g/%gV' % (t_name, minv, maxv) + self.stored_pdos[idx] = '%s %g/%gV' % (t_name, minv, maxv) elif t1 == 2: t_name = 'Variable' minv = ((pdo >> 10) & 0x3ff) * 0.05 maxv = ((pdo >> 20) & 0x3ff) * 0.05 ma = ((pdo >> 0) & 0x3ff) * 0.01 p = '%g/%gV %gA' % (minv, maxv, ma) - STORED_PDOS[idx] = '%s %g/%gV' % (t_name, minv, maxv) + self.stored_pdos[idx] = '%s %g/%gV' % (t_name, minv, maxv) elif t1 == 3: t2 = (pdo >> 28) & 3 if t2 == 0: - t_name = 'Programmable' - p = 'TODO: PPS support' + t_name = 'Programmable|PPS' + minv = ((pdo >> 8) & 0xff) * 0.1 + maxv = ((pdo >> 17) & 0xff) * 0.1 + ma = ((pdo >> 0) & 0xff) * 0.05 + p = '%g/%gV %gA' % (minv, maxv, ma) + if (pdo >> 27) & 0x1: + p += ' [limited]' + self.stored_pdos[idx] = '%s %g/%gV' % (t_name, minv, maxv) else: t_name = 'Reserved APDO: '+bin(t2) - p = '' + p = '[raw: %s]' % (bin(pdo)) + self.stored_pdos[idx] = '%s %s' % (t_name, p) flags = '' for f in sorted(PDO_FLAGS.keys(), reverse = True): if pdo & f: @@ -450,6 +465,7 @@ class Decoder(srd.Decoder): self.bad = [] self.half_one = False self.start_one = 0 + self.stored_pdos = {} def metadata(self, key, value): if key == srd.SRD_CONF_SAMPLERATE: @@ -529,7 +545,7 @@ class Decoder(srd.Decoder): if not self.samplerate: raise SamplerateError('Cannot decode without samplerate.') while True: - self.wait({0: 'e'}) + pins = self.wait([{0: 'e'}, {1: 'e'}, {'skip': int(self.samplerate/1e3)}]) # First sample of the packet, just record the start date if not self.startsample: