1 /***************************************************************************
2 * Copyright (C) 2008 by Spencer Oliver *
3 * spen@spen-soft.co.uk *
5 * Copyright (C) 2008 by David T.L. Wong *
7 * This program is free software; you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation; either version 2 of the License, or *
10 * (at your option) any later version. *
12 * This program is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
17 * You should have received a copy of the GNU General Public License *
18 * along with this program; if not, write to the *
19 * Free Software Foundation, Inc., *
20 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
21 ***************************************************************************/
27 #include "mips_ejtag.h"
29 #include "binarybuffer.h"
35 int mips_ejtag_set_instr(mips_ejtag_t
*ejtag_info
, int new_instr
, void *delete_me_and_submit_patch
)
39 tap
= ejtag_info
->tap
;
43 if (buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
) != (u32
)new_instr
)
49 field
.num_bits
= tap
->ir_length
;
51 buf_set_u32(field
.out_value
, 0, field
.num_bits
, new_instr
);
53 field
.in_value
= NULL
;
56 field
.in_handler
= NULL
;
58 jtag_add_ir_scan(1, &field
, TAP_INVALID
);
64 int mips_ejtag_get_idcode(mips_ejtag_t
*ejtag_info
, u32
*idcode
, in_handler_t handler
)
68 jtag_add_end_state(TAP_IDLE
);
70 mips_ejtag_set_instr(ejtag_info
, EJTAG_INST_IDCODE
, NULL
);
72 field
.tap
= ejtag_info
->tap
;
74 field
.out_value
= NULL
;
76 field
.in_value
= (void*)idcode
;
79 field
.in_handler
= NULL
;
81 jtag_add_dr_scan(1, &field
, TAP_INVALID
);
83 if (jtag_execute_queue() != ERROR_OK
)
85 LOG_ERROR("register read failed");
91 int mips_ejtag_get_impcode(mips_ejtag_t
*ejtag_info
, u32
*impcode
, in_handler_t handler
)
95 jtag_add_end_state(TAP_IDLE
);
97 mips_ejtag_set_instr(ejtag_info
, EJTAG_INST_IMPCODE
, NULL
);
99 field
.tap
= ejtag_info
->tap
;
101 field
.out_value
= NULL
;
103 field
.in_value
= (void*)impcode
;
106 field
.in_handler
= NULL
;
108 jtag_add_dr_scan(1, &field
, TAP_INVALID
);
110 if (jtag_execute_queue() != ERROR_OK
)
112 LOG_ERROR("register read failed");
118 int mips_ejtag_drscan_32(mips_ejtag_t
*ejtag_info
, u32
*data
)
121 tap
= ejtag_info
->tap
;
132 buf_set_u32(field
.out_value
, 0, field
.num_bits
, *data
);
134 field
.in_value
= (u8
*)data
;
137 field
.in_handler
= NULL
;
139 jtag_add_dr_scan(1, &field
, TAP_INVALID
);
141 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
143 LOG_ERROR("register read failed");
152 int mips_ejtag_step_enable(mips_ejtag_t
*ejtag_info
)
155 MIPS32_MTC0(1,31,0), /* move $1 to COP0 DeSave */
156 MIPS32_MFC0(1,23,0), /* move COP0 Debug to $1 */
157 MIPS32_ORI(1,1,0x0100), /* set SSt bit in debug reg */
158 MIPS32_MTC0(1,23,0), /* move $1 to COP0 Debug */
159 MIPS32_MFC0(1,31,0), /* move COP0 DeSave to $1 */
165 mips32_pracc_exec(ejtag_info
, sizeof(code
)/sizeof(code
[0]), code
, \
166 0, NULL
, 0, NULL
, 1);
170 int mips_ejtag_step_disable(mips_ejtag_t
*ejtag_info
)
173 MIPS32_MTC0(15,31,0), /* move $15 to COP0 DeSave */
174 MIPS32_LUI(15,UPPER16(MIPS32_PRACC_STACK
)), /* $15 = MIPS32_PRACC_STACK */
175 MIPS32_ORI(15,15,LOWER16(MIPS32_PRACC_STACK
)),
176 MIPS32_SW(1,0,15), /* sw $1,($15) */
177 MIPS32_SW(2,0,15), /* sw $2,($15) */
178 MIPS32_MFC0(1,23,0), /* move COP0 Debug to $1 */
179 MIPS32_LUI(2,0xFFFF), /* $2 = 0xfffffeff */
180 MIPS32_ORI(2,2,0xFEFF),
182 MIPS32_MTC0(1,23,0), /* move $1 to COP0 Debug */
185 MIPS32_MFC0(15,31,0), /* move COP0 DeSave to $15 */
191 mips32_pracc_exec(ejtag_info
, sizeof(code
)/sizeof(code
[0]), code
, \
192 0, NULL
, 0, NULL
, 1);
197 int mips_ejtag_config_step(mips_ejtag_t
*ejtag_info
, int enable_step
)
200 return mips_ejtag_step_enable(ejtag_info
);
201 return mips_ejtag_step_disable(ejtag_info
);
204 int mips_ejtag_enter_debug(mips_ejtag_t
*ejtag_info
)
207 jtag_add_end_state(TAP_IDLE
);
208 mips_ejtag_set_instr(ejtag_info
, EJTAG_INST_CONTROL
, NULL
);
210 /* set debug break bit */
211 ejtag_ctrl
= ejtag_info
->ejtag_ctrl
| EJTAG_CTRL_JTAGBRK
;
212 mips_ejtag_drscan_32(ejtag_info
, &ejtag_ctrl
);
214 /* break bit will be cleared by hardware */
215 ejtag_ctrl
= ejtag_info
->ejtag_ctrl
;
216 mips_ejtag_drscan_32(ejtag_info
, &ejtag_ctrl
);
217 LOG_DEBUG("ejtag_ctrl: 0x%8.8x", ejtag_ctrl
);
218 if((ejtag_ctrl
& EJTAG_CTRL_BRKST
) == 0)
219 LOG_DEBUG("Failed to enter Debug Mode!");
224 int mips_ejtag_exit_debug(mips_ejtag_t
*ejtag_info
, int enable_interrupts
)
229 /* TODO : enable/disable interrrupts */
231 /* execute our dret instruction */
232 mips32_pracc_exec(ejtag_info
, 1, &inst
, 0, NULL
, 0, NULL
, 0);
237 int mips_ejtag_read_debug(mips_ejtag_t
*ejtag_info
, u32
* debug_reg
)
241 MIPS32_MTC0(15,31,0), /* move $15 to COP0 DeSave */
242 MIPS32_LUI(15,UPPER16(MIPS32_PRACC_STACK
)), /* $15 = MIPS32_PRACC_STACK */
243 MIPS32_ORI(15,15,LOWER16(MIPS32_PRACC_STACK
)),
244 MIPS32_SW(1,0,15), /* sw $1,($15) */
245 MIPS32_SW(2,0,15), /* sw $2,($15) */
246 MIPS32_LUI(1,UPPER16(MIPS32_PRACC_PARAM_OUT
)), /* $1 = MIPS32_PRACC_PARAM_OUT */
247 MIPS32_ORI(1,1,LOWER16(MIPS32_PRACC_PARAM_OUT
)),
248 MIPS32_MFC0(2,23,0), /* move COP0 Debug to $2 */
252 MIPS32_MFC0(15,31,0), /* move COP0 DeSave to $15 */
258 mips32_pracc_exec(ejtag_info
, sizeof(code
)/sizeof(code
[0]), code
, \
259 0, NULL
, 1, debug_reg
, 1);
264 int mips_ejtag_init(mips_ejtag_t
*ejtag_info
)
268 mips_ejtag_get_impcode(ejtag_info
, &ejtag_info
->impcode
, NULL
);
269 LOG_DEBUG("impcode: 0x%8.8x", ejtag_info
->impcode
);
271 /* get ejtag version */
272 ejtag_version
= ((ejtag_info
->impcode
>> 29) & 0x07);
274 switch (ejtag_version
)
277 LOG_DEBUG("EJTAG: Version 1 or 2.0 Detected");
280 LOG_DEBUG("EJTAG: Version 2.5 Detected");
283 LOG_DEBUG("EJTAG: Version 2.6 Detected");
286 LOG_DEBUG("EJTAG: Version 3.1 Detected");
289 LOG_DEBUG("EJTAG: Unknown Version Detected");
292 LOG_DEBUG("EJTAG: features:%s%s%s%s%s%s%s",
293 ejtag_info
->impcode
& (1<<28) ? " R3k": " R4k",
294 ejtag_info
->impcode
& (1<<24) ? " DINT": "",
295 ejtag_info
->impcode
& (1<<22) ? " ASID_8": "",
296 ejtag_info
->impcode
& (1<<21) ? " ASID_6": "",
297 ejtag_info
->impcode
& (1<<16) ? " MIPS16": "",
298 ejtag_info
->impcode
& (1<<14) ? " noDMA": " DMA",
299 ejtag_info
->impcode
& (1<<0) ? " MIPS64": " MIPS32"
302 if((ejtag_info
->impcode
& (1<<14)) == 0)
303 LOG_DEBUG("EJTAG: DMA Access Mode Support Enabled");
305 /* set initial state for ejtag control reg */
306 ejtag_info
->ejtag_ctrl
= EJTAG_CTRL_ROCC
| EJTAG_CTRL_PRACC
| EJTAG_CTRL_PROBEN
| EJTAG_CTRL_SETDEV
;
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)