22
22
from collections import namedtuple
23
23
24
24
class Ann :
25
- BIT , START , STOP , PARITY_OK , PARITY_ERR , DATA , WORD = range (7 )
25
+ BIT , HSTART , DSTART , STOP , PARITY_OK , PARITY_ERR , DATA , WORD , ACK = range (9 )
26
26
27
27
Bit = namedtuple ('Bit' , 'val ss es' )
28
28
@@ -37,21 +37,29 @@ class Decoder(srd.Decoder):
37
37
outputs = []
38
38
tags = ['PC' ]
39
39
channels = (
40
- {'id' : 'clk' , 'name' : 'Clock' , 'desc' : 'Clock line' },
41
- {'id' : 'data' , 'name' : 'Data' , 'desc' : 'Data line' },
40
+ {'id' : 'clk' , 'type' : 0 , 'name' : 'Clock' , 'desc' : 'Clock line' },
41
+ {'id' : 'data' , 'type' : 107 , 'name' : 'Data' , 'desc' : 'Data line' },
42
+ )
43
+ options = (
44
+ {'id' : 'HtoD_Clock' , 'desc' : 'HtoD_Clock' ,
45
+ 'default' : 'rise' , 'values' : ('rise' , 'fall' )},
46
+ {'id' : 'DtoH_Clock' , 'desc' : 'DtoH_Clock' ,
47
+ 'default' : 'fall' , 'values' : ('fall' , 'rise' )},
42
48
)
43
49
annotations = (
44
- ('bit' , 'Bit' ),
45
- ('start-bit' , 'Start bit' ),
46
- ('stop-bit' , 'Stop bit' ),
47
- ('parity-ok' , 'Parity OK bit' ),
48
- ('parity-err' , 'Parity error bit' ),
49
- ('data-bit' , 'Data bit' ),
50
- ('word' , 'Word' ),
50
+ ('207' , 'bit' , 'Bit' ),
51
+ ('109' , 'HSTART' , 'HSTART' ),
52
+ ('50' , 'DSTART' , 'DSTART' ),
53
+ ('1000' , 'stop-bit' , 'Stop bit' ),
54
+ ('7' , 'parity-ok' , 'Parity OK bit' ),
55
+ ('1000' , 'parity-err' , 'Parity error bit' ),
56
+ ('40' , 'data-bit' , 'Data bit' ),
57
+ ('65' , 'word' , 'Word' ),
58
+ ('75' , 'ACK' , 'ACK' ),
51
59
)
52
60
annotation_rows = (
53
61
('bits' , 'Bits' , (0 ,)),
54
- ('fields' , 'Fields' , (1 , 2 , 3 , 4 , 5 , 6 )),
62
+ ('fields' , 'Fields' , (1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 )),
55
63
)
56
64
57
65
def __init__ (self ):
@@ -61,10 +69,14 @@ def reset(self):
61
69
self .bits = []
62
70
self .samplenum = 0
63
71
self .bitcount = 0
72
+ self .state = 'NULL'
73
+ self .ss = self .es = 0
74
+ self .HtoDss = 0
64
75
65
76
def start (self ):
66
77
self .out_ann = self .register (srd .OUTPUT_ANN )
67
-
78
+ self .HtoD = 1 if self .options ['HtoD_Clock' ] == 'rise' else 0
79
+ self .DtoH = 1 if self .options ['DtoH_Clock' ] == 'fall' else 0
68
80
def putb (self , bit , ann_idx ):
69
81
b = self .bits [bit ]
70
82
self .put (b .ss , b .es , self .out_ann , [ann_idx , [str (b .val )]])
@@ -75,7 +87,9 @@ def putx(self, bit, ann):
75
87
def handle_bits (self , datapin ):
76
88
# Ignore non start condition bits (useful during keyboard init).
77
89
if self .bitcount == 0 and datapin == 1 :
78
- return
90
+ self .state = 'HtoD'
91
+ (clock_pin , datapin ) = self .wait ({0 : 'r' })
92
+
79
93
80
94
# Store individual bits and their start/end samplenumbers.
81
95
self .bits .append (Bit (datapin , self .samplenum , self .samplenum ))
@@ -105,7 +119,10 @@ def handle_bits(self, datapin):
105
119
# Emit annotations.
106
120
for i in range (11 ):
107
121
self .putb (i , Ann .BIT )
108
- self .putx (0 , [Ann .START , ['Start bit' , 'Start' , 'S' ]])
122
+ if self .state == 'HtoD' :
123
+ self .putx (0 , [Ann .HSTART , ['Host Start' , 'HStart' , 'HS' ]])
124
+ if self .state == 'DtoH' :
125
+ self .putx (0 , [Ann .DSTART , ['Device Start' , 'Device' , 'DS' ]])
109
126
self .put (self .bits [1 ].ss , self .bits [8 ].es , self .out_ann , [Ann .WORD ,
110
127
['Data: %02x' % word , 'D: %02x' % word , '%02x' % word ]])
111
128
if parity_ok :
@@ -115,12 +132,62 @@ def handle_bits(self, datapin):
115
132
self .putx (10 , [Ann .STOP , ['Stop bit' , 'Stop' , 'St' , 'T' ]])
116
133
117
134
self .bits , self .bitcount = [], 0
135
+ self .state == 'NULL'
118
136
119
137
def decode (self ):
120
138
while True :
121
139
# Sample data bits on falling clock edge.
122
- (clock_pin , data_pin ) = self .wait ({0 : 'f' })
123
- self .handle_bits (data_pin )
124
- if (self .bitcount == 11 ):
125
- (clock_pin , data_pin ) = self .wait ({0 : 'r' })
140
+ if self .bitcount == 0 :
141
+ if self .HtoDss :
142
+ self .state = 'HtoD'
143
+ (clock_pin , data_pin ) = self .wait ({0 : 'r' ,1 : 'l' })
144
+ self .handle_bits (data_pin )
145
+ (clock_pin , data_pin ) = self .wait ({0 : 'f' })
146
+ else :
147
+ (clock_pin , data_pin ) = self .wait ([{0 : 'f' ,1 : 'r' },{0 : 'f' ,1 : 'f' },{0 : 'f' ,1 : 'h' },{0 : 'f' ,1 : 'l' }])
148
+ if (self .matched & (0b1 << 0 )):
149
+ continue
150
+ if (self .matched & (0b1 << 1 )):
151
+ self .state = 'HtoD'
152
+ (clock_pin , data_pin ) = self .wait ({0 : 'r' ,1 : 'l' })
153
+ self .handle_bits (data_pin )
154
+ (clock_pin , data_pin ) = self .wait ({0 : 'f' })
155
+ if (self .matched & (0b1 << 2 )):
156
+ self .state = 'HtoD'
157
+ (clock_pin , data_pin ) = self .wait ({0 : 'r' ,1 : 'l' })
158
+ self .handle_bits (data_pin )
159
+ (clock_pin , data_pin ) = self .wait ({0 : 'f' })
160
+ if (self .matched & (0b1 << 3 )):
161
+ self .state = 'DtoH'
162
+ self .handle_bits (data_pin )
163
+ if self .state == 'HtoD' :
164
+ if self .HtoD :
165
+ (clock_pin , data_pin ) = self .wait ({0 : 'r' })
166
+ else :
167
+ (clock_pin , data_pin ) = self .wait ({0 : 'f' })
168
+ self .handle_bits (data_pin )
169
+ if (self .bitcount == 10 ):
170
+ (clock_pin , data_pin ) = self .wait ({0 : 'r' })
171
+ self .handle_bits (data_pin )
172
+ if (self .bitcount == 11 ):
173
+ (clock_pin , data_pin ) = self .wait ({0 : 'f' })
174
+ self .handle_bits (data_pin )
175
+ self .ss = self .samplenum
176
+ (clock_pin , data_pin ) = self .wait ({0 : 'r' })
177
+ self .es = self .samplenum
178
+ self .put (self .ss ,self .es ,self .out_ann ,[Ann .ACK , ['ACK' , 'ACK' , 'ACK' , 'A' ]])
179
+ self .HtoDss = 0
180
+ if self .state == 'DtoH' :
181
+ if self .DtoH :
182
+ (clock_pin , data_pin ) = self .wait ({0 : 'f' })
183
+ else :
184
+ (clock_pin , data_pin ) = self .wait ({0 : 'r' })
126
185
self .handle_bits (data_pin )
186
+ if (self .bitcount == 11 ):
187
+ (clock_pin , data_pin ) = self .wait ([{1 : 'f' },{0 : 'r' }])
188
+ if (self .matched & (0b1 << 0 )):
189
+ self .handle_bits (data_pin )
190
+ self .HtoDss = 1
191
+ if (self .matched & (0b1 << 1 )):
192
+ self .handle_bits (data_pin )
193
+ self .HtoDss = 0
0 commit comments