ipdbg: fix double free of virtual-ir data
[openocd.git] / src / target / avr32_jtag.c
bloba9c4f8dd64fbf3cf0222a2cd9a0e83bb3a8a68ee
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 /***************************************************************************
4 * Copyright (C) 2010 by Oleksandr Tymoshenko <gonzo@bluezbox.com> *
5 ***************************************************************************/
7 #ifdef HAVE_CONFIG_H
8 #include "config.h"
9 #endif
11 #include "target.h"
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)
17 struct jtag_tap *tap;
18 int busy = 0;
20 tap = jtag_info->tap;
21 if (!tap)
22 return ERROR_FAIL;
24 if (buf_get_u32(tap->cur_instr, 0, tap->ir_length) != (uint32_t)new_instr) {
25 do {
26 struct scan_field field;
27 uint8_t t[4] = { 0 };
28 uint8_t ret[4];
30 field.num_bits = tap->ir_length;
31 field.out_value = t;
32 buf_set_u32(t, 0, field.num_bits, new_instr);
33 field.in_value = ret;
35 jtag_add_ir_scan(tap, &field, TAP_IDLE);
36 if (jtag_execute_queue() != ERROR_OK) {
37 LOG_ERROR("%s: setting address failed", __func__);
38 return ERROR_FAIL;
40 busy = buf_get_u32(ret, 2, 1);
41 } while (busy); /* check for busy bit */
44 return ERROR_OK;
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];
51 uint8_t addr_buf[4];
52 uint8_t busy_buf[4];
53 int busy;
55 memset(fields, 0, sizeof(fields));
57 do {
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__);
75 return ERROR_FAIL;
77 busy = buf_get_u32(busy_buf, 6, 1);
78 } while (busy);
80 return ERROR_OK;
84 static int avr32_jtag_nexus_read_data(struct avr32_jtag *jtag_info,
85 uint32_t *pdata)
88 struct scan_field fields[2];
89 uint8_t data_buf[4];
90 uint8_t busy_buf[4];
91 int busy;
93 do {
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__);
110 return ERROR_FAIL;
113 busy = buf_get_u32(busy_buf, 0, 1);
114 } while (busy);
116 *pdata = buf_get_u32(data_buf, 0, 32);
118 return ERROR_OK;
121 static int avr32_jtag_nexus_write_data(struct avr32_jtag *jtag_info,
122 uint32_t data)
125 struct scan_field fields[2];
126 uint8_t data_buf[4];
127 uint8_t busy_buf[4];
128 uint8_t dummy_buf[4];
129 int busy;
131 do {
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__);
150 return ERROR_FAIL;
153 busy = buf_get_u32(busy_buf, 0, 0);
154 } while (busy);
157 return ERROR_OK;
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];
180 uint8_t addr_buf[4];
181 uint8_t slave_buf[4];
182 uint8_t busy_buf[4];
183 int busy;
185 memset(fields, 0, sizeof(fields));
187 do {
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__);
207 return ERROR_FAIL;
209 busy = buf_get_u32(busy_buf, 1, 1);
210 } while (busy);
212 return ERROR_OK;
215 static int avr32_jtag_mwa_read_data(struct avr32_jtag *jtag_info,
216 uint32_t *pdata)
219 struct scan_field fields[2];
220 uint8_t data_buf[4];
221 uint8_t busy_buf[4];
222 int busy;
224 do {
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__);
241 return ERROR_FAIL;
244 busy = buf_get_u32(busy_buf, 0, 1);
245 } while (busy);
247 *pdata = buf_get_u32(data_buf, 0, 32);
249 return ERROR_OK;
252 static int avr32_jtag_mwa_write_data(struct avr32_jtag *jtag_info,
253 uint32_t data)
256 struct scan_field fields[2];
257 uint8_t data_buf[4];
258 uint8_t busy_buf[4];
259 uint8_t zero_buf[4];
260 int busy;
262 do {
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__);
281 return ERROR_FAIL;
284 busy = buf_get_u32(busy_buf, 0, 1);
285 } while (busy);
287 return ERROR_OK;
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);
297 return ERROR_OK;
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);
307 return ERROR_OK;
310 int avr32_jtag_exec(struct avr32_jtag *jtag_info, uint32_t inst)
312 int retval;
313 uint32_t ds;
315 retval = avr32_jtag_nexus_write(jtag_info, AVR32_OCDREG_DINST, inst);
316 if (retval != ERROR_OK)
317 return retval;
319 do {
320 retval = avr32_jtag_nexus_read(jtag_info, AVR32_OCDREG_DS, &ds);
321 if (retval != ERROR_OK)
322 return retval;
323 } while ((ds & OCDREG_DS_DBA) && !(ds & OCDREG_DS_INC));
325 return ERROR_OK;
328 int avr32_ocd_setbits(struct avr32_jtag *jtag, int reg, uint32_t bits)
330 uint32_t value;
331 int res;
333 res = avr32_jtag_nexus_read(jtag, reg, &value);
334 if (res)
335 return res;
337 value |= bits;
338 res = avr32_jtag_nexus_write(jtag, reg, value);
339 if (res)
340 return res;
342 return ERROR_OK;
345 int avr32_ocd_clearbits(struct avr32_jtag *jtag, int reg, uint32_t bits)
347 uint32_t value;
348 int res;
350 res = avr32_jtag_nexus_read(jtag, reg, &value);
351 if (res)
352 return res;
354 value &= ~bits;
355 res = avr32_jtag_nexus_write(jtag, reg, value);
356 if (res)
357 return res;
359 return ERROR_OK;