target/dsp563xx: review scope of symbols
[openocd.git] / src / target / dsp563xx.c
1 /***************************************************************************
2 * Copyright (C) 2009 by Mathias Kuester *
3 * mkdorg@users.sourceforge.net *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
20 #ifdef HAVE_CONFIG_H
21 #include "config.h"
22 #endif
23
24 #include <helper/jim.h>
25
26 #include "target.h"
27 #include "target_type.h"
28 #include "register.h"
29 #include "dsp563xx.h"
30 #include "dsp563xx_once.h"
31
32 #define DSP563XX_JTAG_INS_LEN 4
33
34 #define JTAG_STATUS_NORMAL 0x01
35 #define JTAG_STATUS_STOPWAIT 0x05
36 #define JTAG_STATUS_BUSY 0x09
37 #define JTAG_STATUS_DEBUG 0x0d
38
39 #define JTAG_INSTR_EXTEST 0x00
40 #define JTAG_INSTR_SAMPLE_PRELOAD 0x01
41 #define JTAG_INSTR_IDCODE 0x02
42 #define JTAG_INSTR_CLAMP 0x03
43 #define JTAG_INSTR_HIZ 0x04
44 #define JTAG_INSTR_ENABLE_ONCE 0x06
45 #define JTAG_INSTR_DEBUG_REQUEST 0x07
46 #define JTAG_INSTR_BYPASS 0x0F
47
48 /* forward declarations */
49 static int dsp563xx_write_ir_u8(struct jtag_tap *tap, uint8_t * ir_in, uint8_t ir_out,
50 int ir_len, int rti);
51
52 /* IR and DR functions */
53 static int dsp563xx_jtag_sendinstr(struct jtag_tap *tap, uint8_t * ir_in, uint8_t ir_out);
54 int dsp563xx_jtag_senddat(struct jtag_tap *tap, uint32_t * dr_in, uint32_t dr_out,
55 int len);
56
57 #define ASM_REG_R_R0 0x607000
58 #define ASM_REG_R_R1 0x617000
59 #define ASM_REG_R_R2 0x627000
60 #define ASM_REG_R_R3 0x637000
61 #define ASM_REG_R_R4 0x647000
62 #define ASM_REG_R_R5 0x657000
63 #define ASM_REG_R_R6 0x667000
64 #define ASM_REG_R_R7 0x677000
65
66 #define ASM_REG_W_R0 0x60F400
67 #define ASM_REG_W_R1 0x61F400
68 #define ASM_REG_W_R2 0x62F400
69 #define ASM_REG_W_R3 0x63F400
70 #define ASM_REG_W_R4 0x64F400
71 #define ASM_REG_W_R5 0x65F400
72 #define ASM_REG_W_R6 0x66F400
73 #define ASM_REG_W_R7 0x67F400
74
75 #define ASM_REG_R_N0 0x707000
76 #define ASM_REG_R_N1 0x717000
77 #define ASM_REG_R_N2 0x727000
78 #define ASM_REG_R_N3 0x737000
79 #define ASM_REG_R_N4 0x747000
80 #define ASM_REG_R_N5 0x757000
81 #define ASM_REG_R_N6 0x767000
82 #define ASM_REG_R_N7 0x777000
83
84 #define ASM_REG_W_N0 0x70F400
85 #define ASM_REG_W_N1 0x71F400
86 #define ASM_REG_W_N2 0x72F400
87 #define ASM_REG_W_N3 0x73F400
88 #define ASM_REG_W_N4 0x74F400
89 #define ASM_REG_W_N5 0x75F400
90 #define ASM_REG_W_N6 0x76F400
91 #define ASM_REG_W_N7 0x77F400
92
93 #define ASM_REG_R_M0 0x057020 /* control register m[0..7] */
94 #define ASM_REG_R_M1 0x057021
95 #define ASM_REG_R_M2 0x057022
96 #define ASM_REG_R_M3 0x057023
97 #define ASM_REG_R_M4 0x057024
98 #define ASM_REG_R_M5 0x057025
99 #define ASM_REG_R_M6 0x057026
100 #define ASM_REG_R_M7 0x057027
101
102 #define ASM_REG_W_M0 0x05F420
103 #define ASM_REG_W_M1 0x05F421
104 #define ASM_REG_W_M2 0x05F422
105 #define ASM_REG_W_M3 0x05F423
106 #define ASM_REG_W_M4 0x05F424
107 #define ASM_REG_W_M5 0x05F425
108 #define ASM_REG_W_M6 0x05F426
109 #define ASM_REG_W_M7 0x05F427
110
111 #define ASM_REG_R_X0 0x447000
112 #define ASM_REG_R_X1 0x457000
113
114 #define ASM_REG_W_X0 0x44F400
115 #define ASM_REG_W_X1 0x45F400
116
117 #define ASM_REG_R_Y0 0x467000
118 #define ASM_REG_R_Y1 0x477000
119
120 #define ASM_REG_W_Y0 0x46F400
121 #define ASM_REG_W_Y1 0x47F400
122
123 #define ASM_REG_R_A0 0x507000
124 #define ASM_REG_R_A1 0x547000
125 #define ASM_REG_R_A2 0x527000
126
127 #define ASM_REG_W_A0 0x50F400
128 #define ASM_REG_W_A1 0x54F400
129 #define ASM_REG_W_A2 0x52F400
130
131 #define ASM_REG_R_B0 0x517000
132 #define ASM_REG_R_B1 0x557000
133 #define ASM_REG_R_B2 0x537000
134
135 #define ASM_REG_W_B0 0x51F400
136 #define ASM_REG_W_B1 0x55F400
137 #define ASM_REG_W_B2 0x53F400
138
139 #define ASM_REG_R_VBA 0x057030 /* control register */
140 #define ASM_REG_W_VBA 0x05F430
141
142 #define ASM_REG_R_OMR 0x05703A /* control register */
143 #define ASM_REG_W_OMR 0x05F43A
144
145 #define ASM_REG_R_EP 0x05702A
146 #define ASM_REG_W_EP 0x05F42A
147
148 #define ASM_REG_R_SC 0x057031 /* stack counter */
149 #define ASM_REG_W_SC 0x05F431
150
151 #define ASM_REG_R_SZ 0x057038 /* stack size */
152 #define ASM_REG_W_SZ 0x05F438
153
154 #define ASM_REG_R_SR 0x057039 /* control register, status register */
155 #define ASM_REG_W_SR 0x05F439
156
157 #define ASM_REG_R_SP 0x05703B /* control register, stack pointer */
158 #define ASM_REG_W_SP 0x05F43B
159
160 #define ASM_REG_R_SSH 0x05703C /* control register, system stack high */
161 #define ASM_REG_W_SSH 0x05743C
162
163 #define ASM_REG_R_SSL 0x05703D /* control register, system stack low */
164 #define ASM_REG_W_SSL 0x05F43D
165
166 #define ASM_REG_R_LA 0x05703E /* control register, loop address */
167 #define ASM_REG_W_LA 0x05F43E
168
169 #define ASM_REG_R_LC 0x05703F /* control register, loop count */
170 #define ASM_REG_W_LC 0x05F43F
171
172 #define ASM_REG_R_PC 0x000000
173 #define ASM_REG_W_PC 0x000000
174
175 static const struct
176 {
177 unsigned id;
178 char *name;
179 unsigned bits;
180 uint32_t r_cmd;
181 uint32_t w_cmd;
182 } dsp563xx_regs[] =
183 {
184 /* *INDENT-OFF* */
185 {0, "r0", 24, ASM_REG_R_R0, ASM_REG_W_R0},
186 {1, "r1", 24, ASM_REG_R_R1, ASM_REG_W_R1},
187 {2, "r2", 24, ASM_REG_R_R2, ASM_REG_W_R2},
188 {3, "r3", 24, ASM_REG_R_R3, ASM_REG_W_R3},
189 {4, "r4", 24, ASM_REG_R_R4, ASM_REG_W_R4},
190 {5, "r5", 24, ASM_REG_R_R5, ASM_REG_W_R5},
191 {6, "r6", 24, ASM_REG_R_R6, ASM_REG_W_R6},
192 {7, "r7", 24, ASM_REG_R_R7, ASM_REG_W_R7},
193 {8, "n0", 24, ASM_REG_R_N0, ASM_REG_W_N0},
194 {9, "n1", 24, ASM_REG_R_N1, ASM_REG_W_N1},
195 {10, "n2", 24, ASM_REG_R_N2, ASM_REG_W_N2},
196 {11, "n3", 24, ASM_REG_R_N3, ASM_REG_W_N3},
197 {12, "n4", 24, ASM_REG_R_N4, ASM_REG_W_N4},
198 {13, "n5", 24, ASM_REG_R_N5, ASM_REG_W_N5},
199 {14, "n6", 24, ASM_REG_R_N6, ASM_REG_W_N6},
200 {15, "n7", 24, ASM_REG_R_N7, ASM_REG_W_N7},
201 {16, "m0", 24, ASM_REG_R_M0, ASM_REG_W_M0},
202 {17, "m1", 24, ASM_REG_R_M1, ASM_REG_W_M1},
203 {18, "m2", 24, ASM_REG_R_M2, ASM_REG_W_M2},
204 {19, "m3", 24, ASM_REG_R_M3, ASM_REG_W_M3},
205 {20, "m4", 24, ASM_REG_R_M4, ASM_REG_W_M4},
206 {21, "m5", 24, ASM_REG_R_M5, ASM_REG_W_M5},
207 {22, "m6", 24, ASM_REG_R_M6, ASM_REG_W_M6},
208 {23, "m7", 24, ASM_REG_R_M7, ASM_REG_W_M7},
209 {24, "x0", 24, ASM_REG_R_X0, ASM_REG_W_X0},
210 {25, "x1", 24, ASM_REG_R_X1, ASM_REG_W_X1},
211 {26, "y0", 24, ASM_REG_R_Y0, ASM_REG_W_Y0},
212 {27, "y1", 24, ASM_REG_R_Y1, ASM_REG_W_Y1},
213 {28, "a0", 24, ASM_REG_R_A0, ASM_REG_W_A0},
214 {29, "a1", 24, ASM_REG_R_A1, ASM_REG_W_A1},
215 {30, "a2", 8, ASM_REG_R_A2, ASM_REG_W_A2},
216 {31, "b0", 24, ASM_REG_R_B0, ASM_REG_W_B0},
217 {32, "b1", 24, ASM_REG_R_B1, ASM_REG_W_B1},
218 {33, "b2", 8, ASM_REG_R_B2, ASM_REG_W_B2},
219 {34, "omr", 24, ASM_REG_R_OMR, ASM_REG_W_OMR},
220 {35, "vba", 24, ASM_REG_R_VBA, ASM_REG_W_VBA},
221 {36, "ep", 24, ASM_REG_R_EP, ASM_REG_W_EP},
222 {37, "sc", 24, ASM_REG_R_SC, ASM_REG_W_SC},
223 {38, "sz", 24, ASM_REG_R_SZ, ASM_REG_W_SZ},
224 {39, "sr", 24, ASM_REG_R_SR, ASM_REG_W_SR},
225 {40, "sp", 24, ASM_REG_R_SP, ASM_REG_W_SP},
226 {41, "la", 24, ASM_REG_R_LA, ASM_REG_W_LA},
227 {42, "lc", 24, ASM_REG_R_LC, ASM_REG_W_LC},
228 {43, "pc", 24, ASM_REG_R_PC, ASM_REG_W_PC}
229 /* *INDENT-ON* */
230 };
231
232 static int dsp563xx_get_gdb_reg_list(struct target *target, struct reg **reg_list[],
233 int *reg_list_size)
234 {
235 struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
236 int i;
237
238 if (target->state != TARGET_HALTED)
239 {
240 return ERROR_TARGET_NOT_HALTED;
241 }
242
243 *reg_list_size = DSP563XX_NUMCOREREGS;
244 *reg_list = malloc(sizeof(struct reg *) * (*reg_list_size));
245
246 for (i = 0; i < DSP563XX_NUMCOREREGS; i++)
247 {
248 (*reg_list)[i] = &dsp563xx->core_cache->reg_list[i];
249 }
250
251 return ERROR_OK;
252
253 }
254
255 static int dsp563xx_read_core_reg(struct target *target, int num)
256 {
257 uint32_t reg_value;
258 struct dsp563xx_core_reg *dsp563xx_core_reg;
259 struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
260
261 if ((num < 0) || (num >= DSP563XX_NUMCOREREGS))
262 return ERROR_INVALID_ARGUMENTS;
263
264 dsp563xx_core_reg = dsp563xx->core_cache->reg_list[num].arch_info;
265 reg_value = dsp563xx->core_regs[num];
266 buf_set_u32(dsp563xx->core_cache->reg_list[num].value, 0, 32, reg_value);
267 dsp563xx->core_cache->reg_list[num].valid = 1;
268 dsp563xx->core_cache->reg_list[num].dirty = 0;
269
270 return ERROR_OK;
271 }
272
273 static int dsp563xx_write_core_reg(struct target *target, int num)
274 {
275 uint32_t reg_value;
276 struct dsp563xx_core_reg *dsp563xx_core_reg;
277 struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
278
279 if ((num < 0) || (num >= DSP563XX_NUMCOREREGS))
280 return ERROR_INVALID_ARGUMENTS;
281
282 reg_value = buf_get_u32(dsp563xx->core_cache->reg_list[num].value, 0, 32);
283 dsp563xx_core_reg = dsp563xx->core_cache->reg_list[num].arch_info;
284 dsp563xx->core_regs[num] = reg_value;
285 dsp563xx->core_cache->reg_list[num].valid = 1;
286 dsp563xx->core_cache->reg_list[num].dirty = 0;
287
288 return ERROR_OK;
289 }
290
291 static int dsp563xx_target_create(struct target *target, Jim_Interp * interp)
292 {
293 struct dsp563xx_common *dsp563xx = calloc(1, sizeof(struct dsp563xx_common));
294
295 dsp563xx->jtag_info.tap = target->tap;
296 target->arch_info = dsp563xx;
297 dsp563xx->read_core_reg = dsp563xx_read_core_reg;
298 dsp563xx->write_core_reg = dsp563xx_write_core_reg;
299
300 return ERROR_OK;
301 }
302
303 static int dsp563xx_get_core_reg(struct reg *reg)
304 {
305 int retval = 0;
306
307 LOG_DEBUG("%s", __FUNCTION__);
308
309 struct dsp563xx_core_reg *dsp563xx_reg = reg->arch_info;
310 struct target *target = dsp563xx_reg->target;
311 struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
312
313 if (target->state != TARGET_HALTED)
314 {
315 return ERROR_TARGET_NOT_HALTED;
316 }
317
318 retval = dsp563xx->read_core_reg(target, dsp563xx_reg->num);
319
320 return retval;
321 }
322
323 static int dsp563xx_set_core_reg(struct reg *reg, uint8_t * buf)
324 {
325 LOG_DEBUG("%s", __FUNCTION__);
326
327 struct dsp563xx_core_reg *dsp563xx_reg = reg->arch_info;
328 struct target *target = dsp563xx_reg->target;
329 uint32_t value = buf_get_u32(buf, 0, 32);
330
331 if (target->state != TARGET_HALTED)
332 {
333 return ERROR_TARGET_NOT_HALTED;
334 }
335
336 buf_set_u32(reg->value, 0, reg->size, value);
337 reg->dirty = 1;
338 reg->valid = 1;
339
340 return ERROR_OK;
341 }
342
343 static int dsp563xx_save_context(struct target *target)
344 {
345 int i;
346 uint32_t data = 0;
347 struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
348 struct dsp563xx_core_reg *arch_info;
349
350 for (i = 0; i < DSP563XX_NUMCOREREGS - 1; i++)
351 {
352
353 // if (!dsp563xx->core_cache->reg_list[i].valid)
354 {
355 arch_info = dsp563xx->core_cache->reg_list[i].arch_info;
356 dsp563xx_once_execute_dw_ir(target->tap, arch_info->r_cmd,
357 0xfffffc);
358 dsp563xx_once_execute_sw_ir(target->tap, 0x000000);
359 dsp563xx_once_reg_read(target->tap, DSP563XX_ONCE_OGDBR,
360 &data);
361 dsp563xx->core_regs[i] = data;
362 dsp563xx->read_core_reg(target, i);
363 }
364 }
365
366 /* read pc */
367 dsp563xx_once_reg_read(target->tap, DSP563XX_ONCE_OPABEX, &data);
368 dsp563xx->core_regs[i] = data;
369 dsp563xx->read_core_reg(target, i);
370
371 return ERROR_OK;
372 }
373
374 static int dsp563xx_restore_context(struct target *target)
375 {
376 int i;
377 struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
378 struct dsp563xx_core_reg *arch_info;
379
380 for (i = 0; i < DSP563XX_NUMCOREREGS - 1; i++)
381 {
382 if (dsp563xx->core_cache->reg_list[i].dirty)
383 {
384 arch_info = dsp563xx->core_cache->reg_list[i].arch_info;
385
386 dsp563xx->write_core_reg(target, i);
387
388 dsp563xx_once_execute_dw_ir(target->tap, arch_info->w_cmd,
389 dsp563xx->core_regs[i]);
390 dsp563xx_once_execute_sw_ir(target->tap, 0x000000);
391 }
392 }
393
394 return ERROR_OK;
395 }
396
397 static const struct reg_arch_type dsp563xx_reg_type = {
398 .get = dsp563xx_get_core_reg,
399 .set = dsp563xx_set_core_reg,
400 };
401
402 static int dsp563xx_init_target(struct command_context *cmd_ctx, struct target *target)
403 {
404 /* get pointers to arch-specific information */
405 struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
406
407 struct reg_cache **cache_p = register_get_last_cache_p(&target->reg_cache);
408 struct reg_cache *cache = malloc(sizeof(struct reg_cache));
409 struct reg *reg_list = malloc(sizeof(struct reg) * DSP563XX_NUMCOREREGS);
410 struct dsp563xx_core_reg *arch_info =
411 malloc(sizeof(struct dsp563xx_core_reg) * DSP563XX_NUMCOREREGS);
412 int i;
413
414 LOG_DEBUG("%s", __FUNCTION__);
415
416 /* Build the process context cache */
417 cache->name = "dsp563xx registers";
418 cache->next = NULL;
419 cache->reg_list = reg_list;
420 cache->num_regs = DSP563XX_NUMCOREREGS;
421 (*cache_p) = cache;
422 dsp563xx->core_cache = cache;
423
424 for (i = 0; i < DSP563XX_NUMCOREREGS; i++)
425 {
426 arch_info[i].num = dsp563xx_regs[i].id;
427 arch_info[i].name = dsp563xx_regs[i].name;
428 arch_info[i].size = dsp563xx_regs[i].bits;
429 arch_info[i].r_cmd = dsp563xx_regs[i].r_cmd;
430 arch_info[i].w_cmd = dsp563xx_regs[i].w_cmd;
431 arch_info[i].target = target;
432 arch_info[i].dsp563xx_common = dsp563xx;
433 reg_list[i].name = dsp563xx_regs[i].name;
434 reg_list[i].size = dsp563xx_regs[i].bits;
435 reg_list[i].value = calloc(1, 4);
436 reg_list[i].dirty = 0;
437 reg_list[i].valid = 0;
438 reg_list[i].type = &dsp563xx_reg_type;
439 reg_list[i].arch_info = &arch_info[i];
440 }
441
442 return ERROR_OK;
443 }
444
445 static int dsp563xx_arch_state(struct target *target)
446 {
447 LOG_DEBUG("%s", __FUNCTION__);
448 return ERROR_OK;
449 }
450
451 static int dsp563xx_jtag_status(struct target *target, uint8_t * status)
452 {
453 uint8_t ir_in;
454
455 ir_in = 0;
456
457 dsp563xx_jtag_sendinstr(target->tap, &ir_in, JTAG_INSTR_ENABLE_ONCE);
458 dsp563xx_execute_queue();
459
460 *status = ir_in;
461
462 return ERROR_OK;
463 }
464
465 static int dsp563xx_jtag_debug_request(struct target *target)
466 {
467 uint8_t ir_in = 0;
468 uint32_t retry = 0;
469
470 while (ir_in != JTAG_STATUS_DEBUG)
471 {
472 dsp563xx_jtag_sendinstr(target->tap, &ir_in,
473 JTAG_INSTR_DEBUG_REQUEST);
474 dsp563xx_execute_queue();
475 LOG_DEBUG("JTAG CMD 7 res: %02X", ir_in);
476 dsp563xx_jtag_sendinstr(target->tap, &ir_in, JTAG_INSTR_ENABLE_ONCE);
477 dsp563xx_execute_queue();
478 LOG_DEBUG("JTAG CMD 6 res: %02X", ir_in);
479
480 if (retry++ == 100)
481 return ERROR_TARGET_FAILURE;
482 }
483
484 if (ir_in != JTAG_STATUS_DEBUG)
485 {
486 return ERROR_TARGET_FAILURE;
487 }
488
489 return ERROR_OK;
490 }
491
492 static int dsp563xx_poll(struct target *target)
493 {
494 uint8_t jtag_status;
495 uint32_t once_status;
496
497 dsp563xx_jtag_status(target, &jtag_status);
498
499 if ((jtag_status & 1) != 1)
500 {
501 target->state = TARGET_UNKNOWN;
502 LOG_ERROR
503 ("jtag status contains invalid mode value - communication failure");
504 return ERROR_TARGET_FAILURE;
505 }
506
507 if (jtag_status != JTAG_STATUS_DEBUG)
508 {
509 target->state = TARGET_RUNNING;
510 }
511
512 dsp563xx_once_reg_read(target->tap, DSP563XX_ONCE_OSCR, &once_status);
513
514 if ((once_status & DSP563XX_ONCE_OSCR_DEBUG_M) == DSP563XX_ONCE_OSCR_DEBUG_M)
515 {
516 target->state = TARGET_HALTED;
517
518 }
519
520 return ERROR_OK;
521 }
522
523 static int dsp563xx_halt(struct target *target)
524 {
525 uint8_t jtag_status;
526 uint32_t once_status;
527 struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
528
529 if (target->state == TARGET_HALTED)
530 {
531 LOG_DEBUG("target was already halted");
532 return ERROR_OK;
533 }
534
535 if (target->state == TARGET_UNKNOWN)
536 {
537 LOG_WARNING("target was in unknown state when halt was requested");
538 }
539
540 // if ( jtag_status != 0x0d )
541 {
542 dsp563xx_jtag_debug_request(target);
543
544 /* store pipeline register */
545 dsp563xx_once_reg_read(target->tap, DSP563XX_ONCE_OPILR,
546 &dsp563xx->pipeline_context.once_opilr);
547 dsp563xx_once_reg_read(target->tap, DSP563XX_ONCE_OPDBR,
548 &dsp563xx->pipeline_context.once_opdbr);
549
550 dsp563xx_save_context(target);
551
552 dsp563xx_jtag_status(target, &jtag_status);
553 LOG_DEBUG("%02X", jtag_status);
554 dsp563xx_once_reg_read(target->tap, DSP563XX_ONCE_OSCR,
555 &once_status);
556 LOG_DEBUG("%02X", (unsigned) once_status);
557 }
558
559 LOG_DEBUG("target->state: %s", target_state_name(target));
560
561 LOG_DEBUG("%s", __FUNCTION__);
562
563 return ERROR_OK;
564 }
565
566 #define DSP563XX_ASM_CMD_JUMP 0x0AF080
567
568 static int dsp563xx_resume(struct target *target, int current, uint32_t address,
569 int handle_breakpoints, int debug_execution)
570 {
571 struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
572
573 LOG_DEBUG("%s", __FUNCTION__);
574
575 dsp563xx_restore_context(target);
576
577 if (current)
578 {
579 /* restore pipeline registers and go */
580 dsp563xx_once_reg_write(target->tap, DSP563XX_ONCE_OPILR,
581 dsp563xx->pipeline_context.once_opilr);
582 dsp563xx_once_reg_write(target->tap,
583 DSP563XX_ONCE_OPDBR | DSP563XX_ONCE_OCR_EX |
584 DSP563XX_ONCE_OCR_GO,
585 dsp563xx->pipeline_context.once_opdbr);
586 }
587 else
588 {
589 /* set to go register and jump */
590 dsp563xx_once_reg_write(target->tap, DSP563XX_ONCE_OPDBR,
591 DSP563XX_ASM_CMD_JUMP);
592 dsp563xx_once_reg_write(target->tap,
593 DSP563XX_ONCE_PDBGOTO | DSP563XX_ONCE_OCR_EX
594 | DSP563XX_ONCE_OCR_GO, address);
595 }
596
597 target->state = TARGET_RUNNING;
598
599 return ERROR_OK;
600 }
601
602 static int dsp563xx_step(struct target *target, int current, uint32_t address,
603 int handle_breakpoints)
604 {
605 uint32_t once_status;
606 uint32_t dr_in, cnt;
607 struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
608
609 if (target->state != TARGET_HALTED)
610 {
611 LOG_DEBUG("target was not halted");
612 return ERROR_OK;
613 }
614
615 LOG_DEBUG("%s %08X %08X", __FUNCTION__, current, (unsigned) address);
616
617 dsp563xx_jtag_debug_request(target);
618
619 dsp563xx_restore_context(target);
620
621 /* reset trace mode */
622 dsp563xx_once_reg_write(target->tap, DSP563XX_ONCE_OSCR, 0x000000);
623 /* enable trace mode */
624 dsp563xx_once_reg_write(target->tap, DSP563XX_ONCE_OSCR,
625 DSP563XX_ONCE_OSCR_TME);
626
627 cnt = 0;
628
629 /* on JUMP we need one extra cycle */
630 if (!current)
631 cnt++;
632
633 /* load step counter with N-1 */
634 dsp563xx_once_reg_write(target->tap, DSP563XX_ONCE_OTC, cnt);
635
636 if (current)
637 {
638 /* restore pipeline registers and go */
639 dsp563xx_once_reg_write(target->tap, DSP563XX_ONCE_OPILR,
640 dsp563xx->pipeline_context.once_opilr);
641 dsp563xx_once_reg_write(target->tap,
642 DSP563XX_ONCE_OPDBR | DSP563XX_ONCE_OCR_EX |
643 DSP563XX_ONCE_OCR_GO,
644 dsp563xx->pipeline_context.once_opdbr);
645 }
646 else
647 {
648 /* set to go register and jump */
649 dsp563xx_once_reg_write(target->tap, DSP563XX_ONCE_OPDBR,
650 DSP563XX_ASM_CMD_JUMP);
651 dsp563xx_once_reg_write(target->tap,
652 DSP563XX_ONCE_PDBGOTO | DSP563XX_ONCE_OCR_EX
653 | DSP563XX_ONCE_OCR_GO, address);
654 }
655
656 while (1)
657 {
658 dsp563xx_once_reg_read(target->tap, DSP563XX_ONCE_OSCR,
659 &once_status);
660
661 if (once_status & DSP563XX_ONCE_OSCR_TO)
662 {
663 /* store pipeline register */
664 dsp563xx_once_reg_read(target->tap, DSP563XX_ONCE_OPILR,
665 &dsp563xx->pipeline_context.
666 once_opilr);
667 dsp563xx_once_reg_read(target->tap, DSP563XX_ONCE_OPDBR,
668 &dsp563xx->pipeline_context.
669 once_opdbr);
670
671 dsp563xx_save_context(target);
672
673 dsp563xx_once_reg_read(target->tap, DSP563XX_ONCE_OPABFR,
674 &dr_in);
675 LOG_DEBUG("%08X", (unsigned) dr_in);
676 dsp563xx_once_reg_read(target->tap, DSP563XX_ONCE_OPABDR,
677 &dr_in);
678 LOG_DEBUG("%08X", (unsigned) dr_in);
679 dsp563xx_once_reg_read(target->tap, DSP563XX_ONCE_OPABEX,
680 &dr_in);
681 LOG_DEBUG("%08X", (unsigned) dr_in);
682
683 /* reset trace mode */
684 dsp563xx_once_reg_write(target->tap, DSP563XX_ONCE_OSCR,
685 0x000000);
686
687 break;
688 }
689 }
690
691 return ERROR_OK;
692 }
693
694 static int dsp563xx_assert_reset(struct target *target)
695 {
696 target->state = TARGET_RESET;
697
698 LOG_DEBUG("%s", __FUNCTION__);
699 return ERROR_OK;
700 }
701
702 static int dsp563xx_deassert_reset(struct target *target)
703 {
704 target->state = TARGET_RUNNING;
705
706 LOG_DEBUG("%s", __FUNCTION__);
707 return ERROR_OK;
708 }
709
710 static int dsp563xx_soft_reset_halt(struct target *target)
711 {
712 LOG_DEBUG("%s", __FUNCTION__);
713 return ERROR_OK;
714 }
715
716 /*
717 * 000000 nop
718 * 46F400 AABBCC move #$aabbcc,y0
719 * 60F400 AABBCC move #$aabbcc,r0
720 * 467000 AABBCC move y0,x:AABBCC
721 * 607000 AABBCC move r0,x:AABBCC
722
723 * 46E000 move x:(r0),y0
724 * 4EE000 move y:(r0),y0
725 * 07E086 move p:(r0),y0
726
727 * 0450B9 move sr,r0
728 * 0446BA move omr,y0
729 * 0446BC move ssh,y0
730 * 0446BD move ssl,y0
731 * 0446BE move la,y0
732 * 0446BF move lc,y0
733 *
734 * 61F000 AABBCC move x:AABBCC,r1
735 * 076190 movem r0,p:(r1)
736 *
737 */
738 static int dsp563xx_read_memory_p(struct target *target, uint32_t address,
739 uint32_t size, uint32_t count, uint8_t * buffer)
740 {
741 uint32_t i, x;
742 uint32_t data;
743 uint8_t *b;
744
745 LOG_DEBUG("address: 0x%8.8" PRIx32 ", size: 0x%8.8" PRIx32 ", count: 0x%8.8"
746 PRIx32, address, size, count);
747
748 if (target->state != TARGET_HALTED)
749 {
750 LOG_WARNING("target not halted");
751 return ERROR_TARGET_NOT_HALTED;
752 }
753
754 x = count;
755
756 for (i = 0; i < x; i++)
757 {
758 dsp563xx_once_execute_dw_ir_nq(target->tap, 0x60F400, address + i);
759 dsp563xx_once_execute_sw_ir_nq(target->tap, 0x07E086);
760 dsp563xx_once_execute_dw_ir_nq(target->tap, 0x467000, 0xfffffc);
761 dsp563xx_execute_queue();
762
763 dsp563xx_once_reg_read(target->tap, DSP563XX_ONCE_OGDBR, &data);
764
765 b = buffer + 4 * i;
766 if (size > 0)
767 *b++ = data >> 0;
768 if (size > 1)
769 *b++ = data >> 8;
770 if (size > 2)
771 *b++ = data >> 16;
772 if (size > 3)
773 *b++ = 0x00;
774 }
775
776 return ERROR_OK;
777 }
778
779 static int dsp563xx_write_memory_p(struct target *target, uint32_t address, uint32_t size,
780 uint32_t count, uint8_t * buffer)
781 {
782 uint32_t i, x;
783 uint32_t data;
784 uint8_t *b;
785
786 LOG_DEBUG("address: 0x%8.8" PRIx32 ", size: 0x%8.8" PRIx32 ", count: 0x%8.8"
787 PRIx32 "", address, size, count);
788
789 if (target->state != TARGET_HALTED)
790 {
791 LOG_WARNING("target not halted");
792 return ERROR_TARGET_NOT_HALTED;
793 }
794
795 x = count;
796
797 for (i = 0; i < x; i++)
798 {
799 b = buffer + 4 * i;
800
801 data = 0;
802 if (size > 0)
803 data = *buffer++;
804 if (size > 1)
805 data |= (*buffer++) << 8;
806 if (size > 2)
807 data |= (*buffer++) << 16;
808 if (size > 3)
809 data |= (*buffer++) << 24;
810
811 // LOG_DEBUG("%08X", data);
812
813 dsp563xx_once_execute_dw_ir_nq(target->tap, 0x61F400, address + i);
814 dsp563xx_once_execute_dw_ir_nq(target->tap, 0x60F400, data);
815 dsp563xx_once_execute_sw_ir_nq(target->tap, 0x076190);
816 dsp563xx_execute_queue();
817 }
818
819 return ERROR_OK;
820 }
821
822 int dsp563xx_jtag_senddat(struct jtag_tap *tap, uint32_t * dr_in, uint32_t dr_out,
823 int len)
824 {
825 return dsp563xx_write_dr_u32(tap, dr_in, dr_out, len, 1);
826 }
827
828 static int dsp563xx_jtag_sendinstr(struct jtag_tap *tap, uint8_t * ir_in, uint8_t ir_out)
829 {
830 return dsp563xx_write_ir_u8(tap, ir_in, ir_out, DSP563XX_JTAG_INS_LEN, 1);
831 }
832
833 /* IR and DR functions */
834 static int dsp563xx_write_ir(struct jtag_tap *tap, uint8_t * ir_in, uint8_t * ir_out,
835 int ir_len, int rti)
836 {
837 if (NULL == tap)
838 {
839 LOG_ERROR("invalid tap");
840 return ERROR_FAIL;
841 }
842 if (ir_len != tap->ir_length)
843 {
844 LOG_ERROR("invalid ir_len");
845 return ERROR_FAIL;
846 }
847
848 {
849 jtag_add_plain_ir_scan(tap->ir_length, ir_out, ir_in, TAP_IDLE);
850 }
851
852 return ERROR_OK;
853 }
854
855 static int dsp563xx_write_dr(struct jtag_tap *tap, uint8_t * dr_in, uint8_t * dr_out,
856 int dr_len, int rti)
857 {
858 if (NULL == tap)
859 {
860 LOG_ERROR("invalid tap");
861 return ERROR_FAIL;
862 }
863
864 {
865 jtag_add_plain_dr_scan(dr_len, dr_out, dr_in, TAP_IDLE);
866 }
867
868 return ERROR_OK;
869 }
870
871 static int dsp563xx_write_ir_u8(struct jtag_tap *tap, uint8_t * ir_in, uint8_t ir_out,
872 int ir_len, int rti)
873 {
874 if (ir_len > 8)
875 {
876 LOG_ERROR("ir_len overflow, maxium is 8");
877 return ERROR_FAIL;
878 }
879
880 dsp563xx_write_ir(tap, ir_in, &ir_out, ir_len, rti);
881
882 return ERROR_OK;
883 }
884
885 int dsp563xx_write_dr_u8(struct jtag_tap *tap, uint8_t * dr_in, uint8_t dr_out,
886 int dr_len, int rti)
887 {
888 if (dr_len > 8)
889 {
890 LOG_ERROR("dr_len overflow, maxium is 8");
891 return ERROR_FAIL;
892 }
893
894 dsp563xx_write_dr(tap, dr_in, &dr_out, dr_len, rti);
895
896 return ERROR_OK;
897 }
898
899 int dsp563xx_write_ir_u16(struct jtag_tap *tap, uint16_t * ir_in, uint16_t ir_out,
900 int ir_len, int rti)
901 {
902 if (ir_len > 16)
903 {
904 LOG_ERROR("ir_len overflow, maxium is 16");
905 return ERROR_FAIL;
906 }
907
908 dsp563xx_write_ir(tap, (uint8_t *) ir_in, (uint8_t *) & ir_out, ir_len, rti);
909
910 return ERROR_OK;
911 }
912
913 int dsp563xx_write_dr_u16(struct jtag_tap *tap, uint16_t * dr_in, uint16_t dr_out,
914 int dr_len, int rti)
915 {
916 if (dr_len > 16)
917 {
918 LOG_ERROR("dr_len overflow, maxium is 16");
919 return ERROR_FAIL;
920 }
921
922 dsp563xx_write_dr(tap, (uint8_t *) dr_in, (uint8_t *) & dr_out, dr_len, rti);
923
924 return ERROR_OK;
925 }
926
927 int dsp563xx_write_ir_u32(struct jtag_tap *tap, uint32_t * ir_in, uint32_t ir_out,
928 int ir_len, int rti)
929 {
930 if (ir_len > 32)
931 {
932 LOG_ERROR("ir_len overflow, maxium is 32");
933 return ERROR_FAIL;
934 }
935
936 dsp563xx_write_ir(tap, (uint8_t *) ir_in, (uint8_t *) & ir_out, ir_len, rti);
937
938 return ERROR_OK;
939 }
940
941 int dsp563xx_write_dr_u32(struct jtag_tap *tap, uint32_t * dr_in, uint32_t dr_out,
942 int dr_len, int rti)
943 {
944 if (dr_len > 32)
945 {
946 LOG_ERROR("dr_len overflow, maxium is 32");
947 return ERROR_FAIL;
948 }
949
950 dsp563xx_write_dr(tap, (uint8_t *) dr_in, (uint8_t *) & dr_out, dr_len, rti);
951
952 return ERROR_OK;
953 }
954
955 int dsp563xx_execute_queue(void)
956 {
957 return jtag_execute_queue();
958 }
959
960 /** Holds methods for DSP563XX targets. */
961 struct target_type dsp563xx_target = {
962 .name = "dsp563xx",
963
964 .poll = dsp563xx_poll,
965 .arch_state = dsp563xx_arch_state,
966
967 .target_request_data = NULL,
968
969 .get_gdb_reg_list = dsp563xx_get_gdb_reg_list,
970
971 .halt = dsp563xx_halt,
972 .resume = dsp563xx_resume,
973 .step = dsp563xx_step,
974
975 .assert_reset = dsp563xx_assert_reset,
976 .deassert_reset = dsp563xx_deassert_reset,
977 .soft_reset_halt = dsp563xx_soft_reset_halt,
978
979 .read_memory = dsp563xx_read_memory_p,
980 .write_memory = dsp563xx_write_memory_p,
981
982 .target_create = dsp563xx_target_create,
983 .init_target = dsp563xx_init_target,
984 };

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)