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  int retval = jtag_add_statemove(TAP_RESET);
37  if (retval != ERROR_OK)
38  return retval;
39  return jtag_execute_queue();
40 }
41 
42 static int dsp5680xx_drscan(struct target *target, uint8_t *d_in,
43  uint8_t *d_out, int len)
44 {
45  /* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
46  *
47  *Inputs:
48  * - d_in: This is the data that will be shifted into the JTAG DR reg.
49  * - d_out: The data that will be shifted out of the JTAG DR reg will stored here
50  * - len: Length of the data to be shifted to JTAG DR.
51  *
52  *Note: If d_out == NULL, discard incoming bits.
53  *
54  *-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
55  */
56  if (!target->tap) {
58  return ERROR_FAIL;
59  }
60  if (len > 32) {
62  "dr_len overflow, maximum is 32");
63  return ERROR_FAIL;
64  }
65  /* TODO what values of len are valid for jtag_add_plain_dr_scan? */
66  /* can i send as many bits as i want? */
67  /* is the casting necessary? */
68  jtag_add_plain_dr_scan(len, d_in, d_out, TAP_IDLE);
70  int retval = dsp5680xx_execute_queue();
71  if (retval != ERROR_OK) {
72  err_log(DSP5680XX_ERROR_JTAG_DRSCAN, "drscan failed!");
73  return retval;
74  }
75  }
76  if (d_out)
77  LOG_DEBUG("Data read (%d bits): 0x%04X", len, *d_out);
78  else
79  LOG_DEBUG("Data read was discarded.");
80  return ERROR_OK;
81 }
82 
92 static int dsp5680xx_irscan(struct target *target, uint32_t *d_in,
93  uint32_t *d_out, uint8_t ir_len)
94 {
95  uint16_t tap_ir_len = DSP5680XX_JTAG_MASTER_TAP_IRLEN;
96 
97  if (!target || !target->tap) {
99  return ERROR_FAIL;
100  }
101  if (ir_len != target->tap->ir_length) {
102  if (target->tap->enabled) {
103  err_log(DSP5680XX_ERROR_INVALID_IR_LEN, "Invalid irlen");
104  return ERROR_FAIL;
105  } else {
106  struct jtag_tap *t =
107  jtag_tap_by_string("dsp568013.chp");
108  if ((!t)
109  || ((t->enabled) && (ir_len != tap_ir_len))) {
110  err_log(DSP5680XX_ERROR_INVALID_IR_LEN, "Invalid irlen");
111  return ERROR_FAIL;
112  }
113  }
114  }
115  jtag_add_plain_ir_scan(ir_len, (uint8_t *) d_in, (uint8_t *) d_out,
116  TAP_IDLE);
117  if (dsp5680xx_context.flush) {
118  int retval = dsp5680xx_execute_queue();
119  if (retval != ERROR_OK) {
120  err_log(DSP5680XX_ERROR_JTAG_IRSCAN, "irscan failed!");
121  return retval;
122  }
123  }
124  return ERROR_OK;
125 }
126 
127 static int dsp5680xx_jtag_status(struct target *target, uint8_t *status)
128 {
129  uint32_t read_from_ir;
130 
131  uint32_t instr = JTAG_INSTR_ENABLE_ONCE;
132 
133  int retval =
134  dsp5680xx_irscan(target, &instr, &read_from_ir,
136  if (retval != ERROR_OK)
137  return retval;
138  if (status)
139  *status = (uint8_t) read_from_ir;
140  return ERROR_OK;
141 }
142 
143 static int jtag_data_read(struct target *target, uint8_t *data_read,
144  int num_bits)
145 {
146  uint32_t bogus_instr = 0;
147 
148  int retval =
149  dsp5680xx_drscan(target, (uint8_t *) &bogus_instr, data_read,
150  num_bits);
151  LOG_DEBUG("Data read (%d bits): 0x%04X", num_bits, *data_read);
153  return retval;
154 }
155 
156 #define jtag_data_read8(target, data_read) jtag_data_read(target, data_read, 8)
157 #define jtag_data_read16(target, data_read) jtag_data_read(target, data_read, 16)
158 #define jtag_data_read32(target, data_read) jtag_data_read(target, data_read, 32)
159 
160 static uint32_t data_read_dummy;
161 
162 static int jtag_data_write(struct target *target, uint32_t instr, int num_bits,
163  uint32_t *data_read)
164 {
165  int retval =
166  dsp5680xx_drscan(target, (uint8_t *) &instr,
167  (uint8_t *) &data_read_dummy, num_bits);
168  if (retval != ERROR_OK)
169  return retval;
170  if (data_read)
171  *data_read = data_read_dummy;
172  return ERROR_OK;
173 }
174 
175 #define jtag_data_write8(target, instr, data_read) jtag_data_write(target, instr, 8, data_read)
176 #define jtag_data_write16(target, instr, data_read) jtag_data_write(target, instr, 16, data_read)
177 #define jtag_data_write24(target, instr, data_read) jtag_data_write(target, instr, 24, data_read)
178 #define jtag_data_write32(target, instr, data_read) jtag_data_write(target, instr, 32, data_read)
179 
192 static int eonce_instruction_exec_single(struct target *target, uint8_t instr,
193  uint8_t rw, uint8_t go, uint8_t ex,
194  uint8_t *eonce_status)
195 {
196  uint32_t dr_out_tmp;
197 
198  uint8_t instr_with_flags = instr | (rw << 7) | (go << 6) | (ex << 5);
199 
200  int retval = jtag_data_write(target, instr_with_flags, 8, &dr_out_tmp);
201  if (retval != ERROR_OK)
202  return retval;
203  if (eonce_status)
204  *eonce_status = (uint8_t) dr_out_tmp;
205  return ERROR_OK;
206 }
207 
208 /* wrappers for multi opcode instructions */
209 #define dsp5680xx_exe_1(target, oc1, oc2, oc3) dsp5680xx_exe1(target, oc1)
210 #define dsp5680xx_exe_2(target, oc1, oc2, oc3) dsp5680xx_exe2(target, oc1, oc2)
211 #define dsp5680xx_exe_3(target, oc1, oc2, oc3) dsp5680xx_exe3(target, oc1, oc2, oc3)
212 #define dsp5680xx_exe_generic(t, words, oc1, oc2, oc3) dsp5680xx_exe_##words(t, oc1, oc2, oc3)
213 
214 /* Executes one word DSP instruction */
215 static int dsp5680xx_exe1(struct target *target, uint16_t opcode)
216 {
217  int retval = eonce_instruction_exec_single(target, 0x04, 0, 1, 0, NULL);
218  if (retval != ERROR_OK)
219  return retval;
220  return jtag_data_write16(target, opcode, NULL);
221 }
222 
223 /* Executes two word DSP instruction */
224 static int dsp5680xx_exe2(struct target *target, uint16_t opcode1,
225  uint16_t opcode2)
226 {
227  int retval = eonce_instruction_exec_single(target, 0x04, 0, 0, 0, NULL);
228  if (retval != ERROR_OK)
229  return retval;
230  retval = jtag_data_write16(target, opcode1, NULL);
231  if (retval != ERROR_OK)
232  return retval;
233  retval = eonce_instruction_exec_single(target, 0x04, 0, 1, 0, NULL);
234  if (retval != ERROR_OK)
235  return retval;
236  return jtag_data_write16(target, opcode2, NULL);
237 }
238 
239 /* Executes three word DSP instruction */
240 static int dsp5680xx_exe3(struct target *target, uint16_t opcode1,
241  uint16_t opcode2, uint16_t opcode3)
242 {
243  int retval = eonce_instruction_exec_single(target, 0x04, 0, 0, 0, NULL);
244  if (retval != ERROR_OK)
245  return retval;
246  retval = jtag_data_write16(target, opcode1, NULL);
247  if (retval != ERROR_OK)
248  return retval;
249  retval = eonce_instruction_exec_single(target, 0x04, 0, 0, 0, NULL);
250  if (retval != ERROR_OK)
251  return retval;
252  retval = jtag_data_write16(target, opcode2, NULL);
253  if (retval != ERROR_OK)
254  return retval;
255  retval = eonce_instruction_exec_single(target, 0x04, 0, 1, 0, NULL);
256  if (retval != ERROR_OK)
257  return retval;
258  return jtag_data_write16(target, opcode3, NULL);
259 }
260 
261 /*
262  *--------------- Real-time data exchange ---------------
263  * The EOnCE Transmit (OTX) and Receive (ORX) registers are data memory mapped, each with an upper
264  * and lower 16 bit word.
265  * Transmit and receive directions are defined from the core’s perspective.
266  * The core writes to the Transmit register and reads the Receive register, and the host through
267  * JTAG writes to the Receive register and reads the Transmit register.
268  * Both registers have a combined data memory mapped OTXRXSR which provides indication when
269  * each may be accessed.
270  * ref: eonce_rev.1.0_0208081.pdf@36
271  */
272 
273 /* writes data into upper ORx register of the target */
274 static int core_tx_upper_data(struct target *target, uint16_t data,
275  uint32_t *eonce_status_low)
276 {
277  int retval =
279  NULL);
280  if (retval != ERROR_OK)
281  return retval;
282  return jtag_data_write16(target, data, eonce_status_low);
283 }
284 
285 /* writes data into lower ORx register of the target */
286 #define CMD1 eonce_instruction_exec_single(target, DSP5680XX_ONCE_ORX, 0, 0, 0, NULL);
287 #define CMD2 jtag_data_write16((t, data)
288 #define core_tx_lower_data(t, data) PT1\ PT2
289 
296 static int core_rx_upper_data(struct target *target, uint8_t *data_read)
297 {
298  int retval =
300  NULL);
301  if (retval != ERROR_OK)
302  return retval;
303  return jtag_data_read16(target, data_read);
304 }
305 
312 static int core_rx_lower_data(struct target *target, uint8_t *data_read)
313 {
314  int retval =
316  NULL);
317  if (retval != ERROR_OK)
318  return retval;
319  return jtag_data_read16(target, data_read);
320 }
321 
322 /*
323  *-- -- -- -- --- -- -- -- --- -- -- -- --- -- -- -- --- -- -- -- --- --
324  *-- -- -- -- --- -- -- -Core Instructions- -- -- -- --- -- -- -- --- --
325  *-- -- -- -- --- -- -- -- --- -- -- -- --- -- -- -- --- -- -- -- --- --
326  */
327 
328 #define exe(a, b, c, d, e) dsp5680xx_exe_generic(a, b, c, d, e)
329 
330 /* move.l #value, r0 */
331 #define core_move_long_to_r0(target, value) exe(target, 3, 0xe418, value&0xffff, value>>16)
332 
333 /* move.l #value, n */
334 #define core_move_long_to_n(target, value) exe(target, 3, 0xe41e, value&0xffff, value>>16)
335 
336 /* move x:(r0), y0 */
337 #define core_move_at_r0_to_y0(target) exe(target, 1, 0xF514, 0, 0)
338 
339 /* move x:(r0), y1 */
340 #define core_move_at_r0_to_y1(target) exe(target, 1, 0xF714, 0, 0)
341 
342 /* move.l x:(r0), y */
343 #define core_move_long_at_r0_y(target) exe(target, 1, 0xF734, 0, 0)
344 
345 /* move y0, x:(r0) */
346 #define core_move_y0_at_r0(target) exe(target, 1, 0xd514, 0, 0)
347 
348 /* bfclr #value, x:(r0) */
349 #define eonce_bfclr_at_r0(target, value) exe(target, 2, 0x8040, value, 0)
350 
351 /* move #value, y0 */
352 #define core_move_value_to_y0(target, value) exe(target, 2, 0x8745, value, 0)
353 
354 /* move.w y0, x:(r0)+ */
355 #define core_move_y0_at_r0_inc(target) exe(target, 1, 0xd500, 0, 0)
356 
357 /* move.w y0, p:(r0)+ */
358 #define core_move_y0_at_pr0_inc(target) exe(target, 1, 0x8560, 0, 0)
359 
360 /* move.w p:(r0)+, y0 */
361 #define core_move_at_pr0_inc_to_y0(target) exe(target, 1, 0x8568, 0, 0)
362 
363 /* move.w p:(r0)+, y1 */
364 #define core_move_at_pr0_inc_to_y1(target) exe(target, 1, 0x8768, 0, 0)
365 
366 /* move.l #value, r2 */
367 #define core_move_long_to_r2(target, value) exe(target, 3, 0xe41A, value&0xffff, value>>16)
368 
369 /* move y0, x:(r2) */
370 #define core_move_y0_at_r2(target) exe(target, 1, 0xd516, 0, 0)
371 
372 /* move.w #<value>, x:(r2) */
373 #define core_move_value_at_r2(target, value) exe(target, 2, 0x8642, value, 0)
374 
375 /* move.w #<value>, x:(r0) */
376 #define core_move_value_at_r0(target, value) exe(target, 2, 0x8640, value, 0)
377 
378 /* move.w #<value>, x:(R2+<disp>) */
379 #define core_move_value_at_r2_disp(target, value, disp) exe(target, 3, 0x8646, value, disp)
380 
381 /* move.w x:(r2), Y0 */
382 #define core_move_at_r2_to_y0(target) exe(target, 1, 0xF516, 0, 0)
383 
384 /* move.w p:(r2)+, y0 */
385 #define core_move_at_pr2_inc_to_y0(target) exe(target, 1, 0x856A, 0, 0)
386 
387 /* move.l #value, r3 */
388 #define core_move_long_to_r1(target, value) exe(target, 3, 0xE419, value&0xffff, value>>16)
389 
390 /* move.l #value, r3 */
391 #define core_move_long_to_r3(target, value) exe(target, 3, 0xE41B, value&0xffff, value>>16)
392 
393 /* move.w y0, p:(r3)+ */
394 #define core_move_y0_at_pr3_inc(target) exe(target, 1, 0x8563, 0, 0)
395 
396 /* move.w y0, x:(r3) */
397 #define core_move_y0_at_r3(target) exe(target, 1, 0xD503, 0, 0)
398 
399 /* move.l #value, r4 */
400 #define core_move_long_to_r4(target, value) exe(target, 3, 0xE41C, value&0xffff, value>>16)
401 
402 /* move pc, r4 */
403 #define core_move_pc_to_r4(target) exe(target, 1, 0xE716, 0, 0)
404 
405 /* move.l r4, y */
406 #define core_move_r4_to_y(target) exe(target, 1, 0xe764, 0, 0)
407 
408 /* move.w p:(r0)+, y0 */
409 #define core_move_at_pr0_inc_to_y0(target) exe(target, 1, 0x8568, 0, 0)
410 
411 /* move.w x:(r0)+, y0 */
412 #define core_move_at_r0_inc_to_y0(target) exe(target, 1, 0xf500, 0, 0)
413 
414 /* move x:(r0), y0 */
415 #define core_move_at_r0_y0(target) exe(target, 1, 0xF514, 0, 0)
416 
417 /* nop */
418 #define eonce_nop(target) exe(target, 1, 0xe700, 0, 0)
419 
420 /* move.w x:(R2+<disp>), Y0 */
421 #define core_move_at_r2_disp_to_y0(target, disp) exe(target, 2, 0xF542, disp, 0)
422 
423 /* move.w y1, x:(r2) */
424 #define core_move_y1_at_r2(target) exe(target, 1, 0xd716, 0, 0)
425 
426 /* move.w y1, x:(r0) */
427 #define core_move_y1_at_r0(target) exe(target, 1, 0xd714, 0, 0)
428 
429 /* move.bp y0, x:(r0)+ */
430 #define core_move_byte_y0_at_r0(target) exe(target, 1, 0xd5a0, 0, 0)
431 
432 /* move.w y1, p:(r0)+ */
433 #define core_move_y1_at_pr0_inc(target) exe(target, 1, 0x8760, 0, 0)
434 
435 /* move.w y1, x:(r0)+ */
436 #define core_move_y1_at_r0_inc(target) exe(target, 1, 0xD700, 0, 0)
437 
438 /* move.l #value, y */
439 #define core_move_long_to_y(target, value) exe(target, 3, 0xe417, value&0xffff, value>>16)
440 
441 static int core_move_value_to_pc(struct target *target, uint32_t value)
442 {
443  if (target->state != TARGET_HALTED) {
445  return ERROR_FAIL;
446  }
449  return ERROR_FAIL;
450  }
451 
452  return dsp5680xx_exe_generic(target, 3, 0xE71E, value & 0xffff,
453  value >> 16);
454 }
455 
457 {
460  (MC568013_EONCE_OBASE_ADDR << 16)));
461 }
462 
464 {
467  (MC568013_EONCE_OBASE_ADDR << 16)));
468 }
469 
470 static int dsp5680xx_read_core_reg(struct target *target, uint8_t reg_addr,
471  uint16_t *data_read)
472 {
473  /* TODO implement a general version of this which matches what openocd uses. */
474  uint32_t dummy_data_to_shift_into_dr;
475 
476  int retval = eonce_instruction_exec_single(target, reg_addr, 1, 0, 0, NULL);
477  if (retval != ERROR_OK)
478  return retval;
479  retval =
480  dsp5680xx_drscan(target, (uint8_t *) &dummy_data_to_shift_into_dr,
481  (uint8_t *) data_read, 8);
482  if (retval != ERROR_OK)
483  return retval;
484  LOG_DEBUG("Reg. data: 0x%02X.", *data_read);
485  return ERROR_OK;
486 }
487 
488 static int eonce_read_status_reg(struct target *target, uint16_t *data)
489 {
491 }
492 
501 static int eonce_exit_debug_mode(struct target *target, uint8_t *eonce_status)
502 {
503  return eonce_instruction_exec_single(target, 0x1F, 0, 0, 1, eonce_status);
504 }
505 
506 static int switch_tap(struct target *target, struct jtag_tap *master_tap,
507  struct jtag_tap *core_tap)
508 {
509  int retval = ERROR_OK;
510 
511  uint32_t instr;
512 
513  uint32_t ir_out; /* not used, just to make jtag happy. */
514 
515  if (!master_tap) {
516  master_tap = jtag_tap_by_string("dsp568013.chp");
517  if (!master_tap) {
518  const char *msg = "Failed to get master tap.";
519 
521  return ERROR_FAIL;
522  }
523  }
524  if (!core_tap) {
525  core_tap = jtag_tap_by_string("dsp568013.cpu");
526  if (!core_tap) {
528  "Failed to get core tap.");
529  return ERROR_FAIL;
530  }
531  }
532 
533  if (!(((int)master_tap->enabled) ^ ((int)core_tap->enabled))) {
535  ("Master:%d\nCore:%d\nOnly 1 should be enabled.\n",
536  (int)master_tap->enabled, (int)core_tap->enabled);
537  }
538 
539  if (master_tap->enabled) {
540  instr = 0x5;
541  retval =
542  dsp5680xx_irscan(target, &instr, &ir_out,
544  if (retval != ERROR_OK)
545  return retval;
546  instr = 0x2;
547  retval =
548  dsp5680xx_drscan(target, (uint8_t *) &instr,
549  (uint8_t *) &ir_out, 4);
550  if (retval != ERROR_OK)
551  return retval;
552  core_tap->enabled = true;
553  master_tap->enabled = false;
554  } else {
555  instr = 0x08;
556  retval =
557  dsp5680xx_irscan(target, &instr, &ir_out,
559  if (retval != ERROR_OK)
560  return retval;
561  instr = 0x1;
562  retval =
563  dsp5680xx_drscan(target, (uint8_t *) &instr,
564  (uint8_t *) &ir_out, 4);
565  if (retval != ERROR_OK)
566  return retval;
567  core_tap->enabled = false;
568  master_tap->enabled = true;
569  }
570  return ERROR_OK;
571 }
572 
588  uint16_t *eonce_status)
589 {
590  uint32_t instr = JTAG_INSTR_DEBUG_REQUEST;
591 
592  uint32_t ir_out; /* not used, just to make jtag happy.*/
593 
594  /* Debug request #1 */
595  int retval =
596  dsp5680xx_irscan(target, &instr, &ir_out,
598  if (retval != ERROR_OK)
599  return retval;
600 
601  /* Enable EOnCE module */
602  instr = JTAG_INSTR_ENABLE_ONCE;
603  /* Two rounds of jtag 0x6 (enable eonce) to enable EOnCE. */
604  retval =
605  dsp5680xx_irscan(target, &instr, &ir_out,
607  if (retval != ERROR_OK)
608  return retval;
609  retval =
610  dsp5680xx_irscan(target, &instr, &ir_out,
612  if (retval != ERROR_OK)
613  return retval;
614  if ((ir_out & JTAG_STATUS_MASK) == JTAG_STATUS_DEBUG)
616  else {
617  return ERROR_FAIL;
618  }
619  /* Verify that debug mode is enabled */
620  uint16_t data_read_from_dr;
621 
622  retval = eonce_read_status_reg(target, &data_read_from_dr);
623  if (retval != ERROR_OK)
624  return retval;
625  if ((data_read_from_dr & 0x30) == 0x30) {
626  LOG_DEBUG("EOnCE successfully entered debug mode.");
628  } else {
633  return ERROR_TARGET_FAILURE;
634  }
635  if (eonce_status)
636  *eonce_status = data_read_from_dr;
637  return ERROR_OK;
638 }
639 
649  uint16_t *eonce_status)
650 {
651  uint32_t instr = JTAG_INSTR_DEBUG_REQUEST;
652 
653  uint32_t ir_out; /* not used, just to make jtag happy. */
654 
655  uint16_t instr_16;
656 
657  uint16_t read_16;
658 
659  /* First try the easy way */
660  int retval = eonce_enter_debug_mode_without_reset(target, eonce_status);
661  if (retval == ERROR_OK)
662  return retval;
663 
664  struct jtag_tap *tap_chp = jtag_tap_by_string("dsp568013.chp");
665  if (!tap_chp) {
667  "Failed to get master tap.");
668  return ERROR_FAIL;
669  }
670  struct jtag_tap *tap_cpu = jtag_tap_by_string("dsp568013.cpu");
671  if (!tap_cpu) {
673  "Failed to get master tap.");
674  return ERROR_FAIL;
675  }
676  /* Enable master tap */
677  tap_chp->enabled = true;
678  tap_cpu->enabled = false;
679 
680  instr = MASTER_TAP_CMD_IDCODE;
681  retval =
682  dsp5680xx_irscan(target, &instr, &ir_out,
684  if (retval != ERROR_OK)
685  return retval;
686  jtag_add_sleep(TIME_DIV_FREESCALE * 100 * 1000);
687 
688  /* Enable EOnCE module */
689  jtag_add_reset(0, 1);
690  jtag_add_sleep(TIME_DIV_FREESCALE * 200 * 1000);
691  instr = 0x0606ffff; /* This was selected experimentally. */
692  retval =
693  dsp5680xx_drscan(target, (uint8_t *) &instr, (uint8_t *) &ir_out,
694  32);
695  if (retval != ERROR_OK)
696  return retval;
697  /* ir_out now hold tap idcode */
698 
699  /* Enable core tap */
700  tap_chp->enabled = true;
701  retval = switch_tap(target, tap_chp, tap_cpu);
702  if (retval != ERROR_OK)
703  return retval;
704 
705  instr = JTAG_INSTR_ENABLE_ONCE;
706  /* Two rounds of jtag 0x6 (enable eonce) to enable EOnCE. */
707  retval =
708  dsp5680xx_irscan(target, &instr, &ir_out,
710  if (retval != ERROR_OK)
711  return retval;
712  instr = JTAG_INSTR_DEBUG_REQUEST;
713  retval =
714  dsp5680xx_irscan(target, &instr, &ir_out,
716  if (retval != ERROR_OK)
717  return retval;
718  instr_16 = 0x1;
719  retval =
720  dsp5680xx_drscan(target, (uint8_t *) &instr_16,
721  (uint8_t *) &read_16, 8);
722  if (retval != ERROR_OK)
723  return retval;
724  instr_16 = 0x20;
725  retval =
726  dsp5680xx_drscan(target, (uint8_t *) &instr_16,
727  (uint8_t *) &read_16, 8);
728  if (retval != ERROR_OK)
729  return retval;
730  jtag_add_sleep(TIME_DIV_FREESCALE * 100 * 1000);
731  jtag_add_reset(0, 0);
732  jtag_add_sleep(TIME_DIV_FREESCALE * 300 * 1000);
733 
734  instr = JTAG_INSTR_ENABLE_ONCE;
735  /* Two rounds of jtag 0x6 (enable eonce) to enable EOnCE. */
736  for (int i = 0; i < 3; i++) {
737  retval =
738  dsp5680xx_irscan(target, &instr, &ir_out,
740  if (retval != ERROR_OK)
741  return retval;
742  }
743  if ((ir_out & JTAG_STATUS_MASK) == JTAG_STATUS_DEBUG)
745  else {
746  err_log(DSP5680XX_ERROR_HALT, "Failed to halt target.");
747  return ERROR_FAIL;
748  }
749 
750  for (int i = 0; i < 3; i++) {
751  instr_16 = 0x86;
752  dsp5680xx_drscan(target, (uint8_t *) &instr_16,
753  (uint8_t *) &read_16, 16);
754  instr_16 = 0xff;
755  dsp5680xx_drscan(target, (uint8_t *) &instr_16,
756  (uint8_t *) &read_16, 16);
757  }
758 
759  /* Verify that debug mode is enabled */
760  uint16_t data_read_from_dr;
761 
762  retval = eonce_read_status_reg(target, &data_read_from_dr);
763  if (retval != ERROR_OK)
764  return retval;
765  if ((data_read_from_dr & 0x30) == 0x30) {
766  LOG_DEBUG("EOnCE successfully entered debug mode.");
768  } else {
769  const char *msg = "Failed to set EOnCE module to debug mode";
770 
772  return ERROR_TARGET_FAILURE;
773  }
774  if (eonce_status)
775  *eonce_status = data_read_from_dr;
776  return ERROR_OK;
777 }
778 
786 static int eonce_pc_store(struct target *target)
787 {
788  uint8_t tmp[2];
789 
790  int retval = core_move_pc_to_r4(target);
791  if (retval != ERROR_OK)
792  return retval;
793  retval = core_move_r4_to_y(target);
794  if (retval != ERROR_OK)
795  return retval;
796  retval = eonce_load_tx_rx_to_r0(target);
797  if (retval != ERROR_OK)
798  return retval;
799  retval = core_move_y0_at_r0(target);
800  if (retval != ERROR_OK)
801  return retval;
802  retval = core_rx_lower_data(target, tmp);
803  if (retval != ERROR_OK)
804  return retval;
805  LOG_USER("PC value: 0x%X%X\n", tmp[1], tmp[0]);
806  dsp5680xx_context.stored_pc = (tmp[0] | (tmp[1] << 8));
807  return ERROR_OK;
808 }
809 
811 {
812  struct dsp5680xx_common *dsp5680xx =
813  calloc(1, sizeof(struct dsp5680xx_common));
814  target->arch_info = dsp5680xx;
815  return ERROR_OK;
816 }
817 
818 static int dsp5680xx_init_target(struct command_context *cmd_ctx,
819  struct target *target)
820 {
824  LOG_DEBUG("target initiated!");
825  /* TODO core tap must be enabled before running these commands, currently
826  * this is done in the .cfg tcl script. */
827  return ERROR_OK;
828 }
829 
830 static int dsp5680xx_arch_state(struct target *target)
831 {
832  LOG_USER("%s not implemented yet.", __func__);
833  return ERROR_OK;
834 }
835 
837 {
839  return ERROR_OK;
840 }
841 
843 {
845  return ERROR_OK;
846 }
847 
848 static int dsp5680xx_halt(struct target *target)
849 {
850  uint16_t eonce_status = 0xbeef;
851 
852  if ((target->state == TARGET_HALTED)
854  LOG_USER("Target already halted and in debug mode.");
855  return ERROR_OK;
856  } else {
857  if (target->state == TARGET_HALTED)
858  LOG_USER
859  ("Target already halted, re attempting to enter debug mode.");
860  }
861  int retval = eonce_enter_debug_mode(target, &eonce_status);
862  if (retval != ERROR_OK)
863  return retval;
864  retval = eonce_pc_store(target);
865  if (retval != ERROR_OK)
866  return retval;
868  retval = eonce_pc_store(target);
869  }
870  return retval;
871 }
872 
873 static int dsp5680xx_poll(struct target *target)
874 {
875  uint8_t jtag_status;
876 
877  uint8_t eonce_status;
878 
879  uint16_t read_tmp;
880 
881  int retval = dsp5680xx_jtag_status(target, &jtag_status);
882  if (retval != ERROR_OK)
883  return retval;
884  if (jtag_status == JTAG_STATUS_DEBUG)
885  if (target->state != TARGET_HALTED) {
886  retval = eonce_enter_debug_mode(target, &read_tmp);
887  if (retval != ERROR_OK)
888  return retval;
889  eonce_status = (uint8_t) read_tmp;
890  if ((eonce_status & EONCE_STAT_MASK) !=
892  const char *msg =
893  "%s: Failed to put EOnCE in debug mode.Flash locked?...";
894  LOG_WARNING(msg, __func__);
895  return ERROR_TARGET_FAILURE;
896  } else {
898  return ERROR_OK;
899  }
900  }
901  if (jtag_status == JTAG_STATUS_NORMAL) {
902  if (target->state == TARGET_RESET) {
903  retval = dsp5680xx_halt(target);
904  if (retval != ERROR_OK)
905  return retval;
906  retval = eonce_exit_debug_mode(target, &eonce_status);
907  if (retval != ERROR_OK)
908  return retval;
909  if ((eonce_status & EONCE_STAT_MASK) !=
911  const char *msg =
912  "%s: JTAG running, but EOnCE run failed.Try resetting..";
913  LOG_WARNING(msg, __func__);
914  return ERROR_TARGET_FAILURE;
915  } else {
917  return ERROR_OK;
918  }
919  }
920  if (target->state != TARGET_RUNNING) {
921  retval = eonce_read_status_reg(target, &read_tmp);
922  if (retval != ERROR_OK)
923  return retval;
924  eonce_status = (uint8_t) read_tmp;
925  if ((eonce_status & EONCE_STAT_MASK) !=
928  ("Inconsistent target status. Restart!");
929  return ERROR_TARGET_FAILURE;
930  }
931  }
933  return ERROR_OK;
934  }
935  if (jtag_status == JTAG_STATUS_DEAD) {
936  LOG_ERROR
937  ("%s: Cannot communicate with JTAG. Check connection...",
938  __func__);
940  return ERROR_TARGET_FAILURE;
941  }
942  if (target->state == TARGET_UNKNOWN) {
943  LOG_ERROR("%s: Target status invalid - communication failure",
944  __func__);
945  return ERROR_TARGET_FAILURE;
946  }
947  return ERROR_OK;
948 }
949 
950 static int dsp5680xx_resume(struct target *target, bool current,
951  target_addr_t address, bool handle_breakpoints, bool debug_execution)
952 {
953  if (target->state == TARGET_RUNNING) {
954  LOG_USER("Target already running.");
955  return ERROR_OK;
956  }
957  int retval;
958 
959  uint8_t eonce_status;
960 
961  uint8_t jtag_status;
962 
964  if (!current) {
966  if (retval != ERROR_OK)
967  return retval;
968  }
969 
970  int retry = 20;
971 
972  while (retry-- > 1) {
973  retval = eonce_exit_debug_mode(target, &eonce_status);
974  if (retval != ERROR_OK)
975  return retval;
976  if (eonce_status == DSP5680XX_ONCE_OSCR_NORMAL_M)
977  break;
978  }
979  if (retry == 0) {
981  "Failed to exit debug mode...");
982  return ERROR_TARGET_FAILURE;
983  } else {
986  }
987  LOG_DEBUG("EOnCE status: 0x%02X.", eonce_status);
988  } else {
989  /*
990  * If debug mode was not enabled but target was halted, then it is most likely that
991  * access to eonce registers is locked.
992  * Reset target to make it run again.
993  */
994  jtag_add_reset(0, 1);
995  jtag_add_sleep(TIME_DIV_FREESCALE * 200 * 1000);
996 
997  retval = reset_jtag();
998  if (retval != ERROR_OK) {
1000  "Failed to reset JTAG state machine");
1001  return retval;
1002  }
1003  jtag_add_sleep(TIME_DIV_FREESCALE * 100 * 1000);
1004  jtag_add_reset(0, 0);
1005  jtag_add_sleep(TIME_DIV_FREESCALE * 300 * 1000);
1006  retval = dsp5680xx_jtag_status(target, &jtag_status);
1007  if (retval != ERROR_OK)
1008  return retval;
1009  if ((jtag_status & JTAG_STATUS_MASK) == JTAG_STATUS_NORMAL) {
1012  } else {
1013  err_log(DSP5680XX_ERROR_RESUME, "Failed to resume target");
1014  return ERROR_TARGET_FAILURE;
1015  }
1016  }
1017  return ERROR_OK;
1018 }
1019 
1031 static int dsp5680xx_convert_address(uint32_t *address, int *pmem)
1032 {
1033  /*
1034  * Distinguish data memory (x) from program memory (p) by the address.
1035  * Addresses over S_FILE_DATA_OFFSET are considered (x) memory.
1036  */
1037  if (*address >= S_FILE_DATA_OFFSET) {
1038  *pmem = 0;
1039  if (((*address) & 0xff0000) != 0xff0000)
1041  }
1042  return ERROR_OK;
1043 }
1044 
1045 static int dsp5680xx_read_16_single(struct target *t, uint32_t a,
1046  uint8_t *data_read, int r_pmem)
1047 {
1048  struct target *target = t;
1049 
1050  uint32_t address = a;
1051 
1052  int retval = core_move_long_to_r0(target, address);
1053  if (retval != ERROR_OK)
1054  return retval;
1055  if (r_pmem)
1057  else
1058  retval = core_move_at_r0_to_y0(target);
1059  if (retval != ERROR_OK)
1060  return retval;
1061  retval = eonce_load_tx_rx_to_r0(target);
1062  if (retval != ERROR_OK)
1063  return retval;
1064  retval = core_move_y0_at_r0(target);
1065  if (retval != ERROR_OK)
1066  return retval;
1067  /* at this point the data i want is at the reg eonce can read */
1068  retval = core_rx_lower_data(target, data_read);
1069  if (retval != ERROR_OK)
1070  return retval;
1071  LOG_DEBUG("%s:Data read from 0x%06" PRIX32 ": 0x%02X%02X", __func__, address,
1072  data_read[1], data_read[0]);
1073  return ERROR_OK;
1074 }
1075 
1076 static int dsp5680xx_read_32_single(struct target *t, uint32_t a,
1077  uint8_t *data_read, int r_pmem)
1078 {
1079  struct target *target = t;
1080 
1081  uint32_t address = a;
1082 
1083  address = (address & 0xFFFFF);
1084  /* Get data to an intermediate register */
1085  int retval = core_move_long_to_r0(target, address);
1086  if (retval != ERROR_OK)
1087  return retval;
1088  if (r_pmem) {
1090  if (retval != ERROR_OK)
1091  return retval;
1093  if (retval != ERROR_OK)
1094  return retval;
1095  } else {
1097  if (retval != ERROR_OK)
1098  return retval;
1099  retval = core_move_at_r0_to_y1(target);
1100  if (retval != ERROR_OK)
1101  return retval;
1102  }
1103  /* Get lower part of data to TX/RX */
1104  retval = eonce_load_tx_rx_to_r0(target);
1105  if (retval != ERROR_OK)
1106  return retval;
1107  retval = core_move_y0_at_r0_inc(target); /* This also load TX/RX high to r0 */
1108  if (retval != ERROR_OK)
1109  return retval;
1110  /* Get upper part of data to TX/RX */
1111  retval = core_move_y1_at_r0(target);
1112  if (retval != ERROR_OK)
1113  return retval;
1114  /* at this point the data i want is at the reg eonce can read */
1115  retval = core_rx_lower_data(target, data_read);
1116  if (retval != ERROR_OK)
1117  return retval;
1118  return core_rx_upper_data(target, data_read + 2);
1119 }
1120 
1121 static int dsp5680xx_read(struct target *t, target_addr_t a, uint32_t size,
1122  uint32_t count, uint8_t *buf)
1123 {
1124  struct target *target = t;
1125 
1126  uint32_t address = a;
1127 
1128  uint8_t *buffer = buf;
1129 
1130  if (target->state != TARGET_HALTED) {
1132  return ERROR_FAIL;
1133  }
1136  return ERROR_FAIL;
1137  }
1138 
1139  int pmem = 1;
1140 
1141  int retval = dsp5680xx_convert_address(&address, &pmem);
1142  if (retval != ERROR_OK)
1143  return retval;
1144 
1146  int counter = FLUSH_COUNT_READ_WRITE;
1147 
1148  for (unsigned int i = 0; i < count; i++) {
1149  if (--counter == 0) {
1151  counter = FLUSH_COUNT_READ_WRITE;
1152  }
1153  switch (size) {
1154  case 1:
1155  if (!(i % 2))
1156  retval =
1158  address + i / 2,
1159  buffer + i, pmem);
1160  break;
1161  case 2:
1162  retval =
1164  buffer + 2 * i, pmem);
1165  break;
1166  case 4:
1167  retval =
1169  buffer + 4 * i, pmem);
1170  break;
1171  default:
1172  LOG_USER("%s: Invalid read size.", __func__);
1173  break;
1174  }
1175  if (retval != ERROR_OK)
1176  return retval;
1178  }
1179 
1181  return dsp5680xx_execute_queue();
1182 }
1183 
1184 static int dsp5680xx_write_16_single(struct target *t, uint32_t a,
1185  uint16_t data, uint8_t w_pmem)
1186 {
1187  struct target *target = t;
1188 
1189  uint32_t address = a;
1190 
1191  int retval = core_move_long_to_r0(target, address);
1192  if (retval != ERROR_OK)
1193  return retval;
1194  if (w_pmem) {
1195  retval = core_move_value_to_y0(target, data);
1196  if (retval != ERROR_OK)
1197  return retval;
1198  retval = core_move_y0_at_pr0_inc(target);
1199  } else {
1200  retval = core_move_value_at_r0(target, data);
1201  }
1202  return retval;
1203 }
1204 
1205 static int dsp5680xx_write_32_single(struct target *t, uint32_t a,
1206  uint32_t data, int w_pmem)
1207 {
1208  struct target *target = t;
1209 
1210  uint32_t address = a;
1211 
1212  int retval = core_move_long_to_r0(target, address);
1213  if (retval != ERROR_OK)
1214  return retval;
1215  retval = core_move_long_to_y(target, data);
1216  if (retval != ERROR_OK)
1217  return retval;
1218  if (w_pmem)
1219  retval = core_move_y0_at_pr0_inc(target);
1220  else
1221  retval = core_move_y0_at_r0_inc(target);
1222  if (retval != ERROR_OK)
1223  return retval;
1224  if (w_pmem)
1225  retval = core_move_y1_at_pr0_inc(target);
1226  else
1227  retval = core_move_y1_at_r0_inc(target);
1228  return retval;
1229 }
1230 
1231 static int dsp5680xx_write_8(struct target *t, uint32_t a, uint32_t c,
1232  const uint8_t *d, int pmem)
1233 {
1234  struct target *target = t;
1235 
1236  uint32_t address = a;
1237 
1238  uint32_t count = c;
1239 
1240  const uint8_t *data = d;
1241 
1242  int retval = 0;
1243 
1244  uint16_t data_16;
1245 
1246  uint32_t iter;
1247 
1248  int counter = FLUSH_COUNT_READ_WRITE;
1249 
1250  for (iter = 0; iter < count / 2; iter++) {
1251  if (--counter == 0) {
1253  counter = FLUSH_COUNT_READ_WRITE;
1254  }
1255  data_16 = (data[2 * iter] | (data[2 * iter + 1] << 8));
1256  retval =
1257  dsp5680xx_write_16_single(target, address + iter, data_16,
1258  pmem);
1259  if (retval != ERROR_OK) {
1260  LOG_ERROR("%s: Could not write to p:0x%04" PRIX32, __func__,
1261  address);
1263  return retval;
1264  }
1266  }
1268 
1269  /* Only one byte left, let's not overwrite the other byte (mem is 16bit) */
1270  /* Need to retrieve the part we do not want to overwrite. */
1271  uint16_t data_old;
1272 
1273  if ((count == 1) || (count % 2)) {
1274  retval =
1275  dsp5680xx_read(target, address + iter, 1, 1,
1276  (uint8_t *) &data_old);
1277  if (retval != ERROR_OK)
1278  return retval;
1279  if (count == 1)
1280  data_old = (((data_old & 0xff) << 8) | data[0]); /* preserve upper byte */
1281  else
1282  data_old =
1283  (((data_old & 0xff) << 8) | data[2 * iter + 1]);
1284  retval =
1285  dsp5680xx_write_16_single(target, address + iter, data_old,
1286  pmem);
1287  }
1288  return retval;
1289 }
1290 
1291 static int dsp5680xx_write_16(struct target *t, uint32_t a, uint32_t c,
1292  const uint8_t *d, int pmem)
1293 {
1294  struct target *target = t;
1295 
1296  uint32_t address = a;
1297 
1298  uint32_t count = c;
1299 
1300  const uint8_t *data = d;
1301 
1302  uint32_t iter;
1303 
1304  int counter = FLUSH_COUNT_READ_WRITE;
1305 
1306  for (iter = 0; iter < count; iter++) {
1307  if (--counter == 0) {
1309  counter = FLUSH_COUNT_READ_WRITE;
1310  }
1311  int retval =
1313  data[iter], pmem);
1314  if (retval != ERROR_OK) {
1315  LOG_ERROR("%s: Could not write to p:0x%04" PRIX32, __func__,
1316  address);
1318  return retval;
1319  }
1321  }
1323  return ERROR_OK;
1324 }
1325 
1326 static int dsp5680xx_write_32(struct target *t, uint32_t a, uint32_t c,
1327  const uint8_t *d, int pmem)
1328 {
1329  struct target *target = t;
1330 
1331  uint32_t address = a;
1332 
1333  uint32_t count = c;
1334 
1335  const uint8_t *data = d;
1336 
1337  uint32_t iter;
1338 
1339  int counter = FLUSH_COUNT_READ_WRITE;
1340 
1341  for (iter = 0; iter < count; iter++) {
1342  if (--counter == 0) {
1344  counter = FLUSH_COUNT_READ_WRITE;
1345  }
1346  int retval =
1347  dsp5680xx_write_32_single(target, address + (iter << 1),
1348  data[iter], pmem);
1349  if (retval != ERROR_OK) {
1350  LOG_ERROR("%s: Could not write to p:0x%04" PRIX32, __func__,
1351  address);
1353  return retval;
1354  }
1356  }
1358  return ERROR_OK;
1359 }
1360 
1374 static int dsp5680xx_write(struct target *target, target_addr_t a, uint32_t size, uint32_t count,
1375  const uint8_t *b)
1376 {
1377  /* TODO Cannot write 32bit to odd address, will write 0x12345678 as 0x5678 0x0012 */
1378  uint32_t address = a;
1379 
1380  uint8_t const *buffer = b;
1381 
1382  if (target->state != TARGET_HALTED) {
1384  return ERROR_FAIL;
1385  }
1388  return ERROR_FAIL;
1389  }
1390 
1391  int p_mem = 1;
1392 
1393  int retval = dsp5680xx_convert_address(&address, &p_mem);
1394  if (retval != ERROR_OK)
1395  return retval;
1396 
1397  switch (size) {
1398  case 1:
1399  retval =
1401  break;
1402  case 2:
1403  retval =
1405  break;
1406  case 4:
1407  retval =
1409  break;
1410  default:
1411  err_log(DSP5680XX_ERROR_INVALID_DATA_SIZE_UNIT, "Invalid data size.");
1412  return ERROR_TARGET_DATA_ABORT;
1413  }
1414  return retval;
1415 }
1416 
1417 static int dsp5680xx_write_buffer(struct target *t, target_addr_t a, uint32_t size,
1418  const uint8_t *b)
1419 {
1420  if (t->state != TARGET_HALTED) {
1422  return ERROR_FAIL;
1423  }
1426  return ERROR_FAIL;
1427  }
1428  return dsp5680xx_write(t, a, 1, size, b);
1429 }
1430 
1442  uint8_t *buffer)
1443 {
1444  if (target->state != TARGET_HALTED) {
1446  return ERROR_FAIL;
1447  }
1450  return ERROR_FAIL;
1451  }
1452 
1453  /* The "/2" solves the byte/word addressing issue.*/
1454  return dsp5680xx_read(target, address, 2, size / 2, buffer);
1455 }
1456 
1470  uint32_t *checksum)
1471 {
1472  return ERROR_FAIL;
1473 }
1474 
1486 static int perl_crc(const uint8_t *buff8, uint32_t word_count)
1487 {
1488  uint16_t checksum = 0xffff;
1489 
1490  uint16_t data, fbmisr;
1491 
1492  uint32_t i;
1493 
1494  for (i = 0; i < word_count; i++) {
1495  data = (buff8[2 * i] | (buff8[2 * i + 1] << 8));
1496  fbmisr =
1497  (checksum & 2) >> 1 ^ (checksum & 4) >> 2 ^ (checksum & 16)
1498  >> 4 ^ (checksum & 0x8000) >> 15;
1499  checksum = (data ^ ((checksum << 1) | fbmisr));
1500  }
1501  i--;
1502  for (; !(i & 0x80000000); i--) {
1503  data = (buff8[2 * i] | (buff8[2 * i + 1] << 8));
1504  fbmisr =
1505  (checksum & 2) >> 1 ^ (checksum & 4) >> 2 ^ (checksum & 16)
1506  >> 4 ^ (checksum & 0x8000) >> 15;
1507  checksum = (data ^ ((checksum << 1) | fbmisr));
1508  }
1509  return checksum;
1510 }
1511 
1520 {
1521  uint16_t sim_cmd = SIM_CMD_RESET;
1522 
1523  if (strcmp(target->tap->chip, "dsp568013") == 0) {
1524  uint32_t sim_addr = MC568013_SIM_BASE_ADDR + S_FILE_DATA_OFFSET;
1525  return dsp5680xx_write(target, sim_addr, 1, 2,
1526  (const uint8_t *)&sim_cmd);
1527  }
1528  return ERROR_OK;
1529 }
1530 
1539 {
1540  /* TODO is this what this function is expected to do...? */
1541  int retval = dsp5680xx_halt(target);
1542  if (retval != ERROR_OK)
1543  return retval;
1544  return dsp5680xx_f_sim_reset(target);
1545 }
1546 
1547 int dsp5680xx_f_protect_check(struct target *target, uint16_t *protected)
1548 {
1549  if (target->state != TARGET_HALTED) {
1551  return ERROR_FAIL;
1552  }
1555  return ERROR_FAIL;
1556  }
1557  if (!protected) {
1558  const char *msg = "NULL pointer not valid.";
1559 
1561  return ERROR_FAIL;
1562  }
1564  (uint8_t *) protected, 0);
1565 }
1566 
1580 static int dsp5680xx_f_ex(struct target *target, uint16_t c, uint32_t address, uint32_t data,
1581  uint16_t *hfm_ustat, int pmem)
1582 {
1583  uint32_t command = c;
1584 
1586  if (retval != ERROR_OK)
1587  return retval;
1589  if (retval != ERROR_OK)
1590  return retval;
1591  uint8_t i[2];
1592 
1593  int watchdog = 100;
1594 
1595  do {
1596  retval = core_move_at_r2_disp_to_y0(target, HFM_USTAT); /* read HMF_USTAT */
1597  if (retval != ERROR_OK)
1598  return retval;
1599  retval = core_move_y0_at_r0(target);
1600  if (retval != ERROR_OK)
1601  return retval;
1602  retval = core_rx_upper_data(target, i);
1603  if (retval != ERROR_OK)
1604  return retval;
1605  if ((watchdog--) == 1) {
1606  const char *msg =
1607  "Timed out waiting for FM to finish old command.";
1609  return ERROR_TARGET_FAILURE;
1610  }
1611  } while (!(i[0] & 0x40)); /* wait until current command is complete */
1612 
1614 
1615  /* write to HFM_CNFG (lock=0,select bank) - flash_desc.bank&0x03, 0x01 == 0x00, 0x01 ??? */
1616  retval = core_move_value_at_r2_disp(target, 0x00, HFM_CNFG);
1617  if (retval != ERROR_OK)
1618  return retval;
1619  /* write to HMF_USTAT, clear PVIOL, ACCERR &BLANK bits */
1620  retval = core_move_value_at_r2_disp(target, 0x04, HFM_USTAT);
1621  if (retval != ERROR_OK)
1622  return retval;
1623  /* clear only one bit at a time */
1624  retval = core_move_value_at_r2_disp(target, 0x10, HFM_USTAT);
1625  if (retval != ERROR_OK)
1626  return retval;
1627  retval = core_move_value_at_r2_disp(target, 0x20, HFM_USTAT);
1628  if (retval != ERROR_OK)
1629  return retval;
1630  /* write to HMF_PROT, clear protection */
1631  retval = core_move_value_at_r2_disp(target, 0x00, HFM_PROT);
1632  if (retval != ERROR_OK)
1633  return retval;
1634  /* write to HMF_PROTB, clear protection */
1635  retval = core_move_value_at_r2_disp(target, 0x00, HFM_PROTB);
1636  if (retval != ERROR_OK)
1637  return retval;
1638  retval = core_move_value_to_y0(target, data);
1639  if (retval != ERROR_OK)
1640  return retval;
1641  /* write to the flash block */
1642  retval = core_move_long_to_r3(target, address);
1643  if (retval != ERROR_OK)
1644  return retval;
1645  if (pmem) {
1646  retval = core_move_y0_at_pr3_inc(target);
1647  } else {
1648  retval = core_move_y0_at_r3(target);
1649  }
1650  if (retval != ERROR_OK)
1651  return retval;
1652  /* write command to the HFM_CMD reg */
1654  if (retval != ERROR_OK)
1655  return retval;
1656  /* start the command */
1657  retval = core_move_value_at_r2_disp(target, 0x80, HFM_USTAT);
1658  if (retval != ERROR_OK)
1659  return retval;
1660 
1662  retval = dsp5680xx_execute_queue();
1663  if (retval != ERROR_OK)
1664  return retval;
1665 
1666  watchdog = 100;
1667  do {
1668  /* read HMF_USTAT */
1670  if (retval != ERROR_OK)
1671  return retval;
1672  retval = core_move_y0_at_r0(target);
1673  if (retval != ERROR_OK)
1674  return retval;
1675  retval = core_rx_upper_data(target, i);
1676  if (retval != ERROR_OK)
1677  return retval;
1678  if ((watchdog--) == 1) {
1680  "FM execution did not finish.");
1681  return ERROR_TARGET_FAILURE;
1682  }
1683  } while (!(i[0] & 0x40)); /* wait until the command is complete */
1684  *hfm_ustat = ((i[0] << 8) | (i[1]));
1685  if (i[0] & HFM_USTAT_MASK_PVIOL_ACCER) {
1686  const char *msg =
1687  "pviol and/or accer bits set. HFM command execution error";
1689  return ERROR_TARGET_FAILURE;
1690  }
1691  return ERROR_OK;
1692 }
1693 
1706 static int set_fm_ck_div(struct target *target)
1707 {
1708  uint8_t i[2];
1709 
1710  int retval = core_move_long_to_r2(target, HFM_BASE_ADDR);
1711  if (retval != ERROR_OK)
1712  return retval;
1714  if (retval != ERROR_OK)
1715  return retval;
1716  /* read HFM_CLKD */
1717  retval = core_move_at_r2_to_y0(target);
1718  if (retval != ERROR_OK)
1719  return retval;
1720  retval = core_move_y0_at_r0(target);
1721  if (retval != ERROR_OK)
1722  return retval;
1723  retval = core_rx_upper_data(target, i);
1724  if (retval != ERROR_OK)
1725  return retval;
1726  unsigned int hfm_at_wrong_value = 0;
1727 
1728  if ((i[0] & 0x7f) != HFM_CLK_DEFAULT) {
1729  LOG_DEBUG("HFM CLK divisor contained incorrect value (0x%02X).",
1730  i[0] & 0x7f);
1731  hfm_at_wrong_value = 1;
1732  } else {
1733  LOG_DEBUG
1734  ("HFM CLK divisor was already set to correct value (0x%02X).",
1735  i[0] & 0x7f);
1736  return ERROR_OK;
1737  }
1738  /* write HFM_CLKD */
1740  if (retval != ERROR_OK)
1741  return retval;
1742  /* verify HFM_CLKD */
1743  retval = core_move_at_r2_to_y0(target);
1744  if (retval != ERROR_OK)
1745  return retval;
1746  retval = core_move_y0_at_r0(target);
1747  if (retval != ERROR_OK)
1748  return retval;
1749  retval = core_rx_upper_data(target, i);
1750  if (retval != ERROR_OK)
1751  return retval;
1752  if (i[0] != (0x80 | (HFM_CLK_DEFAULT & 0x7f))) {
1753  err_log(DSP5680XX_ERROR_FM_SET_CLK, "Unable to set HFM CLK divisor.");
1754  return ERROR_TARGET_FAILURE;
1755  }
1756  if (hfm_at_wrong_value)
1757  LOG_DEBUG("HFM CLK divisor set to 0x%02x.", i[0] & 0x7f);
1758  return ERROR_OK;
1759 }
1760 
1775 static int dsp5680xx_f_signature(struct target *target, uint32_t address, uint32_t words,
1776  uint16_t *signature)
1777 {
1778  int retval;
1779 
1780  uint16_t hfm_ustat;
1781 
1784  /*
1785  * Generate error here, since it is not done in eonce_enter_debug_mode_without_reset
1786  */
1787  if (retval != ERROR_OK) {
1788  err_log(DSP5680XX_ERROR_HALT, "Failed to halt target.");
1789  return retval;
1790  }
1791  }
1792  retval =
1794  &hfm_ustat, 1);
1795  if (retval != ERROR_OK)
1796  return retval;
1798  (uint8_t *) signature, 0);
1799 }
1800 
1801 int dsp5680xx_f_erase_check(struct target *target, uint8_t *erased,
1802  uint32_t sector)
1803 {
1804  int retval;
1805 
1806  uint16_t hfm_ustat;
1807 
1808  uint32_t tmp;
1809 
1811  retval = dsp5680xx_halt(target);
1812  if (retval != ERROR_OK)
1813  return retval;
1814  }
1815  retval = set_fm_ck_div(target);
1816  if (retval != ERROR_OK)
1817  return retval;
1818  /*
1819  * Check if chip is already erased.
1820  */
1821  tmp = HFM_FLASH_BASE_ADDR + sector * HFM_SECTOR_SIZE / 2;
1822  retval =
1823  dsp5680xx_f_ex(target, HFM_ERASE_VERIFY, tmp, 0, &hfm_ustat, 1);
1824  if (retval != ERROR_OK)
1825  return retval;
1826  if (erased)
1827  *erased = (uint8_t) (hfm_ustat & HFM_USTAT_MASK_BLANK);
1828  return ERROR_OK;
1829 }
1830 
1840 static int erase_sector(struct target *target, int sector, uint16_t *hfm_ustat)
1841 {
1842  uint32_t tmp = HFM_FLASH_BASE_ADDR + sector * HFM_SECTOR_SIZE / 2;
1843 
1844  return dsp5680xx_f_ex(target, HFM_PAGE_ERASE, tmp, 0, hfm_ustat, 1);
1845 }
1846 
1855 static int mass_erase(struct target *target, uint16_t *hfm_ustat)
1856 {
1857  return dsp5680xx_f_ex(target, HFM_MASS_ERASE, 0, 0, hfm_ustat, 1);
1858 }
1859 
1860 int dsp5680xx_f_erase(struct target *target, int first, int last)
1861 {
1862  int retval;
1863 
1865  retval = dsp5680xx_halt(target);
1866  if (retval != ERROR_OK)
1867  return retval;
1868  }
1869  /*
1870  * Reset SIM
1871  *
1872  */
1873  retval = dsp5680xx_f_sim_reset(target);
1874  if (retval != ERROR_OK)
1875  return retval;
1876  /*
1877  * Set hfmdiv
1878  *
1879  */
1880  retval = set_fm_ck_div(target);
1881  if (retval != ERROR_OK)
1882  return retval;
1883 
1884  uint16_t hfm_ustat;
1885 
1886  int do_mass_erase = ((!(first | last))
1887  || ((first == 0)
1888  && (last == (HFM_SECTOR_COUNT - 1))));
1889  if (do_mass_erase) {
1890  /* Mass erase */
1891  retval = mass_erase(target, &hfm_ustat);
1892  if (retval != ERROR_OK)
1893  return retval;
1894  } else {
1895  for (int i = first; i <= last; i++) {
1896  retval = erase_sector(target, i, &hfm_ustat);
1897  if (retval != ERROR_OK)
1898  return retval;
1899  }
1900  }
1901  return ERROR_OK;
1902 }
1903 
1904 /*
1905  * Algorithm for programming normal p: flash
1906  * Follow state machine from "56F801x Peripheral Reference Manual"@163.
1907  * Registers to set up before calling:
1908  * r0: TX/RX high address.
1909  * r2: FM module base address.
1910  * r3: Destination address in flash.
1911  *
1912  * hfm_wait: // wait for buffer empty
1913  * brclr #0x80, x:(r2+0x13), hfm_wait
1914  * rx_check: // wait for input buffer full
1915  * brclr #0x01, x:(r0-2), rx_check
1916  * move.w x:(r0), y0 // read from Rx buffer
1917  * move.w y0, p:(r3)+
1918  * move.w #0x20, x:(r2+0x14) // write PGM command
1919  * move.w #0x80, x:(r2+0x13) // start the command
1920  * move.w X:(R2+0x13), A // Read USTAT register
1921  * brclr #0x20, A, accerr_check // protection violation check
1922  * bfset #0x20, X:(R2+0x13) // clear pviol
1923  * bra hfm_wait
1924  * accerr_check:
1925  * brclr #0x10, A, hfm_wait // access error check
1926  * bfset #0x10, X:(R2+0x13) // clear accerr
1927  * bra hfm_wait // loop
1928  * 0x00000000 0x8A460013807D brclr #0x80, X:(R2+0x13),*+0
1929  * 0x00000003 0xE700 nop
1930  * 0x00000004 0xE700 nop
1931  * 0x00000005 0x8A44FFFE017B brclr #1, X:(R0-2),*-2
1932  * 0x00000008 0xE700 nop
1933  * 0x00000009 0xF514 move.w X:(R0), Y0
1934  * 0x0000000A 0x8563 move.w Y0, P:(R3)+
1935  * 0x0000000B 0x864600200014 move.w #32, X:(R2+0x14)
1936  * 0x0000000E 0x864600800013 move.w #128, X:(R2+0x13)
1937  * 0x00000011 0xF0420013 move.w X:(R2+0x13), A
1938  * 0x00000013 0x8B402004 brclr #0x20, A,*+6
1939  * 0x00000015 0x824600130020 bfset #0x20, X:(R2+0x13)
1940  * 0x00000018 0xA967 bra *-24
1941  * 0x00000019 0x8B401065 brclr #0x10, A,*-25
1942  * 0x0000001B 0x824600130010 bfset #0x10, X:(R2+0x13)
1943  * 0x0000001E 0xA961 bra *-30
1944  */
1945 
1946 static const uint16_t pgm_write_pflash[] = {
1947  0x8A46, 0x0013, 0x807D, 0xE700,
1948  0xE700, 0x8A44, 0xFFFE, 0x017B,
1949  0xE700, 0xF514, 0x8563, 0x8646,
1950  0x0020, 0x0014, 0x8646, 0x0080,
1951  0x0013, 0xF042, 0x0013, 0x8B40,
1952  0x2004, 0x8246, 0x0013, 0x0020,
1953  0xA967, 0x8B40, 0x1065, 0x8246,
1954  0x0013, 0x0010, 0xA961
1955 };
1956 
1957 static const uint32_t pgm_write_pflash_length = 31;
1958 
1959 int dsp5680xx_f_wr(struct target *t, const uint8_t *b, uint32_t a, uint32_t count,
1960  int is_flash_lock)
1961 {
1962  struct target *target = t;
1963 
1964  uint32_t address = a;
1965 
1966  const uint8_t *buffer = b;
1967 
1968  int retval = ERROR_OK;
1969 
1971  retval = eonce_enter_debug_mode(target, NULL);
1972  if (retval != ERROR_OK)
1973  return retval;
1974  }
1975  /*
1976  * Download the pgm that flashes.
1977  *
1978  */
1979  const uint32_t len = pgm_write_pflash_length;
1980 
1981  uint32_t ram_addr = 0x8700;
1982 
1983  /*
1984  * This seems to be a safe address.
1985  * This one is the one used by codewarrior in 56801x_flash.cfg
1986  */
1987  if (!is_flash_lock) {
1988  retval =
1989  dsp5680xx_write(target, ram_addr, 1, len * 2,
1990  (uint8_t *) pgm_write_pflash);
1991  if (retval != ERROR_OK)
1992  return retval;
1993  retval = dsp5680xx_execute_queue();
1994  if (retval != ERROR_OK)
1995  return retval;
1996  }
1997  /*
1998  * Set hfmdiv
1999  *
2000  */
2001  retval = set_fm_ck_div(target);
2002  if (retval != ERROR_OK)
2003  return retval;
2004  /*
2005  * Setup registers needed by pgm_write_pflash
2006  *
2007  */
2008 
2010 
2011  retval = core_move_long_to_r3(target, address); /* Destination address to r3 */
2012  if (retval != ERROR_OK)
2013  return retval;
2014  retval = core_load_tx_rx_high_addr_to_r0(target); /* TX/RX reg address to r0 */
2015  if (retval != ERROR_OK)
2016  return retval;
2017  retval = core_move_long_to_r2(target, HFM_BASE_ADDR); /* FM base address to r2 */
2018  if (retval != ERROR_OK)
2019  return retval;
2020  /*
2021  * Run flashing program.
2022  *
2023  */
2024  /* write to HFM_CNFG (lock=0, select bank) */
2025  retval = core_move_value_at_r2_disp(target, 0x00, HFM_CNFG);
2026  if (retval != ERROR_OK)
2027  return retval;
2028  /* write to HMF_USTAT, clear PVIOL, ACCERR &BLANK bits */
2029  retval = core_move_value_at_r2_disp(target, 0x04, HFM_USTAT);
2030  if (retval != ERROR_OK)
2031  return retval;
2032  /* clear only one bit at a time */
2033  retval = core_move_value_at_r2_disp(target, 0x10, HFM_USTAT);
2034  if (retval != ERROR_OK)
2035  return retval;
2036  retval = core_move_value_at_r2_disp(target, 0x20, HFM_USTAT);
2037  if (retval != ERROR_OK)
2038  return retval;
2039  /* write to HMF_PROT, clear protection */
2040  retval = core_move_value_at_r2_disp(target, 0x00, HFM_PROT);
2041  if (retval != ERROR_OK)
2042  return retval;
2043  /* write to HMF_PROTB, clear protection */
2044  retval = core_move_value_at_r2_disp(target, 0x00, HFM_PROTB);
2045  if (retval != ERROR_OK)
2046  return retval;
2047  if (count % 2) {
2048  /* TODO implement handling of odd number of words. */
2049  const char *msg = "Cannot handle odd number of words.";
2050 
2052  return ERROR_FAIL;
2053  }
2054 
2056  retval = dsp5680xx_execute_queue();
2057  if (retval != ERROR_OK)
2058  return retval;
2059 
2060  uint32_t drscan_data;
2061 
2062  uint16_t tmp = (buffer[0] | (buffer[1] << 8));
2063 
2064  retval = core_tx_upper_data(target, tmp, &drscan_data);
2065  if (retval != ERROR_OK)
2066  return retval;
2067 
2068  retval = dsp5680xx_resume(target, false, ram_addr, false, false);
2069  if (retval != ERROR_OK)
2070  return retval;
2071 
2072  int counter = FLUSH_COUNT_FLASH;
2073 
2075  uint32_t i;
2076 
2077  for (i = 1; (i < count / 2) && (i < HFM_SIZE_WORDS); i++) {
2078  if (--counter == 0) {
2080  counter = FLUSH_COUNT_FLASH;
2081  }
2082  tmp = (buffer[2 * i] | (buffer[2 * i + 1] << 8));
2083  retval = core_tx_upper_data(target, tmp, &drscan_data);
2084  if (retval != ERROR_OK) {
2086  return retval;
2087  }
2089  }
2091  if (!is_flash_lock) {
2092  /*
2093  *Verify flash (skip when exec lock sequence)
2094  *
2095  */
2096  uint16_t signature;
2097 
2098  uint16_t pc_crc;
2099 
2100  retval = dsp5680xx_f_signature(target, address, i, &signature);
2101  if (retval != ERROR_OK)
2102  return retval;
2103  pc_crc = perl_crc(buffer, i);
2104  if (pc_crc != signature) {
2105  const char *msg =
2106  "Flashed data failed CRC check, flash again!";
2108  return ERROR_FAIL;
2109  }
2110  }
2111  return retval;
2112 }
2113 
2115 {
2116  uint16_t eonce_status;
2117 
2118  uint32_t ir_out;
2119 
2120  struct jtag_tap *tap_chp = jtag_tap_by_string("dsp568013.chp");
2121  if (!tap_chp) {
2123  "Failed to get master tap.");
2124  return ERROR_FAIL;
2125  }
2126  struct jtag_tap *tap_cpu = jtag_tap_by_string("dsp568013.cpu");
2127  if (!tap_cpu) {
2129  "Failed to get master tap.");
2130  return ERROR_FAIL;
2131  }
2132 
2133  int retval = eonce_enter_debug_mode_without_reset(target, &eonce_status);
2134  if (retval == ERROR_OK)
2135  LOG_WARNING("Memory was not locked.");
2136 
2137  jtag_add_reset(0, 1);
2138  jtag_add_sleep(TIME_DIV_FREESCALE * 200 * 1000);
2139 
2140  retval = reset_jtag();
2141  if (retval != ERROR_OK) {
2143  "Failed to reset JTAG state machine");
2144  return retval;
2145  }
2146  jtag_add_sleep(150);
2147 
2148  /* Enable core tap */
2149  tap_chp->enabled = true;
2150  retval = switch_tap(target, tap_chp, tap_cpu);
2151  if (retval != ERROR_OK)
2152  return retval;
2153 
2154  uint32_t instr = JTAG_INSTR_DEBUG_REQUEST;
2155  retval =
2156  dsp5680xx_irscan(target, &instr, &ir_out,
2158  if (retval != ERROR_OK)
2159  return retval;
2160  jtag_add_sleep(TIME_DIV_FREESCALE * 100 * 1000);
2161  jtag_add_reset(0, 0);
2162  jtag_add_sleep(TIME_DIV_FREESCALE * 300 * 1000);
2163 
2164  /* Enable master tap */
2165  tap_chp->enabled = false;
2166  retval = switch_tap(target, tap_chp, tap_cpu);
2167  if (retval != ERROR_OK)
2168  return retval;
2169 
2170  /* Execute mass erase to unlock */
2172  retval =
2173  dsp5680xx_irscan(target, &instr, &ir_out,
2175  if (retval != ERROR_OK)
2176  return retval;
2177 
2178  instr = HFM_CLK_DEFAULT;
2179  retval = dsp5680xx_drscan(target, (uint8_t *) &instr, (uint8_t *) &ir_out, 16);
2180  if (retval != ERROR_OK)
2181  return retval;
2182 
2183  jtag_add_sleep(TIME_DIV_FREESCALE * 150 * 1000);
2184  jtag_add_reset(0, 1);
2185  jtag_add_sleep(TIME_DIV_FREESCALE * 200 * 1000);
2186 
2187  retval = reset_jtag();
2188  if (retval != ERROR_OK) {
2190  "Failed to reset JTAG state machine");
2191  return retval;
2192  }
2193  jtag_add_sleep(150);
2194 
2195  instr = 0x0606ffff;
2196  retval = dsp5680xx_drscan(target, (uint8_t *) &instr, (uint8_t *) &ir_out,
2197  32);
2198  if (retval != ERROR_OK)
2199  return retval;
2200 
2201  /* enable core tap */
2202  instr = 0x5;
2203  retval =
2204  dsp5680xx_irscan(target, &instr, &ir_out,
2206  if (retval != ERROR_OK)
2207  return retval;
2208  instr = 0x2;
2209  retval = dsp5680xx_drscan(target, (uint8_t *) &instr, (uint8_t *) &ir_out,
2210  4);
2211  if (retval != ERROR_OK)
2212  return retval;
2213 
2214  tap_cpu->enabled = true;
2215  tap_chp->enabled = false;
2218  return ERROR_OK;
2219 }
2220 
2222 {
2223  uint16_t lock_word = HFM_LOCK_FLASH;
2224  int retval = dsp5680xx_f_wr(target, (uint8_t *)&lock_word, HFM_LOCK_ADDR_L, 2, 1);
2225  if (retval != ERROR_OK)
2226  return retval;
2227 
2228  jtag_add_reset(0, 1);
2229  jtag_add_sleep(TIME_DIV_FREESCALE * 200 * 1000);
2230 
2231  retval = reset_jtag();
2232  if (retval != ERROR_OK) {
2234  "Failed to reset JTAG state machine");
2235  return retval;
2236  }
2237  jtag_add_sleep(TIME_DIV_FREESCALE * 100 * 1000);
2238  jtag_add_reset(0, 0);
2239  jtag_add_sleep(TIME_DIV_FREESCALE * 300 * 1000);
2240 
2241  struct jtag_tap *tap_chp = jtag_tap_by_string("dsp568013.chp");
2242  if (!tap_chp) {
2244  "Failed to get master tap.");
2245  return ERROR_FAIL;
2246  }
2247  struct jtag_tap *tap_cpu = jtag_tap_by_string("dsp568013.cpu");
2248  if (!tap_cpu) {
2250  "Failed to get master tap.");
2251  return ERROR_FAIL;
2252  }
2255  tap_cpu->enabled = false;
2256  tap_chp->enabled = true;
2257  return switch_tap(target, tap_chp, tap_cpu);
2258 }
2259 
2260 static int dsp5680xx_step(struct target *target, bool current, target_addr_t address,
2261  bool handle_breakpoints)
2262 {
2264  "Not implemented yet.");
2265  return ERROR_FAIL;
2266 }
2267 
2269 struct target_type dsp5680xx_target = {
2270  .name = "dsp5680xx",
2271 
2272  .poll = dsp5680xx_poll,
2273  .arch_state = dsp5680xx_arch_state,
2274 
2275  .halt = dsp5680xx_halt,
2276  .resume = dsp5680xx_resume,
2277  .step = dsp5680xx_step,
2278 
2279  .write_buffer = dsp5680xx_write_buffer,
2280  .read_buffer = dsp5680xx_read_buffer,
2281 
2282  .assert_reset = dsp5680xx_assert_reset,
2283  .deassert_reset = dsp5680xx_deassert_reset,
2284  .soft_reset_halt = dsp5680xx_soft_reset_halt,
2285 
2286  .read_memory = dsp5680xx_read,
2287  .write_memory = dsp5680xx_write,
2288 
2289  .checksum_memory = dsp5680xx_checksum_memory,
2290 
2291  .target_create = dsp5680xx_target_create,
2292  .init_target = dsp5680xx_init_target,
2293 };
#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:274
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:1441
static int dsp5680xx_soft_reset_halt(struct target *target)
Halts the core and resets the SIM.
Definition: dsp5680xx.c:1538
static uint32_t data_read_dummy
Definition: dsp5680xx.c:160
static int dsp5680xx_halt(struct target *target)
Definition: dsp5680xx.c:848
static int dsp5680xx_deassert_reset(struct target *target)
Definition: dsp5680xx.c:842
#define core_move_value_at_r2_disp(target, value, disp)
Definition: dsp5680xx.c:379
#define core_move_y0_at_pr0_inc(target)
Definition: dsp5680xx.c:358
static int dsp5680xx_read_32_single(struct target *t, uint32_t a, uint8_t *data_read, int r_pmem)
Definition: dsp5680xx.c:1076
static int eonce_exit_debug_mode(struct target *target, uint8_t *eonce_status)
Takes the core out of debug mode.
Definition: dsp5680xx.c:501
static int core_load_tx_rx_high_addr_to_r0(struct target *target)
Definition: dsp5680xx.c:463
#define core_move_at_r2_disp_to_y0(target, disp)
Definition: dsp5680xx.c:421
#define core_move_pc_to_r4(target)
Definition: dsp5680xx.c:403
static int jtag_data_write(struct target *target, uint32_t instr, int num_bits, uint32_t *data_read)
Definition: dsp5680xx.c:162
static int dsp5680xx_exe2(struct target *target, uint16_t opcode1, uint16_t opcode2)
Definition: dsp5680xx.c:224
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:1031
static int dsp5680xx_resume(struct target *target, bool current, target_addr_t address, bool handle_breakpoints, bool debug_execution)
Definition: dsp5680xx.c:950
static int dsp5680xx_write_16_single(struct target *t, uint32_t a, uint16_t data, uint8_t w_pmem)
Definition: dsp5680xx.c:1184
#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:192
#define core_move_at_r0_to_y0(target)
Definition: dsp5680xx.c:337
static const uint32_t pgm_write_pflash_length
Definition: dsp5680xx.c:1957
int dsp5680xx_f_erase(struct target *target, int first, int last)
Erases either a sector or the complete flash array.
Definition: dsp5680xx.c:1860
#define core_move_at_pr0_inc_to_y1(target)
Definition: dsp5680xx.c:364
#define core_move_at_pr0_inc_to_y0(target)
Definition: dsp5680xx.c:409
#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:2221
static int dsp5680xx_irscan(struct target *target, uint32_t *d_in, uint32_t *d_out, uint8_t ir_len)
Test func.
Definition: dsp5680xx.c:92
static int mass_erase(struct target *target, uint16_t *hfm_ustat)
Executes the FM mass erase command.
Definition: dsp5680xx.c:1855
static int dsp5680xx_drscan(struct target *target, uint8_t *d_in, uint8_t *d_out, int len)
Definition: dsp5680xx.c:42
#define core_move_y0_at_r0(target)
Definition: dsp5680xx.c:346
#define core_move_y0_at_r0_inc(target)
Definition: dsp5680xx.c:355
#define core_move_y1_at_r0(target)
Definition: dsp5680xx.c:427
#define core_move_y1_at_pr0_inc(target)
Definition: dsp5680xx.c:433
static int jtag_data_read(struct target *target, uint8_t *data_read, int num_bits)
Definition: dsp5680xx.c:143
#define dsp5680xx_exe_generic(t, words, oc1, oc2, oc3)
Definition: dsp5680xx.c:212
static int dsp5680xx_write_8(struct target *t, uint32_t a, uint32_t c, const uint8_t *d, int pmem)
Definition: dsp5680xx.c:1231
static int dsp5680xx_target_create(struct target *target)
Definition: dsp5680xx.c:810
static int dsp5680xx_poll(struct target *target)
Definition: dsp5680xx.c:873
static int switch_tap(struct target *target, struct jtag_tap *master_tap, struct jtag_tap *core_tap)
Definition: dsp5680xx.c:506
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:1775
static int dsp5680xx_exe1(struct target *target, uint16_t opcode)
Definition: dsp5680xx.c:215
static int dsp5680xx_read_core_reg(struct target *target, uint8_t reg_addr, uint16_t *data_read)
Definition: dsp5680xx.c:470
#define jtag_data_write16(target, instr, data_read)
Definition: dsp5680xx.c:176
static int core_rx_lower_data(struct target *target, uint8_t *data_read)
Definition: dsp5680xx.c:312
static int dsp5680xx_step(struct target *target, bool current, target_addr_t address, bool handle_breakpoints)
Definition: dsp5680xx.c:2260
#define core_move_value_to_y0(target, value)
Definition: dsp5680xx.c:352
static int dsp5680xx_f_sim_reset(struct target *target)
Resets the SIM.
Definition: dsp5680xx.c:1519
static int dsp5680xx_assert_reset(struct target *target)
Definition: dsp5680xx.c:836
#define core_move_y0_at_pr3_inc(target)
Definition: dsp5680xx.c:394
#define core_move_at_r2_to_y0(target)
Definition: dsp5680xx.c:382
#define core_move_at_r0_to_y1(target)
Definition: dsp5680xx.c:340
#define core_move_r4_to_y(target)
Definition: dsp5680xx.c:406
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:587
static int dsp5680xx_read(struct target *t, target_addr_t a, uint32_t size, uint32_t count, uint8_t *buf)
Definition: dsp5680xx.c:1121
#define core_move_y1_at_r0_inc(target)
Definition: dsp5680xx.c:436
#define HALT_MSG
Definition: dsp5680xx.c:24
static int eonce_load_tx_rx_to_r0(struct target *target)
Definition: dsp5680xx.c:456
static int dsp5680xx_write_32_single(struct target *t, uint32_t a, uint32_t data, int w_pmem)
Definition: dsp5680xx.c:1205
static int dsp5680xx_exe3(struct target *target, uint16_t opcode1, uint16_t opcode2, uint16_t opcode3)
Definition: dsp5680xx.c:240
static int dsp5680xx_jtag_status(struct target *target, uint8_t *status)
Definition: dsp5680xx.c:127
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:648
static int dsp5680xx_init_target(struct command_context *cmd_ctx, struct target *target)
Definition: dsp5680xx.c:818
#define core_move_value_at_r2(target, value)
Definition: dsp5680xx.c:373
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:1374
static int dsp5680xx_write_16(struct target *t, uint32_t a, uint32_t c, const uint8_t *d, int pmem)
Definition: dsp5680xx.c:1291
static int dsp5680xx_execute_queue(void)
Definition: dsp5680xx.c:26
#define core_move_value_at_r0(target, value)
Definition: dsp5680xx.c:376
#define core_move_long_to_r3(target, value)
Definition: dsp5680xx.c:391
int dsp5680xx_f_unlock(struct target *target)
Executes a mass erase command.
Definition: dsp5680xx.c:2114
static int core_move_value_to_pc(struct target *target, uint32_t value)
Definition: dsp5680xx.c:441
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:1486
#define core_move_y0_at_r3(target)
Definition: dsp5680xx.c:397
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:1706
static int dsp5680xx_write_32(struct target *t, uint32_t a, uint32_t c, const uint8_t *d, int pmem)
Definition: dsp5680xx.c:1326
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:1469
static int dsp5680xx_read_16_single(struct target *t, uint32_t a, uint8_t *data_read, int r_pmem)
Definition: dsp5680xx.c:1045
#define jtag_data_read16(target, data_read)
Definition: dsp5680xx.c:157
#define core_move_long_to_r2(target, value)
Definition: dsp5680xx.c:367
static int dsp5680xx_arch_state(struct target *target)
Definition: dsp5680xx.c:830
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:1959
#define core_move_at_r0_inc_to_y0(target)
Definition: dsp5680xx.c:412
static int core_rx_upper_data(struct target *target, uint8_t *data_read)
Definition: dsp5680xx.c:296
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:1580
static int eonce_read_status_reg(struct target *target, uint16_t *data)
Definition: dsp5680xx.c:488
static struct dsp5680xx_common dsp5680xx_context
Definition: dsp5680xx.c:19
#define core_move_long_to_r0(target, value)
Definition: dsp5680xx.c:331
int dsp5680xx_f_protect_check(struct target *target, uint16_t *protected)
Reads the memory mapped protection register.
Definition: dsp5680xx.c:1547
struct target_type dsp5680xx_target
Holds methods for dsp5680xx targets.
Definition: dsp5680xx.c:2269
static int reset_jtag(void)
Reset state machine.
Definition: dsp5680xx.c:34
static const uint16_t pgm_write_pflash[]
Definition: dsp5680xx.c:1946
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:1801
static int erase_sector(struct target *target, int sector, uint16_t *hfm_ustat)
Executes the FM page erase command.
Definition: dsp5680xx.c:1840
#define core_move_long_to_y(target, value)
Definition: dsp5680xx.c:439
static int eonce_pc_store(struct target *target)
Reads the current value of the program counter and stores it.
Definition: dsp5680xx.c:786
static int dsp5680xx_write_buffer(struct target *t, target_addr_t a, uint32_t size, const uint8_t *b)
Definition: dsp5680xx.c:1417
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
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:466
struct jtag_tap * jtag_tap_by_string(const char *s)
Definition: jtag/core.c:238
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:770
int jtag_execute_queue(void)
For software FIFO implementations, the queued commands can be executed during this call or earlier.
Definition: jtag/core.c:1049
int jtag_add_statemove(enum tap_state goal_state)
jtag_add_statemove() moves from the current state to goal_state.
Definition: jtag/core.c:556
void jtag_add_sleep(uint32_t us)
Definition: jtag/core.c:882
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:393
@ TAP_RESET
Definition: jtag.h:56
@ 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:27
const char * name
Name of this type of target.
Definition: target_type.h:32
Definition: target.h:119
struct jtag_tap * tap
Definition: target.h:122
enum target_state state
Definition: target.h:167
void * arch_info
Definition: target.h:174
@ 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:820
#define ERROR_TARGET_FAILURE
Definition: target.h:818
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