static avr32_get_mem(target_t *target, u32 addr, u32 *data)
{
jtag_tap_t *tap = target->tap;
int retval;
jtag_add_end_state(TAP_IDLE);
jtag_set_instr(tap, INST_MEM_WORD_ACCESS);
scan_field_t field1;
field1.tap = tap;
field1.num_bits = 35;
u8 *data1 = calloc(CEIL(field1.num_bits, 8), 1);
buf_set_u32(data1, 0, 4, SYSTEM_BUS_CACHED);
buf_set_u32(data1, 4, 30, addr >> 2);
buf_set_u32(data1, 34, 1, READ_ACCESS);
field1.out_value = data1;
field1.out_mask = NULL;
field1.in_value = NULL;
field1.in_check_value = NULL;
field1.in_check_mask = NULL;
field1.in_handler = NULL;
field1.in_handler_priv = NULL;
jtag_add_dr_scan(1, &field1, -1);
scan_field_t field2;
field2.tap = tap;
field2.num_bits = 35;
u8 *data2 = calloc(CEIL(field2.num_bits, 8), 1);
field2.out_value = NULL;
field2.out_mask = NULL;
field2.in_value = data2;
field2.in_check_value = NULL;
field2.in_check_mask = NULL;
field2.in_handler = NULL;
field2.in_handler_priv = NULL;
jtag_add_dr_scan(1, &field2, -1);
retval = jtag_execute_queue();
if (retval == ERROR_OK) {
*data = buf_get_u32(data2, 0, 32);
LOG_DEBUG("avr32: %08x: %08x", addr, *data);
} else {
LOG_ERROR("avr32: could not read %08x", addr);
}
free(data1);
free(data2);
return retval;
}
Your trouble is coming from the passage on IDLE state.
Here is the solution for 2x dr_scan with DRCAPTURE but without passing
on IDLE :
Set end_state to TAP_DRPAUSE before jtag_add_dr_scan(1, &field1, -1);
After jtag_add_dr_scan(1, &field1, -1) STATE will be DRPAUSE.
Add a jtag_add_state to DRPAUSE -> this will do a path as:
'DRPAUSE->DREXIT2->DRUPDATE->DRSELECT->DRCAPTURE->DREXIT1->DRPAUSE'
Then add your jtag_add_dr_scan(1, &field2, -1);
and jtag_execute_queue()
This should do what you need.
Best regards,
Laurent
http://www.amontec.com
Amontec JTAGkey and Amontec JTAGkey2
Making JTAG a real snap !
_______________________________________________
Openocd-development mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development