int block_count_left = count;
uint32_t block_count_address = addr;
- uint8_t *block_count_buffer = (uint8_t *)buffer;
+ uint8_t *block_count_buffer = buffer;
while (block_count_left) {
block_count_buffer += size * MAX_BURST_SIZE;
}
+ /* The adv_debug_if always return words and half words in
+ * little-endian order no matter what the target endian is.
+ * So if the target endian is big, change the order.
+ */
+
+ struct target *target = jtag_info->target;
+ if ((target->endianness == TARGET_BIG_ENDIAN) && (size != 1)) {
+ switch (size) {
+ case 4:
+ buf_bswap32(buffer, buffer, size * count);
+ break;
+ case 2:
+ buf_bswap16(buffer, buffer, size * count);
+ break;
+ }
+ }
+
return ERROR_OK;
}
if (retval != ERROR_OK)
return retval;
+ /* The adv_debug_if wants words and half words in little-endian
+ * order no matter what the target endian is. So if the target
+ * endian is big, change the order.
+ */
+
+ void *t = NULL;
+ struct target *target = jtag_info->target;
+ if ((target->endianness == TARGET_BIG_ENDIAN) && (size != 1)) {
+ t = malloc(count * size * sizeof(uint8_t));
+ if (t == NULL) {
+ LOG_ERROR("Out of memory");
+ return ERROR_FAIL;
+ }
+
+ switch (size) {
+ case 4:
+ buf_bswap32(t, buffer, size * count);
+ break;
+ case 2:
+ buf_bswap16(t, buffer, size * count);
+ break;
+ }
+ buffer = t;
+ }
+
int block_count_left = count;
uint32_t block_count_address = addr;
uint8_t *block_count_buffer = (uint8_t *)buffer;
retval = adbg_wb_burst_write(jtag_info, block_count_buffer,
size, blocks_this_round,
block_count_address);
- if (retval != ERROR_OK)
+ if (retval != ERROR_OK) {
+ if (t != NULL)
+ free(t);
return retval;
+ }
block_count_left -= blocks_this_round;
block_count_address += size * MAX_BURST_SIZE;
block_count_buffer += size * MAX_BURST_SIZE;
}
+ if (t != NULL)
+ free(t);
+
return ERROR_OK;
}