1. NB! The svn version #'s listed in the git log do not match the svn
version #'s in the original repository. Going forward we should
stick to git for testing.

I assume you referred to the old svn version #'s in your testing?

2. I've tightened up the way working memory is
handled for the MMU enable/disable case. debug_level 3 messages
have been improved. Not a smoking gun though.

Using the attached patch against the the latest master branch and running with
debug_level 3, I believe you'll find that the MMU is enabled when you
try to program
the flash.

Now why 2645 would have MMU enabled at this point and 2646 wouldn't I don't
know...


Try running with this patch against master's head and post back the
debug_level 3
log...

While the attached patch tightens things up, I don't think we've
solved it just yet...



-- 
Øyvind Harboe
http://www.zylin.com/zy1000.html
ARM7 ARM9 ARM11 XScale Cortex
JTAG debugger and flash programmer
From a036bba97aa2a3b0628b0f4e8412c565311e75eb Mon Sep 17 00:00:00 2001
From: =?utf-8?q?=C3=98yvind=20Harboe?= <oyvind.har...@zylin.com>
Date: Mon, 2 Nov 2009 11:10:09 +0100
Subject: [PATCH] target: require working area for physical/virtual addresses to be specified
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit

Fixed bug: if virtual address for working memory was not specified
and MMU was enabled, then address 0 would be used.

Require working address to be specified for both MMU enabled
and disabled case.

Signed-off-by: Øyvind Harboe <oyvind.har...@zylin.com>
---
 src/target/target.c |   30 ++++++++++++++++++++++++------
 src/target/target.h |    8 +++++---
 2 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/src/target/target.c b/src/target/target.c
index 381e774..47bdbcc 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -938,13 +938,29 @@ int target_alloc_working_area(struct target_s *target, uint32_t size, working_ar
 		{
 			return retval;
 		}
+
 		if (enabled)
 		{
-			target->working_area = target->working_area_virt;
-		}
-		else
+			if (target->working_area_phys_spec)
+			{
+				LOG_DEBUG("MMU disabled, using physical address for working memory 0x%08x", (unsigned)target->working_area_phys);
+				target->working_area = target->working_area_phys;
+			} else
+			{
+				LOG_ERROR("No working memory available. Specify -work-area-phys to target.");
+				return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
+			}
+		} else
 		{
-			target->working_area = target->working_area_phys;
+			if (target->working_area_virt_spec)
+			{
+				LOG_DEBUG("MMU enabled, using virtual address for working memory 0x%08x", (unsigned)target->working_area_virt);
+				target->working_area = target->working_area_virt;
+			} else
+			{
+				LOG_ERROR("No working memory available. Specify -work-area-virt to target.");
+				return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
+			}
 		}
 	}
 
@@ -973,8 +989,6 @@ int target_alloc_working_area(struct target_s *target, uint32_t size, working_ar
 		uint32_t first_free = target->working_area;
 		uint32_t free_size = target->working_area_size;
 
-		LOG_DEBUG("allocating new working area");
-
 		c = target->working_areas;
 		while (c)
 		{
@@ -991,6 +1005,8 @@ int target_alloc_working_area(struct target_s *target, uint32_t size, working_ar
 			return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
 		}
 
+		LOG_DEBUG("allocated new working area at address 0x%08x", (unsigned)first_free);
+
 		new_wa = malloc(sizeof(working_area_t));
 		new_wa->next = NULL;
 		new_wa->size = size;
@@ -3597,6 +3613,7 @@ static int target_configure(Jim_GetOptInfo *goi, target_t *target)
 					return e;
 				}
 				target->working_area_virt = w;
+				target->working_area_virt_spec = true;
 			} else {
 				if (goi->argc != 0) {
 					goto no_params;
@@ -3614,6 +3631,7 @@ static int target_configure(Jim_GetOptInfo *goi, target_t *target)
 					return e;
 				}
 				target->working_area_phys = w;
+				target->working_area_phys_spec = true;
 			} else {
 				if (goi->argc != 0) {
 					goto no_params;
diff --git a/src/target/target.h b/src/target/target.h
index 9894aca..c9af56c 100644
--- a/src/target/target.h
+++ b/src/target/target.h
@@ -128,9 +128,11 @@ typedef struct target_s
 	int reset_halt;						/* attempt resetting the CPU into the halted mode? */
 	uint32_t working_area;					/* working area (initialized RAM). Evaluated
 										 * upon first allocation from virtual/physical address. */
-	uint32_t working_area_virt;				/* virtual address */
-	uint32_t working_area_phys;				/* physical address */
-	uint32_t working_area_size;				/* size in bytes */
+	bool working_area_virt_spec;		/* virtual address specified? */
+	uint32_t working_area_virt;			/* virtual address */
+	bool working_area_phys_spec;		/* virtual address specified? */
+	uint32_t working_area_phys;			/* physical address */
+	uint32_t working_area_size;			/* size in bytes */
 	uint32_t backup_working_area;			/* whether the content of the working area has to be preserved */
 	struct working_area_s *working_areas;/* list of allocated working areas */
 	enum target_debug_reason debug_reason;/* reason why the target entered debug state */
-- 
1.6.3.3

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

Reply via email to