diff options
author | Mathias K <kesmtp@freenet.de> | 2012-01-12 21:07:57 +0100 |
---|---|---|
committer | Spencer Oliver <spen@spen-soft.co.uk> | 2012-01-12 22:31:42 +0000 |
commit | c2ab3b4d5efba0201d88d899dc0fd310574ef5b9 (patch) | |
tree | be676ccdf0c8344539a50b2b9b9122aa0dfecf98 /src/target | |
parent | 37b575367be2702346c3188c686ac944a85c78e3 (diff) | |
download | riscv-openocd-c2ab3b4d5efba0201d88d899dc0fd310574ef5b9.zip riscv-openocd-c2ab3b4d5efba0201d88d899dc0fd310574ef5b9.tar.gz riscv-openocd-c2ab3b4d5efba0201d88d899dc0fd310574ef5b9.tar.bz2 |
stlink: add none 32bit memory read/write functions
This patch add none 32bit memory read/write functions.
Change-Id: Ie3a761cf006249b30d0691d1ea167d69a012c36a
Signed-off-by: Mathias K <kesmtp@freenet.de>
Reviewed-on: http://openocd.zylin.com/367
Tested-by: jenkins
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
Diffstat (limited to 'src/target')
-rw-r--r-- | src/target/stm32_stlink.c | 68 |
1 files changed, 49 insertions, 19 deletions
diff --git a/src/target/stm32_stlink.c b/src/target/stm32_stlink.c index fce9b7f..dec2b24 100644 --- a/src/target/stm32_stlink.c +++ b/src/target/stm32_stlink.c @@ -560,31 +560,46 @@ static int stm32_stlink_read_memory(struct target *target, uint32_t address, uint8_t *buffer) { int res; - uint32_t *dst = (uint32_t *) buffer; + uint32_t buffer_threshold = 128; + uint32_t addr_increment = 4; + uint8_t *dst = buffer; uint32_t c; struct stlink_interface_s *stlink_if = target_to_stlink(target); if (!count || !buffer) return ERROR_COMMAND_SYNTAX_ERROR; + + LOG_DEBUG("%s %x %d %d", __func__, address, size, count); + + /* prepare byte count, buffer threshold + * and address increment for none 32bit access + */ if (size != 4) { - LOG_DEBUG("%s %x %d %d", __func__, address, size, count); - return ERROR_COMMAND_SYNTAX_ERROR; + count *= size; + buffer_threshold = 64; + addr_increment = 1; } while (count) { - if (count > 128) - c = 128; + if (count > buffer_threshold) + c = buffer_threshold; else c = count; - res = - stlink_if->layout->api->read_mem32(stlink_if->fd, address, + if (size != 4) + res = + stlink_if->layout->api->read_mem8(stlink_if->fd, address, c, dst); + else + res = + stlink_if->layout->api->read_mem32(stlink_if->fd, address, + c, (uint32_t *)dst); if (res != ERROR_OK) return res; - dst += c; - address += (c * 4); + + address += (c * addr_increment); + dst += (c * addr_increment); count -= c; } @@ -596,31 +611,46 @@ static int stm32_stlink_write_memory(struct target *target, uint32_t address, const uint8_t *buffer) { int res; - uint32_t *dst = (uint32_t *) buffer; + uint32_t buffer_threshold = 128; + uint32_t addr_increment = 4; + const uint8_t *dst = buffer; uint32_t c; struct stlink_interface_s *stlink_if = target_to_stlink(target); if (!count || !buffer) return ERROR_COMMAND_SYNTAX_ERROR; + + LOG_DEBUG("%s %x %d %d", __func__, address, size, count); + + /* prepare byte count, buffer threshold + * and address increment for none 32bit access + */ if (size != 4) { - LOG_DEBUG("%s %x %d %d", __func__, address, size, count); - return ERROR_COMMAND_SYNTAX_ERROR; + count *= size; + buffer_threshold = 64; + addr_increment = 1; } while (count) { - if (count > 128) - c = 128; + if (count > buffer_threshold) + c = buffer_threshold; else c = count; - res = - stlink_if->layout->api->write_mem32(stlink_if->fd, address, - c, dst); + if (size != 4) + res = + stlink_if->layout->api->write_mem8(stlink_if->fd, address, + c, dst); + else + res = + stlink_if->layout->api->write_mem32(stlink_if->fd, address, + c, (uint32_t *)dst); if (res != ERROR_OK) return res; - dst += c; - address += (c * 4); + + address += (c * addr_increment); + dst += (c * addr_increment); count -= c; } |