1 /* SPDX-License-Identifier: GPL-2.0-or-later */
3 /***************************************************************************
4 * Copyright (C) 2010 by Oleksandr Tymoshenko <gonzo@bluezbox.com> *
5 ***************************************************************************/
12 #include "jtag/jtag.h"
13 #include "avr32_jtag.h"
15 static int avr32_jtag_set_instr(struct avr32_jtag
*jtag_info
, int new_instr
)
24 if (buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
) != (uint32_t)new_instr
) {
26 struct scan_field field
;
30 field
.num_bits
= tap
->ir_length
;
32 buf_set_u32(t
, 0, field
.num_bits
, new_instr
);
35 jtag_add_ir_scan(tap
, &field
, TAP_IDLE
);
36 if (jtag_execute_queue() != ERROR_OK
) {
37 LOG_ERROR("%s: setting address failed", __func__
);
40 busy
= buf_get_u32(ret
, 2, 1);
41 } while (busy
); /* check for busy bit */
47 static int avr32_jtag_nexus_set_address(struct avr32_jtag
*jtag_info
,
48 uint32_t addr
, int mode
)
50 struct scan_field fields
[2];
55 memset(fields
, 0, sizeof(fields
));
58 memset(addr_buf
, 0, sizeof(addr_buf
));
59 memset(busy_buf
, 0, sizeof(busy_buf
));
61 buf_set_u32(addr_buf
, 0, 1, mode
);
62 buf_set_u32(addr_buf
, 1, 7, addr
);
64 fields
[0].num_bits
= 26;
65 fields
[0].in_value
= NULL
;
66 fields
[0].out_value
= NULL
;
68 fields
[1].num_bits
= 8;
69 fields
[1].in_value
= busy_buf
;
70 fields
[1].out_value
= addr_buf
;
72 jtag_add_dr_scan(jtag_info
->tap
, 2, fields
, TAP_IDLE
);
73 if (jtag_execute_queue() != ERROR_OK
) {
74 LOG_ERROR("%s: setting address failed", __func__
);
77 busy
= buf_get_u32(busy_buf
, 6, 1);
84 static int avr32_jtag_nexus_read_data(struct avr32_jtag
*jtag_info
,
88 struct scan_field fields
[2];
94 memset(data_buf
, 0, sizeof(data_buf
));
95 memset(busy_buf
, 0, sizeof(busy_buf
));
97 fields
[0].num_bits
= 32;
98 fields
[0].out_value
= NULL
;
99 fields
[0].in_value
= data_buf
;
102 fields
[1].num_bits
= 2;
103 fields
[1].in_value
= busy_buf
;
104 fields
[1].out_value
= NULL
;
106 jtag_add_dr_scan(jtag_info
->tap
, 2, fields
, TAP_IDLE
);
108 if (jtag_execute_queue() != ERROR_OK
) {
109 LOG_ERROR("%s: reading data failed", __func__
);
113 busy
= buf_get_u32(busy_buf
, 0, 1);
116 *pdata
= buf_get_u32(data_buf
, 0, 32);
121 static int avr32_jtag_nexus_write_data(struct avr32_jtag
*jtag_info
,
125 struct scan_field fields
[2];
128 uint8_t dummy_buf
[4];
132 memset(data_buf
, 0, sizeof(data_buf
));
133 memset(busy_buf
, 0, sizeof(busy_buf
));
134 memset(dummy_buf
, 0, sizeof(dummy_buf
));
136 fields
[0].num_bits
= 2;
137 fields
[0].in_value
= busy_buf
;
138 fields
[0].out_value
= dummy_buf
;
141 buf_set_u32(data_buf
, 0, 32, data
);
142 fields
[1].num_bits
= 32;
143 fields
[1].in_value
= NULL
;
144 fields
[1].out_value
= data_buf
;
146 jtag_add_dr_scan(jtag_info
->tap
, 2, fields
, TAP_IDLE
);
148 if (jtag_execute_queue() != ERROR_OK
) {
149 LOG_ERROR("%s: reading data failed", __func__
);
153 busy
= buf_get_u32(busy_buf
, 0, 0);
160 int avr32_jtag_nexus_read(struct avr32_jtag
*jtag_info
,
161 uint32_t addr
, uint32_t *value
)
163 avr32_jtag_set_instr(jtag_info
, AVR32_INST_NEXUS_ACCESS
);
164 avr32_jtag_nexus_set_address(jtag_info
, addr
, MODE_READ
);
165 return avr32_jtag_nexus_read_data(jtag_info
, value
);
168 int avr32_jtag_nexus_write(struct avr32_jtag
*jtag_info
,
169 uint32_t addr
, uint32_t value
)
171 avr32_jtag_set_instr(jtag_info
, AVR32_INST_NEXUS_ACCESS
);
172 avr32_jtag_nexus_set_address(jtag_info
, addr
, MODE_WRITE
);
173 return avr32_jtag_nexus_write_data(jtag_info
, value
);
176 static int avr32_jtag_mwa_set_address(struct avr32_jtag
*jtag_info
, int slave
,
177 uint32_t addr
, int mode
)
179 struct scan_field fields
[2];
181 uint8_t slave_buf
[4];
185 memset(fields
, 0, sizeof(fields
));
188 memset(addr_buf
, 0, sizeof(addr_buf
));
189 memset(busy_buf
, 0, sizeof(busy_buf
));
190 memset(slave_buf
, 0, sizeof(slave_buf
));
192 buf_set_u32(slave_buf
, 0, 4, slave
);
193 buf_set_u32(addr_buf
, 0, 1, mode
);
194 buf_set_u32(addr_buf
, 1, 30, addr
>> 2);
196 fields
[0].num_bits
= 31;
197 fields
[0].in_value
= NULL
;
198 fields
[0].out_value
= addr_buf
;
200 fields
[1].num_bits
= 4;
201 fields
[1].in_value
= busy_buf
;
202 fields
[1].out_value
= slave_buf
;
204 jtag_add_dr_scan(jtag_info
->tap
, 2, fields
, TAP_IDLE
);
205 if (jtag_execute_queue() != ERROR_OK
) {
206 LOG_ERROR("%s: setting address failed", __func__
);
209 busy
= buf_get_u32(busy_buf
, 1, 1);
215 static int avr32_jtag_mwa_read_data(struct avr32_jtag
*jtag_info
,
219 struct scan_field fields
[2];
225 memset(data_buf
, 0, sizeof(data_buf
));
226 memset(busy_buf
, 0, sizeof(busy_buf
));
228 fields
[0].num_bits
= 32;
229 fields
[0].out_value
= NULL
;
230 fields
[0].in_value
= data_buf
;
233 fields
[1].num_bits
= 3;
234 fields
[1].in_value
= busy_buf
;
235 fields
[1].out_value
= NULL
;
237 jtag_add_dr_scan(jtag_info
->tap
, 2, fields
, TAP_IDLE
);
239 if (jtag_execute_queue() != ERROR_OK
) {
240 LOG_ERROR("%s: reading data failed", __func__
);
244 busy
= buf_get_u32(busy_buf
, 0, 1);
247 *pdata
= buf_get_u32(data_buf
, 0, 32);
252 static int avr32_jtag_mwa_write_data(struct avr32_jtag
*jtag_info
,
256 struct scan_field fields
[2];
263 memset(data_buf
, 0, sizeof(data_buf
));
264 memset(busy_buf
, 0, sizeof(busy_buf
));
265 memset(zero_buf
, 0, sizeof(zero_buf
));
267 buf_set_u32(data_buf
, 0, 32, data
);
268 fields
[0].num_bits
= 3;
269 fields
[0].in_value
= busy_buf
;
270 fields
[0].out_value
= zero_buf
;
272 fields
[1].num_bits
= 32;
273 fields
[1].out_value
= data_buf
;
274 fields
[1].in_value
= NULL
;
277 jtag_add_dr_scan(jtag_info
->tap
, 2, fields
, TAP_IDLE
);
279 if (jtag_execute_queue() != ERROR_OK
) {
280 LOG_ERROR("%s: reading data failed", __func__
);
284 busy
= buf_get_u32(busy_buf
, 0, 1);
290 int avr32_jtag_mwa_read(struct avr32_jtag
*jtag_info
, int slave
,
291 uint32_t addr
, uint32_t *value
)
293 avr32_jtag_set_instr(jtag_info
, AVR32_INST_MW_ACCESS
);
294 avr32_jtag_mwa_set_address(jtag_info
, slave
, addr
, MODE_READ
);
295 avr32_jtag_mwa_read_data(jtag_info
, value
);
300 int avr32_jtag_mwa_write(struct avr32_jtag
*jtag_info
, int slave
,
301 uint32_t addr
, uint32_t value
)
303 avr32_jtag_set_instr(jtag_info
, AVR32_INST_MW_ACCESS
);
304 avr32_jtag_mwa_set_address(jtag_info
, slave
, addr
, MODE_WRITE
);
305 avr32_jtag_mwa_write_data(jtag_info
, value
);
310 int avr32_jtag_exec(struct avr32_jtag
*jtag_info
, uint32_t inst
)
315 retval
= avr32_jtag_nexus_write(jtag_info
, AVR32_OCDREG_DINST
, inst
);
316 if (retval
!= ERROR_OK
)
320 retval
= avr32_jtag_nexus_read(jtag_info
, AVR32_OCDREG_DS
, &ds
);
321 if (retval
!= ERROR_OK
)
323 } while ((ds
& OCDREG_DS_DBA
) && !(ds
& OCDREG_DS_INC
));
328 int avr32_ocd_setbits(struct avr32_jtag
*jtag
, int reg
, uint32_t bits
)
333 res
= avr32_jtag_nexus_read(jtag
, reg
, &value
);
338 res
= avr32_jtag_nexus_write(jtag
, reg
, value
);
345 int avr32_ocd_clearbits(struct avr32_jtag
*jtag
, int reg
, uint32_t bits
)
350 res
= avr32_jtag_nexus_read(jtag
, reg
, &value
);
355 res
= avr32_jtag_nexus_write(jtag
, reg
, value
);