ARM ADIv5 doxygen and cleanup
[fw/openocd] / src / target / arm_adi_v5.c
index 819dd290fd83990c231adb769c4fb396dfbc659a..41f00ec0b7804b7f61e3005829bff5dbf8dc5253 100644 (file)
@@ -119,18 +119,6 @@ static int adi_jtag_dp_scan(struct swjdp_common *swjdp,
        jtag_set_end_state(TAP_IDLE);
        arm_jtag_set_instr(jtag_info, instr, NULL);
 
-       /* Add specified number of tck clocks before accessing memory bus */
-
-       /* REVISIT these TCK cycles should be *AFTER*  updating APACC, since
-        * they provide more time for the (MEM) AP to complete the read ...
-        * See "Minimum Response Time" for JTAG-DP, in the ADIv5 spec.
-        */
-       if ((instr == JTAG_DP_APACC)
-                       && ((reg_addr == AP_REG_DRW)
-                               || ((reg_addr & 0xF0) == AP_REG_BD0))
-                       && (swjdp->memaccess_tck != 0))
-               jtag_add_runtest(swjdp->memaccess_tck, jtag_set_end_state(TAP_IDLE));
-
        /* Scan out a read or write operation using some DP or AP register.
         * For APACC access with any sticky error flag set, this is discarded.
         */
@@ -152,6 +140,18 @@ static int adi_jtag_dp_scan(struct swjdp_common *swjdp,
 
        jtag_add_dr_scan(2, fields, jtag_get_end_state());
 
+       /* Add specified number of tck clocks after starting memory bus
+        * access, giving the hardware time to complete the access.
+        * They provide more time for the (MEM) AP to complete the read ...
+        * See "Minimum Response Time" for JTAG-DP, in the ADIv5 spec.
+        */
+       if ((instr == JTAG_DP_APACC)
+                       && ((reg_addr == AP_REG_DRW)
+                               || ((reg_addr & 0xF0) == AP_REG_BD0))
+                       && (swjdp->memaccess_tck != 0))
+               jtag_add_runtest(swjdp->memaccess_tck,
+                               jtag_set_end_state(TAP_IDLE));
+
        return jtag_get_error();
 }
 
@@ -185,14 +185,14 @@ static int adi_jtag_dp_scan_u32(struct swjdp_common *swjdp,
 /**
  * Utility to write AP registers.
  */
-static inline int ap_write_check(struct swjdp_common *dap,
+static inline int adi_jtag_ap_write_check(struct swjdp_common *dap,
                uint8_t reg_addr, uint8_t *outvalue)
 {
        return adi_jtag_dp_scan(dap, JTAG_DP_APACC, reg_addr, DPAP_WRITE,
                        outvalue, NULL, NULL);
 }
 
-static int scan_inout_check_u32(struct swjdp_common *swjdp,
+static int adi_jtag_scan_inout_check_u32(struct swjdp_common *swjdp,
                uint8_t instr, uint8_t reg_addr, uint8_t RnW,
                uint32_t outvalue, uint32_t *invalue)
 {
@@ -222,7 +222,7 @@ int jtagdp_transaction_endcheck(struct swjdp_common *swjdp)
 
 #if 0
        /* Danger!!!! BROKEN!!!! */
-       scan_inout_check_u32(swjdp, JTAG_DP_DPACC,
+       adi_jtag_scan_inout_check_u32(swjdp, JTAG_DP_DPACC,
                        DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat);
        /* Danger!!!! BROKEN!!!! Why will jtag_execute_queue() fail here????
        R956 introduced the check on return value here and now Michael Schwingen reports
@@ -240,7 +240,7 @@ int jtagdp_transaction_endcheck(struct swjdp_common *swjdp)
        /* Post CTRL/STAT read; discard any previous posted read value
         * but collect its ACK status.
         */
-       scan_inout_check_u32(swjdp, JTAG_DP_DPACC,
+       adi_jtag_scan_inout_check_u32(swjdp, JTAG_DP_DPACC,
                        DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat);
        if ((retval = jtag_execute_queue()) != ERROR_OK)
                return retval;
@@ -275,7 +275,7 @@ int jtagdp_transaction_endcheck(struct swjdp_common *swjdp)
                                return ERROR_JTAG_DEVICE_ERROR;
                        }
 
-                       scan_inout_check_u32(swjdp, JTAG_DP_DPACC,
+                       adi_jtag_scan_inout_check_u32(swjdp, JTAG_DP_DPACC,
                                        DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat);
                        if ((retval = jtag_execute_queue()) != ERROR_OK)
                                return retval;
@@ -317,11 +317,11 @@ int jtagdp_transaction_endcheck(struct swjdp_common *swjdp)
                                LOG_ERROR("JTAG-DP STICKY ERROR");
 
                        /* Clear Sticky Error Bits */
-                       scan_inout_check_u32(swjdp, JTAG_DP_DPACC,
+                       adi_jtag_scan_inout_check_u32(swjdp, JTAG_DP_DPACC,
                                        DP_CTRL_STAT, DPAP_WRITE,
                                        swjdp->dp_ctrl_stat | SSTICKYORUN
                                                | SSTICKYERR, NULL);
-                       scan_inout_check_u32(swjdp, JTAG_DP_DPACC,
+                       adi_jtag_scan_inout_check_u32(swjdp, JTAG_DP_DPACC,
                                        DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat);
                        if ((retval = jtag_execute_queue()) != ERROR_OK)
                                return retval;
@@ -353,14 +353,14 @@ int jtagdp_transaction_endcheck(struct swjdp_common *swjdp)
 static int dap_dp_write_reg(struct swjdp_common *swjdp,
                uint32_t value, uint8_t reg_addr)
 {
-       return scan_inout_check_u32(swjdp, JTAG_DP_DPACC,
+       return adi_jtag_scan_inout_check_u32(swjdp, JTAG_DP_DPACC,
                        reg_addr, DPAP_WRITE, value, NULL);
 }
 
 static int dap_dp_read_reg(struct swjdp_common *swjdp,
                uint32_t *value, uint8_t reg_addr)
 {
-       return scan_inout_check_u32(swjdp, JTAG_DP_DPACC,
+       return adi_jtag_scan_inout_check_u32(swjdp, JTAG_DP_DPACC,
                        reg_addr, DPAP_READ, 0, value);
 }
 
@@ -412,7 +412,7 @@ static int dap_ap_write_reg(struct swjdp_common *swjdp,
        if (retval != ERROR_OK)
                return retval;
 
-       return ap_write_check(swjdp, reg_addr, out_value_buf);
+       return adi_jtag_ap_write_check(swjdp, reg_addr, out_value_buf);
 }
 
 /**
@@ -452,7 +452,7 @@ int dap_ap_read_reg_u32(struct swjdp_common *swjdp,
        if (retval != ERROR_OK)
                return retval;
 
-       return scan_inout_check_u32(swjdp, JTAG_DP_APACC, reg_addr,
+       return adi_jtag_scan_inout_check_u32(swjdp, JTAG_DP_APACC, reg_addr,
                        DPAP_READ, 0, value);
 }
 
@@ -866,14 +866,16 @@ int mem_ap_write_buf_u8(struct swjdp_common *swjdp, uint8_t *buffer, int count,
        return retval;
 }
 
-/*********************************************************************************
-*                                                                                *
-* mem_ap_read_buf_u32(struct swjdp_common *swjdp, uint8_t *buffer, int count, uint32_t address)  *
-*                                                                                *
-* Read block fast in target order (little endian) into a buffer                  *
-*                                                                                *
-**********************************************************************************/
-int mem_ap_read_buf_u32(struct swjdp_common *swjdp, uint8_t *buffer, int count, uint32_t address)
+/**
+ * Synchronously read a block of 32-bit words into a buffer
+ * @param swjdp The DAP connected to the MEM-AP.
+ * @param buffer where the words will be stored (in host byte order).
+ * @param count How many words to read.
+ * @param address Memory address from which to read words; all the
+ *     words must be readable by the currently selected MEM-AP.
+ */
+int mem_ap_read_buf_u32(struct swjdp_common *swjdp, uint8_t *buffer,
+               int count, uint32_t address)
 {
        int wcount, blocksize, readcount, errorcount = 0, retval = ERROR_OK;
        uint32_t adr = address;
@@ -884,8 +886,12 @@ int mem_ap_read_buf_u32(struct swjdp_common *swjdp, uint8_t *buffer, int count,
 
        while (wcount > 0)
        {
-               /* Adjust to read blocks within boundaries aligned to the TAR autoincremnent size*/
-               blocksize = max_tar_block_size(swjdp->tar_autoincr_block, address);
+               /* Adjust to read blocks within boundaries aligned to the
+                * TAR autoincrement size (at least 2^10).  Autoincrement
+                * mode avoids an extra per-word roundtrip to update TAR.
+                */
+               blocksize = max_tar_block_size(swjdp->tar_autoincr_block,
+                               address);
                if (wcount < blocksize)
                        blocksize = wcount;
 
@@ -893,7 +899,8 @@ int mem_ap_read_buf_u32(struct swjdp_common *swjdp, uint8_t *buffer, int count,
                if (blocksize == 0)
                        blocksize = 1;
 
-               dap_setup_accessport(swjdp, CSW_32BIT | CSW_ADDRINC_SINGLE, address);
+               dap_setup_accessport(swjdp, CSW_32BIT | CSW_ADDRINC_SINGLE,
+                               address);
 
                /* Scan out first read */
                adi_jtag_dp_scan(swjdp, JTAG_DP_APACC, AP_REG_DRW,
@@ -928,7 +935,8 @@ int mem_ap_read_buf_u32(struct swjdp_common *swjdp, uint8_t *buffer, int count,
 
                if (errorcount > 1)
                {
-                       LOG_WARNING("Block read error address 0x%" PRIx32 ", count 0x%x", address, count);
+                       LOG_WARNING("Block read error address 0x%" PRIx32
+                               ", count 0x%x", address, count);
                        return ERROR_JTAG_DEVICE_ERROR;
                }
        }
@@ -944,7 +952,8 @@ int mem_ap_read_buf_u32(struct swjdp_common *swjdp, uint8_t *buffer, int count,
 
                        for (i = 0; i < 4; i++)
                        {
-                               *((uint8_t*)pBuffer) = (data >> 8 * (adr & 0x3));
+                               *((uint8_t*)pBuffer) =
+                                               (data >> 8 * (adr & 0x3));
                                pBuffer++;
                                adr++;
                        }
@@ -1005,7 +1014,16 @@ static int mem_ap_read_buf_packed_u16(struct swjdp_common *swjdp,
        return retval;
 }
 
-int mem_ap_read_buf_u16(struct swjdp_common *swjdp, uint8_t *buffer, int count, uint32_t address)
+/**
+ * Synchronously read a block of 16-bit halfwords into a buffer
+ * @param swjdp The DAP connected to the MEM-AP.
+ * @param buffer where the halfwords will be stored (in host byte order).
+ * @param count How many halfwords to read.
+ * @param address Memory address from which to read words; all the
+ *     words must be readable by the currently selected MEM-AP.
+ */
+int mem_ap_read_buf_u16(struct swjdp_common *swjdp, uint8_t *buffer,
+               int count, uint32_t address)
 {
        uint32_t invalue, i;
        int retval = ERROR_OK;
@@ -1094,7 +1112,16 @@ static int mem_ap_read_buf_packed_u8(struct swjdp_common *swjdp,
        return retval;
 }
 
-int mem_ap_read_buf_u8(struct swjdp_common *swjdp, uint8_t *buffer, int count, uint32_t address)
+/**
+ * Synchronously read a block of bytes into a buffer
+ * @param swjdp The DAP connected to the MEM-AP.
+ * @param buffer where the bytes will be stored.
+ * @param count How many bytes to read.
+ * @param address Memory address from which to read data; all the
+ *     data must be readable by the currently selected MEM-AP.
+ */
+int mem_ap_read_buf_u8(struct swjdp_common *swjdp, uint8_t *buffer,
+               int count, uint32_t address)
 {
        uint32_t invalue;
        int retval = ERROR_OK;