OpenOCD
dsp5680xx.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
3 /***************************************************************************
4  * Copyright (C) 2011 by Rodrigo L. Rosa *
5  * rodrigorosa.LG@gmail.com *
6  * *
7  * Based on dsp563xx_once.h written by Mathias Kuester *
8  * mkdorg@users.sourceforge.net *
9  ***************************************************************************/
10 
11 #ifdef HAVE_CONFIG_H
12 #include "config.h"
13 #endif
14 
15 #include "target.h"
16 #include "target_type.h"
17 #include "dsp5680xx.h"
18 
20 
21 #define _E "DSP5680XX_ERROR:%d\nAt:%s:%d:%s"
22 #define err_log(c, m) LOG_ERROR(_E, c, __func__, __LINE__, m)
23 #define DEBUG_MSG "Debug mode be enabled to read mem."
24 #define HALT_MSG "Target must be halted."
25 
26 static int dsp5680xx_execute_queue(void)
27 {
28  return jtag_execute_queue();
29 }
30 
34 static int reset_jtag(void)
35 {
36  enum tap_state states[2];
37 
38  const char *cp = "RESET";
39 
40  states[0] = tap_state_by_name(cp);
41  int retval = jtag_add_statemove(states[0]);
42  if (retval != ERROR_OK)
43  return retval;
44  retval = jtag_execute_queue();
45  if (retval != ERROR_OK)
46  return retval;
47  jtag_add_pathmove(0, states + 1);
48  return jtag_execute_queue();
49 }
50 
51 static int dsp5680xx_drscan(struct target *target, uint8_t *d_in,
52  uint8_t *d_out, int len)
53 {
54  /* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
55  *
56  *Inputs:
57  * - d_in: This is the data that will be shifted into the JTAG DR reg.
58  * - d_out: The data that will be shifted out of the JTAG DR reg will stored here
59  * - len: Length of the data to be shifted to JTAG DR.
60  *
61  *Note: If d_out == NULL, discard incoming bits.
62  *
63  *-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
64  */
65  if (!target->tap) {
67  return ERROR_FAIL;
68  }
69  if (len > 32) {
71  "dr_len overflow, maximum is 32");
72  return ERROR_FAIL;
73  }
74  /* TODO what values of len are valid for jtag_add_plain_dr_scan? */
75  /* can i send as many bits as i want? */
76  /* is the casting necessary? */
77  jtag_add_plain_dr_scan(len, d_in, d_out, TAP_IDLE);
79  int retval = dsp5680xx_execute_queue();
80  if (retval != ERROR_OK) {
81  err_log(DSP5680XX_ERROR_JTAG_DRSCAN, "drscan failed!");
82  return retval;
83  }
84  }
85  if (d_out)
86  LOG_DEBUG("Data read (%d bits): 0x%04X", len, *d_out);
87  else
88  LOG_DEBUG("Data read was discarded.");
89  return ERROR_OK;
90 }
91 
101 static int dsp5680xx_irscan(struct target *target, uint32_t *d_in,
102  uint32_t *d_out, uint8_t ir_len)
103 {
104  uint16_t tap_ir_len = DSP5680XX_JTAG_MASTER_TAP_IRLEN;
105 
106  if (!target || !target->tap) {
108  return ERROR_FAIL;
109  }
110  if (ir_len != target->tap->ir_length) {
111  if (target->tap->enabled) {
112  err_log(DSP5680XX_ERROR_INVALID_IR_LEN, "Invalid irlen");
113  return ERROR_FAIL;
114  } else {
115  struct jtag_tap *t =
116  jtag_tap_by_string("dsp568013.chp");
117  if ((!t)
118  || ((t->enabled) && (ir_len != tap_ir_len))) {
119  err_log(DSP5680XX_ERROR_INVALID_IR_LEN, "Invalid irlen");
120  return ERROR_FAIL;
121  }
122  }
123  }
124  jtag_add_plain_ir_scan(ir_len, (uint8_t *) d_in, (uint8_t *) d_out,
125  TAP_IDLE);
126  if (dsp5680xx_context.flush) {
127  int retval = dsp5680xx_execute_queue();
128  if (retval != ERROR_OK) {
129  err_log(DSP5680XX_ERROR_JTAG_IRSCAN, "irscan failed!");
130  return retval;
131  }
132  }
133  return ERROR_OK;
134 }
135 
136 static int dsp5680xx_jtag_status(struct target *target, uint8_t *status)
137 {
138  uint32_t read_from_ir;
139 
140  uint32_t instr = JTAG_INSTR_ENABLE_ONCE;
141 
142  int retval =
143  dsp5680xx_irscan(target, &instr, &read_from_ir,
145  if (retval != ERROR_OK)
146  return retval;
147  if (status)
148  *status = (uint8_t) read_from_ir;
149  return ERROR_OK;
150 }
151 
152 static int jtag_data_read(struct target *target, uint8_t *data_read,
153  int num_bits)
154 {
155  uint32_t bogus_instr = 0;
156 
157  int retval =
158  dsp5680xx_drscan(target, (uint8_t *) &bogus_instr, data_read,
159  num_bits);
160  LOG_DEBUG("Data read (%d bits): 0x%04X", num_bits, *data_read);
162  return retval;
163 }
164 
165 #define jtag_data_read8(target, data_read) jtag_data_read(target, data_read, 8)
166 #define jtag_data_read16(target, data_read) jtag_data_read(target, data_read, 16)
167 #define jtag_data_read32(target, data_read) jtag_data_read(target, data_read, 32)
168 
169 static uint32_t data_read_dummy;
170 
171 static int jtag_data_write(struct target *target, uint32_t instr, int num_bits,
172  uint32_t *data_read)
173 {
174  int retval =
175  dsp5680xx_drscan(target, (uint8_t *) &instr,
176  (uint8_t *) &data_read_dummy, num_bits);
177  if (retval != ERROR_OK)
178  return retval;
179  if (data_read)
180  *data_read = data_read_dummy;
181  return ERROR_OK;
182 }
183 
184 #define jtag_data_write8(target, instr, data_read) jtag_data_write(target, instr, 8, data_read)
185 #define jtag_data_write16(target, instr, data_read) jtag_data_write(target, instr, 16, data_read)
186 #define jtag_data_write24(target, instr, data_read) jtag_data_write(target, instr, 24, data_read)
187 #define jtag_data_write32(target, instr, data_read) jtag_data_write(target, instr, 32, data_read)
188 
201 static int eonce_instruction_exec_single(struct target *target, uint8_t instr,
202  uint8_t rw, uint8_t go, uint8_t ex,
203  uint8_t *eonce_status)
204 {
205  uint32_t dr_out_tmp;
206 
207  uint8_t instr_with_flags = instr | (rw << 7) | (go << 6) | (ex << 5);
208 
209  int retval = jtag_data_write(target, instr_with_flags, 8, &dr_out_tmp);
210  if (retval != ERROR_OK)
211  return retval;
212  if (eonce_status)
213  *eonce_status = (uint8_t) dr_out_tmp;
214  return ERROR_OK;
215 }
216 
217 /* wrappers for multi opcode instructions */
218 #define dsp5680xx_exe_1(target, oc1, oc2, oc3) dsp5680xx_exe1(target, oc1)
219 #define dsp5680xx_exe_2(target, oc1, oc2, oc3) dsp5680xx_exe2(target, oc1, oc2)
220 #define dsp5680xx_exe_3(target, oc1, oc2, oc3) dsp5680xx_exe3(target, oc1, oc2, oc3)
221 #define dsp5680xx_exe_generic(t, words, oc1, oc2, oc3) dsp5680xx_exe_##words(t, oc1, oc2, oc3)
222 
223 /* Executes one word DSP instruction */
224 static int dsp5680xx_exe1(struct target *target, uint16_t opcode)
225 {
226  int retval = eonce_instruction_exec_single(target, 0x04, 0, 1, 0, NULL);
227  if (retval != ERROR_OK)
228  return retval;
229  return jtag_data_write16(target, opcode, NULL);
230 }
231 
232 /* Executes two word DSP instruction */
233 static int dsp5680xx_exe2(struct target *target, uint16_t opcode1,
234  uint16_t opcode2)
235 {
236  int retval = eonce_instruction_exec_single(target, 0x04, 0, 0, 0, NULL);
237  if (retval != ERROR_OK)
238  return retval;
239  retval = jtag_data_write16(target, opcode1, NULL);
240  if (retval != ERROR_OK)
241  return retval;
242  retval = eonce_instruction_exec_single(target, 0x04, 0, 1, 0, NULL);
243  if (retval != ERROR_OK)
244  return retval;
245  return jtag_data_write16(target, opcode2, NULL);
246 }
247 
248 /* Executes three word DSP instruction */
249 static int dsp5680xx_exe3(struct target *target, uint16_t opcode1,
250  uint16_t opcode2, uint16_t opcode3)
251 {
252  int retval = eonce_instruction_exec_single(target, 0x04, 0, 0, 0, NULL);
253  if (retval != ERROR_OK)
254  return retval;
255  retval = jtag_data_write16(target, opcode1, NULL);
256  if (retval != ERROR_OK)
257  return retval;
258  retval = eonce_instruction_exec_single(target, 0x04, 0, 0, 0, NULL);
259  if (retval != ERROR_OK)
260  return retval;
261  retval = jtag_data_write16(target, opcode2, NULL);
262  if (retval != ERROR_OK)
263  return retval;
264  retval = eonce_instruction_exec_single(target, 0x04, 0, 1, 0, NULL);
265  if (retval != ERROR_OK)
266  return retval;
267  return jtag_data_write16(target, opcode3, NULL);
268 }
269 
270 /*
271  *--------------- Real-time data exchange ---------------
272  * The EOnCE Transmit (OTX) and Receive (ORX) registers are data memory mapped, each with an upper
273  * and lower 16 bit word.
274  * Transmit and receive directions are defined from the core’s perspective.
275  * The core writes to the Transmit register and reads the Receive register, and the host through
276  * JTAG writes to the Receive register and reads the Transmit register.
277  * Both registers have a combined data memory mapped OTXRXSR which provides indication when
278  * each may be accessed.
279  * ref: eonce_rev.1.0_0208081.pdf@36
280  */
281 
282 /* writes data into upper ORx register of the target */
283 static int core_tx_upper_data(struct target *target, uint16_t data,
284  uint32_t *eonce_status_low)
285 {
286  int retval =
288  NULL);
289  if (retval != ERROR_OK)
290  return retval;
291  return jtag_data_write16(target, data, eonce_status_low);
292 }
293 
294 /* writes data into lower ORx register of the target */
295 #define CMD1 eonce_instruction_exec_single(target, DSP5680XX_ONCE_ORX, 0, 0, 0, NULL);
296 #define CMD2 jtag_data_write16((t, data)
297 #define core_tx_lower_data(t, data) PT1\ PT2
298 
305 static int core_rx_upper_data(struct target *target, uint8_t *data_read)
306 {
307  int retval =
309  NULL);
310  if (retval != ERROR_OK)
311  return retval;
312  return jtag_data_read16(target, data_read);
313 }
314 
321 static int core_rx_lower_data(struct target *target, uint8_t *data_read)
322 {
323  int retval =
325  NULL);
326  if (retval != ERROR_OK)
327  return retval;
328  return jtag_data_read16(target, data_read);
329 }
330 
331 /*
332  *-- -- -- -- --- -- -- -- --- -- -- -- --- -- -- -- --- -- -- -- --- --
333  *-- -- -- -- --- -- -- -Core Instructions- -- -- -- --- -- -- -- --- --
334  *-- -- -- -- --- -- -- -- --- -- -- -- --- -- -- -- --- -- -- -- --- --
335  */
336 
337 #define exe(a, b, c, d, e) dsp5680xx_exe_generic(a, b, c, d, e)
338 
339 /* move.l #value, r0 */
340 #define core_move_long_to_r0(target, value) exe(target, 3, 0xe418, value&0xffff, value>>16)
341 
342 /* move.l #value, n */
343 #define core_move_long_to_n(target, value) exe(target, 3, 0xe41e, value&0xffff, value>>16)
344 
345 /* move x:(r0), y0 */
346 #define core_move_at_r0_to_y0(target) exe(target, 1, 0xF514, 0, 0)
347 
348 /* move x:(r0), y1 */
349 #define core_move_at_r0_to_y1(target) exe(target, 1, 0xF714, 0, 0)
350 
351 /* move.l x:(r0), y */
352 #define core_move_long_at_r0_y(target) exe(target, 1, 0xF734, 0, 0)
353 
354 /* move y0, x:(r0) */
355 #define core_move_y0_at_r0(target) exe(target, 1, 0xd514, 0, 0)
356 
357 /* bfclr #value, x:(r0) */
358 #define eonce_bfclr_at_r0(target, value) exe(target, 2, 0x8040, value, 0)
359 
360 /* move #value, y0 */
361 #define core_move_value_to_y0(target, value) exe(target, 2, 0x8745, value, 0)
362 
363 /* move.w y0, x:(r0)+ */
364 #define core_move_y0_at_r0_inc(target) exe(target, 1, 0xd500, 0, 0)
365 
366 /* move.w y0, p:(r0)+ */
367 #define core_move_y0_at_pr0_inc(target) exe(target, 1, 0x8560, 0, 0)
368 
369 /* move.w p:(r0)+, y0 */
370 #define core_move_at_pr0_inc_to_y0(target) exe(target, 1, 0x8568, 0, 0)
371 
372 /* move.w p:(r0)+, y1 */
373 #define core_move_at_pr0_inc_to_y1(target) exe(target, 1, 0x8768, 0, 0)
374 
375 /* move.l #value, r2 */
376 #define core_move_long_to_r2(target, value) exe(target, 3, 0xe41A, value&0xffff, value>>16)
377 
378 /* move y0, x:(r2) */
379 #define core_move_y0_at_r2(target) exe(target, 1, 0xd516, 0, 0)
380 
381 /* move.w #<value>, x:(r2) */
382 #define core_move_value_at_r2(target, value) exe(target, 2, 0x8642, value, 0)
383 
384 /* move.w #<value>, x:(r0) */
385 #define core_move_value_at_r0(target, value) exe(target, 2, 0x8640, value, 0)
386 
387 /* move.w #<value>, x:(R2+<disp>) */
388 #define core_move_value_at_r2_disp(target, value, disp) exe(target, 3, 0x8646, value, disp)
389 
390 /* move.w x:(r2), Y0 */
391 #define core_move_at_r2_to_y0(target) exe(target, 1, 0xF516, 0, 0)
392 
393 /* move.w p:(r2)+, y0 */
394 #define core_move_at_pr2_inc_to_y0(target) exe(target, 1, 0x856A, 0, 0)
395 
396 /* move.l #value, r3 */
397 #define core_move_long_to_r1(target, value) exe(target, 3, 0xE419, value&0xffff, value>>16)
398 
399 /* move.l #value, r3 */
400 #define core_move_long_to_r3(target, value) exe(target, 3, 0xE41B, value&0xffff, value>>16)
401 
402 /* move.w y0, p:(r3)+ */
403 #define core_move_y0_at_pr3_inc(target) exe(target, 1, 0x8563, 0, 0)
404 
405 /* move.w y0, x:(r3) */
406 #define core_move_y0_at_r3(target) exe(target, 1, 0xD503, 0, 0)
407 
408 /* move.l #value, r4 */
409 #define core_move_long_to_r4(target, value) exe(target, 3, 0xE41C, value&0xffff, value>>16)
410 
411 /* move pc, r4 */
412 #define core_move_pc_to_r4(target) exe(target, 1, 0xE716, 0, 0)
413 
414 /* move.l r4, y */
415 #define core_move_r4_to_y(target) exe(target, 1, 0xe764, 0, 0)
416 
417 /* move.w p:(r0)+, y0 */
418 #define core_move_at_pr0_inc_to_y0(target) exe(target, 1, 0x8568, 0, 0)
419 
420 /* move.w x:(r0)+, y0 */
421 #define core_move_at_r0_inc_to_y0(target) exe(target, 1, 0xf500, 0, 0)
422 
423 /* move x:(r0), y0 */
424 #define core_move_at_r0_y0(target) exe(target, 1, 0xF514, 0, 0)
425 
426 /* nop */
427 #define eonce_nop(target) exe(target, 1, 0xe700, 0, 0)
428 
429 /* move.w x:(R2+<disp>), Y0 */
430 #define core_move_at_r2_disp_to_y0(target, disp) exe(target, 2, 0xF542, disp, 0)
431 
432 /* move.w y1, x:(r2) */
433 #define core_move_y1_at_r2(target) exe(target, 1, 0xd716, 0, 0)
434 
435 /* move.w y1, x:(r0) */
436 #define core_move_y1_at_r0(target) exe(target, 1, 0xd714, 0, 0)
437 
438 /* move.bp y0, x:(r0)+ */
439 #define core_move_byte_y0_at_r0(target) exe(target, 1, 0xd5a0, 0, 0)
440 
441 /* move.w y1, p:(r0)+ */
442 #define core_move_y1_at_pr0_inc(target) exe(target, 1, 0x8760, 0, 0)
443 
444 /* move.w y1, x:(r0)+ */
445 #define core_move_y1_at_r0_inc(target) exe(target, 1, 0xD700, 0, 0)
446 
447 /* move.l #value, y */
448 #define core_move_long_to_y(target, value) exe(target, 3, 0xe417, value&0xffff, value>>16)
449 
450 static int core_move_value_to_pc(struct target *target, uint32_t value)
451 {
452  if (target->state != TARGET_HALTED) {
454  return ERROR_FAIL;
455  }
458  return ERROR_FAIL;
459  }
460 
461  return dsp5680xx_exe_generic(target, 3, 0xE71E, value & 0xffff,
462  value >> 16);
463 }
464 
466 {
469  (MC568013_EONCE_OBASE_ADDR << 16)));
470 }
471 
473 {
476  (MC568013_EONCE_OBASE_ADDR << 16)));
477 }
478 
479 static int dsp5680xx_read_core_reg(struct target *target, uint8_t reg_addr,
480  uint16_t *data_read)
481 {
482  /* TODO implement a general version of this which matches what openocd uses. */
483  uint32_t dummy_data_to_shift_into_dr;
484 
485  int retval = eonce_instruction_exec_single(target, reg_addr, 1, 0, 0, NULL);
486  if (retval != ERROR_OK)
487  return retval;
488  retval =
489  dsp5680xx_drscan(target, (uint8_t *) &dummy_data_to_shift_into_dr,
490  (uint8_t *) data_read, 8);
491  if (retval != ERROR_OK)
492  return retval;
493  LOG_DEBUG("Reg. data: 0x%02X.", *data_read);
494  return ERROR_OK;
495 }
496 
497 static int eonce_read_status_reg(struct target *target, uint16_t *data)
498 {
500 }
501 
510 static int eonce_exit_debug_mode(struct target *target, uint8_t *eonce_status)
511 {
512  return eonce_instruction_exec_single(target, 0x1F, 0, 0, 1, eonce_status);
513 }
514 
515 static int switch_tap(struct target *target, struct jtag_tap *master_tap,
516  struct jtag_tap *core_tap)
517 {
518  int retval = ERROR_OK;
519 
520  uint32_t instr;
521 
522  uint32_t ir_out; /* not used, just to make jtag happy. */
523 
524  if (!master_tap) {
525  master_tap = jtag_tap_by_string("dsp568013.chp");
526  if (!master_tap) {
527  const char *msg = "Failed to get master tap.";
528 
530  return ERROR_FAIL;
531  }
532  }
533  if (!core_tap) {
534  core_tap = jtag_tap_by_string("dsp568013.cpu");
535  if (!core_tap) {
537  "Failed to get core tap.");
538  return ERROR_FAIL;
539  }
540  }
541 
542  if (!(((int)master_tap->enabled) ^ ((int)core_tap->enabled))) {
544  ("Master:%d\nCore:%d\nOnly 1 should be enabled.\n",
545  (int)master_tap->enabled, (int)core_tap->enabled);
546  }
547 
548  if (master_tap->enabled) {
549  instr = 0x5;
550  retval =
551  dsp5680xx_irscan(target, &instr, &ir_out,
553  if (retval != ERROR_OK)
554  return retval;
555  instr = 0x2;
556  retval =
557  dsp5680xx_drscan(target, (uint8_t *) &instr,
558  (uint8_t *) &ir_out, 4);
559  if (retval != ERROR_OK)
560  return retval;
561  core_tap->enabled = true;
562  master_tap->enabled = false;
563  } else {
564  instr = 0x08;
565  retval =
566  dsp5680xx_irscan(target, &instr, &ir_out,
568  if (retval != ERROR_OK)
569  return retval;
570  instr = 0x1;
571  retval =
572  dsp5680xx_drscan(target, (uint8_t *) &instr,
573  (uint8_t *) &ir_out, 4);
574  if (retval != ERROR_OK)
575  return retval;
576  core_tap->enabled = false;
577  master_tap->enabled = true;
578  }
579  return ERROR_OK;
580 }
581 
597  uint16_t *eonce_status)
598 {
599  uint32_t instr = JTAG_INSTR_DEBUG_REQUEST;
600 
601  uint32_t ir_out; /* not used, just to make jtag happy.*/
602 
603  /* Debug request #1 */
604  int retval =
605  dsp5680xx_irscan(target, &instr, &ir_out,
607  if (retval != ERROR_OK)
608  return retval;
609 
610  /* Enable EOnCE module */
611  instr = JTAG_INSTR_ENABLE_ONCE;
612  /* Two rounds of jtag 0x6 (enable eonce) to enable EOnCE. */
613  retval =
614  dsp5680xx_irscan(target, &instr, &ir_out,
616  if (retval != ERROR_OK)
617  return retval;
618  retval =
619  dsp5680xx_irscan(target, &instr, &ir_out,
621  if (retval != ERROR_OK)
622  return retval;
623  if ((ir_out & JTAG_STATUS_MASK) == JTAG_STATUS_DEBUG)
625  else {
626  return ERROR_FAIL;
627  }
628  /* Verify that debug mode is enabled */
629  uint16_t data_read_from_dr;
630 
631  retval = eonce_read_status_reg(target, &data_read_from_dr);
632  if (retval != ERROR_OK)
633  return retval;
634  if ((data_read_from_dr & 0x30) == 0x30) {
635  LOG_DEBUG("EOnCE successfully entered debug mode.");
637  } else {
642  return ERROR_TARGET_FAILURE;
643  }
644  if (eonce_status)
645  *eonce_status = data_read_from_dr;
646  return ERROR_OK;
647 }
648 
658  uint16_t *eonce_status)
659 {
660  uint32_t instr = JTAG_INSTR_DEBUG_REQUEST;
661 
662  uint32_t ir_out; /* not used, just to make jtag happy. */
663 
664  uint16_t instr_16;
665 
666  uint16_t read_16;
667 
668  /* First try the easy way */
669  int retval = eonce_enter_debug_mode_without_reset(target, eonce_status);
670  if (retval == ERROR_OK)
671  return retval;
672 
673  struct jtag_tap *tap_chp = jtag_tap_by_string("dsp568013.chp");
674  if (!tap_chp) {
676  "Failed to get master tap.");
677  return ERROR_FAIL;
678  }
679  struct jtag_tap *tap_cpu = jtag_tap_by_string("dsp568013.cpu");
680  if (!tap_cpu) {
682  "Failed to get master tap.");
683  return ERROR_FAIL;
684  }
685  /* Enable master tap */
686  tap_chp->enabled = true;
687  tap_cpu->enabled = false;
688 
689  instr = MASTER_TAP_CMD_IDCODE;
690  retval =
691  dsp5680xx_irscan(target, &instr, &ir_out,
693  if (retval != ERROR_OK)
694  return retval;
695  jtag_add_sleep(TIME_DIV_FREESCALE * 100 * 1000);
696 
697  /* Enable EOnCE module */
698  jtag_add_reset(0, 1);
699  jtag_add_sleep(TIME_DIV_FREESCALE * 200 * 1000);
700  instr = 0x0606ffff; /* This was selected experimentally. */
701  retval =
702  dsp5680xx_drscan(target, (uint8_t *) &instr, (uint8_t *) &ir_out,
703  32);
704  if (retval != ERROR_OK)
705  return retval;
706  /* ir_out now hold tap idcode */
707 
708  /* Enable core tap */
709  tap_chp->enabled = true;
710  retval = switch_tap(target, tap_chp, tap_cpu);
711  if (retval != ERROR_OK)
712  return retval;
713 
714  instr = JTAG_INSTR_ENABLE_ONCE;
715  /* Two rounds of jtag 0x6 (enable eonce) to enable EOnCE. */
716  retval =
717  dsp5680xx_irscan(target, &instr, &ir_out,
719  if (retval != ERROR_OK)
720  return retval;
721  instr = JTAG_INSTR_DEBUG_REQUEST;
722  retval =
723  dsp5680xx_irscan(target, &instr, &ir_out,
725  if (retval != ERROR_OK)
726  return retval;
727  instr_16 = 0x1;
728  retval =
729  dsp5680xx_drscan(target, (uint8_t *) &instr_16,
730  (uint8_t *) &read_16, 8);
731  if (retval != ERROR_OK)
732  return retval;
733  instr_16 = 0x20;
734  retval =
735  dsp5680xx_drscan(target, (uint8_t *) &instr_16,
736  (uint8_t *) &read_16, 8);
737  if (retval != ERROR_OK)
738  return retval;
739  jtag_add_sleep(TIME_DIV_FREESCALE * 100 * 1000);
740  jtag_add_reset(0, 0);
741  jtag_add_sleep(TIME_DIV_FREESCALE * 300 * 1000);
742 
743  instr = JTAG_INSTR_ENABLE_ONCE;
744  /* Two rounds of jtag 0x6 (enable eonce) to enable EOnCE. */
745  for (int i = 0; i < 3; i++) {
746  retval =
747  dsp5680xx_irscan(target, &instr, &ir_out,
749  if (retval != ERROR_OK)
750  return retval;
751  }
752  if ((ir_out & JTAG_STATUS_MASK) == JTAG_STATUS_DEBUG)
754  else {
755  err_log(DSP5680XX_ERROR_HALT, "Failed to halt target.");
756  return ERROR_FAIL;
757  }
758 
759  for (int i = 0; i < 3; i++) {
760  instr_16 = 0x86;
761  dsp5680xx_drscan(target, (uint8_t *) &instr_16,
762  (uint8_t *) &read_16, 16);
763  instr_16 = 0xff;
764  dsp5680xx_drscan(target, (uint8_t *) &instr_16,
765  (uint8_t *) &read_16, 16);
766  }
767 
768  /* Verify that debug mode is enabled */
769  uint16_t data_read_from_dr;
770 
771  retval = eonce_read_status_reg(target, &data_read_from_dr);
772  if (retval != ERROR_OK)
773  return retval;
774  if ((data_read_from_dr & 0x30) == 0x30) {
775  LOG_DEBUG("EOnCE successfully entered debug mode.");
777  } else {
778  const char *msg = "Failed to set EOnCE module to debug mode";
779 
781  return ERROR_TARGET_FAILURE;
782  }
783  if (eonce_status)
784  *eonce_status = data_read_from_dr;
785  return ERROR_OK;
786 }
787 
795 static int eonce_pc_store(struct target *target)
796 {
797  uint8_t tmp[2];
798 
799  int retval = core_move_pc_to_r4(target);
800  if (retval != ERROR_OK)
801  return retval;
802  retval = core_move_r4_to_y(target);
803  if (retval != ERROR_OK)
804  return retval;
805  retval = eonce_load_tx_rx_to_r0(target);
806  if (retval != ERROR_OK)
807  return retval;
808  retval = core_move_y0_at_r0(target);
809  if (retval != ERROR_OK)
810  return retval;
811  retval = core_rx_lower_data(target, tmp);
812  if (retval != ERROR_OK)
813  return retval;
814  LOG_USER("PC value: 0x%X%X\n", tmp[1], tmp[0]);
815  dsp5680xx_context.stored_pc = (tmp[0] | (tmp[1] << 8));
816  return ERROR_OK;
817 }
818 
820 {
821  struct dsp5680xx_common *dsp5680xx =
822  calloc(1, sizeof(struct dsp5680xx_common));
823  target->arch_info = dsp5680xx;
824  return ERROR_OK;
825 }
826 
827 static int dsp5680xx_init_target(struct command_context *cmd_ctx,
828  struct target *target)
829 {
833  LOG_DEBUG("target initiated!");
834  /* TODO core tap must be enabled before running these commands, currently
835  * this is done in the .cfg tcl script. */
836  return ERROR_OK;
837 }
838 
839 static int dsp5680xx_arch_state(struct target *target)
840 {
841  LOG_USER("%s not implemented yet.", __func__);
842  return ERROR_OK;
843 }
844 
846 {
848  return ERROR_OK;
849 }
850 
852 {
854  return ERROR_OK;
855 }
856 
857 static int dsp5680xx_halt(struct target *target)
858 {
859  uint16_t eonce_status = 0xbeef;
860 
861  if ((target->state == TARGET_HALTED)
863  LOG_USER("Target already halted and in debug mode.");
864  return ERROR_OK;
865  } else {
866  if (target->state == TARGET_HALTED)
867  LOG_USER
868  ("Target already halted, re attempting to enter debug mode.");
869  }
870  int retval = eonce_enter_debug_mode(target, &eonce_status);
871  if (retval != ERROR_OK)
872  return retval;
873  retval = eonce_pc_store(target);
874  if (retval != ERROR_OK)
875  return retval;
877  retval = eonce_pc_store(target);
878  }
879  return retval;
880 }
881 
882 static int dsp5680xx_poll(struct target *target)
883 {
884  uint8_t jtag_status;
885 
886  uint8_t eonce_status;
887 
888  uint16_t read_tmp;
889 
890  int retval = dsp5680xx_jtag_status(target, &jtag_status);
891  if (retval != ERROR_OK)
892  return retval;
893  if (jtag_status == JTAG_STATUS_DEBUG)
894  if (target->state != TARGET_HALTED) {
895  retval = eonce_enter_debug_mode(target, &read_tmp);
896  if (retval != ERROR_OK)
897  return retval;
898  eonce_status = (uint8_t) read_tmp;
899  if ((eonce_status & EONCE_STAT_MASK) !=
901  const char *msg =
902  "%s: Failed to put EOnCE in debug mode.Flash locked?...";
903  LOG_WARNING(msg, __func__);
904  return ERROR_TARGET_FAILURE;
905  } else {
907  return ERROR_OK;
908  }
909  }
910  if (jtag_status == JTAG_STATUS_NORMAL) {
911  if (target->state == TARGET_RESET) {
912  retval = dsp5680xx_halt(target);
913  if (retval != ERROR_OK)
914  return retval;
915  retval = eonce_exit_debug_mode(target, &eonce_status);
916  if (retval != ERROR_OK)
917  return retval;
918  if ((eonce_status & EONCE_STAT_MASK) !=
920  const char *msg =
921  "%s: JTAG running, but EOnCE run failed.Try resetting..";
922  LOG_WARNING(msg, __func__);
923  return ERROR_TARGET_FAILURE;
924  } else {
926  return ERROR_OK;
927  }
928  }
929  if (target->state != TARGET_RUNNING) {
930  retval = eonce_read_status_reg(target, &read_tmp);
931  if (retval != ERROR_OK)
932  return retval;
933  eonce_status = (uint8_t) read_tmp;
934  if ((eonce_status & EONCE_STAT_MASK) !=
937  ("Inconsistent target status. Restart!");
938  return ERROR_TARGET_FAILURE;
939  }
940  }
942  return ERROR_OK;
943  }
944  if (jtag_status == JTAG_STATUS_DEAD) {
945  LOG_ERROR
946  ("%s: Cannot communicate with JTAG. Check connection...",
947  __func__);
949  return ERROR_TARGET_FAILURE;
950  }
951  if (target->state == TARGET_UNKNOWN) {
952  LOG_ERROR("%s: Target status invalid - communication failure",
953  __func__);
954  return ERROR_TARGET_FAILURE;
955  }
956  return ERROR_OK;
957 }
958 
959 static int dsp5680xx_resume(struct target *target, bool current,
960  target_addr_t address, bool handle_breakpoints, bool debug_execution)
961 {
962  if (target->state == TARGET_RUNNING) {
963  LOG_USER("Target already running.");
964  return ERROR_OK;
965  }
966  int retval;
967 
968  uint8_t eonce_status;
969 
970  uint8_t jtag_status;
971 
973  if (!current) {
975  if (retval != ERROR_OK)
976  return retval;
977  }
978 
979  int retry = 20;
980 
981  while (retry-- > 1) {
982  retval = eonce_exit_debug_mode(target, &eonce_status);
983  if (retval != ERROR_OK)
984  return retval;
985  if (eonce_status == DSP5680XX_ONCE_OSCR_NORMAL_M)
986  break;
987  }
988  if (retry == 0) {
990  "Failed to exit debug mode...");
991  return ERROR_TARGET_FAILURE;
992  } else {
995  }
996  LOG_DEBUG("EOnCE status: 0x%02X.", eonce_status);
997  } else {
998  /*
999  * If debug mode was not enabled but target was halted, then it is most likely that
1000  * access to eonce registers is locked.
1001  * Reset target to make it run again.
1002  */
1003  jtag_add_reset(0, 1);
1004  jtag_add_sleep(TIME_DIV_FREESCALE * 200 * 1000);
1005 
1006  retval = reset_jtag();
1007  if (retval != ERROR_OK) {
1009  "Failed to reset JTAG state machine");
1010  return retval;
1011  }
1012  jtag_add_sleep(TIME_DIV_FREESCALE * 100 * 1000);
1013  jtag_add_reset(0, 0);
1014  jtag_add_sleep(TIME_DIV_FREESCALE * 300 * 1000);
1015  retval = dsp5680xx_jtag_status(target, &jtag_status);
1016  if (retval != ERROR_OK)
1017  return retval;
1018  if ((jtag_status & JTAG_STATUS_MASK) == JTAG_STATUS_NORMAL) {
1021  } else {
1022  err_log(DSP5680XX_ERROR_RESUME, "Failed to resume target");
1023  return ERROR_TARGET_FAILURE;
1024  }
1025  }
1026  return ERROR_OK;
1027 }
1028 
1040 static int dsp5680xx_convert_address(uint32_t *address, int *pmem)
1041 {
1042  /*
1043  * Distinguish data memory (x) from program memory (p) by the address.
1044  * Addresses over S_FILE_DATA_OFFSET are considered (x) memory.
1045  */
1046  if (*address >= S_FILE_DATA_OFFSET) {
1047  *pmem = 0;
1048  if (((*address) & 0xff0000) != 0xff0000)
1050  }
1051  return ERROR_OK;
1052 }
1053 
1054 static int dsp5680xx_read_16_single(struct target *t, uint32_t a,
1055  uint8_t *data_read, int r_pmem)
1056 {
1057  struct target *target = t;
1058 
1059  uint32_t address = a;
1060 
1061  int retval = core_move_long_to_r0(target, address);
1062  if (retval != ERROR_OK)
1063  return retval;
1064  if (r_pmem)
1066  else
1067  retval = core_move_at_r0_to_y0(target);
1068  if (retval != ERROR_OK)
1069  return retval;
1070  retval = eonce_load_tx_rx_to_r0(target);
1071  if (retval != ERROR_OK)
1072  return retval;
1073  retval = core_move_y0_at_r0(target);
1074  if (retval != ERROR_OK)
1075  return retval;
1076  /* at this point the data i want is at the reg eonce can read */
1077  retval = core_rx_lower_data(target, data_read);
1078  if (retval != ERROR_OK)
1079  return retval;
1080  LOG_DEBUG("%s:Data read from 0x%06" PRIX32 ": 0x%02X%02X", __func__, address,
1081  data_read[1], data_read[0]);
1082  return ERROR_OK;
1083 }
1084 
1085 static int dsp5680xx_read_32_single(struct target *t, uint32_t a,
1086  uint8_t *data_read, int r_pmem)
1087 {
1088  struct target *target = t;
1089 
1090  uint32_t address = a;
1091 
1092  address = (address & 0xFFFFF);
1093  /* Get data to an intermediate register */
1094  int retval = core_move_long_to_r0(target, address);
1095  if (retval != ERROR_OK)
1096  return retval;
1097  if (r_pmem) {
1099  if (retval != ERROR_OK)
1100  return retval;
1102  if (retval != ERROR_OK)
1103  return retval;
1104  } else {
1106  if (retval != ERROR_OK)
1107  return retval;
1108  retval = core_move_at_r0_to_y1(target);
1109  if (retval != ERROR_OK)
1110  return retval;
1111  }
1112  /* Get lower part of data to TX/RX */
1113  retval = eonce_load_tx_rx_to_r0(target);
1114  if (retval != ERROR_OK)
1115  return retval;
1116  retval = core_move_y0_at_r0_inc(target); /* This also load TX/RX high to r0 */
1117  if (retval != ERROR_OK)
1118  return retval;
1119  /* Get upper part of data to TX/RX */
1120  retval = core_move_y1_at_r0(target);
1121  if (retval != ERROR_OK)
1122  return retval;
1123  /* at this point the data i want is at the reg eonce can read */
1124  retval = core_rx_lower_data(target, data_read);
1125  if (retval != ERROR_OK)
1126  return retval;
1127  return core_rx_upper_data(target, data_read + 2);
1128 }
1129 
1130 static int dsp5680xx_read(struct target *t, target_addr_t a, uint32_t size,
1131  uint32_t count, uint8_t *buf)
1132 {
1133  struct target *target = t;
1134 
1135  uint32_t address = a;
1136 
1137  uint8_t *buffer = buf;
1138 
1139  if (target->state != TARGET_HALTED) {
1141  return ERROR_FAIL;
1142  }
1145  return ERROR_FAIL;
1146  }
1147 
1148  int pmem = 1;
1149 
1150  int retval = dsp5680xx_convert_address(&address, &pmem);
1151  if (retval != ERROR_OK)
1152  return retval;
1153 
1155  int counter = FLUSH_COUNT_READ_WRITE;
1156 
1157  for (unsigned int i = 0; i < count; i++) {
1158  if (--counter == 0) {
1160  counter = FLUSH_COUNT_READ_WRITE;
1161  }
1162  switch (size) {
1163  case 1:
1164  if (!(i % 2))
1165  retval =
1167  address + i / 2,
1168  buffer + i, pmem);
1169  break;
1170  case 2:
1171  retval =
1173  buffer + 2 * i, pmem);
1174  break;
1175  case 4:
1176  retval =
1178  buffer + 4 * i, pmem);
1179  break;
1180  default:
1181  LOG_USER("%s: Invalid read size.", __func__);
1182  break;
1183  }
1184  if (retval != ERROR_OK)
1185  return retval;
1187  }
1188 
1190  return dsp5680xx_execute_queue();
1191 }
1192 
1193 static int dsp5680xx_write_16_single(struct target *t, uint32_t a,
1194  uint16_t data, uint8_t w_pmem)
1195 {
1196  struct target *target = t;
1197 
1198  uint32_t address = a;
1199 
1200  int retval = core_move_long_to_r0(target, address);
1201  if (retval != ERROR_OK)
1202  return retval;
1203  if (w_pmem) {
1204  retval = core_move_value_to_y0(target, data);
1205  if (retval != ERROR_OK)
1206  return retval;
1207  retval = core_move_y0_at_pr0_inc(target);
1208  } else {
1209  retval = core_move_value_at_r0(target, data);
1210  }
1211  return retval;
1212 }
1213 
1214 static int dsp5680xx_write_32_single(struct target *t, uint32_t a,
1215  uint32_t data, int w_pmem)
1216 {
1217  struct target *target = t;
1218 
1219  uint32_t address = a;
1220 
1221  int retval = core_move_long_to_r0(target, address);
1222  if (retval != ERROR_OK)
1223  return retval;
1224  retval = core_move_long_to_y(target, data);
1225  if (retval != ERROR_OK)
1226  return retval;
1227  if (w_pmem)
1228  retval = core_move_y0_at_pr0_inc(target);
1229  else
1230  retval = core_move_y0_at_r0_inc(target);
1231  if (retval != ERROR_OK)
1232  return retval;
1233  if (w_pmem)
1234  retval = core_move_y1_at_pr0_inc(target);
1235  else
1236  retval = core_move_y1_at_r0_inc(target);
1237  return retval;
1238 }
1239 
1240 static int dsp5680xx_write_8(struct target *t, uint32_t a, uint32_t c,
1241  const uint8_t *d, int pmem)
1242 {
1243  struct target *target = t;
1244 
1245  uint32_t address = a;
1246 
1247  uint32_t count = c;
1248 
1249  const uint8_t *data = d;
1250 
1251  int retval = 0;
1252 
1253  uint16_t data_16;
1254 
1255  uint32_t iter;
1256 
1257  int counter = FLUSH_COUNT_READ_WRITE;
1258 
1259  for (iter = 0; iter < count / 2; iter++) {
1260  if (--counter == 0) {
1262  counter = FLUSH_COUNT_READ_WRITE;
1263  }
1264  data_16 = (data[2 * iter] | (data[2 * iter + 1] << 8));
1265  retval =
1266  dsp5680xx_write_16_single(target, address + iter, data_16,
1267  pmem);
1268  if (retval != ERROR_OK) {
1269  LOG_ERROR("%s: Could not write to p:0x%04" PRIX32, __func__,
1270  address);
1272  return retval;
1273  }
1275  }
1277 
1278  /* Only one byte left, let's not overwrite the other byte (mem is 16bit) */
1279  /* Need to retrieve the part we do not want to overwrite. */
1280  uint16_t data_old;
1281 
1282  if ((count == 1) || (count % 2)) {
1283  retval =
1284  dsp5680xx_read(target, address + iter, 1, 1,
1285  (uint8_t *) &data_old);
1286  if (retval != ERROR_OK)
1287  return retval;
1288  if (count == 1)
1289  data_old = (((data_old & 0xff) << 8) | data[0]); /* preserve upper byte */
1290  else
1291  data_old =
1292  (((data_old & 0xff) << 8) | data[2 * iter + 1]);
1293  retval =
1294  dsp5680xx_write_16_single(target, address + iter, data_old,
1295  pmem);
1296  }
1297  return retval;
1298 }
1299 
1300 static int dsp5680xx_write_16(struct target *t, uint32_t a, uint32_t c,
1301  const uint8_t *d, int pmem)
1302 {
1303  struct target *target = t;
1304 
1305  uint32_t address = a;
1306 
1307  uint32_t count = c;
1308 
1309  const uint8_t *data = d;
1310 
1311  uint32_t iter;
1312 
1313  int counter = FLUSH_COUNT_READ_WRITE;
1314 
1315  for (iter = 0; iter < count; iter++) {
1316  if (--counter == 0) {
1318  counter = FLUSH_COUNT_READ_WRITE;
1319  }
1320  int retval =
1322  data[iter], pmem);
1323  if (retval != ERROR_OK) {
1324  LOG_ERROR("%s: Could not write to p:0x%04" PRIX32, __func__,
1325  address);
1327  return retval;
1328  }
1330  }
1332  return ERROR_OK;
1333 }
1334 
1335 static int dsp5680xx_write_32(struct target *t, uint32_t a, uint32_t c,
1336  const uint8_t *d, int pmem)
1337 {
1338  struct target *target = t;
1339 
1340  uint32_t address = a;
1341 
1342  uint32_t count = c;
1343 
1344  const uint8_t *data = d;
1345 
1346  uint32_t iter;
1347 
1348  int counter = FLUSH_COUNT_READ_WRITE;
1349 
1350  for (iter = 0; iter < count; iter++) {
1351  if (--counter == 0) {
1353  counter = FLUSH_COUNT_READ_WRITE;
1354  }
1355  int retval =
1356  dsp5680xx_write_32_single(target, address + (iter << 1),
1357  data[iter], pmem);
1358  if (retval != ERROR_OK) {
1359  LOG_ERROR("%s: Could not write to p:0x%04" PRIX32, __func__,
1360  address);
1362  return retval;
1363  }
1365  }
1367  return ERROR_OK;
1368 }
1369 
1383 static int dsp5680xx_write(struct target *target, target_addr_t a, uint32_t size, uint32_t count,
1384  const uint8_t *b)
1385 {
1386  /* TODO Cannot write 32bit to odd address, will write 0x12345678 as 0x5678 0x0012 */
1387  uint32_t address = a;
1388 
1389  uint8_t const *buffer = b;
1390 
1391  if (target->state != TARGET_HALTED) {
1393  return ERROR_FAIL;
1394  }
1397  return ERROR_FAIL;
1398  }
1399 
1400  int p_mem = 1;
1401 
1402  int retval = dsp5680xx_convert_address(&address, &p_mem);
1403  if (retval != ERROR_OK)
1404  return retval;
1405 
1406  switch (size) {
1407  case 1:
1408  retval =
1410  break;
1411  case 2:
1412  retval =
1414  break;
1415  case 4:
1416  retval =
1418  break;
1419  default:
1420  err_log(DSP5680XX_ERROR_INVALID_DATA_SIZE_UNIT, "Invalid data size.");
1421  return ERROR_TARGET_DATA_ABORT;
1422  }
1423  return retval;
1424 }
1425 
1426 static int dsp5680xx_write_buffer(struct target *t, target_addr_t a, uint32_t size,
1427  const uint8_t *b)
1428 {
1429  if (t->state != TARGET_HALTED) {
1431  return ERROR_FAIL;
1432  }
1435  return ERROR_FAIL;
1436  }
1437  return dsp5680xx_write(t, a, 1, size, b);
1438 }
1439 
1451  uint8_t *buffer)
1452 {
1453  if (target->state != TARGET_HALTED) {
1455  return ERROR_FAIL;
1456  }
1459  return ERROR_FAIL;
1460  }
1461 
1462  /* The "/2" solves the byte/word addressing issue.*/
1463  return dsp5680xx_read(target, address, 2, size / 2, buffer);
1464 }
1465 
1479  uint32_t *checksum)
1480 {
1481  return ERROR_FAIL;
1482 }
1483 
1495 static int perl_crc(const uint8_t *buff8, uint32_t word_count)
1496 {
1497  uint16_t checksum = 0xffff;
1498 
1499  uint16_t data, fbmisr;
1500 
1501  uint32_t i;
1502 
1503  for (i = 0; i < word_count; i++) {
1504  data = (buff8[2 * i] | (buff8[2 * i + 1] << 8));
1505  fbmisr =
1506  (checksum & 2) >> 1 ^ (checksum & 4) >> 2 ^ (checksum & 16)
1507  >> 4 ^ (checksum & 0x8000) >> 15;
1508  checksum = (data ^ ((checksum << 1) | fbmisr));
1509  }
1510  i--;
1511  for (; !(i & 0x80000000); i--) {
1512  data = (buff8[2 * i] | (buff8[2 * i + 1] << 8));
1513  fbmisr =
1514  (checksum & 2) >> 1 ^ (checksum & 4) >> 2 ^ (checksum & 16)
1515  >> 4 ^ (checksum & 0x8000) >> 15;
1516  checksum = (data ^ ((checksum << 1) | fbmisr));
1517  }
1518  return checksum;
1519 }
1520 
1529 {
1530  uint16_t sim_cmd = SIM_CMD_RESET;
1531 
1532  if (strcmp(target->tap->chip, "dsp568013") == 0) {
1533  uint32_t sim_addr = MC568013_SIM_BASE_ADDR + S_FILE_DATA_OFFSET;
1534  return dsp5680xx_write(target, sim_addr, 1, 2,
1535  (const uint8_t *)&sim_cmd);
1536  }
1537  return ERROR_OK;
1538 }
1539 
1548 {
1549  /* TODO is this what this function is expected to do...? */
1550  int retval = dsp5680xx_halt(target);
1551  if (retval != ERROR_OK)
1552  return retval;
1553  return dsp5680xx_f_sim_reset(target);
1554 }
1555 
1556 int dsp5680xx_f_protect_check(struct target *target, uint16_t *protected)
1557 {
1558  if (target->state != TARGET_HALTED) {
1560  return ERROR_FAIL;
1561  }
1564  return ERROR_FAIL;
1565  }
1566  if (!protected) {
1567  const char *msg = "NULL pointer not valid.";
1568 
1570  return ERROR_FAIL;
1571  }
1573  (uint8_t *) protected, 0);
1574 }
1575 
1589 static int dsp5680xx_f_ex(struct target *target, uint16_t c, uint32_t address, uint32_t data,
1590  uint16_t *hfm_ustat, int pmem)
1591 {
1592  uint32_t command = c;
1593 
1595  if (retval != ERROR_OK)
1596  return retval;
1598  if (retval != ERROR_OK)
1599  return retval;
1600  uint8_t i[2];
1601 
1602  int watchdog = 100;
1603 
1604  do {
1605  retval = core_move_at_r2_disp_to_y0(target, HFM_USTAT); /* read HMF_USTAT */
1606  if (retval != ERROR_OK)
1607  return retval;
1608  retval = core_move_y0_at_r0(target);
1609  if (retval != ERROR_OK)
1610  return retval;
1611  retval = core_rx_upper_data(target, i);
1612  if (retval != ERROR_OK)
1613  return retval;
1614  if ((watchdog--) == 1) {
1615  const char *msg =
1616  "Timed out waiting for FM to finish old command.";
1618  return ERROR_TARGET_FAILURE;
1619  }
1620  } while (!(i[0] & 0x40)); /* wait until current command is complete */
1621 
1623 
1624  /* write to HFM_CNFG (lock=0,select bank) - flash_desc.bank&0x03, 0x01 == 0x00, 0x01 ??? */
1625  retval = core_move_value_at_r2_disp(target, 0x00, HFM_CNFG);
1626  if (retval != ERROR_OK)
1627  return retval;
1628  /* write to HMF_USTAT, clear PVIOL, ACCERR &BLANK bits */
1629  retval = core_move_value_at_r2_disp(target, 0x04, HFM_USTAT);
1630  if (retval != ERROR_OK)
1631  return retval;
1632  /* clear only one bit at a time */
1633  retval = core_move_value_at_r2_disp(target, 0x10, HFM_USTAT);
1634  if (retval != ERROR_OK)
1635  return retval;
1636  retval = core_move_value_at_r2_disp(target, 0x20, HFM_USTAT);
1637  if (retval != ERROR_OK)
1638  return retval;
1639  /* write to HMF_PROT, clear protection */
1640  retval = core_move_value_at_r2_disp(target, 0x00, HFM_PROT);
1641  if (retval != ERROR_OK)
1642  return retval;
1643  /* write to HMF_PROTB, clear protection */
1644  retval = core_move_value_at_r2_disp(target, 0x00, HFM_PROTB);
1645  if (retval != ERROR_OK)
1646  return retval;
1647  retval = core_move_value_to_y0(target, data);
1648  if (retval != ERROR_OK)
1649  return retval;
1650  /* write to the flash block */
1651  retval = core_move_long_to_r3(target, address);
1652  if (retval != ERROR_OK)
1653  return retval;
1654  if (pmem) {
1655  retval = core_move_y0_at_pr3_inc(target);
1656  } else {
1657  retval = core_move_y0_at_r3(target);
1658  }
1659  if (retval != ERROR_OK)
1660  return retval;
1661  /* write command to the HFM_CMD reg */
1663  if (retval != ERROR_OK)
1664  return retval;
1665  /* start the command */
1666  retval = core_move_value_at_r2_disp(target, 0x80, HFM_USTAT);
1667  if (retval != ERROR_OK)
1668  return retval;
1669 
1671  retval = dsp5680xx_execute_queue();
1672  if (retval != ERROR_OK)
1673  return retval;
1674 
1675  watchdog = 100;
1676  do {
1677  /* read HMF_USTAT */
1679  if (retval != ERROR_OK)
1680  return retval;
1681  retval = core_move_y0_at_r0(target);
1682  if (retval != ERROR_OK)
1683  return retval;
1684  retval = core_rx_upper_data(target, i);
1685  if (retval != ERROR_OK)
1686  return retval;
1687  if ((watchdog--) == 1) {
1689  "FM execution did not finish.");
1690  return ERROR_TARGET_FAILURE;
1691  }
1692  } while (!(i[0] & 0x40)); /* wait until the command is complete */
1693  *hfm_ustat = ((i[0] << 8) | (i[1]));
1694  if (i[0] & HFM_USTAT_MASK_PVIOL_ACCER) {
1695  const char *msg =
1696  "pviol and/or accer bits set. HFM command execution error";
1698  return ERROR_TARGET_FAILURE;
1699  }
1700  return ERROR_OK;
1701 }
1702 
1715 static int set_fm_ck_div(struct target *target)
1716 {
1717  uint8_t i[2];
1718 
1719  int retval = core_move_long_to_r2(target, HFM_BASE_ADDR);
1720  if (retval != ERROR_OK)
1721  return retval;
1723  if (retval != ERROR_OK)
1724  return retval;
1725  /* read HFM_CLKD */
1726  retval = core_move_at_r2_to_y0(target);
1727  if (retval != ERROR_OK)
1728  return retval;
1729  retval = core_move_y0_at_r0(target);
1730  if (retval != ERROR_OK)
1731  return retval;
1732  retval = core_rx_upper_data(target, i);
1733  if (retval != ERROR_OK)
1734  return retval;
1735  unsigned int hfm_at_wrong_value = 0;
1736 
1737  if ((i[0] & 0x7f) != HFM_CLK_DEFAULT) {
1738  LOG_DEBUG("HFM CLK divisor contained incorrect value (0x%02X).",
1739  i[0] & 0x7f);
1740  hfm_at_wrong_value = 1;
1741  } else {
1742  LOG_DEBUG
1743  ("HFM CLK divisor was already set to correct value (0x%02X).",
1744  i[0] & 0x7f);
1745  return ERROR_OK;
1746  }
1747  /* write HFM_CLKD */
1749  if (retval != ERROR_OK)
1750  return retval;
1751  /* verify HFM_CLKD */
1752  retval = core_move_at_r2_to_y0(target);
1753  if (retval != ERROR_OK)
1754  return retval;
1755  retval = core_move_y0_at_r0(target);
1756  if (retval != ERROR_OK)
1757  return retval;
1758  retval = core_rx_upper_data(target, i);
1759  if (retval != ERROR_OK)
1760  return retval;
1761  if (i[0] != (0x80 | (HFM_CLK_DEFAULT & 0x7f))) {
1762  err_log(DSP5680XX_ERROR_FM_SET_CLK, "Unable to set HFM CLK divisor.");
1763  return ERROR_TARGET_FAILURE;
1764  }
1765  if (hfm_at_wrong_value)
1766  LOG_DEBUG("HFM CLK divisor set to 0x%02x.", i[0] & 0x7f);
1767  return ERROR_OK;
1768 }
1769 
1784 static int dsp5680xx_f_signature(struct target *target, uint32_t address, uint32_t words,
1785  uint16_t *signature)
1786 {
1787  int retval;
1788 
1789  uint16_t hfm_ustat;
1790 
1793  /*
1794  * Generate error here, since it is not done in eonce_enter_debug_mode_without_reset
1795  */
1796  if (retval != ERROR_OK) {
1797  err_log(DSP5680XX_ERROR_HALT, "Failed to halt target.");
1798  return retval;
1799  }
1800  }
1801  retval =
1803  &hfm_ustat, 1);
1804  if (retval != ERROR_OK)
1805  return retval;
1807  (uint8_t *) signature, 0);
1808 }
1809 
1810 int dsp5680xx_f_erase_check(struct target *target, uint8_t *erased,
1811  uint32_t sector)
1812 {
1813  int retval;
1814 
1815  uint16_t hfm_ustat;
1816 
1817  uint32_t tmp;
1818 
1820  retval = dsp5680xx_halt(target);
1821  if (retval != ERROR_OK)
1822  return retval;
1823  }
1824  retval = set_fm_ck_div(target);
1825  if (retval != ERROR_OK)
1826  return retval;
1827  /*
1828  * Check if chip is already erased.
1829  */
1830  tmp = HFM_FLASH_BASE_ADDR + sector * HFM_SECTOR_SIZE / 2;
1831  retval =
1832  dsp5680xx_f_ex(target, HFM_ERASE_VERIFY, tmp, 0, &hfm_ustat, 1);
1833  if (retval != ERROR_OK)
1834  return retval;
1835  if (erased)
1836  *erased = (uint8_t) (hfm_ustat & HFM_USTAT_MASK_BLANK);
1837  return ERROR_OK;
1838 }
1839 
1849 static int erase_sector(struct target *target, int sector, uint16_t *hfm_ustat)
1850 {
1851  uint32_t tmp = HFM_FLASH_BASE_ADDR + sector * HFM_SECTOR_SIZE / 2;
1852 
1853  return dsp5680xx_f_ex(target, HFM_PAGE_ERASE, tmp, 0, hfm_ustat, 1);
1854 }
1855 
1864 static int mass_erase(struct target *target, uint16_t *hfm_ustat)
1865 {
1866  return dsp5680xx_f_ex(target, HFM_MASS_ERASE, 0, 0, hfm_ustat, 1);
1867 }
1868 
1869 int dsp5680xx_f_erase(struct target *target, int first, int last)
1870 {
1871  int retval;
1872 
1874  retval = dsp5680xx_halt(target);
1875  if (retval != ERROR_OK)
1876  return retval;
1877  }
1878  /*
1879  * Reset SIM
1880  *
1881  */
1882  retval = dsp5680xx_f_sim_reset(target);
1883  if (retval != ERROR_OK)
1884  return retval;
1885  /*
1886  * Set hfmdiv
1887  *
1888  */
1889  retval = set_fm_ck_div(target);
1890  if (retval != ERROR_OK)
1891  return retval;
1892 
1893  uint16_t hfm_ustat;
1894 
1895  int do_mass_erase = ((!(first | last))
1896  || ((first == 0)
1897  && (last == (HFM_SECTOR_COUNT - 1))));
1898  if (do_mass_erase) {
1899  /* Mass erase */
1900  retval = mass_erase(target, &hfm_ustat);
1901  if (retval != ERROR_OK)
1902  return retval;
1903  } else {
1904  for (int i = first; i <= last; i++) {
1905  retval = erase_sector(target, i, &hfm_ustat);
1906  if (retval != ERROR_OK)
1907  return retval;
1908  }
1909  }
1910  return ERROR_OK;
1911 }
1912 
1913 /*
1914  * Algorithm for programming normal p: flash
1915  * Follow state machine from "56F801x Peripheral Reference Manual"@163.
1916  * Registers to set up before calling:
1917  * r0: TX/RX high address.
1918  * r2: FM module base address.
1919  * r3: Destination address in flash.
1920  *
1921  * hfm_wait: // wait for buffer empty
1922  * brclr #0x80, x:(r2+0x13), hfm_wait
1923  * rx_check: // wait for input buffer full
1924  * brclr #0x01, x:(r0-2), rx_check
1925  * move.w x:(r0), y0 // read from Rx buffer
1926  * move.w y0, p:(r3)+
1927  * move.w #0x20, x:(r2+0x14) // write PGM command
1928  * move.w #0x80, x:(r2+0x13) // start the command
1929  * move.w X:(R2+0x13), A // Read USTAT register
1930  * brclr #0x20, A, accerr_check // protection violation check
1931  * bfset #0x20, X:(R2+0x13) // clear pviol
1932  * bra hfm_wait
1933  * accerr_check:
1934  * brclr #0x10, A, hfm_wait // access error check
1935  * bfset #0x10, X:(R2+0x13) // clear accerr
1936  * bra hfm_wait // loop
1937  * 0x00000000 0x8A460013807D brclr #0x80, X:(R2+0x13),*+0
1938  * 0x00000003 0xE700 nop
1939  * 0x00000004 0xE700 nop
1940  * 0x00000005 0x8A44FFFE017B brclr #1, X:(R0-2),*-2
1941  * 0x00000008 0xE700 nop
1942  * 0x00000009 0xF514 move.w X:(R0), Y0
1943  * 0x0000000A 0x8563 move.w Y0, P:(R3)+
1944  * 0x0000000B 0x864600200014 move.w #32, X:(R2+0x14)
1945  * 0x0000000E 0x864600800013 move.w #128, X:(R2+0x13)
1946  * 0x00000011 0xF0420013 move.w X:(R2+0x13), A
1947  * 0x00000013 0x8B402004 brclr #0x20, A,*+6
1948  * 0x00000015 0x824600130020 bfset #0x20, X:(R2+0x13)
1949  * 0x00000018 0xA967 bra *-24
1950  * 0x00000019 0x8B401065 brclr #0x10, A,*-25
1951  * 0x0000001B 0x824600130010 bfset #0x10, X:(R2+0x13)
1952  * 0x0000001E 0xA961 bra *-30
1953  */
1954 
1955 static const uint16_t pgm_write_pflash[] = {
1956  0x8A46, 0x0013, 0x807D, 0xE700,
1957  0xE700, 0x8A44, 0xFFFE, 0x017B,
1958  0xE700, 0xF514, 0x8563, 0x8646,
1959  0x0020, 0x0014, 0x8646, 0x0080,
1960  0x0013, 0xF042, 0x0013, 0x8B40,
1961  0x2004, 0x8246, 0x0013, 0x0020,
1962  0xA967, 0x8B40, 0x1065, 0x8246,
1963  0x0013, 0x0010, 0xA961
1964 };
1965 
1966 static const uint32_t pgm_write_pflash_length = 31;
1967 
1968 int dsp5680xx_f_wr(struct target *t, const uint8_t *b, uint32_t a, uint32_t count,
1969  int is_flash_lock)
1970 {
1971  struct target *target = t;
1972 
1973  uint32_t address = a;
1974 
1975  const uint8_t *buffer = b;
1976 
1977  int retval = ERROR_OK;
1978 
1980  retval = eonce_enter_debug_mode(target, NULL);
1981  if (retval != ERROR_OK)
1982  return retval;
1983  }
1984  /*
1985  * Download the pgm that flashes.
1986  *
1987  */
1988  const uint32_t len = pgm_write_pflash_length;
1989 
1990  uint32_t ram_addr = 0x8700;
1991 
1992  /*
1993  * This seems to be a safe address.
1994  * This one is the one used by codewarrior in 56801x_flash.cfg
1995  */
1996  if (!is_flash_lock) {
1997  retval =
1998  dsp5680xx_write(target, ram_addr, 1, len * 2,
1999  (uint8_t *) pgm_write_pflash);
2000  if (retval != ERROR_OK)
2001  return retval;
2002  retval = dsp5680xx_execute_queue();
2003  if (retval != ERROR_OK)
2004  return retval;
2005  }
2006  /*
2007  * Set hfmdiv
2008  *
2009  */
2010  retval = set_fm_ck_div(target);
2011  if (retval != ERROR_OK)
2012  return retval;
2013  /*
2014  * Setup registers needed by pgm_write_pflash
2015  *
2016  */
2017 
2019 
2020  retval = core_move_long_to_r3(target, address); /* Destination address to r3 */
2021  if (retval != ERROR_OK)
2022  return retval;
2023  retval = core_load_tx_rx_high_addr_to_r0(target); /* TX/RX reg address to r0 */
2024  if (retval != ERROR_OK)
2025  return retval;
2026  retval = core_move_long_to_r2(target, HFM_BASE_ADDR); /* FM base address to r2 */
2027  if (retval != ERROR_OK)
2028  return retval;
2029  /*
2030  * Run flashing program.
2031  *
2032  */
2033  /* write to HFM_CNFG (lock=0, select bank) */
2034  retval = core_move_value_at_r2_disp(target, 0x00, HFM_CNFG);
2035  if (retval != ERROR_OK)
2036  return retval;
2037  /* write to HMF_USTAT, clear PVIOL, ACCERR &BLANK bits */
2038  retval = core_move_value_at_r2_disp(target, 0x04, HFM_USTAT);
2039  if (retval != ERROR_OK)
2040  return retval;
2041  /* clear only one bit at a time */
2042  retval = core_move_value_at_r2_disp(target, 0x10, HFM_USTAT);
2043  if (retval != ERROR_OK)
2044  return retval;
2045  retval = core_move_value_at_r2_disp(target, 0x20, HFM_USTAT);
2046  if (retval != ERROR_OK)
2047  return retval;
2048  /* write to HMF_PROT, clear protection */
2049  retval = core_move_value_at_r2_disp(target, 0x00, HFM_PROT);
2050  if (retval != ERROR_OK)
2051  return retval;
2052  /* write to HMF_PROTB, clear protection */
2053  retval = core_move_value_at_r2_disp(target, 0x00, HFM_PROTB);
2054  if (retval != ERROR_OK)
2055  return retval;
2056  if (count % 2) {
2057  /* TODO implement handling of odd number of words. */
2058  const char *msg = "Cannot handle odd number of words.";
2059 
2061  return ERROR_FAIL;
2062  }
2063 
2065  retval = dsp5680xx_execute_queue();
2066  if (retval != ERROR_OK)
2067  return retval;
2068 
2069  uint32_t drscan_data;
2070 
2071  uint16_t tmp = (buffer[0] | (buffer[1] << 8));
2072 
2073  retval = core_tx_upper_data(target, tmp, &drscan_data);
2074  if (retval != ERROR_OK)
2075  return retval;
2076 
2077  retval = dsp5680xx_resume(target, false, ram_addr, false, false);
2078  if (retval != ERROR_OK)
2079  return retval;
2080 
2081  int counter = FLUSH_COUNT_FLASH;
2082 
2084  uint32_t i;
2085 
2086  for (i = 1; (i < count / 2) && (i < HFM_SIZE_WORDS); i++) {
2087  if (--counter == 0) {
2089  counter = FLUSH_COUNT_FLASH;
2090  }
2091  tmp = (buffer[2 * i] | (buffer[2 * i + 1] << 8));
2092  retval = core_tx_upper_data(target, tmp, &drscan_data);
2093  if (retval != ERROR_OK) {
2095  return retval;
2096  }
2098  }
2100  if (!is_flash_lock) {
2101  /*
2102  *Verify flash (skip when exec lock sequence)
2103  *
2104  */
2105  uint16_t signature;
2106 
2107  uint16_t pc_crc;
2108 
2109  retval = dsp5680xx_f_signature(target, address, i, &signature);
2110  if (retval != ERROR_OK)
2111  return retval;
2112  pc_crc = perl_crc(buffer, i);
2113  if (pc_crc != signature) {
2114  const char *msg =
2115  "Flashed data failed CRC check, flash again!";
2117  return ERROR_FAIL;
2118  }
2119  }
2120  return retval;
2121 }
2122 
2124 {
2125  uint16_t eonce_status;
2126 
2127  uint32_t ir_out;
2128 
2129  struct jtag_tap *tap_chp = jtag_tap_by_string("dsp568013.chp");
2130  if (!tap_chp) {
2132  "Failed to get master tap.");
2133  return ERROR_FAIL;
2134  }
2135  struct jtag_tap *tap_cpu = jtag_tap_by_string("dsp568013.cpu");
2136  if (!tap_cpu) {
2138  "Failed to get master tap.");
2139  return ERROR_FAIL;
2140  }
2141 
2142  int retval = eonce_enter_debug_mode_without_reset(target, &eonce_status);
2143  if (retval == ERROR_OK)
2144  LOG_WARNING("Memory was not locked.");
2145 
2146  jtag_add_reset(0, 1);
2147  jtag_add_sleep(TIME_DIV_FREESCALE * 200 * 1000);
2148 
2149  retval = reset_jtag();
2150  if (retval != ERROR_OK) {
2152  "Failed to reset JTAG state machine");
2153  return retval;
2154  }
2155  jtag_add_sleep(150);
2156 
2157  /* Enable core tap */
2158  tap_chp->enabled = true;
2159  retval = switch_tap(target, tap_chp, tap_cpu);
2160  if (retval != ERROR_OK)
2161  return retval;
2162 
2163  uint32_t instr = JTAG_INSTR_DEBUG_REQUEST;
2164  retval =
2165  dsp5680xx_irscan(target, &instr, &ir_out,
2167  if (retval != ERROR_OK)
2168  return retval;
2169  jtag_add_sleep(TIME_DIV_FREESCALE * 100 * 1000);
2170  jtag_add_reset(0, 0);
2171  jtag_add_sleep(TIME_DIV_FREESCALE * 300 * 1000);
2172 
2173  /* Enable master tap */
2174  tap_chp->enabled = false;
2175  retval = switch_tap(target, tap_chp, tap_cpu);
2176  if (retval != ERROR_OK)
2177  return retval;
2178 
2179  /* Execute mass erase to unlock */
2181  retval =
2182  dsp5680xx_irscan(target, &instr, &ir_out,
2184  if (retval != ERROR_OK)
2185  return retval;
2186 
2187  instr = HFM_CLK_DEFAULT;
2188  retval = dsp5680xx_drscan(target, (uint8_t *) &instr, (uint8_t *) &ir_out, 16);
2189  if (retval != ERROR_OK)
2190  return retval;
2191 
2192  jtag_add_sleep(TIME_DIV_FREESCALE * 150 * 1000);
2193  jtag_add_reset(0, 1);
2194  jtag_add_sleep(TIME_DIV_FREESCALE * 200 * 1000);
2195 
2196  retval = reset_jtag();
2197  if (retval != ERROR_OK) {
2199  "Failed to reset JTAG state machine");
2200  return retval;
2201  }
2202  jtag_add_sleep(150);
2203 
2204  instr = 0x0606ffff;
2205  retval = dsp5680xx_drscan(target, (uint8_t *) &instr, (uint8_t *) &ir_out,
2206  32);
2207  if (retval != ERROR_OK)
2208  return retval;
2209 
2210  /* enable core tap */
2211  instr = 0x5;
2212  retval =
2213  dsp5680xx_irscan(target, &instr, &ir_out,
2215  if (retval != ERROR_OK)
2216  return retval;
2217  instr = 0x2;
2218  retval = dsp5680xx_drscan(target, (uint8_t *) &instr, (uint8_t *) &ir_out,
2219  4);
2220  if (retval != ERROR_OK)
2221  return retval;
2222 
2223  tap_cpu->enabled = true;
2224  tap_chp->enabled = false;
2227  return ERROR_OK;
2228 }
2229 
2231 {
2232  uint16_t lock_word = HFM_LOCK_FLASH;
2233  int retval = dsp5680xx_f_wr(target, (uint8_t *)&lock_word, HFM_LOCK_ADDR_L, 2, 1);
2234  if (retval != ERROR_OK)
2235  return retval;
2236 
2237  jtag_add_reset(0, 1);
2238  jtag_add_sleep(TIME_DIV_FREESCALE * 200 * 1000);
2239 
2240  retval = reset_jtag();
2241  if (retval != ERROR_OK) {
2243  "Failed to reset JTAG state machine");
2244  return retval;
2245  }
2246  jtag_add_sleep(TIME_DIV_FREESCALE * 100 * 1000);
2247  jtag_add_reset(0, 0);
2248  jtag_add_sleep(TIME_DIV_FREESCALE * 300 * 1000);
2249 
2250  struct jtag_tap *tap_chp = jtag_tap_by_string("dsp568013.chp");
2251  if (!tap_chp) {
2253  "Failed to get master tap.");
2254  return ERROR_FAIL;
2255  }
2256  struct jtag_tap *tap_cpu = jtag_tap_by_string("dsp568013.cpu");
2257  if (!tap_cpu) {
2259  "Failed to get master tap.");
2260  return ERROR_FAIL;
2261  }
2264  tap_cpu->enabled = false;
2265  tap_chp->enabled = true;
2266  return switch_tap(target, tap_chp, tap_cpu);
2267 }
2268 
2269 static int dsp5680xx_step(struct target *target, bool current, target_addr_t address,
2270  bool handle_breakpoints)
2271 {
2273  "Not implemented yet.");
2274  return ERROR_FAIL;
2275 }
2276 
2278 struct target_type dsp5680xx_target = {
2279  .name = "dsp5680xx",
2280 
2281  .poll = dsp5680xx_poll,
2282  .arch_state = dsp5680xx_arch_state,
2283 
2284  .halt = dsp5680xx_halt,
2285  .resume = dsp5680xx_resume,
2286  .step = dsp5680xx_step,
2287 
2288  .write_buffer = dsp5680xx_write_buffer,
2289  .read_buffer = dsp5680xx_read_buffer,
2290 
2291  .assert_reset = dsp5680xx_assert_reset,
2292  .deassert_reset = dsp5680xx_deassert_reset,
2293  .soft_reset_halt = dsp5680xx_soft_reset_halt,
2294 
2295  .read_memory = dsp5680xx_read,
2296  .write_memory = dsp5680xx_write,
2297 
2298  .checksum_memory = dsp5680xx_checksum_memory,
2299 
2300  .target_create = dsp5680xx_target_create,
2301  .init_target = dsp5680xx_init_target,
2302 };
#define JTAG_INSTR_ENABLE_ONCE
Definition: dsp563xx_once.c:33
#define JTAG_STATUS_DEBUG
Definition: dsp563xx_once.c:26
#define JTAG_STATUS_NORMAL
Definition: dsp563xx_once.c:23
#define JTAG_INSTR_DEBUG_REQUEST
Definition: dsp563xx_once.c:34
static int core_tx_upper_data(struct target *target, uint16_t data, uint32_t *eonce_status_low)
Definition: dsp5680xx.c:283
static int dsp5680xx_read_buffer(struct target *target, target_addr_t address, uint32_t size, uint8_t *buffer)
This function is called by verify_image, it is used to read data from memory.
Definition: dsp5680xx.c:1450
static int dsp5680xx_soft_reset_halt(struct target *target)
Halts the core and resets the SIM.
Definition: dsp5680xx.c:1547
static uint32_t data_read_dummy
Definition: dsp5680xx.c:169
static int dsp5680xx_halt(struct target *target)
Definition: dsp5680xx.c:857
static int dsp5680xx_deassert_reset(struct target *target)
Definition: dsp5680xx.c:851
#define core_move_value_at_r2_disp(target, value, disp)
Definition: dsp5680xx.c:388
#define core_move_y0_at_pr0_inc(target)
Definition: dsp5680xx.c:367
static int dsp5680xx_read_32_single(struct target *t, uint32_t a, uint8_t *data_read, int r_pmem)
Definition: dsp5680xx.c:1085
static int eonce_exit_debug_mode(struct target *target, uint8_t *eonce_status)
Takes the core out of debug mode.
Definition: dsp5680xx.c:510
static int core_load_tx_rx_high_addr_to_r0(struct target *target)
Definition: dsp5680xx.c:472
#define core_move_at_r2_disp_to_y0(target, disp)
Definition: dsp5680xx.c:430
#define core_move_pc_to_r4(target)
Definition: dsp5680xx.c:412
static int jtag_data_write(struct target *target, uint32_t instr, int num_bits, uint32_t *data_read)
Definition: dsp5680xx.c:171
static int dsp5680xx_exe2(struct target *target, uint16_t opcode1, uint16_t opcode2)
Definition: dsp5680xx.c:233
static int dsp5680xx_convert_address(uint32_t *address, int *pmem)
The value of address determines if it corresponds to P: (program) or X: (dat) memory.
Definition: dsp5680xx.c:1040
static int dsp5680xx_resume(struct target *target, bool current, target_addr_t address, bool handle_breakpoints, bool debug_execution)
Definition: dsp5680xx.c:959
static int dsp5680xx_write_16_single(struct target *t, uint32_t a, uint16_t data, uint8_t w_pmem)
Definition: dsp5680xx.c:1193
#define DEBUG_MSG
Definition: dsp5680xx.c:23
static int eonce_instruction_exec_single(struct target *target, uint8_t instr, uint8_t rw, uint8_t go, uint8_t ex, uint8_t *eonce_status)
Executes EOnCE instruction.
Definition: dsp5680xx.c:201
#define core_move_at_r0_to_y0(target)
Definition: dsp5680xx.c:346
static const uint32_t pgm_write_pflash_length
Definition: dsp5680xx.c:1966
int dsp5680xx_f_erase(struct target *target, int first, int last)
Erases either a sector or the complete flash array.
Definition: dsp5680xx.c:1869
#define core_move_at_pr0_inc_to_y1(target)
Definition: dsp5680xx.c:373
#define core_move_at_pr0_inc_to_y0(target)
Definition: dsp5680xx.c:418
#define err_log(c, m)
Definition: dsp5680xx.c:22
int dsp5680xx_f_lock(struct target *target)
Writes the flash security words with a specific value.
Definition: dsp5680xx.c:2230
static int dsp5680xx_irscan(struct target *target, uint32_t *d_in, uint32_t *d_out, uint8_t ir_len)
Test func.
Definition: dsp5680xx.c:101
static int mass_erase(struct target *target, uint16_t *hfm_ustat)
Executes the FM mass erase command.
Definition: dsp5680xx.c:1864
static int dsp5680xx_drscan(struct target *target, uint8_t *d_in, uint8_t *d_out, int len)
Definition: dsp5680xx.c:51
#define core_move_y0_at_r0(target)
Definition: dsp5680xx.c:355
#define core_move_y0_at_r0_inc(target)
Definition: dsp5680xx.c:364
#define core_move_y1_at_r0(target)
Definition: dsp5680xx.c:436
#define core_move_y1_at_pr0_inc(target)
Definition: dsp5680xx.c:442
static int jtag_data_read(struct target *target, uint8_t *data_read, int num_bits)
Definition: dsp5680xx.c:152
#define dsp5680xx_exe_generic(t, words, oc1, oc2, oc3)
Definition: dsp5680xx.c:221
static int dsp5680xx_write_8(struct target *t, uint32_t a, uint32_t c, const uint8_t *d, int pmem)
Definition: dsp5680xx.c:1240
static int dsp5680xx_target_create(struct target *target)
Definition: dsp5680xx.c:819
static int dsp5680xx_poll(struct target *target)
Definition: dsp5680xx.c:882
static int switch_tap(struct target *target, struct jtag_tap *master_tap, struct jtag_tap *core_tap)
Definition: dsp5680xx.c:515
static int dsp5680xx_f_signature(struct target *target, uint32_t address, uint32_t words, uint16_t *signature)
Executes the FM calculate signature command.
Definition: dsp5680xx.c:1784
static int dsp5680xx_exe1(struct target *target, uint16_t opcode)
Definition: dsp5680xx.c:224
static int dsp5680xx_read_core_reg(struct target *target, uint8_t reg_addr, uint16_t *data_read)
Definition: dsp5680xx.c:479
#define jtag_data_write16(target, instr, data_read)
Definition: dsp5680xx.c:185
static int core_rx_lower_data(struct target *target, uint8_t *data_read)
Definition: dsp5680xx.c:321
static int dsp5680xx_step(struct target *target, bool current, target_addr_t address, bool handle_breakpoints)
Definition: dsp5680xx.c:2269
#define core_move_value_to_y0(target, value)
Definition: dsp5680xx.c:361
static int dsp5680xx_f_sim_reset(struct target *target)
Resets the SIM.
Definition: dsp5680xx.c:1528
static int dsp5680xx_assert_reset(struct target *target)
Definition: dsp5680xx.c:845
#define core_move_y0_at_pr3_inc(target)
Definition: dsp5680xx.c:403
#define core_move_at_r2_to_y0(target)
Definition: dsp5680xx.c:391
#define core_move_at_r0_to_y1(target)
Definition: dsp5680xx.c:349
#define core_move_r4_to_y(target)
Definition: dsp5680xx.c:415
static int eonce_enter_debug_mode_without_reset(struct target *target, uint16_t *eonce_status)
Puts the core into debug mode, enabling the EOnCE module.
Definition: dsp5680xx.c:596
static int dsp5680xx_read(struct target *t, target_addr_t a, uint32_t size, uint32_t count, uint8_t *buf)
Definition: dsp5680xx.c:1130
#define core_move_y1_at_r0_inc(target)
Definition: dsp5680xx.c:445
#define HALT_MSG
Definition: dsp5680xx.c:24
static int eonce_load_tx_rx_to_r0(struct target *target)
Definition: dsp5680xx.c:465
static int dsp5680xx_write_32_single(struct target *t, uint32_t a, uint32_t data, int w_pmem)
Definition: dsp5680xx.c:1214
static int dsp5680xx_exe3(struct target *target, uint16_t opcode1, uint16_t opcode2, uint16_t opcode3)
Definition: dsp5680xx.c:249
static int dsp5680xx_jtag_status(struct target *target, uint8_t *status)
Definition: dsp5680xx.c:136
static int eonce_enter_debug_mode(struct target *target, uint16_t *eonce_status)
Puts the core into debug mode, enabling the EOnCE module.
Definition: dsp5680xx.c:657
static int dsp5680xx_init_target(struct command_context *cmd_ctx, struct target *target)
Definition: dsp5680xx.c:827
#define core_move_value_at_r2(target, value)
Definition: dsp5680xx.c:382
static int dsp5680xx_write(struct target *target, target_addr_t a, uint32_t size, uint32_t count, const uint8_t *b)
Writes buffer to memory.
Definition: dsp5680xx.c:1383
static int dsp5680xx_write_16(struct target *t, uint32_t a, uint32_t c, const uint8_t *d, int pmem)
Definition: dsp5680xx.c:1300
static int dsp5680xx_execute_queue(void)
Definition: dsp5680xx.c:26
#define core_move_value_at_r0(target, value)
Definition: dsp5680xx.c:385
#define core_move_long_to_r3(target, value)
Definition: dsp5680xx.c:400
int dsp5680xx_f_unlock(struct target *target)
Executes a mass erase command.
Definition: dsp5680xx.c:2123
static int core_move_value_to_pc(struct target *target, uint32_t value)
Definition: dsp5680xx.c:450
static int perl_crc(const uint8_t *buff8, uint32_t word_count)
Calculates a signature over word_count words in the data from buff8.
Definition: dsp5680xx.c:1495
#define core_move_y0_at_r3(target)
Definition: dsp5680xx.c:406
static int set_fm_ck_div(struct target *target)
Prior to the execution of any Flash module command, the Flash module Clock Divider (CLKDIV) register ...
Definition: dsp5680xx.c:1715
static int dsp5680xx_write_32(struct target *t, uint32_t a, uint32_t c, const uint8_t *d, int pmem)
Definition: dsp5680xx.c:1335
static int dsp5680xx_checksum_memory(struct target *target, target_addr_t address, uint32_t size, uint32_t *checksum)
This function is not implemented.
Definition: dsp5680xx.c:1478
static int dsp5680xx_read_16_single(struct target *t, uint32_t a, uint8_t *data_read, int r_pmem)
Definition: dsp5680xx.c:1054
#define jtag_data_read16(target, data_read)
Definition: dsp5680xx.c:166
#define core_move_long_to_r2(target, value)
Definition: dsp5680xx.c:376
static int dsp5680xx_arch_state(struct target *target)
Definition: dsp5680xx.c:839
int dsp5680xx_f_wr(struct target *t, const uint8_t *b, uint32_t a, uint32_t count, int is_flash_lock)
Writes to flash memory.
Definition: dsp5680xx.c:1968
#define core_move_at_r0_inc_to_y0(target)
Definition: dsp5680xx.c:421
static int core_rx_upper_data(struct target *target, uint8_t *data_read)
Definition: dsp5680xx.c:305
static int dsp5680xx_f_ex(struct target *target, uint16_t c, uint32_t address, uint32_t data, uint16_t *hfm_ustat, int pmem)
Executes a command on the FM module.
Definition: dsp5680xx.c:1589
static int eonce_read_status_reg(struct target *target, uint16_t *data)
Definition: dsp5680xx.c:497
static struct dsp5680xx_common dsp5680xx_context
Definition: dsp5680xx.c:19
#define core_move_long_to_r0(target, value)
Definition: dsp5680xx.c:340
int dsp5680xx_f_protect_check(struct target *target, uint16_t *protected)
Reads the memory mapped protection register.
Definition: dsp5680xx.c:1556
struct target_type dsp5680xx_target
Holds methods for dsp5680xx targets.
Definition: dsp5680xx.c:2278
static int reset_jtag(void)
Reset state machine.
Definition: dsp5680xx.c:34
static const uint16_t pgm_write_pflash[]
Definition: dsp5680xx.c:1955
int dsp5680xx_f_erase_check(struct target *target, uint8_t *erased, uint32_t sector)
The FM has the functionality of checking if the flash array is erased.
Definition: dsp5680xx.c:1810
static int erase_sector(struct target *target, int sector, uint16_t *hfm_ustat)
Executes the FM page erase command.
Definition: dsp5680xx.c:1849
#define core_move_long_to_y(target, value)
Definition: dsp5680xx.c:448
static int eonce_pc_store(struct target *target)
Reads the current value of the program counter and stores it.
Definition: dsp5680xx.c:795
static int dsp5680xx_write_buffer(struct target *t, target_addr_t a, uint32_t size, const uint8_t *b)
Definition: dsp5680xx.c:1426
Basic support for the 5680xx DSP from Freescale. The chip has two taps in the JTAG chain,...
#define JTAG_STATUS_MASK
Definition: dsp5680xx.h:37
#define HFM_USTAT_MASK_BLANK
Definition: dsp5680xx.h:183
#define DSP5680XX_ERROR_JTAG_TAP_FIND_MASTER
Definition: dsp5680xx.h:248
#define DSP5680XX_ERROR_ENTER_DEBUG_MODE
Definition: dsp5680xx.h:252
#define DSP5680XX_ERROR_INVALID_IR_LEN
Definition: dsp5680xx.h:245
#define DSP5680XX_ERROR_FLASHING_INVALID_WORD_COUNT
Definition: dsp5680xx.h:261
#define FLUSH_COUNT_READ_WRITE
Definition: dsp5680xx.h:143
#define DSP5680XX_ERROR_RESUME
Definition: dsp5680xx.h:253
#define DSP5680XX_ERROR_NOT_IN_DEBUG
Definition: dsp5680xx.h:268
#define MASTER_TAP_CMD_FLASH_ERASE
Definition: dsp5680xx.h:65
#define DSP5680XX_ERROR_EXIT_DEBUG_MODE
Definition: dsp5680xx.h:266
#define DSP5680XX_ERROR_NOT_IMPLEMENTED_STEP
Definition: dsp5680xx.h:264
#define MC568013_EONCE_TX1_RX1_HIGH_ADDR
Definition: dsp5680xx.h:217
#define HFM_USTAT_MASK_PVIOL_ACCER
Definition: dsp5680xx.h:184
#define HFM_CMD
Definition: dsp5680xx.h:175
#define DSP5680XX_ERROR_TARGET_RUNNING
Definition: dsp5680xx.h:267
#define HFM_PAGE_ERASE
Definition: dsp5680xx.h:152
#define HFM_ERASE_VERIFY
Definition: dsp5680xx.h:149
#define DSP5680XX_ERROR_JTAG_RESET
Definition: dsp5680xx.h:242
#define DSP5680XX_ERROR_HALT
Definition: dsp5680xx.h:265
#define HFM_PROTB
Definition: dsp5680xx.h:173
#define HFM_CLK_DEFAULT
The value used on for the FM clock is important to prevent flashing errors and to prevent deteriorati...
Definition: dsp5680xx.h:191
#define MC568013_EONCE_OBASE_ADDR
Definition: dsp5680xx.h:214
#define HFM_BASE_ADDR
Definition: dsp5680xx.h:163
#define DSP5680XX_ERROR_INVALID_DATA_SIZE_UNIT
Definition: dsp5680xx.h:255
#define DSP5680XX_ONCE_ORX1
Definition: dsp5680xx.h:133
#define FLUSH_COUNT_FLASH
Definition: dsp5680xx.h:144
#define DSP5680XX_ERROR_FM_EXEC
Definition: dsp5680xx.h:259
#define DSP5680XX_ERROR_FM_SET_CLK
Definition: dsp5680xx.h:260
#define DSP5680XX_ERROR_JTAG_TAP_FIND_CORE
Definition: dsp5680xx.h:249
#define DSP5680XX_ERROR_JTAG_IRSCAN
Definition: dsp5680xx.h:251
#define HFM_LOCK_ADDR_L
Definition: dsp5680xx.h:204
#define HFM_CNFG
Definition: dsp5680xx.h:169
#define HFM_MASS_ERASE
Definition: dsp5680xx.h:153
#define HFM_SECTOR_SIZE
Definition: dsp5680xx.h:196
#define DSP5680XX_JTAG_MASTER_TAP_IRLEN
Definition: dsp5680xx.h:35
#define MC568013_SIM_BASE_ADDR
Definition: dsp5680xx.h:227
#define DSP5680XX_ERROR_PROTECT_CHECK_INVALID_ARGS
Definition: dsp5680xx.h:256
#define DSP5680XX_ONCE_OSCR_NORMAL_M
Definition: dsp5680xx.h:103
#define HFM_FLASH_BASE_ADDR
Definition: dsp5680xx.h:193
#define JTAG_STATUS_DEAD
Definition: dsp5680xx.h:43
#define HFM_USTAT
Definition: dsp5680xx.h:174
#define DSP5680XX_ONCE_OTX1
Definition: dsp5680xx.h:129
#define HFM_DATA
Definition: dsp5680xx.h:176
#define HFM_LOCK_FLASH
Writing HFM_LOCK_FLASH to HFM_LOCK_ADDR_L and HFM_LOCK_ADDR_H will enable security on flash after the...
Definition: dsp5680xx.h:203
#define DSP5680XX_ONCE_OSCR_DEBUG_M
Definition: dsp5680xx.h:109
#define HFM_SECTOR_COUNT
Definition: dsp5680xx.h:197
#define DSP5680XX_ONCE_OTX
Definition: dsp5680xx.h:127
#define HFM_PROT
Definition: dsp5680xx.h:172
#define SIM_CMD_RESET
Definition: dsp5680xx.h:230
#define DSP5680XX_ONCE_OSR
Definition: dsp5680xx.h:123
#define MASTER_TAP_CMD_IDCODE
Definition: dsp5680xx.h:63
#define S_FILE_DATA_OFFSET
Definition: dsp5680xx.h:27
#define DSP5680XX_ERROR_JTAG_DRSCAN
Definition: dsp5680xx.h:250
#define DSP5680XX_ERROR_FM_BUSY
Definition: dsp5680xx.h:257
#define HFM_CALCULATE_DATA_SIGNATURE
Definition: dsp5680xx.h:150
#define TIME_DIV_FREESCALE
Definition: dsp5680xx.h:28
#define EONCE_STAT_MASK
Definition: dsp5680xx.h:111
#define DSP5680XX_ERROR_FLASHING_CRC
Definition: dsp5680xx.h:262
#define DSP5680XX_ERROR_JTAG_TAP_ENABLE_MASTER
Definition: dsp5680xx.h:246
#define DSP5680XX_ERROR_JTAG_DR_LEN_OVERFLOW
Definition: dsp5680xx.h:244
#define DSP5680XX_ERROR_JTAG_INVALID_TAP
Definition: dsp5680xx.h:243
#define DSP5680XX_ERROR_FM_CMD_TIMED_OUT
Definition: dsp5680xx.h:258
#define DSP5680XX_ERROR_JTAG_TAP_ENABLE_CORE
Definition: dsp5680xx.h:247
#define HFM_SIZE_WORDS
Definition: dsp5680xx.h:195
#define MC568013_EONCE_TX_RX_ADDR
Definition: dsp5680xx.h:216
#define DSP5680XX_JTAG_CORE_TAP_IRLEN
Definition: dsp5680xx.h:34
uint64_t buffer
Pointer to data buffer to send over SPI.
Definition: dw-spi-helper.h:0
uint32_t size
Size of dw_spi_transaction::buffer.
Definition: dw-spi-helper.h:4
uint32_t address
Starting address. Sector aligned.
Definition: dw-spi-helper.h:0
enum tap_state tap_state_by_name(const char *name)
Provides user-friendly name lookup of TAP states.
Definition: interface.c:355
void jtag_add_plain_dr_scan(int num_bits, const uint8_t *out_bits, uint8_t *in_bits, enum tap_state state)
Scan out the bits in ir scan mode.
Definition: jtag/core.c:469
struct jtag_tap * jtag_tap_by_string(const char *s)
Definition: jtag/core.c:241
void jtag_add_reset(int req_tlr_or_trst, int req_srst)
A reset of the TAP state machine can be requested.
Definition: jtag/core.c:769
int jtag_execute_queue(void)
For software FIFO implementations, the queued commands can be executed during this call or earlier.
Definition: jtag/core.c:1048
void jtag_add_pathmove(unsigned int num_states, const enum tap_state *path)
Application code must assume that interfaces will implement transitions between states with different...
Definition: jtag/core.c:521
int jtag_add_statemove(enum tap_state goal_state)
jtag_add_statemove() moves from the current state to goal_state.
Definition: jtag/core.c:555
void jtag_add_sleep(uint32_t us)
Definition: jtag/core.c:881
void jtag_add_plain_ir_scan(int num_bits, const uint8_t *out_bits, uint8_t *in_bits, enum tap_state state)
Scan out the bits in ir scan mode.
Definition: jtag/core.c:396
tap_state
Defines JTAG Test Access Port states.
Definition: jtag.h:37
@ TAP_IDLE
Definition: jtag.h:53
#define LOG_USER(expr ...)
Definition: log.h:150
#define LOG_WARNING(expr ...)
Definition: log.h:144
#define ERROR_FAIL
Definition: log.h:188
#define LOG_ERROR(expr ...)
Definition: log.h:147
#define LOG_DEBUG(expr ...)
Definition: log.h:124
#define ERROR_OK
Definition: log.h:182
uint32_t stored_pc
Definition: dsp5680xx.h:274
bool debug_mode_enabled
Definition: dsp5680xx.h:276
Definition: jtag.h:101
char * chip
Definition: jtag.h:102
unsigned int ir_length
size of instruction register
Definition: jtag.h:110
bool enabled
Is this TAP currently enabled?
Definition: jtag.h:109
This holds methods shared between all instances of a given target type.
Definition: target_type.h:26
const char * name
Name of this type of target.
Definition: target_type.h:31
Definition: target.h:119
struct jtag_tap * tap
Definition: target.h:122
enum target_state state
Definition: target.h:160
void * arch_info
Definition: target.h:167
@ TARGET_RESET
Definition: target.h:59
@ TARGET_UNKNOWN
Definition: target.h:56
@ TARGET_HALTED
Definition: target.h:58
@ TARGET_RUNNING
Definition: target.h:57
#define ERROR_TARGET_DATA_ABORT
Definition: target.h:798
#define ERROR_TARGET_FAILURE
Definition: target.h:796
uint64_t target_addr_t
Definition: types.h:279
#define NULL
Definition: usb.h:16
uint8_t status[4]
Definition: vdebug.c:17
uint8_t count[4]
Definition: vdebug.c:22