Improved XScale performance for embedded hosted OpenOCD
git-svn-id: svn://svn.berlios.de/openocd/trunk@562 b42882b7-edfa-0310-969c-e2dbd0fdcd60
This commit is contained in:
parent
df9adb7b23
commit
a7d3a4a7f8
|
@ -624,6 +624,8 @@ int xscale_send(target_t *target, u8 *buffer, int count, int size)
|
||||||
{
|
{
|
||||||
armv4_5_common_t *armv4_5 = target->arch_info;
|
armv4_5_common_t *armv4_5 = target->arch_info;
|
||||||
xscale_common_t *xscale = armv4_5->arch_info;
|
xscale_common_t *xscale = armv4_5->arch_info;
|
||||||
|
u32 t[3];
|
||||||
|
int bits[3];
|
||||||
|
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
|
@ -678,47 +680,46 @@ int xscale_send(target_t *target, u8 *buffer, int count, int size)
|
||||||
|
|
||||||
if (size==4)
|
if (size==4)
|
||||||
{
|
{
|
||||||
|
bits[0]=3;
|
||||||
|
t[0]=0;
|
||||||
|
bits[1]=32;
|
||||||
|
t[2]=1;
|
||||||
|
bits[2]=1;
|
||||||
int endianness = target->endianness;
|
int endianness = target->endianness;
|
||||||
while (done_count++ < count)
|
while (done_count++ < count)
|
||||||
{
|
{
|
||||||
if (endianness == TARGET_LITTLE_ENDIAN)
|
|
||||||
{
|
|
||||||
output[0]=buffer[0];
|
|
||||||
output[1]=buffer[1];
|
|
||||||
output[2]=buffer[2];
|
|
||||||
output[3]=buffer[3];
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
output[0]=buffer[3];
|
|
||||||
output[1]=buffer[2];
|
|
||||||
output[2]=buffer[1];
|
|
||||||
output[3]=buffer[0];
|
|
||||||
}
|
|
||||||
jtag_add_dr_scan(3, fields, TAP_RTI);
|
|
||||||
buffer += size;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
while (done_count++ < count)
|
|
||||||
{
|
|
||||||
/* extract sized element from target-endian buffer, and put it
|
|
||||||
* into little-endian output buffer
|
|
||||||
*/
|
|
||||||
switch (size)
|
switch (size)
|
||||||
{
|
{
|
||||||
|
case 4:
|
||||||
|
if (endianness == TARGET_LITTLE_ENDIAN)
|
||||||
|
{
|
||||||
|
t[1]=le_to_h_u32(buffer);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
t[1]=be_to_h_u32(buffer);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
buf_set_u32(output, 0, 32, target_buffer_get_u16(target, buffer));
|
if (endianness == TARGET_LITTLE_ENDIAN)
|
||||||
|
{
|
||||||
|
t[1]=le_to_h_u16(buffer);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
t[1]=be_to_h_u16(buffer);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
output[0] = *buffer;
|
t[1]=buffer[0];
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
LOG_ERROR("BUG: size neither 4, 2 nor 1");
|
LOG_ERROR("BUG: size neither 4, 2 nor 1");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
jtag_add_dr_out(xscale->jtag_info.chain_pos,
|
||||||
jtag_add_dr_scan(3, fields, TAP_RTI);
|
3,
|
||||||
|
bits,
|
||||||
|
t,
|
||||||
|
TAP_RTI);
|
||||||
buffer += size;
|
buffer += size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue