X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fjtag%2Fjtag.c;h=e0b008baf0702680c399dc69c0b7423569d48053;hb=c3b9604658358f839b1cbfaec785b3ab53a79ae8;hp=74f00900c0a77899a0e4d63151c27b62246c58bd;hpb=7280d4a2c74f444e81d5a2df8b77a2f184f5e6d1;p=openocd diff --git a/src/jtag/jtag.c b/src/jtag/jtag.c index 74f00900..e0b008ba 100644 --- a/src/jtag/jtag.c +++ b/src/jtag/jtag.c @@ -193,6 +193,10 @@ static int hasKHz = 0; extern jtag_interface_t usbprog_interface; #endif +#if BUILD_JLINK == 1 + extern jtag_interface_t jlink_interface; +#endif + jtag_interface_t *jtag_interfaces[] = { #if BUILD_ECOSBOARD == 1 &eCosBoard_interface, @@ -226,6 +230,9 @@ jtag_interface_t *jtag_interfaces[] = { #endif #if BUILD_USBPROG == 1 &usbprog_interface, +#endif +#if BUILD_JLINK == 1 + &jlink_interface, #endif NULL, }; @@ -667,8 +674,8 @@ int MINIDRIVER(interface_jtag_add_dr_scan)(int num_fields, scan_field_t *fields, void MINIDRIVER(interface_jtag_add_dr_out)(int device_num, int num_fields, - int *num_bits, - u32 *value, + const int *num_bits, + const u32 *value, enum tap_state end_state) { int i; @@ -923,15 +930,15 @@ void jtag_add_reset(int req_tlr_or_trst, int req_srst) */ if ((jtag_reset_config & RESET_HAS_SRST)&& (jtag_reset_config & RESET_HAS_TRST)&& - ((jtag_reset_config & RESET_SRST_PULLS_TRST)==0)&& - ((jtag_reset_config & RESET_TRST_PULLS_SRST)==0)) + ((jtag_reset_config & RESET_SRST_PULLS_TRST)==0)) { if (((req_tlr_or_trst&&!jtag_trst)|| (!req_tlr_or_trst&&jtag_trst))&& ((req_srst&&!jtag_srst)|| (!req_srst&&jtag_srst))) { - LOG_ERROR("BUG: transition of req_tlr_or_trst and req_srst in the same jtag_add_reset() call is undefined"); + // FIX!!! srst_pulls_trst allows 1,1 => 0,0 transition.... + //LOG_ERROR("BUG: transition of req_tlr_or_trst and req_srst in the same jtag_add_reset() call is undefined"); } } @@ -1501,10 +1508,8 @@ int jtag_interface_init(struct command_context_s *cmd_ctx) if(hasKHz) { /*stay on "reset speed"*/ - if (jtag_interface->khz(speed1, &speed1) == ERROR_OK) - jtag_speed = speed1; - if (jtag_interface->khz(speed2, &speed2) == ERROR_OK) - jtag_speed_post_reset = speed2; + jtag_interface->khz(speed1, &jtag_speed); + jtag_interface->khz(speed2, &jtag_speed_post_reset); hasKHz = 0; } @@ -1523,7 +1528,7 @@ static int jtag_init_inner(struct command_context_s *cmd_ctx) jtag_device_t *device; int retval; - LOG_DEBUG("-"); + LOG_DEBUG("Init JTAG chain"); device = jtag_devices; jtag_ir_scan_size = 0; @@ -1536,7 +1541,7 @@ static int jtag_init_inner(struct command_context_s *cmd_ctx) } jtag_add_tlr(); - if ((retval=jtag_execute_queue())==ERROR_OK) + if ((retval=jtag_execute_queue())!=ERROR_OK) return retval; /* examine chain first, as this could discover the real chain layout */ @@ -1624,6 +1629,11 @@ static int default_khz(int khz, int *jtag_speed) return ERROR_FAIL; } +static int default_speed_div(int speed, int *khz) +{ + return ERROR_FAIL; +} + int handle_interface_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { int i; @@ -1654,6 +1664,10 @@ int handle_interface_command(struct command_context_s *cmd_ctx, char *cmd, char { jtag_interface->khz = default_khz; } + if (jtag_interface->speed_div == NULL) + { + jtag_interface->speed_div = default_speed_div; + } return ERROR_OK; } } @@ -1850,7 +1864,11 @@ int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cmd, char /* this command can be called during CONFIG, * in which case jtag isn't initialized */ if (jtag) + { + jtag->speed_div(jtag_speed, &speed1); + jtag->speed_div(jtag_speed_post_reset, &speed2); jtag->speed(cur_speed); + } } command_print(cmd_ctx, "jtag_speed: %d, %d", jtag_speed, jtag_speed_post_reset); @@ -1861,34 +1879,45 @@ int handle_jtag_khz_command(struct command_context_s *cmd_ctx, char *cmd, char * { LOG_DEBUG("handle jtag khz"); - if ((argc<1) || (argc>2)) + if (argc>2) return ERROR_COMMAND_SYNTAX_ERROR; - if (argc >= 1) - speed1 = speed2 = strtoul(args[0], NULL, 0); - if (argc == 2) - speed2 = strtoul(args[1], NULL, 0); - - if (jtag != NULL) + if(argc != 0) { - int cur_speed = 0; - LOG_DEBUG("have interface set up"); - int speed_div1, speed_div2; - if (jtag->khz(speed1, &speed_div1)!=ERROR_OK) - return ERROR_OK; - if (jtag->khz(speed2, &speed_div2)!=ERROR_OK) - return ERROR_OK; - + if (argc >= 1) - cur_speed = jtag_speed = jtag_speed_post_reset = speed_div1; + speed1 = speed2 = strtoul(args[0], NULL, 0); if (argc == 2) - cur_speed = jtag_speed_post_reset = speed_div2; - - jtag->speed(cur_speed); - } else - { - hasKHz = 1; + speed2 = strtoul(args[1], NULL, 0); + + if (jtag != NULL) + { + int cur_speed = 0; + LOG_DEBUG("have interface set up"); + int speed_div1, speed_div2; + if (jtag->khz(speed1, &speed_div1)!=ERROR_OK) + { + speed1 = speed2 = 0; + return ERROR_OK; + } + if (jtag->khz(speed2, &speed_div2)!=ERROR_OK) + { + speed1 = speed2 = 0; + return ERROR_OK; + } + + if (argc >= 1) + cur_speed = jtag_speed = jtag_speed_post_reset = speed_div1; + if (argc == 2) + cur_speed = jtag_speed_post_reset = speed_div2; + + jtag->speed(cur_speed); + } else + { + hasKHz = 1; + } } + command_print(cmd_ctx, "jtag_khz: %d, %d", speed1, speed2); return ERROR_OK; }