A starting patch, propagate error for getting speed.

In the future it will fail when no jtag speed has been set
before someone queries the speed.

-- 
Øyvind Harboe

Can Zylin Consulting help on your project?

US toll free 1-866-980-3434 / International +47 51 63 25 00

http://www.zylin.com/zy1000.html
ARM7 ARM9 ARM11 XScale Cortex
JTAG debugger and flash programmer
From 2ec079aa47cb2689f4d6313f7301158a81f239b1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C3=98yvind=20Harboe?= <oyvind.har...@zylin.com>
Date: Mon, 6 Dec 2010 09:21:23 +0100
Subject: [PATCH] jtag: getting the JTAG speed can fail
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

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

_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to