X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Ftarget%2Fmips_ejtag.c;h=84ad5294b0655ab65e80573bd1c313a0a89a74d4;hp=984b5353bb70e7994557ad2b2d89685c430fee34;hb=2ea78551ab3388032ad78cdeefac7ab75e3bb134;hpb=edf52a6cc5314a1db34c110050090a539c8ab3ed diff --git a/src/target/mips_ejtag.c b/src/target/mips_ejtag.c index 984b5353bb..84ad5294b0 100644 --- a/src/target/mips_ejtag.c +++ b/src/target/mips_ejtag.c @@ -28,7 +28,7 @@ #include "mips32.h" #include "mips_ejtag.h" -int mips_ejtag_set_instr(struct mips_ejtag *ejtag_info, int new_instr, void *delete_me_and_submit_patch) +int mips_ejtag_set_instr(struct mips_ejtag *ejtag_info, int new_instr) { struct jtag_tap *tap; @@ -43,10 +43,10 @@ int mips_ejtag_set_instr(struct mips_ejtag *ejtag_info, int new_instr, void *del field.num_bits = tap->ir_length; field.out_value = t; - buf_set_u32(field.out_value, 0, field.num_bits, new_instr); + buf_set_u32(t, 0, field.num_bits, new_instr); field.in_value = NULL; - jtag_add_ir_scan(tap, &field, jtag_get_end_state()); + jtag_add_ir_scan(tap, &field, TAP_IDLE); } return ERROR_OK; @@ -56,15 +56,13 @@ int mips_ejtag_get_idcode(struct mips_ejtag *ejtag_info, uint32_t *idcode) { struct scan_field field; - jtag_set_end_state(TAP_IDLE); - - mips_ejtag_set_instr(ejtag_info, EJTAG_INST_IDCODE, NULL); + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_IDCODE); field.num_bits = 32; field.out_value = NULL; field.in_value = (void*)idcode; - jtag_add_dr_scan(ejtag_info->tap, 1, &field, jtag_get_end_state()); + jtag_add_dr_scan(ejtag_info->tap, 1, &field, TAP_IDLE); if (jtag_execute_queue() != ERROR_OK) { @@ -74,19 +72,17 @@ int mips_ejtag_get_idcode(struct mips_ejtag *ejtag_info, uint32_t *idcode) return ERROR_OK; } -int mips_ejtag_get_impcode(struct mips_ejtag *ejtag_info, uint32_t *impcode) +static int mips_ejtag_get_impcode(struct mips_ejtag *ejtag_info, uint32_t *impcode) { struct scan_field field; - jtag_set_end_state(TAP_IDLE); - - mips_ejtag_set_instr(ejtag_info, EJTAG_INST_IMPCODE, NULL); + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_IMPCODE); field.num_bits = 32; field.out_value = NULL; field.in_value = (void*)impcode; - jtag_add_dr_scan(ejtag_info->tap, 1, &field, jtag_get_end_state()); + jtag_add_dr_scan(ejtag_info->tap, 1, &field, TAP_IDLE); if (jtag_execute_queue() != ERROR_OK) { @@ -109,10 +105,10 @@ int mips_ejtag_drscan_32(struct mips_ejtag *ejtag_info, uint32_t *data) field.num_bits = 32; field.out_value = t; - buf_set_u32(field.out_value, 0, field.num_bits, *data); + buf_set_u32(t, 0, field.num_bits, *data); field.in_value = r; - jtag_add_dr_scan(tap, 1, &field, jtag_get_end_state()); + jtag_add_dr_scan(tap, 1, &field, TAP_IDLE); if ((retval = jtag_execute_queue()) != ERROR_OK) { @@ -127,7 +123,38 @@ int mips_ejtag_drscan_32(struct mips_ejtag *ejtag_info, uint32_t *data) return ERROR_OK; } -int mips_ejtag_step_enable(struct mips_ejtag *ejtag_info) +int mips_ejtag_drscan_8(struct mips_ejtag *ejtag_info, uint32_t *data) +{ + struct jtag_tap *tap; + tap = ejtag_info->tap; + + if (tap == NULL) + return ERROR_FAIL; + struct scan_field field; + uint8_t t[4] = {0, 0, 0, 0}, r[4]; + int retval; + + field.num_bits = 8; + field.out_value = t; + buf_set_u32(t, 0, field.num_bits, *data); + field.in_value = r; + + jtag_add_dr_scan(tap, 1, &field, TAP_IDLE); + + if ((retval = jtag_execute_queue()) != ERROR_OK) + { + LOG_ERROR("register read failed"); + return retval; + } + + *data = buf_get_u32(field.in_value, 0, 32); + + keep_alive(); + + return ERROR_OK; +} + +static int mips_ejtag_step_enable(struct mips_ejtag *ejtag_info) { static const uint32_t code[] = { MIPS32_MTC0(1,31,0), /* move $1 to COP0 DeSave */ @@ -143,7 +170,8 @@ int mips_ejtag_step_enable(struct mips_ejtag *ejtag_info) return ERROR_OK; } -int mips_ejtag_step_disable(struct mips_ejtag *ejtag_info) + +static int mips_ejtag_step_disable(struct mips_ejtag *ejtag_info) { static const uint32_t code[] = { MIPS32_MTC0(15,31,0), /* move $15 to COP0 DeSave */ @@ -178,8 +206,7 @@ int mips_ejtag_config_step(struct mips_ejtag *ejtag_info, int enable_step) int mips_ejtag_enter_debug(struct mips_ejtag *ejtag_info) { uint32_t ejtag_ctrl; - jtag_set_end_state(TAP_IDLE); - mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL, NULL); + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL); /* set debug break bit */ ejtag_ctrl = ejtag_info->ejtag_ctrl | EJTAG_CTRL_JTAGBRK; @@ -308,7 +335,7 @@ int mips_ejtag_fastdata_scan(struct mips_ejtag *ejtag_info, int write, uint32_t fields[1].in_value = (uint8_t *) data; } - jtag_add_dr_scan(tap, 2, fields, jtag_get_end_state()); + jtag_add_dr_scan(tap, 2, fields, TAP_IDLE); keep_alive(); return ERROR_OK;