origen_arm_debug 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 609583b64578afdec4453eaec6425e0eb3ea447c
4
- data.tar.gz: fcb99fc0d5ebaf867853fb59055b0a9ee7fc519d
3
+ metadata.gz: dc238d6a6c1968e247feaf3a6b57c4b6222246e8
4
+ data.tar.gz: 79ee7b36c4af7d4357fa541937b429a9b596525f
5
5
  SHA512:
6
- metadata.gz: 2c0c1690d203d8ef3443927bfce7602e1cd6317c736200aa5dc263dd185611a63e97f9f5e4f1bdd0e0eb1690336b7eb93aa9ecf3621d5db372c9bd0c1fb32b9b
7
- data.tar.gz: a25d97c6b5791a6418df1954c599b635cf93035cf2a0de695b9b4be8357fc42d66ac993ed53bad71f750c52c7dc3d3bfcc7175927d4fcbe00bc62a9c74a14c9a
6
+ metadata.gz: f13c97b08406af4d1748cea9ca1ce365cc910a14689f631aa9fc0156e4a454516978e5c4be3a1cc7579021b3df1c55624617ecc06fd9e59bba28fee0ea4a2707
7
+ data.tar.gz: b061fba3f3ccad2c04cc8b94b0ac8b633aea8a25ac3fc2183cec9f802e110c7829c2990edc71e4c298b8066afaec33872230080bf3c32db356e8f5212ef8d7e1
data/config/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module OrigenARMDebug
2
2
  MAJOR = 0
3
3
  MINOR = 4
4
- BUGFIX = 0
4
+ BUGFIX = 1
5
5
  DEV = nil
6
6
 
7
7
  VERSION = [MAJOR, MINOR, BUGFIX].join(".") + (DEV ? ".pre#{DEV}" : '')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: origen_arm_debug
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ronnie Lajaunie
@@ -80,17 +80,11 @@ files:
80
80
  - config/users.rb
81
81
  - config/version.rb
82
82
  - lib/origen_arm_debug.rb
83
- - lib/origen_arm_debug/abs_if_jtag.rb
84
- - lib/origen_arm_debug/abs_if_swd.rb
85
- - lib/origen_arm_debug/core_access_M4.rb
86
83
  - lib/origen_arm_debug/driver.rb
87
84
  - lib/origen_arm_debug/dut.rb
88
85
  - lib/origen_arm_debug/dut_jtag.rb
89
86
  - lib/origen_arm_debug/dut_swd.rb
90
- - lib/origen_arm_debug/jtag_ap.rb
91
- - lib/origen_arm_debug/jtag_dp.rb
92
87
  - lib/origen_arm_debug/mem_ap.rb
93
- - lib/origen_arm_debug/sw_dp.rb
94
88
  - lib/origen_arm_debug/swj_dp.rb
95
89
  - pattern/read_write_reg.rb
96
90
  - templates/web/index.md.erb
