Michael Bruck:
[openocd.git] / src / target / arm11_dbgtap.c
1 /***************************************************************************
2 * Copyright (C) 2008 digenius technology GmbH. *
3 * *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
8 * *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
13 * *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
18 ***************************************************************************/
19
20 #ifdef HAVE_CONFIG_H
21 #include "config.h"
22 #endif
23
24 #include "arm11.h"
25 #include "jtag.h"
26 #include "log.h"
27
28 #include <stdlib.h>
29 #include <string.h>
30
31 #if 0
32 #define JTAG_DEBUG(expr ...) DEBUG(expr)
33 #else
34 #define JTAG_DEBUG(expr ...) do {} while(0)
35 #endif
36
37 enum tap_state arm11_move_pi_to_si_via_ci[] =
38 {
39 TAP_E2I, TAP_UI, TAP_SDS, TAP_SIS, TAP_CI, TAP_SI
40 };
41
42
43 int arm11_add_ir_scan_vc(int num_fields, scan_field_t *fields, enum tap_state state)
44 {
45 if (cmd_queue_cur_state == TAP_PI)
46 jtag_add_pathmove(asizeof(arm11_move_pi_to_si_via_ci), arm11_move_pi_to_si_via_ci);
47
48 return jtag_add_ir_scan(num_fields, fields, state);
49 }
50
51 enum tap_state arm11_move_pd_to_sd_via_cd[] =
52 {
53 TAP_E2D, TAP_UD, TAP_SDS, TAP_CD, TAP_SD
54 };
55
56 int arm11_add_dr_scan_vc(int num_fields, scan_field_t *fields, enum tap_state state)
57 {
58 if (cmd_queue_cur_state == TAP_PD)
59 jtag_add_pathmove(asizeof(arm11_move_pd_to_sd_via_cd), arm11_move_pd_to_sd_via_cd);
60
61 return jtag_add_dr_scan(num_fields, fields, state);
62 }
63
64
65 /** Code de-clutter: Construct scan_field_t to write out a value
66 *
67 * \param arm11 Target state variable.
68 * \param num_bits Length of the data field
69 * \param out_data pointer to the data that will be sent out
70 * <em>(data is read when it is added to the JTAG queue)</em>
71 * \param in_data pointer to the memory that will receive data that was clocked in
72 * <em>(data is written when the JTAG queue is executed)</em>
73 * \param field target data structure that will be initialized
74 */
75 void arm11_setup_field(arm11_common_t * arm11, int num_bits, void * out_data, void * in_data, scan_field_t * field)
76 {
77 field->device = arm11->jtag_info.chain_pos;
78 field->num_bits = num_bits;
79 field->out_mask = NULL;
80 field->in_check_mask = NULL;
81 field->in_check_value = NULL;
82 field->in_handler = NULL;
83 field->in_handler_priv = NULL;
84
85 field->out_value = out_data;
86 field->in_value = in_data;
87 }
88
89
90 /** Write JTAG instruction register
91 *
92 * \param arm11 Target state variable.
93 * \param instr An ARM11 DBGTAP instruction. Use enum #arm11_instructions.
94 * \param state Pass the final TAP state or -1 for the default value (Pause-IR).
95 *
96 * \remarks This adds to the JTAG command queue but does \em not execute it.
97 */
98 void arm11_add_IR(arm11_common_t * arm11, u8 instr, enum tap_state state)
99 {
100 jtag_device_t *device = jtag_get_device(arm11->jtag_info.chain_pos);
101
102 if (buf_get_u32(device->cur_instr, 0, 5) == instr)
103 {
104 JTAG_DEBUG("IR <= 0x%02x SKIPPED", instr);
105 return;
106 }
107
108 JTAG_DEBUG("IR <= 0x%02x", instr);
109
110 scan_field_t field;
111
112 arm11_setup_field(arm11, 5, &instr, NULL, &field);
113
114 arm11_add_ir_scan_vc(1, &field, state == -1 ? TAP_PI : state);
115 }
116
117 /** Verify shifted out data from Scan Chain Register (SCREG)
118 * Used as parameter to scan_field_t::in_handler in
119 * arm11_add_debug_SCAN_N().
120 *
121 */
122 static int arm11_in_handler_SCAN_N(u8 *in_value, void *priv, struct scan_field_s *field)
123 {
124 /** \todo TODO: clarify why this isnt properly masked in jtag.c jtag_read_buffer() */
125 u8 v = *in_value & 0x1F;
126
127 if (v != 0x10)
128 {
129 ERROR("'arm11 target' JTAG communication error SCREG SCAN OUT 0x%02x (expected 0x10)", v);
130 exit(-1);
131 }
132
133 JTAG_DEBUG("SCREG SCAN OUT 0x%02x", v);
134 return ERROR_OK;
135 }
136
137 /** Select and write to Scan Chain Register (SCREG)
138 *
139 * This function sets the instruction register to SCAN_N and writes
140 * the data register with the selected chain number.
141 *
142 * http://infocenter.arm.com/help/topic/com.arm.doc.ddi0301f/Cacbjhfg.html
143 *
144 * \param arm11 Target state variable.
145 * \param chain Scan chain that will be selected.
146 * \param state Pass the final TAP state or -1 for the default
147 * value (Pause-DR).
148 *
149 * The chain takes effect when Update-DR is passed (usually when subsequently
150 * the INTEXT/EXTEST instructions are written).
151 *
152 * \warning (Obsolete) Using this twice in a row will \em fail. The first call will end
153 * in Pause-DR. The second call, due to the IR caching, will not
154 * go through Capture-DR when shifting in the new scan chain number.
155 * As a result the verification in arm11_in_handler_SCAN_N() must
156 * fail.
157 *
158 * \remarks This adds to the JTAG command queue but does \em not execute it.
159 */
160
161 void arm11_add_debug_SCAN_N(arm11_common_t * arm11, u8 chain, enum tap_state state)
162 {
163 JTAG_DEBUG("SCREG <= 0x%02x", chain);
164
165 arm11_add_IR(arm11, ARM11_SCAN_N, -1);
166
167 scan_field_t field;
168
169 arm11_setup_field(arm11, 5, &chain, NULL, &field);
170
171 field.in_handler = arm11_in_handler_SCAN_N;
172
173 arm11_add_dr_scan_vc(1, &field, state == -1 ? TAP_PD : state);
174 }
175
176 /** Write an instruction into the ITR register
177 *
178 * \param arm11 Target state variable.
179 * \param inst An ARM11 processor instruction/opcode.
180 * \param flag Optional parameter to retrieve the InstCompl flag
181 * (this will be written when the JTAG chain is executed).
182 * \param state Pass the final TAP state or -1 for the default
183 * value (Run-Test/Idle).
184 *
185 * \remarks By default this ends with Run-Test/Idle state
186 * and causes the instruction to be executed. If
187 * a subsequent write to DTR is needed before
188 * executing the instruction then TAP_PD should be
189 * passed to \p state.
190 *
191 * \remarks This adds to the JTAG command queue but does \em not execute it.
192 */
193 void arm11_add_debug_INST(arm11_common_t * arm11, u32 inst, u8 * flag, enum tap_state state)
194 {
195 JTAG_DEBUG("INST <= 0x%08x", inst);
196
197 scan_field_t itr[2];
198
199 arm11_setup_field(arm11, 32, &inst, NULL, itr + 0);
200 arm11_setup_field(arm11, 1, NULL, flag, itr + 1);
201
202 arm11_add_dr_scan_vc(asizeof(itr), itr, state == -1 ? TAP_RTI : state);
203 }
204
205 /** Read the Debug Status and Control Register (DSCR)
206 *
207 * same as CP14 c1
208 *
209 * \param arm11 Target state variable.
210 * \return DSCR content
211 *
212 * \remarks This is a stand-alone function that executes the JTAG command queue.
213 */
214 u32 arm11_read_DSCR(arm11_common_t * arm11)
215 {
216 arm11_add_debug_SCAN_N(arm11, 0x01, -1);
217
218 arm11_add_IR(arm11, ARM11_INTEST, -1);
219
220 u32 dscr;
221 scan_field_t chain1_field;
222
223 arm11_setup_field(arm11, 32, NULL, &dscr, &chain1_field);
224
225 arm11_add_dr_scan_vc(1, &chain1_field, TAP_PD);
226
227 jtag_execute_queue();
228
229 if (arm11->last_dscr != dscr)
230 JTAG_DEBUG("DSCR = %08x (OLD %08x)", dscr, arm11->last_dscr);
231
232 arm11->last_dscr = dscr;
233
234 return dscr;
235 }
236
237 /** Write the Debug Status and Control Register (DSCR)
238 *
239 * same as CP14 c1
240 *
241 * \param arm11 Target state variable.
242 * \param dscr DSCR content
243 *
244 * \remarks This is a stand-alone function that executes the JTAG command queue.
245 */
246 void arm11_write_DSCR(arm11_common_t * arm11, u32 dscr)
247 {
248 arm11_add_debug_SCAN_N(arm11, 0x01, -1);
249
250 arm11_add_IR(arm11, ARM11_EXTEST, -1);
251
252 scan_field_t chain1_field;
253
254 arm11_setup_field(arm11, 32, &dscr, NULL, &chain1_field);
255
256 arm11_add_dr_scan_vc(1, &chain1_field, TAP_PD);
257
258 jtag_execute_queue();
259
260 JTAG_DEBUG("DSCR <= %08x (OLD %08x)", dscr, arm11->last_dscr);
261
262 arm11->last_dscr = dscr;
263 }
264
265
266
267 /** Get the debug reason from Debug Status and Control Register (DSCR)
268 *
269 * \param dscr DSCR value to analyze
270 * \return Debug reason
271 *
272 */
273 enum target_debug_reason arm11_get_DSCR_debug_reason(u32 dscr)
274 {
275 switch (dscr & ARM11_DSCR_METHOD_OF_DEBUG_ENTRY_MASK)
276 {
277 case ARM11_DSCR_METHOD_OF_DEBUG_ENTRY_HALT:
278 INFO("Debug entry: JTAG HALT");
279 return DBG_REASON_DBGRQ;
280
281 case ARM11_DSCR_METHOD_OF_DEBUG_ENTRY_BREAKPOINT:
282 INFO("Debug entry: breakpoint");
283 return DBG_REASON_BREAKPOINT;
284
285 case ARM11_DSCR_METHOD_OF_DEBUG_ENTRY_WATCHPOINT:
286 INFO("Debug entry: watchpoint");
287 return DBG_REASON_WATCHPOINT;
288
289 case ARM11_DSCR_METHOD_OF_DEBUG_ENTRY_BKPT_INSTRUCTION:
290 INFO("Debug entry: BKPT instruction");
291 return DBG_REASON_BREAKPOINT;
292
293 case ARM11_DSCR_METHOD_OF_DEBUG_ENTRY_EDBGRQ:
294 INFO("Debug entry: EDBGRQ signal");
295 return DBG_REASON_DBGRQ;
296
297 case ARM11_DSCR_METHOD_OF_DEBUG_ENTRY_VECTOR_CATCH:
298 INFO("Debug entry: VCR vector catch");
299 return DBG_REASON_BREAKPOINT;
300
301 default:
302 INFO("Debug entry: unknown");
303 return DBG_REASON_DBGRQ;
304 }
305 };
306
307
308
309 /** Prepare the stage for ITR/DTR operations
310 * from the arm11_run_instr... group of functions.
311 *
312 * Put arm11_run_instr_data_prepare() and arm11_run_instr_data_finish()
313 * around a block of arm11_run_instr_... calls.
314 *
315 * Select scan chain 5 to allow quick access to DTR. When scan
316 * chain 4 is needed to put in a register the ITRSel instruction
317 * shortcut is used instead of actually changing the Scan_N
318 * register.
319 *
320 * \param arm11 Target state variable.
321 *
322 */
323 void arm11_run_instr_data_prepare(arm11_common_t * arm11)
324 {
325 arm11_add_debug_SCAN_N(arm11, 0x05, -1);
326 }
327
328 /** Cleanup after ITR/DTR operations
329 * from the arm11_run_instr... group of functions
330 *
331 * Put arm11_run_instr_data_prepare() and arm11_run_instr_data_finish()
332 * around a block of arm11_run_instr_... calls.
333 *
334 * Any RTI can lead to an instruction execution when
335 * scan chains 4 or 5 are selected and the IR holds
336 * INTEST or EXTEST. So we must disable that before
337 * any following activities lead to an RTI.
338 *
339 * \param arm11 Target state variable.
340 *
341 */
342 void arm11_run_instr_data_finish(arm11_common_t * arm11)
343 {
344 arm11_add_debug_SCAN_N(arm11, 0x00, -1);
345 }
346
347
348 /** Execute one or multiple instructions via ITR
349 *
350 * \pre arm11_run_instr_data_prepare() / arm11_run_instr_data_finish() block
351 *
352 * \param arm11 Target state variable.
353 * \param opcode Pointer to sequence of ARM opcodes
354 * \param count Number of opcodes to execute
355 *
356 */
357 void arm11_run_instr_no_data(arm11_common_t * arm11, u32 * opcode, size_t count)
358 {
359 arm11_add_IR(arm11, ARM11_ITRSEL, -1);
360
361 while (count--)
362 {
363 arm11_add_debug_INST(arm11, *opcode++, NULL, TAP_RTI);
364
365 while (1)
366 {
367 u8 flag;
368
369 arm11_add_debug_INST(arm11, 0, &flag, count ? TAP_RTI : TAP_PD);
370
371 jtag_execute_queue();
372
373 if (flag)
374 break;
375 }
376 }
377 }
378
379 /** Execute one instruction via ITR
380 *
381 * \pre arm11_run_instr_data_prepare() / arm11_run_instr_data_finish() block
382 *
383 * \param arm11 Target state variable.
384 * \param opcode ARM opcode
385 *
386 */
387 void arm11_run_instr_no_data1(arm11_common_t * arm11, u32 opcode)
388 {
389 arm11_run_instr_no_data(arm11, &opcode, 1);
390 }
391
392
393 /** Execute one instruction via ITR repeatedly while
394 * passing data to the core via DTR on each execution.
395 *
396 * The executed instruction \em must read data from DTR.
397 *
398 * \pre arm11_run_instr_data_prepare() / arm11_run_instr_data_finish() block
399 *
400 * \param arm11 Target state variable.
401 * \param opcode ARM opcode
402 * \param data Pointer to the data words to be passed to the core
403 * \param count Number of data words and instruction repetitions
404 *
405 */
406 void arm11_run_instr_data_to_core(arm11_common_t * arm11, u32 opcode, u32 * data, size_t count)
407 {
408 arm11_add_IR(arm11, ARM11_ITRSEL, -1);
409
410 arm11_add_debug_INST(arm11, opcode, NULL, TAP_PD);
411
412 arm11_add_IR(arm11, ARM11_EXTEST, -1);
413
414 scan_field_t chain5_fields[3];
415
416 u32 Data;
417 u8 Ready;
418 u8 nRetry;
419
420 arm11_setup_field(arm11, 32, &Data, NULL, chain5_fields + 0);
421 arm11_setup_field(arm11, 1, NULL, &Ready, chain5_fields + 1);
422 arm11_setup_field(arm11, 1, NULL, &nRetry, chain5_fields + 2);
423
424 while (count--)
425 {
426 do
427 {
428 Data = *data;
429
430 arm11_add_dr_scan_vc(asizeof(chain5_fields), chain5_fields, TAP_RTI);
431 jtag_execute_queue();
432
433 JTAG_DEBUG("DTR Ready %d nRetry %d", Ready, nRetry);
434 }
435 while (!Ready);
436
437 data++;
438 }
439
440 arm11_add_IR(arm11, ARM11_INTEST, -1);
441
442 do
443 {
444 Data = 0;
445
446 arm11_add_dr_scan_vc(asizeof(chain5_fields), chain5_fields, TAP_PD);
447 jtag_execute_queue();
448
449 JTAG_DEBUG("DTR Data %08x Ready %d nRetry %d", Data, Ready, nRetry);
450 }
451 while (!Ready);
452 }
453
454 /** JTAG path for arm11_run_instr_data_to_core_noack
455 *
456 * The repeated TAP_RTI's do not cause a repeated execution
457 * if passed without leaving the state.
458 *
459 * Since this is more than 7 bits (adjustable via adding more
460 * TAP_RTI's) it produces an artificial delay in the lower
461 * layer (FT2232) that is long enough to finish execution on
462 * the core but still shorter than any manually inducible delays.
463 *
464 */
465 enum tap_state arm11_MOVE_PD_RTI_PD_with_delay[] =
466 {
467 TAP_E2D, TAP_UD, TAP_RTI, TAP_RTI, TAP_RTI, TAP_SDS, TAP_CD, TAP_SD
468 };
469
470
471
472 /** Execute one instruction via ITR repeatedly while
473 * passing data to the core via DTR on each execution.
474 *
475 * No Ready check during transmission.
476 *
477 * The executed instruction \em must read data from DTR.
478 *
479 * \pre arm11_run_instr_data_prepare() / arm11_run_instr_data_finish() block
480 *
481 * \param arm11 Target state variable.
482 * \param opcode ARM opcode
483 * \param data Pointer to the data words to be passed to the core
484 * \param count Number of data words and instruction repetitions
485 *
486 */
487 void arm11_run_instr_data_to_core_noack(arm11_common_t * arm11, u32 opcode, u32 * data, size_t count)
488 {
489 arm11_add_IR(arm11, ARM11_ITRSEL, -1);
490
491 arm11_add_debug_INST(arm11, opcode, NULL, TAP_PD);
492
493 arm11_add_IR(arm11, ARM11_EXTEST, -1);
494
495 scan_field_t chain5_fields[3];
496
497 arm11_setup_field(arm11, 32, NULL/*&Data*/, NULL, chain5_fields + 0);
498 arm11_setup_field(arm11, 1, NULL, NULL /*&Ready*/, chain5_fields + 1);
499 arm11_setup_field(arm11, 1, NULL, NULL, chain5_fields + 2);
500
501 u8 Readies[count + 1];
502 u8 * ReadyPos = Readies;
503
504 while (count--)
505 {
506 chain5_fields[0].out_value = (void *)(data++);
507 chain5_fields[1].in_value = ReadyPos++;
508
509 if (count)
510 {
511 jtag_add_dr_scan(asizeof(chain5_fields), chain5_fields, TAP_PD);
512 jtag_add_pathmove(asizeof(arm11_MOVE_PD_RTI_PD_with_delay),
513 arm11_MOVE_PD_RTI_PD_with_delay);
514 }
515 else
516 {
517 jtag_add_dr_scan(asizeof(chain5_fields), chain5_fields, TAP_RTI);
518 }
519 }
520
521 arm11_add_IR(arm11, ARM11_INTEST, -1);
522
523 chain5_fields[0].out_value = 0;
524 chain5_fields[1].in_value = ReadyPos++;
525
526 arm11_add_dr_scan_vc(asizeof(chain5_fields), chain5_fields, TAP_PD);
527
528 jtag_execute_queue();
529
530 size_t error_count = 0;
531
532 {size_t i;
533 for (i = 0; i < asizeof(Readies); i++)
534 {
535 if (Readies[i] != 1)
536 {
537 error_count++;
538 }
539 }}
540
541 if (error_count)
542 ERROR("Transfer errors " ZU, error_count);
543 }
544
545
546 /** Execute an instruction via ITR while handing data into the core via DTR.
547 *
548 * The executed instruction \em must read data from DTR.
549 *
550 * \pre arm11_run_instr_data_prepare() / arm11_run_instr_data_finish() block
551 *
552 * \param arm11 Target state variable.
553 * \param opcode ARM opcode
554 * \param data Data word to be passed to the core via DTR
555 *
556 */
557 void arm11_run_instr_data_to_core1(arm11_common_t * arm11, u32 opcode, u32 data)
558 {
559 arm11_run_instr_data_to_core(arm11, opcode, &data, 1);
560 }
561
562
563 /** Execute one instruction via ITR repeatedly while
564 * reading data from the core via DTR on each execution.
565 *
566 * The executed instruction \em must write data to DTR.
567 *
568 * \pre arm11_run_instr_data_prepare() / arm11_run_instr_data_finish() block
569 *
570 * \param arm11 Target state variable.
571 * \param opcode ARM opcode
572 * \param data Pointer to an array that receives the data words from the core
573 * \param count Number of data words and instruction repetitions
574 *
575 */
576 void arm11_run_instr_data_from_core(arm11_common_t * arm11, u32 opcode, u32 * data, size_t count)
577 {
578 arm11_add_IR(arm11, ARM11_ITRSEL, -1);
579
580 arm11_add_debug_INST(arm11, opcode, NULL, TAP_RTI);
581
582 arm11_add_IR(arm11, ARM11_INTEST, -1);
583
584 scan_field_t chain5_fields[3];
585
586 u32 Data;
587 u8 Ready;
588 u8 nRetry;
589
590 arm11_setup_field(arm11, 32, NULL, &Data, chain5_fields + 0);
591 arm11_setup_field(arm11, 1, NULL, &Ready, chain5_fields + 1);
592 arm11_setup_field(arm11, 1, NULL, &nRetry, chain5_fields + 2);
593
594 while (count--)
595 {
596 do
597 {
598 arm11_add_dr_scan_vc(asizeof(chain5_fields), chain5_fields, count ? TAP_RTI : TAP_PD);
599 jtag_execute_queue();
600
601 JTAG_DEBUG("DTR Data %08x Ready %d nRetry %d", Data, Ready, nRetry);
602 }
603 while (!Ready);
604
605 *data++ = Data;
606 }
607 }
608
609 /** Execute one instruction via ITR
610 * then load r0 into DTR and read DTR from core.
611 *
612 * The first executed instruction (\p opcode) should write data to r0.
613 *
614 * \pre arm11_run_instr_data_prepare() / arm11_run_instr_data_finish() block
615 *
616 * \param arm11 Target state variable.
617 * \param opcode ARM opcode to write r0 with the value of interest
618 * \param data Pointer to a data word that receives the value from r0 after \p opcode was executed.
619 *
620 */
621 void arm11_run_instr_data_from_core_via_r0(arm11_common_t * arm11, u32 opcode, u32 * data)
622 {
623 arm11_run_instr_no_data1(arm11, opcode);
624
625 /* MCR p14,0,R0,c0,c5,0 (move r0 -> wDTR -> local var) */
626 arm11_run_instr_data_from_core(arm11, 0xEE000E15, data, 1);
627 }
628
629 /** Load data into core via DTR then move it to r0 then
630 * execute one instruction via ITR
631 *
632 * The final executed instruction (\p opcode) should read data from r0.
633 *
634 * \pre arm11_run_instr_data_prepare() / arm11_run_instr_data_finish() block
635 *
636 * \param arm11 Target state variable.
637 * \param opcode ARM opcode to read r0 act upon it
638 * \param data Data word that will be written to r0 before \p opcode is executed
639 *
640 */
641 void arm11_run_instr_data_to_core_via_r0(arm11_common_t * arm11, u32 opcode, u32 data)
642 {
643 /* MRC p14,0,r0,c0,c5,0 */
644 arm11_run_instr_data_to_core1(arm11, 0xEE100E15, data);
645
646 arm11_run_instr_no_data1(arm11, opcode);
647 }
648
649 /** Apply reads and writes to scan chain 7
650 *
651 * \see arm11_sc7_action_t
652 *
653 * \param arm11 Target state variable.
654 * \param actions A list of read and/or write instructions
655 * \param count Number of instructions in the list.
656 *
657 */
658 void arm11_sc7_run(arm11_common_t * arm11, arm11_sc7_action_t * actions, size_t count)
659 {
660 arm11_add_debug_SCAN_N(arm11, 0x07, -1);
661
662 arm11_add_IR(arm11, ARM11_EXTEST, -1);
663
664 scan_field_t chain7_fields[3];
665
666 u8 nRW;
667 u32 DataOut;
668 u8 AddressOut;
669 u8 Ready;
670 u32 DataIn;
671 u8 AddressIn;
672
673 arm11_setup_field(arm11, 1, &nRW, &Ready, chain7_fields + 0);
674 arm11_setup_field(arm11, 32, &DataOut, &DataIn, chain7_fields + 1);
675 arm11_setup_field(arm11, 7, &AddressOut, &AddressIn, chain7_fields + 2);
676
677 {size_t i;
678 for (i = 0; i < count + 1; i++)
679 {
680 if (i < count)
681 {
682 nRW = actions[i].write ? 1 : 0;
683 DataOut = actions[i].value;
684 AddressOut = actions[i].address;
685 }
686 else
687 {
688 nRW = 0;
689 DataOut = 0;
690 AddressOut = 0;
691 }
692
693 do
694 {
695 JTAG_DEBUG("SC7 <= Address %02x Data %08x nRW %d", AddressOut, DataOut, nRW);
696
697 arm11_add_dr_scan_vc(asizeof(chain7_fields), chain7_fields, TAP_PD);
698 jtag_execute_queue();
699
700 JTAG_DEBUG("SC7 => Address %02x Data %08x Ready %d", AddressIn, DataIn, Ready);
701 }
702 while (!Ready); /* 'nRW' is 'Ready' on read out */
703
704 if (i > 0)
705 {
706 if (actions[i - 1].address != AddressIn)
707 {
708 WARNING("Scan chain 7 shifted out unexpected address");
709 }
710
711 if (!actions[i - 1].write)
712 {
713 actions[i - 1].value = DataIn;
714 }
715 else
716 {
717 if (actions[i - 1].value != DataIn)
718 {
719 WARNING("Scan chain 7 shifted out unexpected data");
720 }
721 }
722 }
723 }}
724
725 {size_t i;
726 for (i = 0; i < count; i++)
727 {
728 JTAG_DEBUG("SC7 %02d: %02x %s %08x", i, actions[i].address, actions[i].write ? "<=" : "=>", actions[i].value);
729 }}
730 }
731
732 /** Clear VCR and all breakpoints and watchpoints via scan chain 7
733 *
734 * \param arm11 Target state variable.
735 *
736 */
737 void arm11_sc7_clear_vbw(arm11_common_t * arm11)
738 {
739 arm11_sc7_action_t clear_bw[arm11->brp + arm11->wrp + 1];
740 arm11_sc7_action_t * pos = clear_bw;
741
742 {size_t i;
743 for (i = 0; i < asizeof(clear_bw); i++)
744 {
745 clear_bw[i].write = true;
746 clear_bw[i].value = 0;
747 }}
748
749 {size_t i;
750 for (i = 0; i < arm11->brp; i++)
751 (pos++)->address = ARM11_SC7_BCR0 + i;
752 }
753
754 {size_t i;
755 for (i = 0; i < arm11->wrp; i++)
756 (pos++)->address = ARM11_SC7_WCR0 + i;
757 }
758
759 (pos++)->address = ARM11_SC7_VCR;
760
761 arm11_sc7_run(arm11, clear_bw, asizeof(clear_bw));
762 }
763
764 /** Write VCR register
765 *
766 * \param arm11 Target state variable.
767 * \param value Value to be written
768 */
769 void arm11_sc7_set_vcr(arm11_common_t * arm11, u32 value)
770 {
771 arm11_sc7_action_t set_vcr;
772
773 set_vcr.write = true;
774 set_vcr.address = ARM11_SC7_VCR;
775 set_vcr.value = value;
776
777
778 arm11_sc7_run(arm11, &set_vcr, 1);
779 }
780
781
782
783 /** Read word from address
784 *
785 * \param arm11 Target state variable.
786 * \param address Memory address to be read
787 * \param result Pointer where to store result
788 *
789 */
790 void arm11_read_memory_word(arm11_common_t * arm11, u32 address, u32 * result)
791 {
792 arm11_run_instr_data_prepare(arm11);
793
794 /* MRC p14,0,r0,c0,c5,0 (r0 = address) */
795 arm11_run_instr_data_to_core1(arm11, 0xee100e15, address);
796
797 /* LDC p14,c5,[R0],#4 (DTR = [r0]) */
798 arm11_run_instr_data_from_core(arm11, 0xecb05e01, result, 1);
799
800 arm11_run_instr_data_finish(arm11);
801 }
802
803

Linking to existing account procedure

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

SSH host keys fingerprints

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