X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Ftarget%2Farm_adi_v5.c;h=fb30989a397d2a257f81e5fe8d97392d4c949e25;hp=e905699376b07cfc6e2e428c4c147c1d0705f5aa;hb=7c7fed0283e5c6e434de94af443218ef78175e87;hpb=e86dee32004d750e8654fe449bfcdffaed7339fa diff --git a/src/target/arm_adi_v5.c b/src/target/arm_adi_v5.c index e905699376..fb30989a39 100644 --- a/src/target/arm_adi_v5.c +++ b/src/target/arm_adi_v5.c @@ -45,6 +45,7 @@ #include "log.h" #include "time_support.h" #include +#include /* * Transaction Mode: @@ -76,23 +77,23 @@ int adi_jtag_dp_scan(arm_jtag_t *jtag_info, u8 instr, u8 reg_addr, u8 RnW, u8 *o fields[0].num_bits = 3; buf_set_u32(&out_addr_buf, 0, 3, ((reg_addr >> 1) & 0x6) | (RnW & 0x1)); fields[0].out_value = &out_addr_buf; - + fields[0].in_value = ack; + + - - fields[0].in_handler = NULL; - + fields[1].tap = jtag_info->tap; fields[1].num_bits = 32; fields[1].out_value = outvalue; - + fields[1].in_value = invalue; - fields[1].in_handler = NULL; - - + + + jtag_add_dr_scan(2, fields, TAP_INVALID); return ERROR_OK; @@ -112,33 +113,29 @@ int adi_jtag_dp_scan_u32(arm_jtag_t *jtag_info, u8 instr, u8 reg_addr, u8 RnW, u fields[0].num_bits = 3; buf_set_u32(&out_addr_buf, 0, 3, ((reg_addr >> 1) & 0x6) | (RnW & 0x1)); fields[0].out_value = &out_addr_buf; - fields[0].in_value = ack; - - fields[0].in_handler = NULL; - + fields[1].tap = jtag_info->tap; fields[1].num_bits = 32; buf_set_u32(out_value_buf, 0, 32, outvalue); fields[1].out_value = out_value_buf; - fields[1].in_value = NULL; + + if (invalue) { - fields[1].in_handler = arm_jtag_buf_to_u32; /* deprecated! invoke this from user code! */ - fields[1].in_handler_priv = invalue; - } - else + u8 tmp[4]; + fields[1].in_value = tmp; + jtag_add_dr_scan_now(2, fields, TAP_INVALID); + + *invalue=le_to_h_u32(tmp); + } else { - fields[1].in_handler = NULL; - - } - - - jtag_add_dr_scan(2, fields, TAP_INVALID); + jtag_add_dr_scan(2, fields, TAP_INVALID); + } return ERROR_OK; } @@ -295,7 +292,7 @@ int dap_dp_read_reg(swjdp_common_t *swjdp, u32 *value, u8 reg_addr) { return scan_inout_check_u32(swjdp, SWJDP_IR_DPACC, reg_addr, DPAP_READ, 0, value); } - + int dap_ap_select(swjdp_common_t *swjdp,u8 apsel) { u32 select; @@ -448,7 +445,6 @@ int mem_ap_write_atomic_u32(swjdp_common_t *swjdp, u32 address, u32 value) *****************************************************************************/ int mem_ap_write_buf_u32(swjdp_common_t *swjdp, u8 *buffer, int count, u32 address) { - u32 outvalue; int wcount, blocksize, writecount, errorcount = 0, retval = ERROR_OK; u32 adr = address; u8* pBuffer = buffer; @@ -464,7 +460,8 @@ int mem_ap_write_buf_u32(swjdp_common_t *swjdp, u8 *buffer, int count, u32 addre for (writecount = 0; writecount < count; writecount++) { int i; - outvalue = *((u32*)pBuffer); + u32 outvalue; + memcpy(&outvalue, pBuffer, sizeof(u32)); for (i = 0; i < 4; i++ ) { @@ -472,7 +469,7 @@ int mem_ap_write_buf_u32(swjdp_common_t *swjdp, u8 *buffer, int count, u32 addre outvalue >>= 8; adr++; } - pBuffer += 4; + pBuffer += sizeof(u32); } } @@ -517,7 +514,6 @@ int mem_ap_write_buf_u32(swjdp_common_t *swjdp, u8 *buffer, int count, u32 addre int mem_ap_write_buf_packed_u16(swjdp_common_t *swjdp, u8 *buffer, int count, u32 address) { - u32 outvalue; int retval = ERROR_OK; int wcount, blocksize, writecount, i; @@ -558,7 +554,8 @@ int mem_ap_write_buf_packed_u16(swjdp_common_t *swjdp, u8 *buffer, int count, u3 } else { - outvalue = *((u32*)buffer); + u32 outvalue; + memcpy(&outvalue, buffer, sizeof(u32)); for (i = 0; i < nbytes; i++ ) { @@ -567,7 +564,7 @@ int mem_ap_write_buf_packed_u16(swjdp_common_t *swjdp, u8 *buffer, int count, u3 address++; } - outvalue = *((u32*)buffer); + memcpy(&outvalue, buffer, sizeof(u32)); dap_ap_write_reg_u32(swjdp, AP_REG_DRW, outvalue); if (swjdp_transaction_endcheck(swjdp) != ERROR_OK) { @@ -588,7 +585,6 @@ int mem_ap_write_buf_packed_u16(swjdp_common_t *swjdp, u8 *buffer, int count, u3 int mem_ap_write_buf_u16(swjdp_common_t *swjdp, u8 *buffer, int count, u32 address) { - u32 outvalue; int retval = ERROR_OK; if (count >= 4) @@ -599,7 +595,9 @@ int mem_ap_write_buf_u16(swjdp_common_t *swjdp, u8 *buffer, int count, u32 addre while (count > 0) { dap_setup_accessport(swjdp, CSW_16BIT | CSW_ADDRINC_SINGLE, address); - outvalue = *((u16*)buffer) << 8 * (address & 0x3); + u16 svalue; + memcpy(&svalue, buffer, sizeof(u16)); + u32 outvalue = (u32)svalue << 8 * (address & 0x3); dap_ap_write_reg_u32(swjdp, AP_REG_DRW, outvalue ); retval = swjdp_transaction_endcheck(swjdp); count -= 2; @@ -612,7 +610,6 @@ int mem_ap_write_buf_u16(swjdp_common_t *swjdp, u8 *buffer, int count, u32 addre int mem_ap_write_buf_packed_u8(swjdp_common_t *swjdp, u8 *buffer, int count, u32 address) { - u32 outvalue; int retval = ERROR_OK; int wcount, blocksize, writecount, i; @@ -649,7 +646,8 @@ int mem_ap_write_buf_packed_u8(swjdp_common_t *swjdp, u8 *buffer, int count, u32 } else { - outvalue = *((u32*)buffer); + u32 outvalue; + memcpy(&outvalue, buffer, sizeof(u32)); for (i = 0; i < nbytes; i++ ) { @@ -658,7 +656,7 @@ int mem_ap_write_buf_packed_u8(swjdp_common_t *swjdp, u8 *buffer, int count, u32 address++; } - outvalue = *((u32*)buffer); + memcpy(&outvalue, buffer, sizeof(u32)); dap_ap_write_reg_u32(swjdp, AP_REG_DRW, outvalue); if (swjdp_transaction_endcheck(swjdp) != ERROR_OK) { @@ -679,7 +677,6 @@ int mem_ap_write_buf_packed_u8(swjdp_common_t *swjdp, u8 *buffer, int count, u32 int mem_ap_write_buf_u8(swjdp_common_t *swjdp, u8 *buffer, int count, u32 address) { - u32 outvalue; int retval = ERROR_OK; if (count >= 4) @@ -690,7 +687,7 @@ int mem_ap_write_buf_u8(swjdp_common_t *swjdp, u8 *buffer, int count, u32 addres while (count > 0) { dap_setup_accessport(swjdp, CSW_8BIT | CSW_ADDRINC_SINGLE, address); - outvalue = *((u8*)buffer) << 8 * (address & 0x3); + u32 outvalue = (u32)*buffer << 8 * (address & 0x3); dap_ap_write_reg_u32(swjdp, AP_REG_DRW, outvalue ); retval = swjdp_transaction_endcheck(swjdp); count--; @@ -766,7 +763,8 @@ int mem_ap_read_buf_u32(swjdp_common_t *swjdp, u8 *buffer, int count, u32 addres for (readcount = 0; readcount < count; readcount++) { int i; - u32 data = *((u32*)pBuffer); + u32 data; + memcpy(&data, pBuffer, sizeof(u32)); for (i = 0; i < 4; i++ ) { @@ -858,7 +856,8 @@ int mem_ap_read_buf_u16(swjdp_common_t *swjdp, u8 *buffer, int count, u32 addres } else { - *((u16*)buffer) = (invalue >> 8 * (address & 0x3)); + u16 svalue = (invalue >> 8 * (address & 0x3)); + memcpy(buffer, &svalue, sizeof(u16)); address += 2; buffer += 2; } @@ -868,6 +867,12 @@ int mem_ap_read_buf_u16(swjdp_common_t *swjdp, u8 *buffer, int count, u32 addres return retval; } +/* FIX!!! is this a potential performance bottleneck w.r.t. requiring too many + * roundtrips when jtag_execute_queue() has a large overhead(e.g. for USB)s? + * + * The solution is to arrange for a large out/in scan in this loop and + * and convert data afterwards. + */ int mem_ap_read_buf_packed_u8(swjdp_common_t *swjdp, u8 *buffer, int count, u32 address) { u32 invalue; @@ -1009,7 +1014,7 @@ int dap_info_command(struct command_context_s *cmd_ctx, swjdp_common_t *swjdp, i u32 dbgbase,apid; int romtable_present = 0; - u8 mem_ap; + u8 mem_ap; u32 apselold; apselold = swjdp->apsel; @@ -1025,23 +1030,23 @@ int dap_info_command(struct command_context_s *cmd_ctx, swjdp_common_t *swjdp, i switch (apid&0x0F) { case 0: - command_print(cmd_ctx, "\tType is jtag-ap"); + command_print(cmd_ctx, "\tType is jtag-ap"); break; case 1: - command_print(cmd_ctx, "\tType is mem-ap AHB"); + command_print(cmd_ctx, "\tType is mem-ap AHB"); break; case 2: - command_print(cmd_ctx, "\tType is mem-ap APB"); + command_print(cmd_ctx, "\tType is mem-ap APB"); break; default: - command_print(cmd_ctx, "\tUnknown AP-type"); + command_print(cmd_ctx, "\tUnknown AP-type"); break; } command_print(cmd_ctx, "ap debugbase 0x%8.8x", dbgbase); } else { - command_print(cmd_ctx, "No AP found at this apsel 0x%x", apsel); + command_print(cmd_ctx, "No AP found at this apsel 0x%x", apsel); } romtable_present = ((mem_ap)&&(dbgbase != 0xFFFFFFFF)); @@ -1059,11 +1064,11 @@ int dap_info_command(struct command_context_s *cmd_ctx, swjdp_common_t *swjdp, i command_print(cmd_ctx, "\tROM table in legacy format" ); } /* Now we read ROM table ID registers, ref. ARM IHI 0029B sec */ - mem_ap_read_u32(swjdp, (dbgbase&0xFFFFF000)|0xFF0, &cid0); - mem_ap_read_u32(swjdp, (dbgbase&0xFFFFF000)|0xFF4, &cid1); - mem_ap_read_u32(swjdp, (dbgbase&0xFFFFF000)|0xFF8, &cid2); - mem_ap_read_u32(swjdp, (dbgbase&0xFFFFF000)|0xFFC, &cid3); - mem_ap_read_u32(swjdp, (dbgbase&0xFFFFF000)|0xFCC, &memtype); + mem_ap_read_u32(swjdp, (dbgbase&0xFFFFF000)|0xFF0, &cid0); + mem_ap_read_u32(swjdp, (dbgbase&0xFFFFF000)|0xFF4, &cid1); + mem_ap_read_u32(swjdp, (dbgbase&0xFFFFF000)|0xFF8, &cid2); + mem_ap_read_u32(swjdp, (dbgbase&0xFFFFF000)|0xFFC, &cid3); + mem_ap_read_u32(swjdp, (dbgbase&0xFFFFF000)|0xFCC, &memtype); swjdp_transaction_endcheck(swjdp); command_print(cmd_ctx, "\tCID3 0x%x, CID2 0x%x, CID1 0x%x, CID0, 0x%x",cid3,cid2,cid1,cid0); if (memtype&0x01) @@ -1074,10 +1079,10 @@ int dap_info_command(struct command_context_s *cmd_ctx, swjdp_common_t *swjdp, i { command_print(cmd_ctx, "\tMEMTYPE system memory not present. Dedicated debug bus" ); } - + /* Now we read ROM table entries from dbgbase&0xFFFFF000)|0x000 until we get 0x00000000 */ entry_offset = 0; - do + do { mem_ap_read_atomic_u32(swjdp, (dbgbase&0xFFFFF000)|entry_offset, &romentry); command_print(cmd_ctx, "\tROMTABLE[0x%x] = 0x%x",entry_offset,romentry); @@ -1104,16 +1109,16 @@ int dap_info_command(struct command_context_s *cmd_ctx, swjdp_common_t *swjdp, i else { if (romentry) - command_print(cmd_ctx, "\t\tComponent not present"); + command_print(cmd_ctx, "\t\tComponent not present"); else - command_print(cmd_ctx, "\t\tEnd of ROM table"); + command_print(cmd_ctx, "\t\tEnd of ROM table"); } entry_offset += 4; } while (romentry>0); } else { - command_print(cmd_ctx, "\tNo ROM table present"); + command_print(cmd_ctx, "\tNo ROM table present"); } dap_ap_select(swjdp, apselold);