@@ -1,255 +0,0 @@
1
- module OrigenARMDebug
2
- class ABSIF_JTAG
3
- JTAGC_ARM_ABORT = 0b1000
4
- JTAGC_ARM_DPACC = 0b1010
5
- JTAGC_ARM_APACC = 0b1011
6
- JTAGC_ARM_IDCODE = 0b1110
7
- JTAGC_ARM_BYPASS = 0b1111
8
-
9
- attr_reader :owner
10
- attr_accessor :write_ap_dly
11
- attr_accessor :acc_access_dly
12
-
13
- def initialize(owner, options = {})
14
- @owner = owner
15
-
16
- @write_ap_dly = 8
17
- @acc_access_dly = 7
18
-
19
- @current_apaddr = 0x00000000
20
- end
21
-
22
- #-------------------------------------
23
- # Read tasks - high level
24
- #-------------------------------------
25
- def R_dp(name, rdata, options = {})
26
- options = { mask: 0xffffffff, r_attempts: 1 }.merge(options)
27
- read_dp(name, rdata, options)
28
- end
29
-
30
- def RE_dp(name, edata, options = {})
31
- options = { mask: 0xffffffff, r_attempts: 1 }.merge(options)
32
- actual = edata
33
- R_dp(name, actual, options)
34
-
35
- cc "ABS-IF: RE-DP: #{name} = 0x#{actual.to_s(16).rjust(8, '0')}, "\
36
- "expected = 0x#{edata.to_s(16).rjust(8, '0')}, "\
37
- "mask = 0x#{options[:mask].to_s(16).rjust(8, '0')}"
38
- end
39
-
40
- def R_ap(addr, rdata, options = {})
41
- options = { mask: 0xffffffff, r_attempts: 1 }.merge(options)
42
- read_ap(addr, rdata, options)
43
- end
44
-
45
- def RE_ap(addr, edata, options = {})
46
- options = { mask: 0xffffffff, r_attempts: 1 }.merge(options)
47
- actual = edata
48
- R_ap(addr, actual, options)
49
-
50
- cc "ABS-IF: RE-AP: addr = 0x#{addr.to_s(16).rjust(8, '0')}, "\
51
- "actual = 0x#{actual.to_s(16).rjust(8, '0')}, "\
52
- "expected = 0x#{edata.to_s(16).rjust(8, '0')}, "\
53
- "mask = 0x#{options[:mask].to_s(16).rjust(8, '0')}"
54
- end
55
-
56
- def WAIT_RE_ap(addr, edata, options = {})
57
- options = { mask: 0xffffffff, r_attempts: 1 }.merge(options)
58
- actual = edata
59
- R_ap(addr, actual, options)
60
-
61
- cc "ABS-IF: WAIT_RE-AP: addr = 0x#{addr.to_s(16).rjust(8, '0')}, "\
62
- "actual = 0x#{actual.to_s(16).rjust(8, '0')}, "\
63
- "expected = 0x#{edata.to_s(16).rjust(8, '0')}, "\
64
- "mask = 0x#{options[:mask].to_s(16).rjust(8, '0')}"
65
- end
66
-
67
- #-------------------------------------
68
- # Write tasks - high level
69
- #-------------------------------------
70
- def W_dp(name, wdata, options = {})
71
- options = { w_attempts: 1 }.merge(options)
72
- write_dp(name, wdata, options)
73
- end
74
-
75
- def WR_dp(name, wdata, options = {})
76
- options = { edata: 0x00000000, mask: 0xffffffff, w_attempts: 1, r_attempts: 1 }.merge(options)
77
- actual = options[:edata] & options[:mask]
78
-
79
- W_dp(name, wdata, options)
80
- R_dp(name, actual, options)
81
-
82
- cc "ABS-IF: WR-DP: #{name} write = 0x#{wdata.to_s(16).rjust(8, '0')}, "\
83
- "read = 0x#{actual.to_s(16).rjust(8, '0')}, "\
84
- "expected = 0x#{options[:edata].to_s(16).rjust(8, '0')}, "\
85
- "mask = 0x#{options[:mask].to_s(16).rjust(8, '0')}"
86
- end
87
-
88
- def W_ap(addr, wdata, options = {})
89
- options = { w_attempts: 1 }.merge(options)
90
- write_ap(addr, wdata, options)
91
- end
92
-
93
- def WR_ap(addr, wdata, options = {})
94
- options = { edata: 0x00000000, mask: 0xffffffff, w_attempts: 1, r_attempts: 1 }.merge(options)
95
- actual = wdata & options[:mask]
96
-
97
- W_ap(addr, wdata, options)
98
- R_ap(addr, actual, options)
99
-
100
- cc "ABS-IF: WR-AP: addr = 0x#{addr.to_s(16).rjust(8, '0')}, "\
101
- "write = 0x#{wdata.to_s(16).rjust(8, '0')}, "\
102
- "read = 0x#{actual.to_s(16).rjust(8, '0')}, "\
103
- "expected = 0x#{options[:edata].to_s(16).rjust(8, '0')}, "\
104
- "mask = 0x#{options[:mask].to_s(16).rjust(8, '0')}"
105
- end
106
-
107
- private
108
-
109
- #-------------------------------------
110
- # Implementation of virtual functions
111
- #-------------------------------------
112
- def read_dp(name, rdata, options = {})
113
- options = { r_attempts: 1 }.merge(options)
114
-
115
- set_ir(name) if name == 'IDCODE'
116
- case name
117
- when 'ABORT' then puts "#{name} JTAG-DP register is write-only"
118
- when 'CTRL/STAT' then dpacc_access(name, 1, random, rdata, options)
119
- when 'SELECT' then dpacc_access(name, 1, random, rdata, options)
120
- when 'RDBUFF' then dpacc_access(name, 1, random, rdata, options)
121
- when 'IDCODE' then owner.owner.jtag.write_dr(random, size: 32) # need to make parameterized!!!
122
- else
123
- puts "Unknown JTAG-DP register name #{name}"
124
- end
125
- if name != 'IDCODE' && name != 'RDBUFF'
126
- read_dp('RDBUFF', rdata, options)
127
- end
128
- cc "ABS-IF: R-DP: #{name}=0x" + rdata.to_s(16).rjust(8, '0')
129
- end
130
-
131
- def write_dp(name, wdata, options = {})
132
- options = { w_attempts: 1 }.merge(options)
133
-
134
- if name == 'ABORT' && wdata != 0x00000001
135
- puts "#{name} register must only ever be written with the value 0x00000001"
136
- end
137
- case name
138
- when 'ABORT' then dpacc_access(name, 0, wdata, random, options)
139
- when 'CTRL/STAT' then dpacc_access(name, 0, wdata, random, options)
140
- when 'SELECT' then dpacc_access(name, 0, wdata, random, options)
141
- when 'RDBUFF' then puts "#{name} JTAG-DP register is read-only"
142
- when 'IDCODE' then puts "#{name} JTAG-DP register is read-only"
143
- else; puts "Unknown JTAG-DP register name #{name}"
144
- end
145
- cc "ABS-IF: W-DP: #{name} = 0x#{wdata.to_s(16).rjust(8, '0')}"
146
- end
147
-
148
- def read_ap(addr, rdata, options = {});
149
- options = { r_attempts: 1 }.merge(options)
150
-
151
- apacc_access(addr, 1, random, rdata, options)
152
- read_dp('RDBUFF', rdata, options)
153
-
154
- cc "ABS-IF: R-AP: addr=0x#{addr.to_s(16).rjust(8, '0')}, "\
155
- "rdata=0x#{rdata.to_s(16).rjust(8, '0')}"
156
- end
157
-
158
- def write_ap(addr, wdata, options = {});
159
- options = { w_attempts: 1 }.merge(options)
160
-
161
- rdata = 0x00000000
162
- apacc_access(addr, 0, wdata, rdata, options);
163
- $tester.cycle(repeat: @write_ap_dly)
164
-
165
- cc "ABS-IF: W-AP: addr=0x#{addr.to_s(16).rjust(8, '0')}, "\
166
- "wdata=0x#{wdata.to_s(16).rjust(8, '0')}"
167
- end
168
-
169
- #-------------------------------------
170
- # lower level helper tasks
171
- #-------------------------------------
172
- def set_ir(name)
173
- new_ir = get_ir_code(name);
174
- owner.owner.jtag.write_ir(new_ir, size: 4) # need to make parameterized!!!
175
- end
176
-
177
- def acc_access(name, addr, rwb, wdata, rdata, attempts, options = {});
178
- set_ir(name);
179
- concat_data = (wdata << 3) | (addr << 1) | rwb
180
- attempts.times do
181
- if name == 'RDBUFF'
182
- r = $dut.reg(:dap)
183
- if options[:r_mask] == 'store'
184
- r.bits(3..34).store
185
- elsif options.key?(:compare_data)
186
- r.bits(3..34).data = options[:compare_data]
187
- end
188
- options = options.merge(size: r.size)
189
- owner.owner.jtag.read_dr(r, options) # need to make parameterized!!!
190
- else
191
- options = options.merge(size: 35)
192
- owner.owner.jtag.write_dr(concat_data, options) # need to make parameterized!!!
193
- end
194
- end
195
- $tester.cycle(repeat: @acc_access_dly)
196
- end
197
-
198
- def dpacc_access(name, rwb, wdata, rdata, options = {});
199
- attempts = options[:r_attempts].nil? ? (options[:w_attempts].nil? ? 1 : options[:w_attempts]) : options[:r_attempts]
200
- addr = get_dp_addr(name);
201
- addr_3_2 = (addr & 0x0C) >> 2
202
- acc_access(name, addr_3_2, rwb, wdata, rdata, attempts, options);
203
- end
204
-
205
- def set_apselect(addr);
206
- _random = random
207
- addr = addr & 0xff0000f0;
208
- concat_data = (addr & 0xff000000) | (_random & 0x00ffff00) | (addr & 0x000000f0) | (_random & 0x0000000f)
209
- if (addr != @current_apaddr)
210
- write_dp('SELECT', concat_data);
211
- end
212
- @current_apaddr = addr;
213
- end
214
-
215
- def apacc_access(addr, rwb, wdata, rdata, options = {});
216
- attempts = options[:r_attempts].nil? ? (options[:w_attempts].nil? ? 1 : options[:w_attempts]) : options[:r_attempts]
217
- set_apselect(addr);
218
- addr_3_2 = (addr & 0x0000000C) >> 2
219
- acc_access('APACC', addr_3_2, rwb, wdata, rdata, attempts, options);
220
- end
221
-
222
- def get_dp_addr(name);
223
- case name
224
- when 'IDCODE' then return 0xF
225
- when 'CTRL/STAT' then return 0x4
226
- when 'SELECT' then return 0x8
227
- when 'RDBUFF' then return 0xC
228
- when 'ABORT' then return 0x0
229
- when 'WCR' then puts "#{name} is a SW-DP only register"
230
- when 'RESEND' then puts "#{name} is a SW-DP only register"
231
- else; puts "Unknown JTAG-DP register name: #{name}"
232
- end
233
- 0
234
- end
235
-
236
- def get_ir_code(name);
237
- case name
238
- when 'ABORT' then return JTAGC_ARM_ABORT
239
- when 'CTRL/STAT' then return JTAGC_ARM_DPACC
240
- when 'SELECT' then return JTAGC_ARM_DPACC
241
- when 'RDBUFF' then return JTAGC_ARM_DPACC
242
- when 'APACC' then return JTAGC_ARM_APACC
243
- when 'IDCODE' then return JTAGC_ARM_IDCODE
244
- when 'RESEND' then puts "#{name} is a SW-DP only register"
245
- else; puts "Unknown JTAG-DP register name: #{name}"
246
- end
247
- 0
248
- end
249
-
250
- def random
251
- # rand(4294967295) # random 32-bit integer
252
- 0x01234567
253
- end
254
- end
255
- end
@@ -1,269 +0,0 @@
1
- # To use this driver the $soc model must define the following pins (an alias is fine):
2
- # :swd_clk
3
- # :swd_dio
4
- #
5
- # API methods:
6
- # R_dp - debug register read - just a dummy function in origen
7
- # RE_dp - debug register read/expect - expect compares not implemented
8
- # R_ap - read a specific address - just a dummy function in origen
9
- # W_dp - debug register write
10
- # W_ap - write a specific address
11
- # WR_ap - write a specific address, then read back
12
-
13
- module OrigenARMDebug
14
- class ABSIF_SWD
15
- attr_reader :owner
16
- include Origen::Registers
17
-
18
- def initialize(owner, options = {})
19
- @current_apaddr = 0
20
- @orundetect = 0
21
- @owner = owner
22
- end
23
-
24
- # Highest level implementation of API - abstracted from 'read' and 'write' for future merging with JTAG debug
25
- def R_dp(name, rdata, options = {})
26
- cc 'Reading ' + name
27
- read_dp(name, options)
28
- end
29
-
30
- def RE_dp(name, edata, options = {})
31
- R_dp(name, edata, options)
32
- end
33
-
34
- def R_ap(addr, rdata, options = {})
35
- cc 'Reading address ' + addr.to_s(16)
36
- read_ap(addr, options)
37
- end
38
-
39
- def WAIT_RE_ap(addr, edata, options = {})
40
- options = { mask: 0xffffffff, r_attempts: 1 }.merge(options)
41
-
42
- # just assume that it always passes
43
- actual = edata
44
-
45
- R_ap(addr, actual, options)
46
-
47
- cc "ABS-IF: WAIT_RE-AP: addr = 0x#{addr.to_s(16)}, "\
48
- "actual = 0x#{actual.to_s(16)}, "\
49
- "expected = 0x#{edata.to_s(16)}, "\
50
- "mask = 0x#{options[:mask].to_s(16)}"
51
- end
52
-
53
- def W_dp(name, wdata, options = {})
54
- cc 'Writing 0x' + wdata.to_s(16) + ' to ' + name
55
- write_dp(name, wdata, options)
56
- end
57
-
58
- def WR_dp(name, wdata, options = {})
59
- options = { edata: 0x00000000, mask: 0xffffffff,
60
- w_attempts: 1, r_attempts: 1
61
- }.merge(options)
62
-
63
- # just assume that it always passes
64
- actual = options[:edata] & options[:mask]
65
-
66
- W_dp(name, wdata, options)
67
- R_dp(name, actual, options)
68
-
69
- cc "ABS-IF: WR-DP: #{name} write = 0x#{wdata.to_s(16)}, "\
70
- "read = 0x#{actual.to_s(16)}, "\
71
- "expected = 0x#{options[:edata].to_s(16)}, "\
72
- "mask = 0x#{options[:mask].to_s(16)}"
73
- end
74
-
75
- def W_ap(addr, wdata, options = {})
76
- options = { w_attempts: 1 }.merge(options)
77
- cc 'Writing 0x' + wdata.to_s(16) + ' to address 0x' + addr.to_s(16)
78
- write_ap(addr, wdata, options)
79
- end
80
-
81
- def WR_ap(addr, wdata, options = {})
82
- options = { edata: 0x00000000, mask: 0xffffffff,
83
- w_attempts: 1, r_attempts: 1
84
- }.merge(options)
85
-
86
- # just assume that it always passes
87
- actual = wdata & options[:mask]
88
- W_ap(addr, wdata, options)
89
- options.delete(:w_delay) if options.key?(:w_delay)
90
- R_ap(addr, actual, options)
91
-
92
- cc "ABS-IF: WR-AP: addr = 0x#{addr.to_s(16)}, "\
93
- "write = 0x#{wdata.to_s(16)}, "\
94
- "read = 0x#{actual.to_s(16)}, "\
95
- "expected = 0x#{options[:edata].to_s(16)}, "\
96
- "mask = 0x#{options[:mask].to_s(16)}"
97
- end
98
-
99
- # SWD-specific functions
100
- def read_dp(name, options = {})
101
- case name
102
- when 'IDCODE' then dpacc_access(name, 1, 0x55555555, options)
103
- when 'ABORT' then cc 'Write only register!'
104
- when 'CTRL/STAT' then dpacc_access(name, 1, 0x55555555, options)
105
- when 'SELECT' then cc 'Write only register!'
106
- when 'RDBUFF' then dpacc_access(name, 1, 0x55555555, options)
107
- when 'WCR' then dpacc_access(name, 1, 0x55555555, options)
108
- when 'RESEND' then dpacc_access(name, 1, 0x55555555, options)
109
- else cc 'Unknown SW-DP register name'
110
- end
111
- end
112
-
113
- def write_dp(name, wdata, options = {})
114
- case name
115
- when 'IDCODE' then cc 'SW-DP register is read-only'
116
- when 'ABORT' then dpacc_access(name, 0, wdata, options)
117
- when 'CTRL/STAT' then dpacc_access(name, 0, wdata, options)
118
- when 'SELECT' then dpacc_access(name, 0, wdata, options)
119
- when 'RDBUFF' then cc 'SW-DP register is read-only'
120
- when 'WCR' then dpacc_access(name, 0, wdata, options)
121
- when 'RESEND' then cc 'SW-DP register is read-only'
122
- else cc 'Unknown SW-DP register name'
123
- end
124
- end
125
-
126
- def write_ap(addr, wdata, options = {})
127
- apacc_access(addr, 0, wdata, options)
128
- end
129
-
130
- def read_ap(addr, options = {})
131
- # Create another copy of options with select keys removed. This first read is junk so we do not want to
132
- # store it or compare it.
133
- junk_options = options.clone.delete_if do |key, val|
134
- (key.eql?(:r_mask) && val.eql?('store')) || key.eql?(:compare_data)
135
- end
136
- # pass junk options onto the first apacc access
137
- apacc_access(addr, 1, 0x55555555, junk_options)
138
- read_dp('RDBUFF', options) # This is the real data
139
- end
140
-
141
- # Low-level access functions
142
- def dpacc_access(name, rwb, wdata, options = {})
143
- addr = get_dp_addr(name)
144
- if (name == 'CTRL/STAT')
145
- cc 'CTRL/STAT'
146
- set_apselect(@current_apaddr & 0xFFFFFFFE, options)
147
- end
148
- if (name == 'WCR')
149
- cc 'NOT IMPLEMENTED'
150
- end
151
-
152
- acc_access(addr, rwb, 0, wdata, options)
153
-
154
- if (name == 'WCR')
155
- cc 'NOT IMPLEMENTED'
156
- end
157
- if (name == 'CTRL/STAT')
158
- @orundetect = wdata & 0x1
159
- end
160
- end
161
-
162
- def apacc_access(addr, rwb, wdata, options = {})
163
- set_apselect((addr & 0xFFFFFFFE) | (@current_apaddr & 1), options)
164
- options.delete(:w_delay) if options.key?(:w_delay)
165
- acc_access((addr & 0xC), rwb, 1, wdata, options)
166
- end
167
-
168
- def get_dp_addr(name)
169
- case name
170
- when 'IDCODE' then return 0x0
171
- when 'ABORT' then return 0x0
172
- when 'CTRL/STAT' then return 0x4
173
- when 'WCR' then return 0x4
174
- when 'RESEND' then return 0x8
175
- when 'SELECT' then return 0x8
176
- when 'RDBUFF' then return 0xC
177
- else cc 'Unknown SW-DP register name'
178
- end
179
- end
180
-
181
- def acc_access(address, rwb, ap_dp, wdata, options = {})
182
- start = 1
183
- apndp = ap_dp
184
- rnw = rwb
185
- addr = address >> 2
186
- parity_pr = ap_dp ^ rwb ^ (addr >> 3) ^ (addr >> 2) & (0x01) ^ (addr >> 1) & (0x01) ^ addr & 0x01
187
- trn = 0
188
- data = wdata
189
- require_dp = @orundetect
190
- line_reset = 0
191
- stop = 0
192
- park = 1
193
-
194
- cc 'SWD transaction'
195
- cc 'Packet Request Phase'
196
-
197
- annotate 'Send Start Bit'
198
- owner.owner.swd.send_data(start, 1)
199
- cc('Send APnDP Bit (DP or AP Access Register Bit)', prefix: true)
200
- owner.owner.swd.send_data(apndp, 1)
201
- c2 'Send RnW Bit (read or write bit)'
202
- owner.owner.swd.send_data(rnw, 1)
203
- c2 'Send Address Bits (2 bits)'
204
- owner.owner.swd.send_data(addr, 2)
205
- c2 'Send Parity Bit'
206
- owner.owner.swd.send_data(parity_pr, 1)
207
- c2 'Send Stop Bit'
208
- owner.owner.swd.send_data(stop, 1)
209
- c2 'Send Park Bit'
210
- owner.owner.swd.send_data(park, 1)
211
-
212
- cc 'Acknowledge Response phase'
213
- owner.owner.swd.send_data(0xf, trn + 1)
214
- owner.owner.swd.get_data (3)
215
- cc 'Read/Write Data Phase'
216
- if (rwb == 1)
217
- cc 'Read'
218
- if options[:r_mask] == 'store'
219
- owner.owner.pin(:swd_dio).store
220
- end
221
- cc 'SWD 32-Bit Read Data Start'
222
- owner.owner.swd.get_data(32, options)
223
- cc 'SWD 32-Bit Read Data End'
224
- cc 'Get Read Parity Bit'
225
- owner.owner.swd.get_data(1)
226
- cc 'Send Read ACK bits'
227
- owner.owner.swd.send_data(0xf, trn + 1)
228
- else
229
- cc 'Write'
230
- cc 'Send ACK Bits'
231
- owner.owner.swd.send_data(0xf, trn + 1)
232
- cc 'SWD 32-Bit Write Start'
233
- owner.owner.swd.send_data(data, 32, options)
234
- cc 'SWD 32-Bit Write End'
235
- cc 'Send Write Parity Bit'
236
- owner.owner.swd.send_data(swd_xor_calc(32, data), 1)
237
- end
238
-
239
- if options.key?(:w_delay)
240
- cc "SWD DIO to 0 for #{options[:w_delay]} cycles"
241
- owner.owner.swd.swd_dio_to_0(options[:w_delay])
242
- else
243
- cc 'SWD DIO to 0 for 10 cycles'
244
- owner.owner.swd.swd_dio_to_0(10)
245
- end
246
- end
247
-
248
- def set_apselect(addr, options = {})
249
- addr &= 0xff0000f1
250
- cc "SET_APSelect: addr = 0x#{addr.to_s(16)} "
251
-
252
- if (addr != @current_apaddr)
253
- cc 'SET_APSelect: write_dp SELECT'
254
- write_dp('SELECT', addr & 0xff0000ff, options)
255
- end
256
-
257
- @current_apaddr = addr
258
- end
259
-
260
- # Calculate exclusive OR
261
- def swd_xor_calc(size, number)
262
- xor = 0
263
- size.times do |bit|
264
- xor ^= (number >> bit) & 0x01
265
- end
266
- xor
267
- end
268
- end
269
- end
File without changes
File without changes
File without changes
File without changes