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:
Spencer Oliver
2013-09-18 20:06:26 +01:00
parent 0c58b81b08
commit cfe9ca039f
6 changed files with 219 additions and 90 deletions

View File

@@ -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[] = {