flash/nor/tcl: Respect flash bank boundary in write_bank
Respect the flash bank boundary and write only to the remaining part of the bank even if the file content is larger. Change-Id: I8f4c1b161c103a77bdb30c6bf052293b5ed48c41 Signed-off-by: Marc Schink <openocd-dev@marcschink.de> Reviewed-on: http://openocd.zylin.com/3861 Tested-by: jenkins Reviewed-by: Paul Fertser <fercerpav@gmail.com> Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
This commit is contained in:
parent
bdc71c5252
commit
7112e5f57a
|
@ -583,6 +583,7 @@ COMMAND_HANDLER(handle_flash_write_bank_command)
|
||||||
{
|
{
|
||||||
uint32_t offset;
|
uint32_t offset;
|
||||||
uint8_t *buffer;
|
uint8_t *buffer;
|
||||||
|
size_t length;
|
||||||
struct fileio *fileio;
|
struct fileio *fileio;
|
||||||
|
|
||||||
if (CMD_ARGC < 2 || CMD_ARGC > 3)
|
if (CMD_ARGC < 2 || CMD_ARGC > 3)
|
||||||
|
@ -617,20 +618,38 @@ COMMAND_HANDLER(handle_flash_write_bank_command)
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer = malloc(filesize);
|
length = MIN(filesize, p->size - offset);
|
||||||
|
|
||||||
|
if (!length) {
|
||||||
|
LOG_INFO("Nothing to write to flash bank");
|
||||||
|
fileio_close(fileio);
|
||||||
|
return ERROR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (length != filesize)
|
||||||
|
LOG_INFO("File content exceeds flash bank size. Only writing the "
|
||||||
|
"first %zu bytes of the file", length);
|
||||||
|
|
||||||
|
buffer = malloc(length);
|
||||||
if (buffer == NULL) {
|
if (buffer == NULL) {
|
||||||
fileio_close(fileio);
|
fileio_close(fileio);
|
||||||
LOG_ERROR("Out of memory");
|
LOG_ERROR("Out of memory");
|
||||||
return ERROR_FAIL;
|
return ERROR_FAIL;
|
||||||
}
|
}
|
||||||
size_t buf_cnt;
|
size_t buf_cnt;
|
||||||
if (fileio_read(fileio, filesize, buffer, &buf_cnt) != ERROR_OK) {
|
if (fileio_read(fileio, length, buffer, &buf_cnt) != ERROR_OK) {
|
||||||
free(buffer);
|
free(buffer);
|
||||||
fileio_close(fileio);
|
fileio_close(fileio);
|
||||||
return ERROR_FAIL;
|
return ERROR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
retval = flash_driver_write(p, buffer, offset, buf_cnt);
|
if (buf_cnt != length) {
|
||||||
|
LOG_ERROR("Short read");
|
||||||
|
free(buffer);
|
||||||
|
return ERROR_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = flash_driver_write(p, buffer, offset, length);
|
||||||
|
|
||||||
free(buffer);
|
free(buffer);
|
||||||
buffer = NULL;
|
buffer = NULL;
|
||||||
|
@ -638,8 +657,8 @@ COMMAND_HANDLER(handle_flash_write_bank_command)
|
||||||
if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) {
|
if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) {
|
||||||
command_print(CMD_CTX, "wrote %zu bytes from file %s to flash bank %u"
|
command_print(CMD_CTX, "wrote %zu bytes from file %s to flash bank %u"
|
||||||
" at offset 0x%8.8" PRIx32 " in %fs (%0.3f KiB/s)",
|
" at offset 0x%8.8" PRIx32 " in %fs (%0.3f KiB/s)",
|
||||||
filesize, CMD_ARGV[1], p->bank_number, offset,
|
length, CMD_ARGV[1], p->bank_number, offset,
|
||||||
duration_elapsed(&bench), duration_kbps(&bench, filesize));
|
duration_elapsed(&bench), duration_kbps(&bench, length));
|
||||||
}
|
}
|
||||||
|
|
||||||
fileio_close(fileio);
|
fileio_close(fileio);
|
||||||
|
|
Loading…
Reference in New Issue