X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Ftarget%2Farm_adi_v5.c;h=ec62f12fa833e527375fe64e4fa61860c8df52f6;hp=dcc9ced3a691f9e9335b527b9420ddca357bdfbe;hb=92bae0b1df2607b6b1ab550f3e1afbdd1517aea4;hpb=573d9a036894670e64f7ed22a6e842961bc24b8e diff --git a/src/target/arm_adi_v5.c b/src/target/arm_adi_v5.c index dcc9ced3a6..ec62f12fa8 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,22 +77,22 @@ 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].out_mask = NULL; + fields[0].in_value = ack; - fields[0].in_check_value = NULL; - fields[0].in_check_mask = NULL; + + fields[0].in_handler = NULL; - fields[0].in_handler_priv = NULL; + fields[1].tap = jtag_info->tap; fields[1].num_bits = 32; fields[1].out_value = outvalue; - fields[1].out_mask = NULL; + fields[1].in_value = invalue; fields[1].in_handler = NULL; - fields[1].in_handler_priv = NULL; - fields[1].in_check_value = NULL; - fields[1].in_check_mask = NULL; + + + jtag_add_dr_scan(2, fields, TAP_INVALID); @@ -112,31 +113,31 @@ 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].out_mask = NULL; + fields[0].in_value = ack; - fields[0].in_check_value = NULL; - fields[0].in_check_mask = NULL; + + fields[0].in_handler = NULL; - fields[0].in_handler_priv = 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].out_mask = NULL; + fields[1].in_value = NULL; if (invalue) { - fields[1].in_handler = arm_jtag_buf_to_u32; + fields[1].in_handler = arm_jtag_buf_to_u32; /* deprecated! invoke this from user code! */ fields[1].in_handler_priv = invalue; } else { fields[1].in_handler = NULL; - fields[1].in_handler_priv = NULL; + } - fields[1].in_check_value = NULL; - fields[1].in_check_mask = NULL; + + jtag_add_dr_scan(2, fields, TAP_INVALID); @@ -247,7 +248,7 @@ int swjdp_transaction_endcheck(swjdp_common_t *swjdp) } else { - u32 mem_ap_csw; + u32 mem_ap_csw, mem_ap_tar; /* Print information about last AHBAP access */ LOG_ERROR("AHBAP Cached values: dp_select 0x%x, ap_csw 0x%x, ap_tar 0x%x", swjdp->dp_select_value, swjdp->ap_csw_value, swjdp->ap_tar_value); @@ -266,9 +267,10 @@ int swjdp_transaction_endcheck(swjdp_common_t *swjdp) LOG_DEBUG("swjdp: status 0x%x", ctrlstat); dap_ap_read_reg_u32(swjdp, AP_REG_CSW, &mem_ap_csw); + dap_ap_read_reg_u32(swjdp, AP_REG_TAR, &mem_ap_tar); if ((retval=jtag_execute_queue())!=ERROR_OK) return retval; - LOG_ERROR("Read MEM_AP_CSW 0x%x", mem_ap_csw); + LOG_ERROR("Read MEM_AP_CSW 0x%x, MEM_AP_TAR 0x%x", mem_ap_csw, mem_ap_tar); } if ((retval=jtag_execute_queue())!=ERROR_OK) @@ -447,7 +449,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; @@ -463,7 +464,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++ ) { @@ -471,7 +473,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); } } @@ -516,7 +518,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; @@ -557,7 +558,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++ ) { @@ -566,7 +568,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) { @@ -587,7 +589,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) @@ -598,7 +599,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; @@ -611,7 +614,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; @@ -648,7 +650,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++ ) { @@ -657,7 +660,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) { @@ -678,7 +681,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) @@ -689,7 +691,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--; @@ -765,7 +767,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++ ) { @@ -857,7 +860,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; }