ARM11: write_memory() avoids increment check

When writing to a chip's "reset yourself" register, the ARM11 code
was reporting a spurious failure.  Just don't bother checking for
correctly incremented pointers given single-unit writes ... it's
a bit faster that way too.  (Reads should likely do the same thing.
For that matter, such checks are usually just a waste...)

Shrink an overlong parameter name, and associated lines'o'code.

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
This commit is contained in:
David Brownell 2009-11-27 18:40:37 -08:00
parent 77aa7ca8d6
commit 4d2750e571
1 changed files with 19 additions and 9 deletions

View File

@ -989,13 +989,14 @@ static int arm11_read_memory(struct target *target, uint32_t address, uint32_t s
} }
/* /*
* arm11_config_memrw_no_increment - in the future we may want to be able * no_increment - in the future we may want to be able
* to read/write a range of data to a "port". a "port" is an action on * to read/write a range of data to a "port". a "port" is an action on
* read memory address for some peripheral. * read memory address for some peripheral.
*/ */
static int arm11_write_memory_inner(struct target *target, static int arm11_write_memory_inner(struct target *target,
uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer, uint32_t address, uint32_t size,
bool arm11_config_memrw_no_increment) uint32_t count, uint8_t *buffer,
bool no_increment)
{ {
int retval; int retval;
@ -1043,7 +1044,9 @@ static int arm11_write_memory_inner(struct target *target,
/* strb r1, [r0], #1 */ /* strb r1, [r0], #1 */
/* strb r1, [r0] */ /* strb r1, [r0] */
retval = arm11_run_instr_no_data1(arm11, retval = arm11_run_instr_no_data1(arm11,
!arm11_config_memrw_no_increment ? 0xe4c01001 : 0xe5c01000); !no_increment
? 0xe4c01001
: 0xe5c01000);
if (retval != ERROR_OK) if (retval != ERROR_OK)
return retval; return retval;
} }
@ -1068,7 +1071,9 @@ static int arm11_write_memory_inner(struct target *target,
/* strh r1, [r0], #2 */ /* strh r1, [r0], #2 */
/* strh r1, [r0] */ /* strh r1, [r0] */
retval = arm11_run_instr_no_data1(arm11, retval = arm11_run_instr_no_data1(arm11,
!arm11_config_memrw_no_increment ? 0xe0c010b2 : 0xe1c010b0); !no_increment
? 0xe0c010b2
: 0xe1c010b0);
if (retval != ERROR_OK) if (retval != ERROR_OK)
return retval; return retval;
} }
@ -1077,7 +1082,7 @@ static int arm11_write_memory_inner(struct target *target,
} }
case 4: { case 4: {
uint32_t instr = !arm11_config_memrw_no_increment ? 0xeca05e01 : 0xed805e00; uint32_t instr = !no_increment ? 0xeca05e01 : 0xed805e00;
/** \todo TODO: buffer cast to uint32_t* causes alignment warnings */ /** \todo TODO: buffer cast to uint32_t* causes alignment warnings */
uint32_t *words = (uint32_t*)buffer; uint32_t *words = (uint32_t*)buffer;
@ -1104,7 +1109,7 @@ static int arm11_write_memory_inner(struct target *target,
} }
/* r0 verification */ /* r0 verification */
if (!arm11_config_memrw_no_increment) if (!no_increment)
{ {
uint32_t r0; uint32_t r0;
@ -1132,9 +1137,14 @@ static int arm11_write_memory_inner(struct target *target,
} }
static int arm11_write_memory(struct target *target, static int arm11_write_memory(struct target *target,
uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer) uint32_t address, uint32_t size,
uint32_t count, uint8_t *buffer)
{ {
return arm11_write_memory_inner(target, address, size, count, buffer, false); /* pointer increment matters only for multi-unit writes ...
* not e.g. to a "reset the chip" controller.
*/
return arm11_write_memory_inner(target, address, size,
count, buffer, count == 1);
} }
/* write target memory in multiples of 4 byte, optimized for writing large quantities of data */ /* write target memory in multiples of 4 byte, optimized for writing large quantities of data */