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__archive__
parent
13e6aa6e03
commit
1ee66e0ce7
|
@ -193,6 +193,11 @@ static int aduc702x_protect(struct flash_bank_s *bank, int set, int first, int l
|
||||||
return ERROR_FLASH_OPERATION_FAILED;
|
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)
|
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;
|
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;
|
armv4_5_algorithm_t armv4_5_info;
|
||||||
int retval = ERROR_OK;
|
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:
|
/* parameters:
|
||||||
|
|
||||||
r0 - address of source data (absolute)
|
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;
|
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);
|
sizeof(aduc702x_flash_write_code), (uint8_t*)aduc702x_flash_write_code);
|
||||||
|
if (retval!=ERROR_OK)
|
||||||
|
{
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
/* memory buffer */
|
/* memory buffer */
|
||||||
while (target_alloc_working_area(target, buffer_size, &source) != ERROR_OK)
|
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)
|
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[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[2].value, 0, 32, address);
|
||||||
buf_set_u32(reg_params[4].value, 0, 32, 0xFFFFF800);
|
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)
|
10000, &armv4_5_info)) != ERROR_OK)
|
||||||
{
|
{
|
||||||
LOG_ERROR("error executing aduc702x flash write algorithm");
|
LOG_ERROR("error executing aduc702x flash write algorithm");
|
||||||
retval = ERROR_FLASH_OPERATION_FAILED;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((buf_get_u32(reg_params[3].value, 0, 32) & 1) != 1) {
|
if ((buf_get_u32(reg_params[3].value, 0, 32) & 1) != 1)
|
||||||
retval = ERROR_FLASH_OPERATION_FAILED;
|
{
|
||||||
|
/* FIX!!!! what does this mean??? replace w/sensible error message */
|
||||||
|
LOG_ERROR("aduc702x detected error writing flash");
|
||||||
|
retval = ERROR_FAIL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer += thisrun_count * 2;
|
buffer += thisrun_count;
|
||||||
address += thisrun_count * 2;
|
address += thisrun_count;
|
||||||
count -= 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;
|
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)
|
static int aduc702x_probe(struct flash_bank_s *bank)
|
||||||
|
|
Loading…
Reference in New Issue