]> www.infradead.org Git - users/borneoa/openocd-next.git/commitdiff
flash/nor/rp2040: add missing TARGET_HALTED checks
authorTomas Vanek <vanekt@fbl.cz>
Wed, 14 Aug 2024 07:39:42 +0000 (09:39 +0200)
committerTomas Vanek <vanekt@fbl.cz>
Fri, 25 Apr 2025 09:40:02 +0000 (09:40 +0000)
Flash erase and write require this guard, unfortunately it is also
partially needed in the flash probe.

Partially backported from former upstream rp2040.c

Signed-off-by: Tomas Vanek <vanekt@fbl.cz>
Change-Id: Ie8a240e66c3ed68e08f872cbbfdd90a6d80e1f1e
Reviewed-on: https://review.openocd.org/c/openocd/+/8452
Tested-by: jenkins
src/flash/nor/rp2040.c

index 0e592f9124d48f38d670a696c08c5530dbd2740e..65c1e095b11864c24562eef9f56e2da9e41b1f94 100644 (file)
@@ -752,6 +752,12 @@ static int rp2040_flash_write(struct flash_bank *bank, const uint8_t *buffer, ui
 
        struct rp2040_flash_bank *priv = bank->driver_priv;
        struct target *target = bank->target;
+
+       if (target->state != TARGET_HALTED) {
+               LOG_ERROR("Target not halted");
+               return ERROR_TARGET_NOT_HALTED;
+       }
+
        struct working_area *bounce;
 
        int err = setup_for_raw_flash_cmd(target, priv);
@@ -839,6 +845,12 @@ static int rp2040_flash_erase(struct flash_bank *bank, unsigned int first, unsig
 {
        struct rp2040_flash_bank *priv = bank->driver_priv;
        struct target *target = bank->target;
+
+       if (target->state != TARGET_HALTED) {
+               LOG_ERROR("Target not halted");
+               return ERROR_TARGET_NOT_HALTED;
+       }
+
        uint32_t start_addr = bank->sectors[first].offset;
        uint32_t length = bank->sectors[last].offset + bank->sectors[last].size - start_addr;
        LOG_DEBUG("RP2040 erase %d bytes starting at 0x%" PRIx32, length, start_addr);
@@ -1109,6 +1121,11 @@ static int rp2040_flash_probe(struct flash_bank *bank)
                priv->spi_dev.name = "size override";
                LOG_DEBUG("SPI flash autodetection disabled, using configured size");
        } else {
+               if (target->state != TARGET_HALTED) {
+                       LOG_ERROR("Target not halted");
+                       return ERROR_TARGET_NOT_HALTED;
+               }
+
                bank->size = 0;
 
                (void)setup_for_raw_flash_cmd(target, priv);
@@ -1240,6 +1257,11 @@ COMMAND_HANDLER(rp2040_rom_api_call_handler)
        for (unsigned int i = 0; i + 1 < CMD_ARGC && i < ARRAY_SIZE(args); i++)
                COMMAND_PARSE_NUMBER(u32, CMD_ARGV[i + 1], args[i]);
 
+       if (target->state != TARGET_HALTED) {
+               LOG_ERROR("Target not halted");
+               return ERROR_TARGET_NOT_HALTED;
+       }
+
        struct rp2040_flash_bank *priv = bank->driver_priv;
        retval = setup_for_raw_flash_cmd(target, priv);
        if (retval != ERROR_OK)