]> sigrok.org Git - libsigrokdecode.git/blame - decoders/mrf24j40/pd.py
mrf24j40: rename reset() helper method
[libsigrokdecode.git] / decoders / mrf24j40 / pd.py
CommitLineData
fecabafe
KP
1##
2## This file is part of the libsigrokdecode project.
3##
4## Copyright (C) 2015 Karl Palsson <karlp@tweak.net.au>
5##
6## This program is free software; you can redistribute it and/or modify
7## it under the terms of the GNU General Public License as published by
8## the Free Software Foundation; either version 2 of the License, or
9## (at your option) any later version.
10##
11## This program is distributed in the hope that it will be useful,
12## but WITHOUT ANY WARRANTY; without even the implied warranty of
13## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14## GNU General Public License for more details.
15##
16## You should have received a copy of the GNU General Public License
4539e9ca 17## along with this program; if not, see <http://www.gnu.org/licenses/>.
fecabafe
KP
18##
19
20import sigrokdecode as srd
07505b2a 21from .lists import *
fecabafe
KP
22
23class Decoder(srd.Decoder):
b197383c 24 api_version = 3
fecabafe
KP
25 id = 'mrf24j40'
26 name = 'MRF24J40'
27 longname = 'Microchip MRF24J40'
28 desc = 'IEEE 802.15.4 2.4 GHz RF tranceiver chip.'
9eac0fe3 29 license = 'gplv2+'
fecabafe
KP
30 inputs = ['spi']
31 outputs = ['mrf24j40']
32 annotations = (
33 ('sread', 'Short register read commands'),
34 ('swrite', 'Short register write commands'),
35 ('lread', 'Long register read commands'),
36 ('lwrite', 'Long register write commands'),
37 ('warning', 'Warnings'),
38 )
39 annotation_rows = (
40 ('read', 'Read', (0, 2)),
41 ('write', 'Write', (1, 3)),
42 ('warnings', 'Warnings', (4,)),
43 )
44
92b7b49f 45 def __init__(self):
fecabafe
KP
46 self.ss_cmd, self.es_cmd = 0, 0
47 self.mosi_bytes = []
48 self.miso_bytes = []
49
50 def start(self):
51 self.out_ann = self.register(srd.OUTPUT_ANN)
52
53 def putx(self, data):
54 self.put(self.ss_cmd, self.es_cmd, self.out_ann, data)
55
56 def putw(self, pos, msg):
57 self.put(pos[0], pos[1], self.out_ann, [4, [msg]])
58
89256c6c 59 def reset_data(self):
fecabafe
KP
60 self.mosi_bytes = []
61 self.miso_bytes = []
62
63 def handle_short(self):
64 write = self.mosi_bytes[0] & 0x1
65 reg = (self.mosi_bytes[0] >> 1) & 0x3f
66 reg_desc = sregs.get(reg, 'illegal')
67 if write:
68 self.putx([1, ['%s: %#x' % (reg_desc, self.mosi_bytes[1])]])
69 else:
70 self.putx([0, ['%s: %#x' % (reg_desc, self.miso_bytes[1])]])
71
72 def handle_long(self):
73 dword = self.mosi_bytes[0] << 8 | self.mosi_bytes[1]
74 write = dword & (0x1 << 4)
75 reg = dword >> 5 & 0x3ff
76 if reg >= 0x0:
77 reg_desc = 'TX:%#x' % reg
78 if reg >= 0x80:
79 reg_desc = 'TX beacon:%#x' % reg
80 if reg >= 0x100:
81 reg_desc = 'TX GTS1:%#x' % reg
82 if reg >= 0x180:
83 reg_desc = 'TX GTS2:%#x' % reg
84 if reg >= 0x200:
85 reg_desc = lregs.get(reg, 'illegal')
86 if reg >= 0x280:
87 reg_desc = 'Security keys:%#x' % reg
88 if reg >= 0x2c0:
89 reg_desc = 'Reserved:%#x' % reg
90 if reg >= 0x300:
91 reg_desc = 'RX:%#x' % reg
92
93 if write:
94 self.putx([3, ['%s: %#x' % (reg_desc, self.mosi_bytes[2])]])
95 else:
96 self.putx([2, ['%s: %#x' % (reg_desc, self.miso_bytes[2])]])
97
98 def decode(self, ss, es, data):
99 ptype = data[0]
100 if ptype == 'CS-CHANGE':
101 # If we transition high mid-stream, toss out our data and restart.
102 cs_old, cs_new = data[1:]
103 if cs_old is not None and cs_old == 0 and cs_new == 1:
104 if len(self.mosi_bytes) not in (0, 2, 3):
105 self.putw([self.ss_cmd, es], 'Misplaced CS!')
89256c6c 106 self.reset_data()
fecabafe
KP
107 return
108
109 # Don't care about anything else.
110 if ptype != 'DATA':
111 return
112 mosi, miso = data[1:]
113
114 self.ss, self.es = ss, es
115
116 if len(self.mosi_bytes) == 0:
117 self.ss_cmd = ss
118 self.mosi_bytes.append(mosi)
119 self.miso_bytes.append(miso)
120
121 # Everything is either 2 bytes or 3 bytes.
122 if len(self.mosi_bytes) < 2:
123 return
124
125 if self.mosi_bytes[0] & 0x80:
126 if len(self.mosi_bytes) == 3:
127 self.es_cmd = es
128 self.handle_long()
89256c6c 129 self.reset_data()
fecabafe
KP
130 else:
131 self.es_cmd = es
132 self.handle_short()
89256c6c 133 self.reset_data()