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