X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fjtag%2Fjtag.c;h=985cf8c2df6337040f1930da5749dd9544284cb4;hb=76ebc78358ef94dcf5d64c8738e6dd4bb1371b2c;hp=a4fd7553be231c047761fedb5f557425f1baa0c4;hpb=4c7891ecebbf28659f24a21e0156284c802ab6e7;p=openocd diff --git a/src/jtag/jtag.c b/src/jtag/jtag.c index a4fd7553..985cf8c2 100644 --- a/src/jtag/jtag.c +++ b/src/jtag/jtag.c @@ -33,9 +33,9 @@ #include "string.h" #include -#ifndef INTERFACE +#ifndef MINIDRIVER /* this allows JTAG devices to implement the entire jtag_xxx() layer in hw/sw */ -#define INTERFACE(a) a +#define MINIDRIVER(a) a #endif @@ -417,7 +417,7 @@ int jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state state) return retval; } -int INTERFACE(interface_jtag_add_ir_scan)(int num_fields, scan_field_t *fields, enum tap_state state) +int MINIDRIVER(interface_jtag_add_ir_scan)(int num_fields, scan_field_t *fields, enum tap_state state) { jtag_command_t **last_cmd; jtag_device_t *device; @@ -516,7 +516,7 @@ int jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, enum tap_state return interface_jtag_add_plain_ir_scan(num_fields, fields, state); } -int INTERFACE(interface_jtag_add_plain_ir_scan)(int num_fields, scan_field_t *fields, enum tap_state state) +int MINIDRIVER(interface_jtag_add_plain_ir_scan)(int num_fields, scan_field_t *fields, enum tap_state state) { int i; jtag_command_t **last_cmd; @@ -575,7 +575,7 @@ int jtag_add_dr_scan(int num_fields, scan_field_t *fields, enum tap_state state) return interface_jtag_add_dr_scan(num_fields, fields, state); } -int INTERFACE(interface_jtag_add_dr_scan)(int num_fields, scan_field_t *fields, enum tap_state state) +int MINIDRIVER(interface_jtag_add_dr_scan)(int num_fields, scan_field_t *fields, enum tap_state state) { int i, j; int bypass_devices = 0; @@ -681,7 +681,7 @@ int jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, enum tap_state return interface_jtag_add_plain_dr_scan(num_fields, fields, state); } -int INTERFACE(interface_jtag_add_plain_dr_scan)(int num_fields, scan_field_t *fields, enum tap_state state) +int MINIDRIVER(interface_jtag_add_plain_dr_scan)(int num_fields, scan_field_t *fields, enum tap_state state) { int i; jtag_command_t **last_cmd = jtag_get_last_command_p(); @@ -738,7 +738,7 @@ int jtag_add_statemove(enum tap_state state) return interface_jtag_add_statemove(state); } -int INTERFACE(interface_jtag_add_statemove)(enum tap_state state) +int MINIDRIVER(interface_jtag_add_statemove)(enum tap_state state) { jtag_command_t **last_cmd = jtag_get_last_command_p(); @@ -782,7 +782,7 @@ int jtag_add_pathmove(int num_states, enum tap_state *path) } -int INTERFACE(interface_jtag_add_pathmove)(int num_states, enum tap_state *path) +int MINIDRIVER(interface_jtag_add_pathmove)(int num_states, enum tap_state *path) { jtag_command_t **last_cmd = jtag_get_last_command_p(); int i; @@ -803,7 +803,7 @@ int INTERFACE(interface_jtag_add_pathmove)(int num_states, enum tap_state *path) return ERROR_OK; } -int INTERFACE(interface_jtag_add_runtest)(int num_cycles, enum tap_state state) +int MINIDRIVER(interface_jtag_add_runtest)(int num_cycles, enum tap_state state) { jtag_command_t **last_cmd = jtag_get_last_command_p(); @@ -884,6 +884,13 @@ int jtag_add_reset(int req_trst, int req_srst) jtag_trst = req_trst; jtag_srst = req_srst; + retval = interface_jtag_add_reset(req_trst, req_srst); + if (retval!=ERROR_OK) + { + jtag_error=retval; + return retval; + } + if (jtag_srst) { jtag_call_event_callbacks(JTAG_SRST_ASSERTED); @@ -898,44 +905,34 @@ int jtag_add_reset(int req_trst, int req_srst) if (trst_with_tms) { jtag_call_event_callbacks(JTAG_TRST_ASSERTED); - cmd_queue_cur_state = TAP_TLR; - cmd_queue_end_state = TAP_TLR; + jtag_add_end_state(TAP_TLR); + jtag_add_statemove(TAP_TLR); return ERROR_OK; } - else + + if (jtag_trst) { - if (jtag_trst) - { - /* we just asserted nTRST, so we're now in Test-Logic-Reset, - * and inform possible listeners about this - */ - cmd_queue_cur_state = TAP_TLR; - jtag_call_event_callbacks(JTAG_TRST_ASSERTED); - } - else - { - /* the nTRST line got deasserted, so we're still in Test-Logic-Reset, - * but we might want to add a delay to give the TAP time to settle - */ - if (jtag_ntrst_delay) - jtag_add_sleep(jtag_ntrst_delay * 1000); - } + /* we just asserted nTRST, so we're now in Test-Logic-Reset, + * and inform possible listeners about this + */ + cmd_queue_cur_state = TAP_TLR; + jtag_call_event_callbacks(JTAG_TRST_ASSERTED); } - retval = interface_jtag_add_reset(req_trst, req_srst); - if (retval!=ERROR_OK) - jtag_error=retval; - - if (trst_with_tms) + else { - jtag_add_statemove(TAP_TLR); + /* the nTRST line got deasserted, so we're still in Test-Logic-Reset, + * but we might want to add a delay to give the TAP time to settle + */ + if (jtag_ntrst_delay) + jtag_add_sleep(jtag_ntrst_delay * 1000); } return retval; } -int INTERFACE(interface_jtag_add_reset)(int req_trst, int req_srst) +int MINIDRIVER(interface_jtag_add_reset)(int req_trst, int req_srst) { jtag_command_t **last_cmd = jtag_get_last_command_p(); @@ -953,7 +950,7 @@ int INTERFACE(interface_jtag_add_reset)(int req_trst, int req_srst) return ERROR_OK; } -int INTERFACE(interface_jtag_add_end_state)(enum tap_state state) +int MINIDRIVER(interface_jtag_add_end_state)(enum tap_state state) { jtag_command_t **last_cmd = jtag_get_last_command_p(); @@ -977,7 +974,7 @@ int jtag_add_end_state(enum tap_state state) return retval; } -int INTERFACE(interface_jtag_add_sleep)(u32 us) +int MINIDRIVER(interface_jtag_add_sleep)(u32 us) { jtag_command_t **last_cmd = jtag_get_last_command_p(); @@ -1181,7 +1178,7 @@ enum scan_type jtag_scan_type(scan_command_t *cmd) return type; } -int INTERFACE(interface_jtag_execute_queue)(void) +int MINIDRIVER(interface_jtag_execute_queue)(void) { int retval; @@ -1901,6 +1898,43 @@ int handle_drscan_command(struct command_context_s *cmd_ctx, char *cmd, char **a return ERROR_OK; } + + +int MINIDRIVER(interface_jtag_add_shift)(const enum tap_state shift_state, const enum tap_state end_state, int num_bits, u32 value) +{ + u8 out_buf[4]; + buf_set_u32(out_buf, 0, 32, flip_u32(value, 32)); + + /* allocate memory for a new list member */ + jtag_command_t **last_cmd; + last_cmd = jtag_get_last_command_p(); + *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t)); + last_comand_pointer = &((*last_cmd)->next); + (*last_cmd)->next = NULL; + (*last_cmd)->type = JTAG_SCAN; + + /* allocate memory for scan command */ + (*last_cmd)->cmd.scan = cmd_queue_alloc(sizeof(scan_command_t)); + (*last_cmd)->cmd.scan->ir_scan = (shift_state==TAP_SI); + (*last_cmd)->cmd.scan->num_fields = 1; + (*last_cmd)->cmd.scan->fields = cmd_queue_alloc(1 * sizeof(scan_field_t)); + (*last_cmd)->cmd.scan->end_state = end_state; + + int num_bytes = CEIL(num_bits, 8); + int i=0; + (*last_cmd)->cmd.scan->fields[i].device = 0; /* not used by any drivers */ + (*last_cmd)->cmd.scan->fields[i].num_bits = num_bits; + (*last_cmd)->cmd.scan->fields[i].out_value = buf_cpy(out_buf, cmd_queue_alloc(num_bytes), num_bits); + (*last_cmd)->cmd.scan->fields[i].out_mask = NULL; + (*last_cmd)->cmd.scan->fields[i].in_value = NULL; + (*last_cmd)->cmd.scan->fields[i].in_check_value = NULL; + (*last_cmd)->cmd.scan->fields[i].in_check_mask = NULL; + (*last_cmd)->cmd.scan->fields[i].in_handler = NULL; + (*last_cmd)->cmd.scan->fields[i].in_handler_priv = NULL; + + return ERROR_OK; +} + int handle_verify_ircapture_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { if (argc == 1)