> -----Original Message----- > From: openocd-development-boun...@lists.berlios.de [mailto:openocd- > development-boun...@lists.berlios.de] On Behalf Of Øyvind Harboe > Sent: Monday, December 06, 2010 10:30 PM > To: openocd-development@lists.berlios.de > Subject: [Openocd-development] [PATCH] jtag: getting the JTAG speed can > fail > > If the JTAG speed has not been set, then it has no defined value, add code to > propagate the error. > > Signed-off-by: Øyvind Harboe <oyvind.har...@zylin.com> > --- > src/jtag/core.c | 27 +++++++++++++++++---------- > src/jtag/drivers/amt_jtagaccel.c | 19 ++++++++++++------- > src/jtag/drivers/ft2232.c | 6 +++++- > src/jtag/drivers/gw16012.c | 6 +++++- > src/jtag/drivers/jlink.c | 6 +++++- > src/jtag/drivers/parport.c | 8 ++++++-- > src/jtag/drivers/presto.c | 6 +++++- > src/jtag/drivers/rlink.c | 6 +++++- > src/jtag/drivers/usb_blaster.c | 6 +++++- > src/jtag/jtag.h | 2 +- > src/jtag/zy1000/zy1000.c | 6 +++++- > 11 files changed, 71 insertions(+), 27 deletions(-) > > diff --git a/src/jtag/core.c b/src/jtag/core.c index c1b64bb..ceb89b9 100644 > --- a/src/jtag/core.c > +++ b/src/jtag/core.c > @@ -1384,9 +1384,13 @@ int adapter_init(struct command_context > *cmd_ctx) > > int requested_khz = jtag_get_speed_khz(); > int actual_khz = requested_khz; > - int retval = jtag_get_speed_readable(&actual_khz); > + int jtag_speed_t; > + int retval = jtag_get_speed(&jtag_speed_t); > + if (retval != ERROR_OK) > + return retval; > + retval = jtag_get_speed_readable(&actual_khz); > if (ERROR_OK != retval) > - LOG_INFO("adapter-specific clock speed value %d", > jtag_get_speed()); > + LOG_INFO("adapter-specific clock speed value %d", > jtag_speed_t); > else if (actual_khz) > { > /* Adaptive clocking -- JTAG-specific */ @@ -1632,30 > +1636,33 @@ int jtag_config_rclk(unsigned fallback_speed_khz) > return (ERROR_OK != retval) ? retval : jtag_set_speed(speed); } > > -int jtag_get_speed(void) > +int jtag_get_speed(int *speed) > { > - int speed = 0; /* avoid -O3 warning */ > switch(clock_mode) > { > case CLOCK_MODE_SPEED: > - speed = jtag_speed; > + *speed = jtag_speed; > break; > case CLOCK_MODE_KHZ: > - adapter_khz_to_speed(jtag_get_speed_khz(), > &speed); > + adapter_khz_to_speed(jtag_get_speed_khz(), > speed); > break; > case CLOCK_MODE_RCLK: > - jtag_rclk_to_speed(rclk_fallback_speed_khz, > &speed); > + jtag_rclk_to_speed(rclk_fallback_speed_khz, > speed); > break; > default: > LOG_ERROR("BUG: unknown jtag clock mode"); > - break; > + return ERROR_FAIL; > } > - return speed; > + return ERROR_OK; > } > > int jtag_get_speed_readable(int *khz) > { > - return jtag ? jtag->speed_div(jtag_get_speed(), khz) : ERROR_OK; > + int jtag_speed_t; > + int retval = jtag_get_speed(&jtag_speed_t); > + if (retval != ERROR_OK) > + return retval; > + return jtag ? jtag->speed_div(jtag_speed_t, khz) : ERROR_OK; > } > > void jtag_set_verify(bool enable) > diff --git a/src/jtag/drivers/amt_jtagaccel.c > b/src/jtag/drivers/amt_jtagaccel.c > index fca8cfe..6d77410 100644 > --- a/src/jtag/drivers/amt_jtagaccel.c > +++ b/src/jtag/drivers/amt_jtagaccel.c > @@ -191,7 +191,8 @@ static void amt_jtagaccel_state_move(void) > > aw_scan_tms_5 = 0x40 | (tms_scan[0] & 0x1f); > AMT_AW(aw_scan_tms_5); > - int jtag_speed = jtag_get_speed(); > + int retval = jtag_get_speed(&jtag_speed); > + assert(retval == ERROR_OK); > if (jtag_speed > 3 || rtck_enabled) > amt_wait_scan_busy(); > > @@ -249,7 +250,9 @@ static void amt_jtagaccel_scan(bool ir_scan, enum > scan_type type, uint8_t *buffe > uint8_t dr_tdo; > uint8_t aw_tms_scan; > uint8_t tms_scan[2]; > - int jtag_speed = jtag_get_speed(); > + int jtag_speed_t; > + int retval = jtag_get_speed(&jtag_speed_t); > + assert(retval == ERROR_OK); > > if (ir_scan) > amt_jtagaccel_end_state(TAP_IRSHIFT); > @@ -267,7 +270,7 @@ static void amt_jtagaccel_scan(bool ir_scan, enum > scan_type type, uint8_t *buffe > > dw_tdi_scan = buf_get_u32(buffer, bit_count, (scan_size - 1) > % 8) & 0xff; > AMT_DW(dw_tdi_scan); > - if (jtag_speed > 3 || rtck_enabled) > + if (jtag_speed_t > 3 || rtck_enabled) > amt_wait_scan_busy(); > > if ((type == SCAN_IN) || (type == SCAN_IO)) @@ -285,7 > +288,7 @@ static void amt_jtagaccel_scan(bool ir_scan, enum scan_type > type, uint8_t *buffe > { > dw_tdi_scan = buf_get_u32(buffer, bit_count, 8) & 0xff; > AMT_DW(dw_tdi_scan); > - if (jtag_speed > 3 || rtck_enabled) > + if (jtag_speed_t > 3 || rtck_enabled) > amt_wait_scan_busy(); > > if ((type == SCAN_IN) || (type == SCAN_IO)) @@ -302,7 > +305,7 @@ static void amt_jtagaccel_scan(bool ir_scan, enum scan_type > type, uint8_t *buffe > tms_scan[1] = > amt_jtagaccel_tap_move[tap_move_ndx(tap_get_state())][tap_move_ndx > (tap_get_end_state())][1]; > aw_tms_scan = 0x40 | (tms_scan[0] & 0x1f) | (buf_get_u32(buffer, > bit_count, 1) << 5); > AMT_AW(aw_tms_scan); > - if (jtag_speed > 3 || rtck_enabled) > + if (jtag_speed_t > 3 || rtck_enabled) > amt_wait_scan_busy(); > > if ((type == SCAN_IN) || (type == SCAN_IO)) @@ -316,7 +319,7 @@ > static void amt_jtagaccel_scan(bool ir_scan, enum scan_type type, uint8_t > *buffe > { > aw_tms_scan = 0x40 | (tms_scan[1] & 0x1f); > AMT_AW(aw_tms_scan); > - if (jtag_speed > 3 || rtck_enabled) > + if (jtag_speed_t > 3 || rtck_enabled) > amt_wait_scan_busy(); > } > tap_set_state(tap_get_end_state()); > @@ -502,7 +505,9 @@ static int amt_jtagaccel_init(void) > aw_control_fsm |= 0x04; > AMT_AW(aw_control_fsm); > > - amt_jtagaccel_speed(jtag_get_speed()); > + int jtag_speed_t; > + int retval = jtag_get_speed(&jtag_speed_t); > + amt_jtagaccel_speed(jtag_speed_t); > > enum reset_types jtag_reset_config = jtag_get_reset_config(); > if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) diff --git > a/src/jtag/drivers/ft2232.c b/src/jtag/drivers/ft2232.c index > 928ec1c..73bf8ad 100644 > --- a/src/jtag/drivers/ft2232.c > +++ b/src/jtag/drivers/ft2232.c > @@ -2395,7 +2395,11 @@ static int ft2232_init(void) > return ERROR_JTAG_INIT_FAILED; > } > > - ft2232_speed(jtag_get_speed()); > + int jtag_speed_t; > + int retval = jtag_get_speed(&jtag_speed_t); > + if (retval != ERROR_OK) > + return retval; > + ft2232_speed(jtag_speed_t); > > buf[0] = 0x85; /* Disconnect TDI/DO to TDO/DI for Loopback */ > if ((retval = ft2232_write(buf, 1, &bytes_written)) != ERROR_OK) diff > --git a/src/jtag/drivers/gw16012.c b/src/jtag/drivers/gw16012.c index > cb29d33..fe3d62e 100644 > --- a/src/jtag/drivers/gw16012.c > +++ b/src/jtag/drivers/gw16012.c > @@ -529,7 +529,11 @@ static int gw16012_init(void) > gw16012_input(&status_port); > gw16012_msb = (status_port & 0x80) ^ 0x80; > > - gw16012_speed(jtag_get_speed()); > + int jtag_speed_t; > + int retval = jtag_get_speed(&jtag_speed_t); > + if (retval != ERROR_OK) > + return retval; > + gw16012_speed(jtag_speed_t); > gw16012_reset(0, 0); > > return ERROR_OK; > diff --git a/src/jtag/drivers/jlink.c b/src/jtag/drivers/jlink.c index > ff389e9..fd56532 100644 > --- a/src/jtag/drivers/jlink.c > +++ b/src/jtag/drivers/jlink.c > @@ -321,7 +321,11 @@ static int jlink_init(void) > jlink_reset(0, 0); > jtag_sleep(3000); > jlink_tap_init(); > - jlink_speed(jtag_get_speed()); > + int jtag_speed_t; > + int retval = jtag_get_speed(&jtag_speed_t); > + if (retval != ERROR_OK) > + return retval; > + jlink_speed(jtag_speed_t); > > /* v5/6 jlink seems to have an issue if the first tap move > * is not divisible by 8, so we send a TLR on first power up */ diff > --git > a/src/jtag/drivers/parport.c b/src/jtag/drivers/parport.c index > 2323ec5..3402bc2 100644 > --- a/src/jtag/drivers/parport.c > +++ b/src/jtag/drivers/parport.c > @@ -384,7 +384,9 @@ static int parport_init(void) > > bitbang_interface = &parport_bitbang; > > - wait_states = jtag_get_speed(); > + int retval = jtag_get_speed(&wait_states); > + if (retval != ERROR_OK) > + return retval; > > return ERROR_OK; > } > @@ -475,7 +477,9 @@ > COMMAND_HANDLER(parport_handle_parport_toggling_time_command) > } > > parport_toggling_time_ns = ns; > - wait_states = jtag_get_speed(); > + int retval = jtag_get_speed(&wait_states); > + if (retval != ERROR_OK) > + return retval; > } > > command_print(CMD_CTX, "parport toggling time = %" PRIu32 " ns", > diff --git a/src/jtag/drivers/presto.c b/src/jtag/drivers/presto.c index > 10bed27..5984daa 100644 > --- a/src/jtag/drivers/presto.c > +++ b/src/jtag/drivers/presto.c > @@ -770,7 +770,11 @@ static int presto_jtag_init(void) > LOG_INFO("PRESTO open, serial number '%s'", presto->serial); > > /* use JTAG speed setting from configuration file */ > - presto_jtag_speed(jtag_get_speed()); > + int jtag_speed_t; > + int retval = jtag_get_speed(&jtag_speed_t); > + if (retval != ERROR_OK) > + return retval; > + presto_jtag_speed(jtag_speed_t); > > bitq_interface = &presto_bitq; > return ERROR_OK; > diff --git a/src/jtag/drivers/rlink.c b/src/jtag/drivers/rlink.c index > dde117b..fc504c3 100644 > --- a/src/jtag/drivers/rlink.c > +++ b/src/jtag/drivers/rlink.c > @@ -1771,7 +1771,11 @@ int rlink_init(void) > > tap_state_queue_init(); > dtc_queue_init(); > - rlink_speed(jtag_get_speed()); > + int jtag_speed_t; > + int retval = jtag_get_speed(&jtag_speed_t); > + if (retval != ERROR_OK) > + return retval; > + rlink_speed(jtag_speed_t); > rlink_reset(0, 0); > > return ERROR_OK; > diff --git a/src/jtag/drivers/usb_blaster.c b/src/jtag/drivers/usb_blaster.c > index 1679040..6cd7703 100644 > --- a/src/jtag/drivers/usb_blaster.c > +++ b/src/jtag/drivers/usb_blaster.c > @@ -442,7 +442,11 @@ static int usb_blaster_init(void) > > bitbang_interface = &usb_blaster_bitbang; > > - usb_blaster_speed(jtag_get_speed()); > + int jtag_speed_t; > + int retval = jtag_get_speed(&jtag_speed_t); > + if (retval != ERROR_OK) > + return retval; > + usb_blaster_speed(jtag_speed_t); > > #if 0 > #if BUILD_USB_BLASTER_FTD2XX == 1 > diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h index d6e49e0..db7cd5c 100644 > --- a/src/jtag/jtag.h > +++ b/src/jtag/jtag.h > @@ -239,7 +239,7 @@ int jtag_call_event_callbacks(enum jtag_event > event); > > > /// @returns The current JTAG speed setting. > -int jtag_get_speed(void); > +int jtag_get_speed(int *speed); > > /** > * Given a @a speed setting, use the interface @c speed_div callback to diff > - > -git a/src/jtag/zy1000/zy1000.c b/src/jtag/zy1000/zy1000.c index > c8bee2f..4e267fc 100644 > --- a/src/jtag/zy1000/zy1000.c > +++ b/src/jtag/zy1000/zy1000.c > @@ -1620,7 +1620,11 @@ int zy1000_init(void) > > /* deassert resets. Important to avoid infinite loop waiting for SRST > to deassert */ > zy1000_reset(0, 0); > - zy1000_speed(jtag_get_speed()); > + int jtag_speed_t; > + int retval = jtag_get_speed(&jtag_speed_t); > + if (retval != ERROR_OK) > + return retval; > + zy1000_speed(jtag_speed_t); > > > #if BUILD_ECOSBOARD > -- > 1.7.0.4 >
Would't the following less invasive patch achieve the same goal? Signed-off-by: Jonas Hörberg <jhorb...@sauer-danfoss.com> --- src/jtag/core.c | 12 ++++++++---- 1 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/jtag/core.c b/src/jtag/core.c index c1b64bb..d864ab3 100644 --- a/src/jtag/core.c +++ b/src/jtag/core.c @@ -124,7 +124,7 @@ static struct jtag_event_callback *jtag_event_callbacks; static int speed_khz = 0; /* speed to fallback to when RCLK is requested but not supported */ static int rclk_fallback_speed_khz = 0; -static enum {CLOCK_MODE_SPEED, CLOCK_MODE_KHZ, CLOCK_MODE_RCLK} clock_mode; +static enum {CLOCK_MODE_UNSELECTED, CLOCK_MODE_KHZ, CLOCK_MODE_RCLK} clock_mode; static int jtag_speed = 0; static struct jtag_interface *jtag = NULL; @@ -1362,6 +1362,13 @@ int adapter_init(struct command_context *cmd_ctx) return ERROR_JTAG_INVALID_INTERFACE; } + if (CLOCK_MODE_UNSELECTED == clock_mode) + { + LOG_ERROR("An adapter speed is not selected in the init script." + " Insert a call to adapter_speed or jtag_rclk to proceed."); + return ERROR_JTAG_INIT_FAILED; + } + jtag = jtag_interface; if (jtag_interface->init() != ERROR_OK) { @@ -1637,9 +1644,6 @@ int jtag_get_speed(void) int speed = 0; /* avoid -O3 warning */ switch(clock_mode) { - case CLOCK_MODE_SPEED: - speed = jtag_speed; - break; case CLOCK_MODE_KHZ: adapter_khz_to_speed(jtag_get_speed_khz(), &speed); break;
fail_for_unselected_adapter_speed.patch
Description: fail_for_unselected_adapter_speed.patch
_______________________________________________ Openocd-development mailing list Openocd-development@lists.berlios.de https://lists.berlios.de/mailman/listinfo/openocd-development