import sigrokdecode as srd
-'''
-OUTPUT_PYTHON format:
-
-Packet:
-[<ptype>, <pdata>]
-
-<ptype>:
- - 'RESET' (Reset/Abort condition)
- - 'ATR' (ATR data from card)
- - 'CMD' (Command from reader)
- - 'DATA' (Data from card)
-
-<pdata> is the data to/from the card
-For 'RESET' <pdata> is None.
-'''
+class Pin:
+ RST, CLK, IO, = range(3)
# CMD: [annotation-type-index, long annotation, short annotation]
proto = {
api_version = 3
id = 'sle44xx'
name = 'SLE 44xx'
- longname = 'SLE44xx protocol'
+ longname = 'SLE44xx memory card'
desc = 'SLE 4418/28/32/42 memory card serial protocol'
license = 'gplv2+'
inputs = ['logic']
- outputs = ['sle44xx']
+ outputs = []
tags = ['Memory']
channels = (
{'id': 'rst', 'name': 'RST', 'desc': 'Reset line'},
self.samplerate = value
def start(self):
- self.out_python = self.register(srd.OUTPUT_PYTHON)
self.out_ann = self.register(srd.OUTPUT_ANN)
self.out_binary = self.register(srd.OUTPUT_BINARY)
def putx(self, data):
self.put(self.ss, self.es, self.out_ann, data)
- def putp(self, data):
- self.put(self.ss, self.es, self.out_python, data)
-
def putb(self, data):
self.put(self.ss, self.es, self.out_binary, data)
def handle_reset(self, pins):
self.ss, self.es = self.samplenum, self.samplenum
cmd = 'RESET' # No need to set the global self.cmd as this command is atomic
- self.putp([cmd, None])
self.putx([proto[cmd][0], proto[cmd][1:]])
self.bitcount = self.databyte = 0
self.bits = []
def decode(self):
while True:
- pins = self.wait([{0: 'r'}, {0: 'l', 1: 'r'}, {1: 'h', 2: 'f'}, {1: 'h', 2: 'r'}])
- if self.matched[0]: # RESET condition (R): RST = rising
+ # Signal conditions tracked by the protocol decoder:
+ # - RESET condition (R): RST = rising
+ # - Incoming data (D): RST = low, CLK = rising.
+ # - Command mode START: CLK = high, I/O = falling.
+ # - Command mode STOP: CLK = high, I/O = rising.
+ (COND_RESET, COND_DATA, COND_CMD_START, COND_CMD_STOP,) = range(4)
+ conditions = [
+ {Pin.RST: 'r'},
+ {Pin.RST: 'l', Pin.CLK: 'r'},
+ {Pin.CLK: 'h', Pin.IO: 'f'},
+ {Pin.CLK: 'h', Pin.IO: 'r'},
+ ]
+ pins = self.wait(conditions)
+ if self.matched[COND_RESET]:
self.handle_reset(pins)
- elif self.matched[1]: # Incoming data (D): RST = low, CLK = rising.
+ elif self.matched[COND_DATA]:
self.handle_data(pins)
- elif self.matched[2]: # Command mode START: CLK = high, I/O = falling.
+ elif self.matched[COND_CMD_START]:
self.handle_command(pins)
- elif self.matched[3]: # Command mode STOP: CLK = high, I/O = rising.
+ elif self.matched[COND_CMD_STOP]:
self.handle_command(pins)