stm32l4: support flashing L45x/46x devices
[fw/openocd] / src / flash / nor / sim3x.c
index 4628e68ed23822c439eb77f47410c4b6d3c73fac..ce9a21ed5d2517ff1dbb446b681b85f9ae57973d 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2014 by Ladislav Bábel                                  *
+ *   Copyright (C) 2014 by Ladislav Bábel                                  *
  *   ladababel@seznam.cz                                                   *
  *                                                                         *
  *   Copyright (C) 2015 by Andreas Bomholtz                                *
@@ -14,6 +14,9 @@
  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
  *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
@@ -512,8 +515,8 @@ static int sim3x_flash_write(struct flash_bank *bank, const uint8_t * buffer, ui
                                        "for padding buffer");
                        return ERROR_FAIL;
                }
-               LOG_INFO("odd number of bytes to write (%d), extending to %d "
-                               "and padding with 0xff", old_count, count);
+               LOG_INFO("odd number of bytes to write (%" PRIu32 "), extending to %" PRIu32
+                               " and padding with 0xff", old_count, count);
 
                new_buffer[count - 1] = 0xff;
                buffer = memcpy(new_buffer, buffer, old_count);
@@ -748,7 +751,7 @@ static int sim3x_read_info(struct flash_bank *bank)
        }
 
        if (((cpuid >> 4) & 0xfff) != 0xc23) {
-               LOG_ERROR("Target is not CortexM3");
+               LOG_ERROR("Target is not Cortex-M3");
                return ERROR_FAIL;
        }
 
@@ -864,20 +867,17 @@ static int sim3x_flash_info(struct flash_bank *bank, char *buf, int buf_size)
                                return ERROR_BUF_TOO_SMALL;
 
                        /* Package */
-                       if (sim3x_info->device_package) {
-                               printed = snprintf(buf, buf_size, "-G%s", sim3x_info->device_package);
-                               buf += printed;
-                               buf_size -= printed;
+                       printed = snprintf(buf, buf_size, "-G%s", sim3x_info->device_package);
+                       buf += printed;
+                       buf_size -= printed;
 
-                               if (buf_size <= 0)
-                                       return ERROR_BUF_TOO_SMALL;
-                       }
+                       if (buf_size <= 0)
+                               return ERROR_BUF_TOO_SMALL;
                }
        }
 
        /* Print flash size */
        printed = snprintf(buf, buf_size, " flash_size = %dKB", sim3x_info->flash_size_kb);
-       buf += printed;
        buf_size -= printed;
 
        if (buf_size <= 0)
@@ -896,7 +896,7 @@ static int ap_write_register(struct adiv5_dap *dap, unsigned reg, uint32_t value
        int retval;
        LOG_DEBUG("DAP_REG[0x%02x] <- %08" PRIX32, reg, value);
 
-       retval = dap_queue_ap_write(dap, reg, value);
+       retval = dap_queue_ap_write(dap_ap(dap, SIM3X_AP), reg, value);
        if (retval != ERROR_OK) {
                LOG_DEBUG("DAP: failed to queue a write request");
                return retval;
@@ -914,7 +914,8 @@ static int ap_write_register(struct adiv5_dap *dap, unsigned reg, uint32_t value
 static int ap_read_register(struct adiv5_dap *dap, unsigned reg, uint32_t *result)
 {
        int retval;
-       retval = dap_queue_ap_read(dap, reg, result);
+
+       retval = dap_queue_ap_read(dap_ap(dap, SIM3X_AP), reg, result);
        if (retval != ERROR_OK) {
                LOG_DEBUG("DAP: failed to queue a read request");
                return retval;
@@ -962,9 +963,6 @@ COMMAND_HANDLER(sim3x_mass_erase)
                return ERROR_FAIL;
        }
 
-       const uint8_t origninal_ap = dap->ap_current >> 24;
-       dap_ap_select(dap, SIM3X_AP);
-
        ret = ap_read_register(dap, SIM3X_AP_ID, &val);
        if (ret != ERROR_OK)
                return ret;
@@ -991,8 +989,6 @@ COMMAND_HANDLER(sim3x_mass_erase)
        if (ret != ERROR_OK)
                return ret;
 
-       dap_ap_select(dap, origninal_ap);
-
        LOG_INFO("Mass erase success");
        return ERROR_OK;
 }
@@ -1016,13 +1012,10 @@ COMMAND_HANDLER(sim3x_lock)
                        return ret;
 
                if ((val & CPUID_CHECK_VALUE_MASK) != CPUID_CHECK_VALUE) {
-                       LOG_ERROR("Target is not ARM CortexM3 or is already locked");
+                       LOG_ERROR("Target is not ARM Cortex-M3 or is already locked");
                        return ERROR_FAIL;
                }
        } else {
-               const uint8_t origninal_ap = dap->ap_current >> 24;
-               dap_ap_select(dap, SIM3X_AP);
-
                /* check SIM3X_AP_ID */
                ret = ap_read_register(dap, SIM3X_AP_ID, &val);
                if (ret != ERROR_OK)
@@ -1042,8 +1035,6 @@ COMMAND_HANDLER(sim3x_lock)
                        if (ret != ERROR_OK)
                                return ret;
 
-                       dap_ap_select(dap, origninal_ap);
-
                        if (val & SIM3X_AP_INIT_STAT_LOCK) {
                                LOG_INFO("Target is already locked");
                                return ERROR_OK;
@@ -1052,8 +1043,6 @@ COMMAND_HANDLER(sim3x_lock)
                                return ERROR_FAIL;
                        }
                }
-
-               dap_ap_select(dap, origninal_ap);
        }
 
        ret = target_read_u32(target, LOCK_WORD_ADDRESS, &val);