summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2009-07-08 18:29:03 +0000
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2009-07-08 18:29:03 +0000
commit1ee66e0ce730aaaa8113599dc2df76be11bae26e (patch)
tree0325ff850f221f06c6d56aa664af7ac4150bb63f /src
parent13e6aa6e03c0759b37a705be5dd93e313d417043 (diff)
downloadopenocd_libswd-1ee66e0ce730aaaa8113599dc2df76be11bae26e.tar.gz
openocd_libswd-1ee66e0ce730aaaa8113599dc2df76be11bae26e.tar.bz2
openocd_libswd-1ee66e0ce730aaaa8113599dc2df76be11bae26e.tar.xz
openocd_libswd-1ee66e0ce730aaaa8113599dc2df76be11bae26e.zip
Fix SEGFAULTs and broken error handling for flash programming w/working area
git-svn-id: svn://svn.berlios.de/openocd/trunk@2499 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src')
-rw-r--r--src/flash/aduc702x.c46
1 files changed, 31 insertions, 15 deletions
diff --git a/src/flash/aduc702x.c b/src/flash/aduc702x.c
index 200ab4c7..a4007d07 100644
--- a/src/flash/aduc702x.c
+++ b/src/flash/aduc702x.c
@@ -193,6 +193,11 @@ static int aduc702x_protect(struct flash_bank_s *bank, int set, int first, int l
return ERROR_FLASH_OPERATION_FAILED;
}
+/* If this fn returns ERROR_TARGET_RESOURCE_NOT_AVAILABLE, then the caller can fall
+ * back to another mechanism that does not require onboard RAM
+ *
+ * Caller should not check for other return values specifically
+ */
static int aduc702x_write_block(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
{
aduc702x_flash_bank_t *aduc702x_info = bank->driver_priv;
@@ -204,6 +209,12 @@ static int aduc702x_write_block(struct flash_bank_s *bank, uint8_t *buffer, uint
armv4_5_algorithm_t armv4_5_info;
int retval = ERROR_OK;
+ if (((count%2)!=0)||((offset%2)!=0))
+ {
+ LOG_ERROR("write block must be multiple of two bytes in offset & length");
+ return ERROR_FAIL;
+ }
+
/* parameters:
r0 - address of source data (absolute)
@@ -249,8 +260,12 @@ static int aduc702x_write_block(struct flash_bank_s *bank, uint8_t *buffer, uint
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
};
- target_write_buffer(target, aduc702x_info->write_algorithm->address,
+ retval=target_write_buffer(target, aduc702x_info->write_algorithm->address,
sizeof(aduc702x_flash_write_code), (uint8_t*)aduc702x_flash_write_code);
+ if (retval!=ERROR_OK)
+ {
+ return retval;
+ }
/* memory buffer */
while (target_alloc_working_area(target, buffer_size, &source) != ERROR_OK)
@@ -279,12 +294,16 @@ static int aduc702x_write_block(struct flash_bank_s *bank, uint8_t *buffer, uint
while (count > 0)
{
- uint32_t thisrun_count = (count > (buffer_size / 2)) ? (buffer_size / 2) : count;
+ uint32_t thisrun_count = (count > buffer_size) ? buffer_size : count;
- target_write_buffer(target, source->address, thisrun_count * 2, buffer);
+ retval=target_write_buffer(target, source->address, thisrun_count, buffer);
+ if (retval!=ERROR_OK)
+ {
+ break;
+ }
buf_set_u32(reg_params[0].value, 0, 32, source->address);
- buf_set_u32(reg_params[1].value, 0, 32, thisrun_count);
+ buf_set_u32(reg_params[1].value, 0, 32, thisrun_count/2);
buf_set_u32(reg_params[2].value, 0, 32, address);
buf_set_u32(reg_params[4].value, 0, 32, 0xFFFFF800);
@@ -294,17 +313,19 @@ static int aduc702x_write_block(struct flash_bank_s *bank, uint8_t *buffer, uint
10000, &armv4_5_info)) != ERROR_OK)
{
LOG_ERROR("error executing aduc702x flash write algorithm");
- retval = ERROR_FLASH_OPERATION_FAILED;
break;
}
- if ((buf_get_u32(reg_params[3].value, 0, 32) & 1) != 1) {
- retval = ERROR_FLASH_OPERATION_FAILED;
+ if ((buf_get_u32(reg_params[3].value, 0, 32) & 1) != 1)
+ {
+ /* FIX!!!! what does this mean??? replace w/sensible error message */
+ LOG_ERROR("aduc702x detected error writing flash");
+ retval = ERROR_FAIL;
break;
}
- buffer += thisrun_count * 2;
- address += thisrun_count * 2;
+ buffer += thisrun_count;
+ address += thisrun_count;
count -= thisrun_count;
}
@@ -382,14 +403,9 @@ int aduc702x_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset,
return ERROR_FLASH_OPERATION_FAILED;
}
}
- else if (retval == ERROR_FLASH_OPERATION_FAILED)
- {
- LOG_ERROR("flash block writing failed");
- return ERROR_FLASH_OPERATION_FAILED;
- }
}
- return ERROR_OK;
+ return retval;
}
static int aduc702x_probe(struct flash_bank_s *bank)