> -----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;

Attachment: 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

Reply via email to