hla: move memory read/write functionality to driver
Due to issues reported when using the jtag mode of the stlink (see Trac #61), the functionality/checking has been moved to the driver. This change also fixes unaligned 32bit memory read/write for the stlink. From testing this change also brings a 3KiB/s speed increase, this is due to the larger read/write packets. Change-Id: I8234110e7e49a683f4dadd54c442ecdc3c47b320 Signed-off-by: Spencer Oliver <spen@spen-soft.co.uk> Reviewed-on: http://openocd.zylin.com/1632 Tested-by: jenkins Reviewed-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
This commit is contained in:
@@ -758,41 +758,13 @@ static int adapter_read_memory(struct target *target, uint32_t address,
|
||||
uint8_t *buffer)
|
||||
{
|
||||
struct hl_interface_s *adapter = target_to_adapter(target);
|
||||
int res;
|
||||
uint32_t buffer_threshold = (adapter->param.max_buffer / 4);
|
||||
uint32_t addr_increment = 4;
|
||||
uint32_t c;
|
||||
|
||||
if (!count || !buffer)
|
||||
return ERROR_COMMAND_SYNTAX_ERROR;
|
||||
|
||||
LOG_DEBUG("%s 0x%08x %d %d", __func__, address, size, count);
|
||||
|
||||
/* prepare byte count, buffer threshold
|
||||
* and address increment for none 32bit access
|
||||
*/
|
||||
if (size != 4) {
|
||||
count *= size;
|
||||
buffer_threshold = (adapter->param.max_buffer / 4) / 2;
|
||||
addr_increment = 1;
|
||||
}
|
||||
|
||||
while (count) {
|
||||
if (count > buffer_threshold)
|
||||
c = buffer_threshold;
|
||||
else
|
||||
c = count;
|
||||
|
||||
res = adapter->layout->api->read_mem(adapter->fd, address, size, c, buffer);
|
||||
if (res != ERROR_OK)
|
||||
return res;
|
||||
|
||||
address += (c * addr_increment);
|
||||
buffer += (c * addr_increment);
|
||||
count -= c;
|
||||
}
|
||||
|
||||
return ERROR_OK;
|
||||
return adapter->layout->api->read_mem(adapter->fd, address, size, count, buffer);
|
||||
}
|
||||
|
||||
static int adapter_write_memory(struct target *target, uint32_t address,
|
||||
@@ -800,41 +772,13 @@ static int adapter_write_memory(struct target *target, uint32_t address,
|
||||
const uint8_t *buffer)
|
||||
{
|
||||
struct hl_interface_s *adapter = target_to_adapter(target);
|
||||
int res;
|
||||
uint32_t buffer_threshold = (adapter->param.max_buffer / 4);
|
||||
uint32_t addr_increment = 4;
|
||||
uint32_t c;
|
||||
|
||||
if (!count || !buffer)
|
||||
return ERROR_COMMAND_SYNTAX_ERROR;
|
||||
|
||||
LOG_DEBUG("%s 0x%08x %d %d", __func__, address, size, count);
|
||||
|
||||
/* prepare byte count, buffer threshold
|
||||
* and address increment for none 32bit access
|
||||
*/
|
||||
if (size != 4) {
|
||||
count *= size;
|
||||
buffer_threshold = (adapter->param.max_buffer / 4) / 2;
|
||||
addr_increment = 1;
|
||||
}
|
||||
|
||||
while (count) {
|
||||
if (count > buffer_threshold)
|
||||
c = buffer_threshold;
|
||||
else
|
||||
c = count;
|
||||
|
||||
res = adapter->layout->api->write_mem(adapter->fd, address, size, c, buffer);
|
||||
if (res != ERROR_OK)
|
||||
return res;
|
||||
|
||||
address += (c * addr_increment);
|
||||
buffer += (c * addr_increment);
|
||||
count -= c;
|
||||
}
|
||||
|
||||
return ERROR_OK;
|
||||
return adapter->layout->api->write_mem(adapter->fd, address, size, count, buffer);
|
||||
}
|
||||
|
||||
static const struct command_registration adapter_command_handlers[] = {
|
||||
|
||||
Reference in New Issue
Block a user