1 /*! \file jtagarm7tdmi.c
2 \brief ARM7TDMI JTAG (AT91R40008)
8 #include "jtagarm7tdmi.h"
11 /**** 20-pin Connection Information (pin1 is on top-right for both connectors)****
12 GoodFET -> 7TDMI 20-pin connector (HE-10 connector)
19 9 4,6,8,10,12,14,16,18,20 (GND)
20 11 17/3 (nTRST) (different sources suggest 17 or 3 alternately)
21 ********************************/
23 /**** 14-pin Connection Information (pin1 is on top-right for both connectors)****
24 GoodFET -> 7TDMI 14-pin connector
34 http://hri.sourceforge.net/tools/jtag_faq_org.html
35 ********************************/
42 /****************************************************************
43 Enabling jtag likely differs with most platforms. We will attempt to enable most from here. Override jtagarm7tdmi_start() to extend for other implementations
44 ARM7TDMI enables three different scan chains:
45 * Chain0 - "entire periphery" including data bus
46 * Chain1 - core data bus (subset of Chain0) - Instruction Pipeline
47 * Chain2 - EmbeddedICE Logic Registers - This is our way into the fun stuff.
51 You can disable EmbeddedICE-RT by setting the DBGEN input LOW.
53 Hard wiring the DBGEN input LOW permanently disables all debug functionality.
54 When DBGEN is LOW, it inhibits DBGDEWPT, DBGIEBKPT, and EDBGRQ to
55 the core, and DBGACK from the ARM9E-S core is always LOW.
60 When the ARM9E-S core is in debug state, you can examine the core and system state
61 by forcing the load and store multiples into the instruction pipeline.
62 Before you can examine the core and system state, the debugger must determine
63 whether the processor entered debug from Thumb state or ARM state, by examining
64 bit 4 of the EmbeddedICE-RT debug status register. If bit 4 is HIGH, the core has
65 entered debug from Thumb state.
66 For more details about determining the core state, see Determining the core and system
71 --- olimex - http://www.olimex.com/dev/pdf/arm-jtag.pdf
72 JTAG signals description:
73 PIN.1 (VTREF) Target voltage sense. Used to indicate the target’s operating voltage to thedebug tool.
74 PIN.2 (VTARGET) Target voltage. May be used to supply power to the debug tool.
75 PIN.3 (nTRST) JTAG TAP reset, this signal should be pulled up to Vcc in target board.
76 PIN4,6, 8, 10,12,14,16,18,20 Ground. The Gnd-Signal-Gnd-Signal strategy implemented on the 20-way connection scheme improves noiseimmunity on the target connect cable.
77 *PIN.5 (TDI) JTAG serial data in, should be pulled up to Vcc on target board.
78 *PIN.7 (TMS) JTAG TAP Mode Select, should be pulled up to Vcc on target board.
79 *PIN.9 (TCK) JTAG clock.
80 PIN.11 (RTCK) JTAG retimed clock.Implemented on certain ASIC ARM implementations the host ASIC may need to synchronize external inputs (such as JTAG inputs) with its own internal clock.
81 *PIN.13 (TDO) JTAG serial data out.
82 *PIN.15 (nSRST) Target system reset.
83 *PIN.17 (DBGRQ) Asynchronous debug request. DBGRQ allows an external signal to force the ARM core into debug mode, should be pull down to GND.
84 PIN.19 (DBGACK) Debug acknowledge. The ARM core acknowledges debug-mode inresponse to a DBGRQ input.
87 ----------- SAMPLE TIMES -----------
89 TDI and TMS are sampled on the rising edge of TCK and TDO transitions appear on the falling edge of TCK. Therefore, TDI and TMS must be written after the falling edge of TCK and TDO must be read after the rising edge of TCK.
91 for this module, we keep tck high for all changes/sampling, and then bounce it.
92 ****************************************************************/
96 /************************** JTAGARM7TDMI Primitives ****************************/
97 void jtag_goto_shift_ir() {
107 void jtag_goto_shift_dr() {
115 void jtag_reset_to_runtest_idle() {
124 jtag_arm_tcktock(); // now in Reset state
126 jtag_arm_tcktock(); // now in Run-Test/Idle state
129 void jtag_arm_tcktock() {
137 // ! Start JTAG, setup pins, reset TAP and return IDCODE
138 unsigned long jtagarm7tdmi_start() {
140 //Known-good starting position.
141 //Might be unnecessary.
157 jtagarm7tdmi_resettap();
158 return jtagarm7tdmi_idcode();
162 //! Reset TAP State Machine
163 void jtagarm7tdmi_resettap(){ // PROVEN
165 jtag_reset_to_runtest_idle();
169 // NOTE: important: THIS MODULE REVOLVES AROUND RETURNING TO RUNTEST/IDLE, OR THE FUNCTIONAL EQUIVALENT
172 //! Shift N bits over TDI/TDO. May choose LSB or MSB, and select whether to terminate (TMS-high on last bit) and whether to return to RUNTEST/IDLE
173 unsigned long jtagarmtransn(unsigned long word, unsigned char bitcount, unsigned char lsb, unsigned char end, unsigned char retidle){ // PROVEN
175 unsigned long high = 1;
178 for (bit=(bitcount-1)/8; bit>0; bit--)
180 high <<= ((bitcount-1)%8);
185 for (bit = bitcount; bit > 0; bit--) {
186 /* write MOSI on trailing edge of previous clock */
194 SETTMS;//TMS high on last bit to exit.
198 /* read MISO on trailing edge */
204 for (bit = bitcount; bit > 0; bit--) {
205 /* write MOSI on trailing edge of previous clock */
210 word = (word & mask) << 1;
213 SETTMS;//TMS high on last bit to exit.
217 /* read MISO on trailing edge */
239 /************************************************************************
240 * ARM7TDMI core has 6 primary registers to be connected between TDI/TDO
243 * * Scan Chain Select Register (4 bits_lsb)
244 * * Scan Chain 0 (64+* bits: 32_databits_lsb + ctrlbits + 32_addrbits_msb)
245 * * Scan Chain 1 (33 bits: 32_bits + BREAKPT)
246 * * Scan Chain 2 (38 bits: rw + 5_regbits_msb + 32_databits_msb)
247 ************************************************************************/
251 /************************** Basic JTAG Verb Commands *******************************/
252 //! Grab the core ID.
253 unsigned long jtagarm7tdmi_idcode(){ // PROVEN
254 jtagarm7tdmi_resettap();
256 jtagarmtransn(ARM7TDMI_IR_IDCODE, 4, LSB, END, RETIDLE);
258 return jtagarmtransn(0,32, LSB, END, RETIDLE);
261 //! Connect Bypass Register to TDO/TDI
262 unsigned char jtagarm7tdmi_bypass(){ // PROVEN
263 //jtagarm7tdmi_resettap();
265 return jtagarmtransn(ARM7TDMI_IR_BYPASS, 4, LSB, END, NORETIDLE);
267 //! INTEST verb - do internal test
268 unsigned char jtagarm7tdmi_intest() {
269 //jtagarm7tdmi_resettap();
271 return jtagarmtransn(ARM7TDMI_IR_INTEST, 4, LSB, END, NORETIDLE);
275 unsigned char jtagarm7tdmi_extest() {
276 //jtagarm7tdmi_resettap();
278 return jtagarmtransn(ARM7TDMI_IR_EXTEST, 4, LSB, END, NORETIDLE);
282 //unsigned long jtagarm7tdmi_sample() {
283 // jtagarm7tdmi_ir_shift4(ARM7TDMI_IR_SAMPLE); // ???? same here.
284 // return jtagtransn(0,32);
288 unsigned char jtagarm7tdmi_restart() {
289 //jtagarm7tdmi_resettap();
291 return jtagarmtransn(ARM7TDMI_IR_RESTART, 4, LSB, END, RETIDLE);
294 //! ARM7TDMI_IR_CLAMP 0x5
295 //unsigned long jtagarm7tdmi_clamp() {
296 // jtagarm7tdmi_resettap();
298 // jtagarmtransn(ARM7TDMI_IR_CLAMP, 4, LSB, END, NORETIDLE);
300 // return jtagarmtransn(0, 32, LSB, END, RETIDLE);
303 //! ARM7TDMI_IR_HIGHZ 0x7
304 //unsigned char jtagarm7tdmi_highz() {
305 // jtagarm7tdmi_resettap();
307 // return jtagarmtransn(ARM7TDMI_IR_HIGHZ, 4, LSB, END, NORETIDLE);
310 //! define ARM7TDMI_IR_CLAMPZ 0x9
311 //unsigned char jtagarm7tdmi_clampz() {
312 // jtagarm7tdmi_resettap();
314 // return jtagarmtransn(ARM7TDMI_IR_CLAMPZ, 4, LSB, END, NORETIDLE);
318 //! Connect the appropriate scan chain to TDO/TDI. SCAN_N, INTEST, ENDS IN SHIFT_DR!!!!!
319 unsigned long jtagarm7tdmi_scan(int chain, int testmode) { // PROVEN
321 When selecting a scan chain the “Run Test/Idle” state should never be reached, other-
322 wise, when in debug state, the core will not be correctly isolated and intrusive
323 commands occur. Therefore, it is recommended to pass directly from the “Update”
324 state” to the “Select DR” state each time the “Update” state is reached.
326 unsigned long retval;
327 if (current_chain != chain) { // breaks shit when going from idcode back to scan chain
329 jtagarmtransn(ARM7TDMI_IR_SCAN_N, 4, LSB, END, NORETIDLE);
331 retval = jtagarmtransn(chain, 4, LSB, END, NORETIDLE);
332 current_chain = chain;
334 retval = current_chain;
335 // put in test mode...
337 jtagarmtransn(testmode, 4, LSB, END, RETIDLE);
342 //! Connect the appropriate scan chain to TDO/TDI. SCAN_N, INTEST, ENDS IN SHIFT_DR!!!!!
343 unsigned long jtagarm7tdmi_scan_intest(int chain) { // PROVEN
344 return jtagarm7tdmi_scan(chain, ARM7TDMI_IR_INTEST);
350 //! push an instruction into the pipeline
351 unsigned long jtagarm7tdmi_instr_primitive(unsigned long instr, char breakpt){
352 unsigned long retval;
353 //jtagarm7tdmi_resettap(); // FIXME: DEBUG: seems necessary for some reason. ugh.
354 jtagarm7tdmi_scan_intest(1);
357 // if the next instruction is to run using MCLK (master clock), set TDI
361 count_sysspd_instr_since_debug++;
366 count_dbgspd_instr_since_debug++;
370 // Now shift in the 32 bits
371 retval = jtagarmtransn(instr, 32, MSB, END, RETIDLE); // Must return to RUN-TEST/IDLE state for instruction to enter pipeline, and causes debug clock.
372 //jtag_arm_tcktock();
378 unsigned long jtagarm7tdmi_nop(char breakpt){
379 return jtagarm7tdmi_instr_primitive(ARM_INSTR_NOP, breakpt);
382 /* stolen from ARM DDI0029G documentation, translated using ARM Architecture Reference Manual (14128.pdf)
383 STR R0, [R0]; Save R0 before use
384 MOV R0, PC ; Copy PC into R0
385 STR R0, [R0]; Now save the PC in R0
386 BX PC ; Jump into ARM state
393 //! set the current mode to ARM, returns PC (FIXME). Should be used by haltcpu(), which should also store PC and the THUMB state, for use by releasecpu();
394 unsigned long jtagarm7tdmi_setMode_ARM(){ // PROVEN
395 unsigned long retval = 0xff;
396 while ((jtagarm7tdmi_get_dbgstate() & JTAG_ARM7TDMI_DBG_TBIT)&& retval-- > 0){
397 cmddataword[6] = jtagarm7tdmi_instr_primitive(THUMB_INSTR_NOP,0);
398 cmddataword[1] = jtagarm7tdmi_instr_primitive(THUMB_INSTR_STR_R0_r0,0);
399 cmddataword[2] = jtagarm7tdmi_instr_primitive(THUMB_INSTR_MOV_R0_PC,0);
400 cmddataword[3] = jtagarm7tdmi_instr_primitive(THUMB_INSTR_STR_R0_r0,0);
401 cmddataword[4] = jtagarm7tdmi_instr_primitive(THUMB_INSTR_BX_PC,0);
402 cmddataword[5] = jtagarm7tdmi_instr_primitive(THUMB_INSTR_NOP,0);
403 cmddataword[6] = jtagarm7tdmi_instr_primitive(THUMB_INSTR_NOP,0);
404 jtagarm7tdmi_resettap(); // seems necessary for some reason. ugh.
412 /************************* EmbeddedICE Primitives ****************************/
413 //! shifter for writing to chain2 (EmbeddedICE).
414 unsigned long eice_write(unsigned char reg, unsigned long data){
415 unsigned long retval, temp;
416 jtagarm7tdmi_scan_intest(2);
417 // Now shift in the 32 bits
419 retval = jtagarmtransn(data, 32, LSB, NOEND, NORETIDLE); // send in the data - 32-bits lsb
420 temp = jtagarmtransn(reg, 5, LSB, NOEND, NORETIDLE); // send in the register address - 5 bits lsb
421 jtagarmtransn(1, 1, LSB, END, RETIDLE); // send in the WRITE bit
423 //SETTMS; // Last Bit - Exit UPDATE_DR
424 //// is this update a read/write or just read?
426 //jtag_arm_tcktock();
431 //! shifter for reading from chain2 (EmbeddedICE).
432 unsigned long eice_read(unsigned char reg){ // PROVEN
434 jtagarm7tdmi_scan_intest(2);
436 // send in the register address - 5 bits LSB
438 temp = jtagarmtransn(reg, 5, LSB, NOEND, NORETIDLE);
440 // clear TDI to select "read only"
441 jtagarmtransn(0, 1, LSB, END, RETIDLE);
444 // Now shift out the 32 bits
445 return(jtagarmtransn(0, 32, LSB, END, RETIDLE)); // atmel arm jtag docs pp.10-11: LSB first
452 /************************* ICEBreaker/EmbeddedICE Stuff ******************************/
453 //! Grab debug register
454 unsigned long jtagarm7tdmi_get_dbgstate() { // ICE Debug register, *NOT* ARM register DSCR // PROVEN
455 //jtagarm7tdmi_resettap();
456 return eice_read(EICE_DBGSTATUS);
459 //! Grab debug register
460 unsigned long jtagarm7tdmi_get_dbgctrl() {
461 return eice_read(EICE_DBGCTRL);
464 //! Update debug register
465 unsigned long jtagarm7tdmi_set_dbgctrl(unsigned long bits) {
466 return eice_write(EICE_DBGCTRL, bits);
471 //! Set and Enable Watchpoint 0
472 void jtagarm7tdmi_set_watchpoint0(unsigned long addr, unsigned long addrmask, unsigned long data, unsigned long datamask, unsigned long ctrl, unsigned long ctrlmask){
473 // store watchpoint info? - not right now
476 eice_write(EICE_WP0ADDR, addr); // write 0 in watchpoint 0 address
477 eice_write(EICE_WP0ADDRMASK, addrmask); // write 0xffffffff in watchpoint 0 address mask
478 eice_write(EICE_WP0DATA, data); // write 0 in watchpoint 0 data
479 eice_write(EICE_WP0DATAMASK, datamask); // write 0xffffffff in watchpoint 0 data mask
480 eice_write(EICE_WP0CTRL, ctrlmask); // write 0x00000100 in watchpoint 0 control value register (enables watchpoint)
481 eice_write(EICE_WP0CTRLMASK, ctrlmask); // write 0xfffffff7 in watchpoint 0 control mask - only detect the fetch instruction
484 //! Set and Enable Watchpoint 1
485 void jtagarm7tdmi_set_watchpoint1(unsigned long addr, unsigned long addrmask, unsigned long data, unsigned long datamask, unsigned long ctrl, unsigned long ctrlmask){
486 // store watchpoint info? - not right now
489 eice_write(EICE_WP1ADDR, addr); // write 0 in watchpoint 1 address
490 eice_write(EICE_WP1ADDRMASK, addrmask); // write 0xffffffff in watchpoint 1 address mask
491 eice_write(EICE_WP1DATA, data); // write 0 in watchpoint 1 data
492 eice_write(EICE_WP1DATAMASK, datamask); // write 0xffffffff in watchpoint 1 data mask
493 eice_write(EICE_WP1CTRL, ctrl); // write 0x00000100 in watchpoint 1 control value register (enables watchpoint)
494 eice_write(EICE_WP1CTRLMASK, ctrlmask); // write 0xfffffff7 in watchpoint 1 control mask - only detect the fetch instruction
497 //! Disable Watchpoint 0
498 void jtagarm7tdmi_disable_watchpoint0(){
499 eice_write(EICE_WP0CTRL, 0x0); // write 0 in watchpoint 0 control value - disables watchpoint 0
502 //! Disable Watchpoint 1
503 void jtagarm7tdmi_disable_watchpoint1(){
504 eice_write(EICE_WP1CTRL, 0x0); // write 0 in watchpoint 0 control value - disables watchpoint 0
509 /******************** Complex Commands **************************/
510 //! Push an instruction into the CPU pipeline
511 // NOTE! Must provide EXECNOPARM for parameter if no parm is required.
512 unsigned long test_exec(unsigned long instr, unsigned long parameter, unsigned char systemspeed) {
513 unsigned long retval;
515 cmddatalong[1] = jtagarm7tdmi_nop( 0);
516 cmddatalong[2] = jtagarm7tdmi_nop(systemspeed);
517 cmddatalong[3] = jtagarm7tdmi_instr_primitive(instr, 0); // write 32-bit instruction code into DR
518 cmddatalong[4] = jtagarm7tdmi_nop( 0);
519 cmddatalong[5] = jtagarm7tdmi_nop( 0);
520 cmddatalong[6] = jtagarm7tdmi_instr_primitive(parameter, 0); // inject long
521 cmddatalong[7] = jtagarm7tdmi_nop( 0);
522 cmddatalong[8] = jtagarm7tdmi_nop( 0);
523 cmddatalong[9] = jtagarm7tdmi_nop( 0);
524 retval = cmddatalong[9];
530 //! Push an instruction into the CPU pipeline
531 // NOTE! Must provide EXECNOPARM for parameter if no parm is required.
532 unsigned long jtagarm7tdmi_exec(unsigned long instr, unsigned long parameter, unsigned char systemspeed) {
533 unsigned long retval;
535 cmddatalong[1] = jtagarm7tdmi_nop( 0);
536 cmddatalong[2] = jtagarm7tdmi_nop(systemspeed);
537 cmddatalong[3] = jtagarm7tdmi_instr_primitive(instr, 0); // write 32-bit instruction code into DR
538 cmddatalong[4] = jtagarm7tdmi_nop( 0);
539 cmddatalong[5] = jtagarm7tdmi_nop( 0);
540 cmddatalong[6] = jtagarm7tdmi_instr_primitive(parameter, 0); // inject long
541 cmddatalong[7] = jtagarm7tdmi_nop( 0);
542 retval = jtagarm7tdmi_nop( 0);
543 cmddatalong[9] = jtagarm7tdmi_nop( 0);
544 cmddatalong[8] = retval;
549 //! Retrieve a 32-bit Register value
550 unsigned long jtagarm7tdmi_get_register(unsigned char reg) {
551 unsigned long retval = 0, instr;
552 // push nop into pipeline - clean out the pipeline...
553 cmddatalong[2] = jtagarm7tdmi_nop( 0);
555 instr = ARM_READ_REG | (reg<<12); // push STR Rx, [R14] into pipeline
556 cmddatalong[1] = jtagarm7tdmi_instr_primitive(instr, 0);
557 cmddatalong[2] = jtagarm7tdmi_nop( 0); // push nop into pipeline - fetched
558 cmddatalong[3] = jtagarm7tdmi_nop( 0); // push nop into pipeline - decoded
559 cmddatalong[4] = jtagarm7tdmi_nop( 0); // push nop into pipeline - executed
560 retval = jtagarm7tdmi_nop( 0); // recover 32-bit word
561 cmddatalong[5] = retval;
562 cmddatalong[6] = jtagarm7tdmi_nop( 0);
563 cmddatalong[7] = jtagarm7tdmi_nop( 0);
564 cmddatalong[8] = jtagarm7tdmi_nop( 0);
568 //! Retrieve a 32-bit Register value
569 unsigned long test_get_register(unsigned char reg) {
570 unsigned long retval = 0, instr;
571 // push nop into pipeline - clean out the pipeline...
572 cmddatalong[2] = jtagarm7tdmi_nop( 0);
574 instr = ARM_READ_REG | (reg<<12); // push STR Rx, [R14] into pipeline
575 cmddatalong[1] = jtagarm7tdmi_instr_primitive(instr, 0); // fetch
576 cmddatalong[2] = jtagarm7tdmi_nop( 0); // decode
577 cmddatalong[3] = jtagarm7tdmi_nop( 0); // execute
578 cmddatalong[4] = jtagarm7tdmi_nop( 0); // ??? what happens here ???
579 retval = jtagarm7tdmi_nop( 0); // recover 32-bit word
580 cmddatalong[5] = retval;
581 cmddatalong[6] = jtagarm7tdmi_nop( 0);
582 cmddatalong[7] = jtagarm7tdmi_nop( 0);
583 cmddatalong[8] = jtagarm7tdmi_nop( 0);
587 //! Set a 32-bit Register value
588 unsigned long jtagarm7tdmi_set_register(unsigned char reg, unsigned long val) {
589 unsigned long retval = 0, instr;
590 cmddatalong[1] = jtagarm7tdmi_nop( 0); // push nop into pipeline - clean out the pipeline...
592 instr = ARM_WRITE_REG | (reg<<12); // push LDR Rx, [R14] into pipeline
593 cmddatalong[2] = jtagarm7tdmi_instr_primitive(instr, 0); // push nop into pipeline - fetch
594 cmddatalong[3] = jtagarm7tdmi_nop( 0); // push nop into pipeline - decode
595 cmddatalong[4] = jtagarm7tdmi_instr_primitive(val-16, 0); // push 32-bit word on data bus
596 //cmddatalong[4] = jtagarm7tdmi_nop( 0); // push nop into pipeline - execute
598 cmddatalong[5] = jtagarm7tdmi_instr_primitive(val, 0); // push 32-bit word on data bus
599 cmddatalong[6] = jtagarm7tdmi_instr_primitive(val+16, 0); // push 32-bit word on data bus
600 //cmddatalong[6] = jtagarm7tdmi_nop( 0); // push nop into pipeline - executed
602 if (reg == ARM_REG_PC){
603 cmddatalong[7] = jtagarm7tdmi_nop( 0);
604 cmddatalong[8] = jtagarm7tdmi_nop( 0);
606 cmddatalong[9] = jtagarm7tdmi_nop( 0);
608 retval = cmddatalong[5];
612 //! Set a 32-bit Register value
613 unsigned long test_set_register(unsigned char reg, unsigned long val) {
614 unsigned long retval = 0, instr;
615 cmddatalong[1] = jtagarm7tdmi_nop( 0); // push nop into pipeline - clean out the pipeline...
617 instr = ARM_WRITE_REG | (reg<<12); // push LDR Rx, [R14] into pipeline
618 cmddatalong[2] = jtagarm7tdmi_instr_primitive(instr, 0);
620 cmddatalong[3] = jtagarm7tdmi_instr_primitive(val+32, 0); // push 32-bit word on data bus - execute state
621 cmddatalong[4] = jtagarm7tdmi_instr_primitive(val+16, 0); // push 32-bit word on data bus - execute state
622 cmddatalong[5] = jtagarm7tdmi_instr_primitive(val, 0); // push 32-bit word on data bus - execute state
623 cmddatalong[6] = jtagarm7tdmi_instr_primitive(val-16, 0); // push 32-bit word on data bus - execute state
625 if (reg == ARM_REG_PC){
626 cmddatalong[7] = jtagarm7tdmi_nop( 0);
627 cmddatalong[8] = jtagarm7tdmi_nop( 0);
629 cmddatalong[9] = jtagarm7tdmi_instr_primitive(val-32, 0); // push 32-bit word on data bus - execute state
631 retval = cmddatalong[5];
638 //! Get all registers. Return an array
639 unsigned long* jtagarm7tdmi_get_registers() {
640 cmddatalong[1] = jtagarm7tdmi_instr_primitive(ARM_INSTR_SKANKREGS,0);
641 cmddatalong[2] = jtagarm7tdmi_nop( 0);
642 cmddatalong[3] = jtagarm7tdmi_nop( 0);
643 cmddatalong[4] = jtagarm7tdmi_nop( 0);
644 cmddatalong[5] = jtagarm7tdmi_nop( 0);
645 cmddatalong[6] = jtagarm7tdmi_nop( 0);
646 cmddatalong[7] = jtagarm7tdmi_nop( 0);
647 cmddatalong[8] = jtagarm7tdmi_nop( 0);
648 cmddatalong[9] = jtagarm7tdmi_nop( 0);
649 cmddatalong[10] = jtagarm7tdmi_nop( 0);
650 cmddatalong[11] = jtagarm7tdmi_nop( 0);
651 cmddatalong[12] = jtagarm7tdmi_nop( 0);
652 cmddatalong[13] = jtagarm7tdmi_nop( 0);
653 cmddatalong[14] = jtagarm7tdmi_nop( 0);
654 cmddatalong[15] = jtagarm7tdmi_nop( 0);
655 cmddatalong[16] = jtagarm7tdmi_nop( 0);
656 cmddatalong[17] = jtagarm7tdmi_nop( 0);
657 cmddatalong[18] = jtagarm7tdmi_nop( 0);
658 cmddatalong[19] = jtagarm7tdmi_nop( 0);
659 cmddatalong[20] = jtagarm7tdmi_nop( 0);
663 //! Get all registers. Return an array
664 unsigned long* jtagarm7tdmi_set_registers() {
665 cmddatalong[1] = jtagarm7tdmi_instr_primitive(ARM_INSTR_SKANKREGS,0);
666 cmddatalong[2] = jtagarm7tdmi_nop( 0);
667 cmddatalong[3] = jtagarm7tdmi_nop( 0);
668 cmddatalong[4] = jtagarm7tdmi_instr_primitive(0x40,0);
669 cmddatalong[5] = jtagarm7tdmi_instr_primitive(0x41,0);
670 cmddatalong[6] = jtagarm7tdmi_instr_primitive(0x42,0);
671 cmddatalong[7] = jtagarm7tdmi_instr_primitive(0x43,0);
672 cmddatalong[8] = jtagarm7tdmi_instr_primitive(0x44,0);
673 cmddatalong[9] = jtagarm7tdmi_instr_primitive(0x45,0);
674 cmddatalong[10] = jtagarm7tdmi_instr_primitive(0x46,0);
675 cmddatalong[11] = jtagarm7tdmi_instr_primitive(0x47,0);
676 cmddatalong[12] = jtagarm7tdmi_instr_primitive(0x48,0);
677 cmddatalong[13] = jtagarm7tdmi_instr_primitive(0x49,0);
678 cmddatalong[14] = jtagarm7tdmi_instr_primitive(0x4a,0);
679 cmddatalong[15] = jtagarm7tdmi_instr_primitive(0x4b,0);
680 cmddatalong[16] = jtagarm7tdmi_instr_primitive(0x4c,0);
681 cmddatalong[17] = jtagarm7tdmi_instr_primitive(0x4d,0);
682 cmddatalong[18] = jtagarm7tdmi_instr_primitive(0x4e,0);
683 cmddatalong[19] = jtagarm7tdmi_instr_primitive(0x4f,0);
687 //! Retrieve the CPSR Register value
688 unsigned long jtagarm7tdmi_get_regCPSR() {
689 unsigned long retval = 0;
691 cmddatalong[1] = jtagarm7tdmi_nop( 0); // push nop into pipeline - clean out the pipeline...
692 cmddatalong[2] = jtagarm7tdmi_instr_primitive(ARM_INSTR_MRS_R0_CPSR, 0); // push MRS_R0, CPSR into pipeline
693 cmddatalong[3] = jtagarm7tdmi_nop( 0); // push nop into pipeline - fetched
694 cmddatalong[4] = jtagarm7tdmi_nop( 0); // push nop into pipeline - decoded
695 cmddatalong[5] = jtagarm7tdmi_nop( 0); // push nop into pipeline - executed
696 retval = jtagarm7tdmi_nop( 0); // recover 32-bit word
697 cmddatalong[6] = retval;
701 //! Retrieve the CPSR Register value
702 unsigned long jtagarm7tdmi_set_regCPSR(unsigned long val) {
703 unsigned long retval = 0;
705 cmddatalong[1] = jtagarm7tdmi_nop( 0); // push nop into pipeline - clean out the pipeline...
706 cmddatalong[1] = jtagarm7tdmi_instr_primitive(ARM_INSTR_MSR_cpsr_cxsf_R0, 0); // push MSR cpsr_cxsf, R0 into pipeline
707 cmddatalong[2] = jtagarm7tdmi_nop( 0); // push nop into pipeline - fetched
708 cmddatalong[3] = jtagarm7tdmi_nop( 0); // push nop into pipeline - decoded
710 retval = jtagarm7tdmi_instr_primitive(val, 0);// push 32-bit word on data bus
711 cmddatalong[5] = jtagarm7tdmi_nop( 0); // push nop into pipeline - executed
712 cmddatalong[4] = retval;
716 //! Write data to address - Assume TAP in run-test/idle state
717 unsigned long jtagarm7tdmi_writemem(unsigned long adr, unsigned long data){
718 unsigned long r0=0, r1=-1;
720 r0 = jtagarm7tdmi_get_register(0); // store R0 and R1
721 r1 = jtagarm7tdmi_get_register(1);
722 jtagarm7tdmi_set_register(0, adr); // write address into R0
723 jtagarm7tdmi_set_register(1, data); // write data in R1
724 jtagarm7tdmi_nop( 0); // push nop into pipeline to "clean" it ???
725 jtagarm7tdmi_nop( 1); // push nop into pipeline with BREAKPT set
726 jtagarm7tdmi_instr_primitive(ARM_INSTR_LDR_R1_r0_4, 0); // push LDR R1, R0, #4 into instruction pipeline
727 jtagarm7tdmi_nop( 0); // push nop into pipeline
728 jtagarm7tdmi_set_register(1, r1); // restore R0 and R1
729 jtagarm7tdmi_set_register(0, r0);
736 //! Read data from address
737 unsigned long jtagarm7tdmi_readmem(unsigned long adr){
738 unsigned long retval = 0;
739 unsigned long r0=0, r1=-1;
740 int waitcount = 0xfff;
742 r0 = jtagarm7tdmi_get_register(0); // store R0 and R1
743 r1 = jtagarm7tdmi_get_register(1);
744 jtagarm7tdmi_set_register(0, adr); // write address into R0
745 jtagarm7tdmi_nop( 0); // push nop into pipeline to "clean" it ???
746 jtagarm7tdmi_nop( 1); // push nop into pipeline with BREAKPT set
747 jtagarm7tdmi_instr_primitive(ARM_INSTR_LDR_R1_r0_4, 0); // push LDR R1, R0, #4 into instruction pipeline
748 jtagarm7tdmi_nop( 0); // push nop into pipeline
749 jtagarm7tdmi_restart(); // SHIFT_IR with RESTART instruction
751 // Poll the Debug Status Register for DBGACK and nMREQ to be HIGH
752 while ((jtagarm7tdmi_get_dbgstate() & 9) == 0 && waitcount > 0){
759 retval = jtagarm7tdmi_get_register(1); // read memory value from R1 register
760 jtagarm7tdmi_set_register(1, r1); // restore R0 and R1
761 jtagarm7tdmi_set_register(0, r0);
767 //! Read Program Counter
768 unsigned long jtagarm7tdmi_getpc(){
769 return jtagarm7tdmi_get_register(ARM_REG_PC);
772 //! Set Program Counter
773 unsigned long jtagarm7tdmi_setpc(unsigned long adr){
774 return jtagarm7tdmi_set_register(ARM_REG_PC, adr);
777 //! Halt CPU - returns 0xffff if the operation fails to complete within
778 unsigned long jtagarm7tdmi_haltcpu(){ // PROVEN
779 int waitcount = 0xfff;
781 // store watchpoint info? - not right now
782 eice_write(EICE_WP1ADDR, 0); // write 0 in watchpoint 1 address
783 eice_write(EICE_WP1ADDRMASK, 0xffffffff); // write 0xffffffff in watchpoint 1 address mask
784 eice_write(EICE_WP1DATA, 0); // write 0 in watchpoint 1 data
785 eice_write(EICE_WP1DATAMASK, 0xffffffff); // write 0xffffffff in watchpoint 1 data mask
786 eice_write(EICE_WP1CTRL, 0x100); //!!!!! WTF! THIS IS SUPPOSED TO BE 9 bits wide?!? // write 0x00000100 in watchpoint 1 control value register (enables watchpoint)
787 eice_write(EICE_WP1CTRLMASK, 0xfffffff7); //!!!!! WTF! THIS IS SUPPOSED TO BE 8 bits wide?!? // write 0xfffffff7 in watchpoint 1 control mask - only detect the fetch instruction
789 // poll until debug status says the cpu is in debug mode
790 while (!(jtagarm7tdmi_get_dbgstate() & 0x1) && waitcount-- > 0){
793 eice_write(EICE_WP1CTRL, 0x0); // write 0 in watchpoint 0 control value - disables watchpoint 0
795 // store the debug state
796 last_halt_debug_state = jtagarm7tdmi_get_dbgstate();
797 last_halt_pc = jtagarm7tdmi_getpc() - 4; // assume -4 for entering debug mode via watchpoint.
798 count_dbgspd_instr_since_debug = 0;
799 count_sysspd_instr_since_debug = 0;
801 // get into ARM mode if the T flag is set (Thumb mode)
802 while (jtagarm7tdmi_get_dbgstate() & JTAG_ARM7TDMI_DBG_TBIT && waitcount-- > 0) {
803 jtagarm7tdmi_setMode_ARM();
805 jtagarm7tdmi_resettap();
809 unsigned long jtagarm7tdmi_releasecpu(){
810 int waitcount = 0xfff;
812 // somehow determine what PC should be (a couple ways possible, calculations required)
813 jtagarm7tdmi_nop(0); // NOP
814 jtagarm7tdmi_nop(1); // NOP/BREAKPT
816 if (last_halt_debug_state & JTAG_ARM7TDMI_DBG_TBIT){ // FIXME: FORNICATED! BX requires register, thus more instrs... could we get away with the same instruction but +1 to offset?
817 instr = ARM_INSTR_B_PC + 0x1000001 - (count_dbgspd_instr_since_debug) - (count_sysspd_instr_since_debug*3); //FIXME: make this right - can't we just do an a7solute b/bx?
818 jtagarm7tdmi_instr_primitive(instr,0);
820 instr = ARM_INSTR_B_PC + 0x1000000 - (count_dbgspd_instr_since_debug*4) - (count_sysspd_instr_since_debug*12);
821 jtagarm7tdmi_instr_primitive(instr,0);
825 jtagarmtransn(ARM7TDMI_IR_RESTART,4,LSB,END,RETIDLE); // VERB_RESTART
827 // wait until restart-bit set in debug state register
828 while ((jtagarm7tdmi_get_dbgstate() & JTAG_ARM7TDMI_DBG_DBGACK) && waitcount > 0){
832 last_halt_debug_state = -1;
840 ///////////////////////////////////////////////////////////////////////////////////////////////////
841 //! Handles ARM7TDMI JTAG commands. Forwards others to JTAG.
842 void jtagarm7tdmihandle(unsigned char app, unsigned char verb, unsigned long len){
843 register char blocks;
845 unsigned int i,val,mlop;
848 jtagarm7tdmi_resettap();
853 cmddatalong[0] = jtagarm7tdmi_start();
854 cmddatalong[2] = jtagarm7tdmi_haltcpu();
855 //jtagarm7tdmi_resettap();
856 cmddatalong[1] = jtagarm7tdmi_get_dbgstate();
858 // DEBUG: FIXME: NOT PART OF OPERATIONAL CODE
859 //for (mlop=2;mlop<4;mlop++){
860 // jtagarm7tdmi_set_register(mlop, 0x43424140);
862 /////////////////////////////////////////////
863 txdata(app,verb,0xc);
865 case JTAGARM7TDMI_READMEM:
867 blocks=(len>4?cmddata[4]:1);
871 txhead(app,verb,len);
875 jtagarm7tdmi_resettap();
878 val=jtagarm7tdmi_readmem(at);
882 serial_tx((val&0xFF00)>>8);
887 case JTAGARM7TDMI_GET_CHIP_ID:
888 jtagarm7tdmi_resettap();
889 cmddatalong[0] = jtagarm7tdmi_idcode();
894 case JTAGARM7TDMI_WRITEMEM:
896 jtagarm7tdmi_resettap();
897 jtagarm7tdmi_writemem(cmddatalong[0],
899 cmddataword[0]=jtagarm7tdmi_readmem(cmddatalong[0]);
903 case JTAGARM7TDMI_HALTCPU:
904 cmddatalong[0] = jtagarm7tdmi_haltcpu();
907 case JTAGARM7TDMI_RELEASECPU:
908 jtagarm7tdmi_resettap();
909 cmddatalong[0] = jtagarm7tdmi_releasecpu();
912 //unimplemented functions
913 //case JTAGARM7TDMI_SETINSTRFETCH:
914 //case JTAGARM7TDMI_WRITEFLASH:
915 //case JTAGARM7TDMI_ERASEFLASH:
916 case JTAGARM7TDMI_SET_PC:
917 cmddatalong[0] = jtagarm7tdmi_setpc(cmddatalong[0]);
920 case JTAGARM7TDMI_GET_DEBUG_CTRL:
921 cmddatalong[0] = jtagarm7tdmi_get_dbgctrl();
924 case JTAGARM7TDMI_SET_DEBUG_CTRL:
925 cmddatalong[0] = jtagarm7tdmi_set_dbgctrl(cmddata[0]);
928 case JTAGARM7TDMI_GET_PC:
929 cmddatalong[0] = jtagarm7tdmi_getpc();
932 case JTAGARM7TDMI_GET_DEBUG_STATE:
933 //jtagarm7tdmi_resettap(); // Shouldn't need this, but currently do. FIXME!
934 cmddatalong[0] = jtagarm7tdmi_get_dbgstate();
937 //case JTAGARM7TDMI_GET_WATCHPOINT:
938 //case JTAGARM7TDMI_SET_WATCHPOINT:
939 case JTAGARM7TDMI_GET_REGISTER:
940 jtagarm7tdmi_resettap();
941 cmddatalong[0] = jtagarm7tdmi_get_register(cmddata[0]);
942 //cmddatalong[0] = test_get_register(cmddata[0]);
945 case JTAGARM7TDMI_SET_REGISTER: // FIXME: NOT AT ALL CORRECT, THIS IS TESTING CODE ONLY
946 jtagarm7tdmi_resettap();
947 cmddatalong[0] = cmddatalong[1];
948 jtagarm7tdmi_set_register(cmddata[0], cmddatalong[1]);
949 //test_set_register(cmddata[0], cmddatalong[1]);
952 case JTAGARM7TDMI_GET_REGISTERS:
953 jtagarm7tdmi_resettap();
954 jtagarm7tdmi_get_registers();
955 txdata(app,verb,200);
957 case JTAGARM7TDMI_SET_REGISTERS:
958 jtagarm7tdmi_resettap();
959 jtagarm7tdmi_set_registers();
960 txdata(app,verb,200);
962 case JTAGARM7TDMI_DEBUG_INSTR:
963 jtagarm7tdmi_resettap();
964 cmddataword[0] = jtagarm7tdmi_exec(cmddataword[0], cmddataword[1], cmddata[9]);
967 //case JTAGARM7TDMI_STEP_INSTR:
968 /* case JTAGARM7TDMI_READ_CODE_MEMORY:
969 case JTAGARM7TDMI_WRITE_FLASH_PAGE:
970 case JTAGARM7TDMI_READ_FLASH_PAGE:
971 case JTAGARM7TDMI_MASS_ERASE_FLASH:
972 case JTAGARM7TDMI_PROGRAM_FLASH:
973 case JTAGARM7TDMI_LOCKCHIP:
974 case JTAGARM7TDMI_CHIP_ERASE:
976 // Really ARM specific stuff
977 case JTAGARM7TDMI_GET_CPSR:
978 jtagarm7tdmi_resettap();
979 cmddatalong[0] = jtagarm7tdmi_get_regCPSR();
982 case JTAGARM7TDMI_SET_CPSR:
983 jtagarm7tdmi_resettap();
984 cmddatalong[0] = jtagarm7tdmi_set_regCPSR(cmddatalong[0]);
987 case JTAGARM7TDMI_GET_SPSR: // FIXME: NOT CORRECT
988 jtagarm7tdmi_resettap();
989 cmddatalong[0] = jtagarm7tdmi_get_regCPSR();
992 case JTAGARM7TDMI_SET_SPSR: // FIXME: NOT CORRECT
993 jtagarm7tdmi_resettap();
994 cmddatalong[0] = jtagarm7tdmi_set_regCPSR(cmddatalong[0]);
997 case JTAGARM7TDMI_SET_MODE_THUMB:
998 case JTAGARM7TDMI_SET_MODE_ARM:
999 jtagarm7tdmi_resettap();
1000 cmddataword[0] = jtagarm7tdmi_setMode_ARM();
1004 case 0xD0: // loopback test
1005 jtagarm7tdmi_resettap();
1006 cmddatalong[0] = jtagarm7tdmi_bypass(cmddatalong[0]);
1009 case 0xD8: // EICE_READ
1010 jtagarm7tdmi_resettap();
1011 cmddatalong[0] = eice_read(cmddatalong[0]);
1014 case 0xD9: // EICE_WRITE
1015 jtagarm7tdmi_resettap();
1016 cmddatalong[0] = eice_write(cmddatalong[0], cmddatalong[1]);
1019 case 0xDA: // TEST MSB THROUGH CHAIN0 and CHAIN1
1020 jtagarm7tdmi_resettap();
1021 jtagarm7tdmi_scan_intest(0);
1022 cmddatalong[0] = jtagarmtransn(0x41414141, 32, LSB, NOEND, NORETIDLE);
1023 cmddatalong[1] = jtagarmtransn(0x42424242, 32, MSB, NOEND, NORETIDLE);
1024 cmddatalong[2] = jtagarmtransn(0x43434343, 9, MSB, NOEND, NORETIDLE);
1025 cmddatalong[3] = jtagarmtransn(0x44444444, 32, MSB, NOEND, NORETIDLE);
1026 cmddatalong[4] = jtagarmtransn(cmddatalong[0], 32, LSB, NOEND, NORETIDLE);
1027 cmddatalong[5] = jtagarmtransn(cmddatalong[1], 32, MSB, NOEND, NORETIDLE);
1028 cmddatalong[6] = jtagarmtransn(cmddatalong[2], 9, MSB, NOEND, NORETIDLE);
1029 cmddatalong[7] = jtagarmtransn(cmddatalong[3], 32, MSB, END, RETIDLE);
1030 jtagarm7tdmi_resettap();
1031 jtagarm7tdmi_scan_intest(1);
1032 cmddatalong[8] = jtagarmtransn(0x41414141, 32, MSB, NOEND, NORETIDLE);
1033 cmddatalong[9] = jtagarmtransn(0x44444444, 1, MSB, NOEND, NORETIDLE);
1034 cmddatalong[10] = jtagarmtransn(cmddatalong[8], 32, MSB, NOEND, NORETIDLE);
1035 cmddatalong[11] = jtagarmtransn(cmddatalong[9], 1, MSB, END, RETIDLE);
1036 jtagarm7tdmi_resettap();
1037 txdata(app,verb,48);
1041 jtaghandle(app,verb,len);
1048 /*****************************
1049 Captured from FlySwatter against AT91SAM7S, to be used by me for testing. ignore
1052 System and User mode registers
1053 r0: 300000df r1: 00000000 r2: 58000000 r3: 00200a75
1054 r4: fffb0000 r5: 00000002 r6: 00000000 r7: 00200f6c
1055 r8: 00000000 r9: 00000000 r10: ffffffff r11: 00000000
1056 r12: 00000009 sp_usr: 00000000 lr_usr: 00000000 pc: 000000fc
1059 FIQ mode shadow registers
1060 r8_fiq: 00000000 r9_fiq: fffcc000 r10_fiq: fffff400 r11_fiq: fffff000
1061 r12_fiq: 00200f44 sp_fiq: 00000000 lr_fiq: 00000000 spsr_fiq: f00000fb
1063 Supervisor mode shadow registers
1064 sp_svc: 00201f78 lr_svc: 00200a75 spsr_svc: 400000b3
1066 Abort mode shadow registers
1067 sp_abt: 00000000 lr_abt: 00000000 spsr_abt: e00000ff
1069 IRQ mode shadow registers
1070 sp_irq: 00000000 lr_irq: 00000000 spsr_irq: f000003b
1072 Undefined instruction mode shadow registers
1073 sp_und: 00000000 lr_und: 00000000 spsr_und: 300000df
1076 target state: halted
1077 target halted in ARM state due to single-step, current mode: Supervisor
1078 cpsr: 0x00000093 pc: 0x00000100
1079 System and User mode registers
1080 r0: 300000df r1: 00000000 r2: 00200000 r3: 00200a75
1081 r4: fffb0000 r5: 00000002 r6: 00000000 r7: 00200f6c
1082 r8: 00000000 r9: 00000000 r10: ffffffff r11: 00000000
1083 r12: 00000009 sp_usr: 00000000 lr_usr: 00000000 pc: 00000100
1086 FIQ mode shadow registers
1087 r8_fiq: 00000000 r9_fiq: fffcc000 r10_fiq: fffff400 r11_fiq: fffff000
1088 r12_fiq: 00200f44 sp_fiq: 00000000 lr_fiq: 00000000 spsr_fiq: f00000fb
1090 Supervisor mode shadow registers
1091 sp_svc: 00201f78 lr_svc: 00200a75 spsr_svc: 400000b3
1093 Abort mode shadow registers
1094 sp_abt: 00000000 lr_abt: 00000000 spsr_abt: e00000ff
1096 IRQ mode shadow registers
1097 sp_irq: 00000000 lr_irq: 00000000 spsr_irq: f000003b
1099 Undefined instruction mode shadow registers
1100 sp_und: 00000000 lr_und: 00000000 spsr_und: 300000df
1103 target state: halted
1104 target halted in ARM state due to single-step, current mode: Abort
1105 cpsr: 0x00000097 pc: 0x00000010
1106 System and User mode registers
1107 r0: 300000e3 r1: 00000000 r2: 00200000 r3: 00200a75
1108 r4: fffb0000 r5: 00000002 r6: 00000000 r7: 00200f6c
1109 r8: 00000000 r9: 00000000 r10: ffffffff r11: 00000000
1110 r12: 00000009 sp_usr: 00000000 lr_usr: 00000000 pc: 00000010
1113 FIQ mode shadow registers
1114 r8_fiq: 00000000 r9_fiq: fffcc000 r10_fiq: fffff400 r11_fiq: fffff000
1115 r12_fiq: 00200f44 sp_fiq: 00000000 lr_fiq: 00000000 spsr_fiq: f00000fb
1117 Supervisor mode shadow registers
1118 sp_svc: 00201f78 lr_svc: 00200a75 spsr_svc: 400000b3
1120 Abort mode shadow registers
1121 sp_abt: 00000000 lr_abt: 00000108 spsr_abt: 00000093
1123 IRQ mode shadow registers
1124 sp_irq: 00000000 lr_irq: 00000000 spsr_irq: f000003b
1126 Undefined instruction mode shadow registers
1127 sp_und: 00000000 lr_und: 00000000 spsr_und: 300000df
1129 target state: halted
1130 target halted in ARM state due to single-step, current mode: Abort
1131 cpsr: 0x00000097 pc: 0x00000010
1132 System and User mode registers
1133 r0: 300000e3 r1: 00000000 r2: 00200000 r3: 00200a75
1134 r4: fffb0000 r5: 00000002 r6: 00000000 r7: 00200f6c
1135 r8: 00000000 r9: 00000000 r10: ffffffff r11: 00000000
1136 r12: 00000009 sp_usr: 00000000 lr_usr: 00000000 pc: 00000010
1139 FIQ mode shadow registers
1140 r8_fiq: 00000000 r9_fiq: fffcc000 r10_fiq: fffff400 r11_fiq: fffff000
1141 r12_fiq: 00200f44 sp_fiq: 00000000 lr_fiq: 00000000 spsr_fiq: f00000fb
1143 Supervisor mode shadow registers
1144 sp_svc: 00201f78 lr_svc: 00200a75 spsr_svc: 400000b3
1146 Abort mode shadow registers
1147 sp_abt: 00000000 lr_abt: 00000108 spsr_abt: 00000093
1149 IRQ mode shadow registers
1150 sp_irq: 00000000 lr_irq: 00000000 spsr_irq: f000003b
1152 Undefined instruction mode shadow registers
1153 sp_und: 00000000 lr_und: 00000000 spsr_und: 300000df
1155 target state: halted
1156 target halted in ARM state due to single-step, current mode: Abort
1157 cpsr: 0x00000097 pc: 0x00000010
1158 System and User mode registers
1159 r0: 300000e3 r1: 00000000 r2: 00200000 r3: 00200a75
1160 r4: fffb0000 r5: 00000002 r6: 00000000 r7: 00200f6c
1161 r8: 00000000 r9: 00000000 r10: ffffffff r11: 00000000
1162 r12: 00000009 sp_usr: 00000000 lr_usr: 00000000 pc: 00000010
1165 FIQ mode shadow registers
1166 r8_fiq: 00000000 r9_fiq: fffcc000 r10_fiq: fffff400 r11_fiq: fffff000
1167 r12_fiq: 00200f44 sp_fiq: 00000000 lr_fiq: 00000000 spsr_fiq: f00000fb
1169 Supervisor mode shadow registers
1170 sp_svc: 00201f78 lr_svc: 00200a75 spsr_svc: 400000b3
1172 Abort mode shadow registers
1173 sp_abt: 00000000 lr_abt: 00000108 spsr_abt: 00000093
1175 IRQ mode shadow registers
1176 sp_irq: 00000000 lr_irq: 00000000 spsr_irq: f000003b
1178 Undefined instruction mode shadow registers
1179 sp_und: 00000000 lr_und: 00000000 spsr_und: 300000df
1181 target state: halted
1182 target halted in ARM state due to single-step, current mode: Abort
1183 cpsr: 0x00000097 pc: 0x00000010
1184 System and User mode registers
1185 r0: 300000e3 r1: 00000000 r2: 00200000 r3: 00200a75
1186 r4: fffb0000 r5: 00000002 r6: 00000000 r7: 00200f6c
1187 r8: 00000000 r9: 00000000 r10: ffffffff r11: 00000000
1188 r12: 00000009 sp_usr: 00000000 lr_usr: 00000000 pc: 00000010
1191 FIQ mode shadow registers
1192 r8_fiq: 00000000 r9_fiq: fffcc000 r10_fiq: fffff400 r11_fiq: fffff000
1193 r12_fiq: 00200f44 sp_fiq: 00000000 lr_fiq: 00000000 spsr_fiq: f00000fb
1195 Supervisor mode shadow registers
1196 sp_svc: 00201f78 lr_svc: 00200a75 spsr_svc: 400000b3
1198 Abort mode shadow registers
1199 sp_abt: 00000000 lr_abt: 00000108 spsr_abt: 00000093
1201 IRQ mode shadow registers
1202 sp_irq: 00000000 lr_irq: 00000000 spsr_irq: f000003b
1204 Undefined instruction mode shadow registers
1205 sp_und: 00000000 lr_und: 00000000 spsr_und: 300000df
1207 target state: halted
1208 target halted in ARM state due to single-step, current mode: Abort
1209 cpsr: 0x00000097 pc: 0x00000010
1210 System and User mode registers
1211 r0: 300000e3 r1: 00000000 r2: 00200000 r3: 00200a75
1212 r4: fffb0000 r5: 00000002 r6: 00000000 r7: 00200f6c
1213 r8: 00000000 r9: 00000000 r10: ffffffff r11: 00000000
1214 r12: 00000009 sp_usr: 00000000 lr_usr: 00000000 pc: 00000010
1217 FIQ mode shadow registers
1218 r8_fiq: 00000000 r9_fiq: fffcc000 r10_fiq: fffff400 r11_fiq: fffff000
1219 r12_fiq: 00200f44 sp_fiq: 00000000 lr_fiq: 00000000 spsr_fiq: f00000fb
1221 Supervisor mode shadow registers
1222 sp_svc: 00201f78 lr_svc: 00200a75 spsr_svc: 400000b3
1224 Abort mode shadow registers
1225 sp_abt: 00000000 lr_abt: 00000108 spsr_abt: 00000093
1227 IRQ mode shadow registers
1228 sp_irq: 00000000 lr_irq: 00000000 spsr_irq: f000003b
1230 Undefined instruction mode shadow registers
1231 sp_und: 00000000 lr_und: 00000000 spsr_und: 300000df
1233 target state: halted
1234 target halted in ARM state due to single-step, current mode: Abort
1235 cpsr: 0x00000097 pc: 0x00000010
1236 System and User mode registers
1237 r0: 300000e3 r1: 00000000 r2: 00200000 r3: 00200a75
1238 r4: fffb0000 r5: 00000002 r6: 00000000 r7: 00200f6c
1239 r8: 00000000 r9: 00000000 r10: ffffffff r11: 00000000
1240 r12: 00000009 sp_usr: 00000000 lr_usr: 00000000 pc: 00000010
1243 FIQ mode shadow registers
1244 r8_fiq: 00000000 r9_fiq: fffcc000 r10_fiq: fffff400 r11_fiq: fffff000
1245 r12_fiq: 00200f44 sp_fiq: 00000000 lr_fiq: 00000000 spsr_fiq: f00000fb
1247 Supervisor mode shadow registers
1248 sp_svc: 00201f78 lr_svc: 00200a75 spsr_svc: 400000b3
1250 Abort mode shadow registers
1251 sp_abt: 00000000 lr_abt: 00000108 spsr_abt: 00000093
1253 IRQ mode shadow registers
1254 sp_irq: 00000000 lr_irq: 00000000 spsr_irq: f000003b
1256 Undefined instruction mode shadow registers
1257 sp_und: 00000000 lr_und: 00000000 spsr_und: 300000df
1259 target state: halted
1260 target halted in ARM state due to single-step, current mode: Abort
1261 cpsr: 0x00000097 pc: 0x00000010
1262 System and User mode registers
1263 r0: 300000e3 r1: 00000000 r2: 00200000 r3: 00200a75
1264 r4: fffb0000 r5: 00000002 r6: 00000000 r7: 00200f6c
1265 r8: 00000000 r9: 00000000 r10: ffffffff r11: 00000000
1266 r12: 00000009 sp_usr: 00000000 lr_usr: 00000000 pc: 00000010
1269 FIQ mode shadow registers
1270 r8_fiq: 00000000 r9_fiq: fffcc000 r10_fiq: fffff400 r11_fiq: fffff000
1271 r12_fiq: 00200f44 sp_fiq: 00000000 lr_fiq: 00000000 spsr_fiq: f00000fb
1273 Supervisor mode shadow registers
1274 sp_svc: 00201f78 lr_svc: 00200a75 spsr_svc: 400000b3
1276 Abort mode shadow registers
1277 sp_abt: 00000000 lr_abt: 00000108 spsr_abt: 00000093
1279 IRQ mode shadow registers
1280 sp_irq: 00000000 lr_irq: 00000000 spsr_irq: f000003b
1282 Undefined instruction mode shadow registers
1283 sp_und: 00000000 lr_und: 00000000 spsr_und: 300000df
1285 target state: halted
1286 target halted in ARM state due to single-step, current mode: Abort
1287 cpsr: 0x00000097 pc: 0x00000010
1288 System and User mode registers
1289 r0: 300000e3 r1: 00000000 r2: 00200000 r3: 00200a75
1290 r4: fffb0000 r5: 00000002 r6: 00000000 r7: 00200f6c
1291 r8: 00000000 r9: 00000000 r10: ffffffff r11: 00000000
1292 r12: 00000009 sp_usr: 00000000 lr_usr: 00000000 pc: 00000010
1295 FIQ mode shadow registers
1296 r8_fiq: 00000000 r9_fiq: fffcc000 r10_fiq: fffff400 r11_fiq: fffff000
1297 r12_fiq: 00200f44 sp_fiq: 00000000 lr_fiq: 00000000 spsr_fiq: f00000fb
1299 Supervisor mode shadow registers
1300 sp_svc: 00201f78 lr_svc: 00200a75 spsr_svc: 400000b3
1302 Abort mode shadow registers
1303 sp_abt: 00000000 lr_abt: 00000108 spsr_abt: 00000093
1305 IRQ mode shadow registers
1306 sp_irq: 00000000 lr_irq: 00000000 spsr_irq: f000003b
1308 Undefined instruction mode shadow registers
1309 sp_und: 00000000 lr_und: 00000000 spsr_und: 300000df
1311 target state: halted
1312 target halted in ARM state due to single-step, current mode: Abort
1313 cpsr: 0x00000097 pc: 0x00000010
1314 System and User mode registers
1315 r0: 300000e3 r1: 00000000 r2: 00200000 r3: 00200a75
1316 r4: fffb0000 r5: 00000002 r6: 00000000 r7: 00200f6c
1317 r8: 00000000 r9: 00000000 r10: ffffffff r11: 00000000
1318 r12: 00000009 sp_usr: 00000000 lr_usr: 00000000 pc: 00000010
1321 FIQ mode shadow registers
1322 r8_fiq: 00000000 r9_fiq: fffcc000 r10_fiq: fffff400 r11_fiq: fffff000
1323 r12_fiq: 00200f44 sp_fiq: 00000000 lr_fiq: 00000000 spsr_fiq: f00000fb
1325 Supervisor mode shadow registers
1326 sp_svc: 00201f78 lr_svc: 00200a75 spsr_svc: 400000b3
1328 Abort mode shadow registers
1329 sp_abt: 00000000 lr_abt: 00000108 spsr_abt: 00000093
1331 IRQ mode shadow registers
1332 sp_irq: 00000000 lr_irq: 00000000 spsr_irq: f000003b
1334 Undefined instruction mode shadow registers
1335 sp_und: 00000000 lr_und: 00000000 spsr_und: 300000df