flash/nor/tcl.c: add filld command to write double-word with 64-bit value
[openocd.git] / src / flash / nor / tcl.c
index 7a402b0e7a3791772e48d509aea983ad9b7f8bb5..3287dd97f14fbc2c35104483ccbf560b2b64298a 100644 (file)
@@ -111,7 +111,7 @@ COMMAND_HANDLER(handle_flash_info_command)
                if (retval == ERROR_FLASH_OPER_UNSUPPORTED)
                        LOG_WARNING("Flash protection check is not implemented.");
 
-               command_print(CMD_CTX,
+               command_print(CMD,
                        "#%d : %s at " TARGET_ADDR_FMT ", size 0x%8.8" PRIx32
                        ", buswidth %i, chipwidth %i",
                        p->bank_number,
@@ -140,7 +140,7 @@ COMMAND_HANDLER(handle_flash_info_command)
                        else if (!show_sectors || !prot_block_available)
                                protect_state = "protection state unknown";
 
-                       command_print(CMD_CTX,
+                       command_print(CMD,
                                "\t#%3i: 0x%8.8" PRIx32 " (0x%" PRIx32 " %" PRIi32 "kB) %s",
                                j,
                                block_array[j].offset,
@@ -152,7 +152,7 @@ COMMAND_HANDLER(handle_flash_info_command)
                if (p->driver->info != NULL) {
                        retval = p->driver->info(p, buf, sizeof(buf));
                        if (retval == ERROR_OK)
-                               command_print(CMD_CTX, "%s", buf);
+                               command_print(CMD, "%s", buf);
                        else
                                LOG_ERROR("error retrieving flash info");
                }
@@ -176,12 +176,12 @@ COMMAND_HANDLER(handle_flash_probe_command)
        if (p) {
                retval = p->driver->probe(p);
                if (retval == ERROR_OK)
-                       command_print(CMD_CTX,
+                       command_print(CMD,
                                "flash '%s' found at " TARGET_ADDR_FMT,
                                p->driver->name,
                                p->base);
        } else {
-               command_print(CMD_CTX, "flash bank '#%s' is out of bounds", CMD_ARGV[0]);
+               command_print(CMD, "flash bank '#%s' is out of bounds", CMD_ARGV[0]);
                retval = ERROR_FAIL;
        }
 
@@ -202,9 +202,9 @@ COMMAND_HANDLER(handle_flash_erase_check_command)
        int j;
        retval = p->driver->erase_check(p);
        if (retval == ERROR_OK)
-               command_print(CMD_CTX, "successfully checked erase state");
+               command_print(CMD, "successfully checked erase state");
        else {
-               command_print(CMD_CTX,
+               command_print(CMD,
                        "unknown error when checking erase state of flash bank #%s at "
                        TARGET_ADDR_FMT,
                        CMD_ARGV[0],
@@ -222,7 +222,7 @@ COMMAND_HANDLER(handle_flash_erase_check_command)
                        erase_state = "erase state unknown";
 
                blank = false;
-               command_print(CMD_CTX,
+               command_print(CMD,
                        "\t#%3i: 0x%8.8" PRIx32 " (0x%" PRIx32 " %" PRIi32 "kB) %s",
                        j,
                        p->sectors[j].offset,
@@ -232,7 +232,7 @@ COMMAND_HANDLER(handle_flash_erase_check_command)
        }
 
        if (blank)
-               command_print(CMD_CTX, "\tBank is erased");
+               command_print(CMD, "\tBank is erased");
        return retval;
 }
 
@@ -267,7 +267,7 @@ COMMAND_HANDLER(handle_flash_erase_address_command)
        COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], length);
 
        if (length <= 0) {
-               command_print(CMD_CTX, "Length must be >0");
+               command_print(CMD, "Length must be >0");
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
@@ -289,7 +289,7 @@ COMMAND_HANDLER(handle_flash_erase_address_command)
                retval = flash_erase_address_range(target, do_pad, address, length);
 
        if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) {
-               command_print(CMD_CTX, "erased address " TARGET_ADDR_FMT " (length %"
+               command_print(CMD, "erased address " TARGET_ADDR_FMT " (length %"
                                PRIi32 ")"
                        " in %fs (%0.3f KiB/s)", address, length,
                        duration_elapsed(&bench), duration_kbps(&bench, length));
@@ -320,13 +320,13 @@ COMMAND_HANDLER(handle_flash_erase_command)
                COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], last);
 
        if (!(first <= last)) {
-               command_print(CMD_CTX, "ERROR: "
+               command_print(CMD, "ERROR: "
                        "first sector must be <= last");
                return ERROR_FAIL;
        }
 
        if (!(last <= (uint32_t)(p->num_sectors - 1))) {
-               command_print(CMD_CTX, "ERROR: "
+               command_print(CMD, "ERROR: "
                        "last sector must be <= %" PRIu32,
                        p->num_sectors - 1);
                return ERROR_FAIL;
@@ -338,7 +338,7 @@ COMMAND_HANDLER(handle_flash_erase_command)
        retval = flash_driver_erase(p, first, last);
 
        if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) {
-               command_print(CMD_CTX, "erased sectors %" PRIu32 " "
+               command_print(CMD, "erased sectors %" PRIu32 " "
                        "through %" PRIu32 " on flash bank %d "
                        "in %fs", first, last, p->bank_number, duration_elapsed(&bench));
        }
@@ -377,14 +377,14 @@ COMMAND_HANDLER(handle_flash_protect_command)
        COMMAND_PARSE_ON_OFF(CMD_ARGV[3], set);
 
        if (!(first <= last)) {
-               command_print(CMD_CTX, "ERROR: "
+               command_print(CMD, "ERROR: "
                        "first %s must be <= last",
                        (p->num_prot_blocks) ? "block" : "sector");
                return ERROR_FAIL;
        }
 
        if (!(last <= (uint32_t)(num_blocks - 1))) {
-               command_print(CMD_CTX, "ERROR: "
+               command_print(CMD, "ERROR: "
                        "last %s must be <= %" PRIu32,
                        (p->num_prot_blocks) ? "block" : "sector",
                        num_blocks - 1);
@@ -393,7 +393,7 @@ COMMAND_HANDLER(handle_flash_protect_command)
 
        retval = flash_driver_protect(p, set, first, last);
        if (retval == ERROR_OK) {
-               command_print(CMD_CTX, "%s protection for %s %" PRIu32
+               command_print(CMD, "%s protection for %s %" PRIu32
                        " through %" PRIu32 " on flash bank %d",
                        (set) ? "set" : "cleared",
                        (p->num_prot_blocks) ? "blocks" : "sectors",
@@ -421,12 +421,12 @@ COMMAND_HANDLER(handle_flash_write_image_command)
                        auto_erase = 1;
                        CMD_ARGV++;
                        CMD_ARGC--;
-                       command_print(CMD_CTX, "auto erase enabled");
+                       command_print(CMD, "auto erase enabled");
                } else if (strcmp(CMD_ARGV[0], "unlock") == 0) {
                        auto_unlock = true;
                        CMD_ARGV++;
                        CMD_ARGC--;
-                       command_print(CMD_CTX, "auto unlock enabled");
+                       command_print(CMD, "auto unlock enabled");
                } else
                        break;
        }
@@ -463,7 +463,7 @@ COMMAND_HANDLER(handle_flash_write_image_command)
        }
 
        if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) {
-               command_print(CMD_CTX, "wrote %" PRIu32 " bytes from file %s "
+               command_print(CMD, "wrote %" PRIu32 " bytes from file %s "
                        "in %fs (%0.3f KiB/s)", written, CMD_ARGV[0],
                        duration_elapsed(&bench), duration_kbps(&bench, written));
        }
@@ -476,7 +476,7 @@ COMMAND_HANDLER(handle_flash_write_image_command)
 COMMAND_HANDLER(handle_flash_fill_command)
 {
        target_addr_t address;
-       uint32_t pattern;
+       uint64_t pattern;
        uint32_t count;
        struct target *target = get_current_target(CMD_CTX);
        unsigned i;
@@ -486,12 +486,8 @@ COMMAND_HANDLER(handle_flash_fill_command)
        if (CMD_ARGC != 3)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
-#if BUILD_TARGET64
-       COMMAND_PARSE_NUMBER(u64, CMD_ARGV[0], address);
-#else
-       COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], address);
-#endif
-       COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], pattern);
+       COMMAND_PARSE_ADDRESS(CMD_ARGV[0], address);
+       COMMAND_PARSE_NUMBER(u64, CMD_ARGV[1], pattern);
        COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], count);
 
        struct flash_bank *bank;
@@ -500,6 +496,9 @@ COMMAND_HANDLER(handle_flash_fill_command)
                return retval;
 
        switch (CMD_NAME[4]) {
+               case 'd':
+                       wordsize = 8;
+                       break;
                case 'w':
                        wordsize = 4;
                        break;
@@ -545,6 +544,10 @@ COMMAND_HANDLER(handle_flash_fill_command)
        uint8_t *ptr = buffer + padding_at_start;
 
        switch (wordsize) {
+               case 8:
+                       for (i = 0; i < count; i++, ptr += wordsize)
+                               target_buffer_set_u64(target, ptr, pattern);
+                       break;
                case 4:
                        for (i = 0; i < count; i++, ptr += wordsize)
                                target_buffer_set_u32(target, ptr, pattern);
@@ -581,9 +584,12 @@ COMMAND_HANDLER(handle_flash_fill_command)
                goto done;
 
        for (i = 0, ptr = buffer; i < count; i++) {
-               uint32_t readback = 0;
+               uint64_t readback = 0;
 
                switch (wordsize) {
+                       case 8:
+                               readback = target_buffer_get_u64(target, ptr);
+                               break;
                        case 4:
                                readback = target_buffer_get_u32(target, ptr);
                                break;
@@ -597,7 +603,7 @@ COMMAND_HANDLER(handle_flash_fill_command)
                if (readback != pattern) {
                        LOG_ERROR(
                                "Verification error address " TARGET_ADDR_FMT
-                               ", read back 0x%02" PRIx32 ", expected 0x%02" PRIx32,
+                               ", read back 0x%02" PRIx64 ", expected 0x%02" PRIx64,
                                address + i * wordsize, readback, pattern);
                        retval = ERROR_FAIL;
                        goto done;
@@ -606,7 +612,7 @@ COMMAND_HANDLER(handle_flash_fill_command)
        }
 
        if ((retval == ERROR_OK) && (duration_measure(&bench) == ERROR_OK)) {
-               command_print(CMD_CTX, "wrote %" PRIu32 " bytes to " TARGET_ADDR_FMT
+               command_print(CMD, "wrote %" PRIu32 " bytes to " TARGET_ADDR_FMT
                        " in %fs (%0.3f KiB/s)", size_bytes, address,
                        duration_elapsed(&bench), duration_kbps(&bench, size_bytes));
        }
@@ -720,7 +726,7 @@ COMMAND_HANDLER(handle_flash_write_bank_command)
        free(buffer);
 
        if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) {
-               command_print(CMD_CTX, "wrote %zu bytes from file %s to flash bank %u"
+               command_print(CMD, "wrote %zu bytes from file %s to flash bank %u"
                        " at offset 0x%8.8" PRIx32 " in %fs (%0.3f KiB/s)",
                        length, CMD_ARGV[1], bank->bank_number, offset,
                        duration_elapsed(&bench), duration_kbps(&bench, length));
@@ -802,7 +808,7 @@ COMMAND_HANDLER(handle_flash_read_bank_command)
        }
 
        if (duration_measure(&bench) == ERROR_OK)
-               command_print(CMD_CTX, "wrote %zd bytes to file %s from flash bank %u"
+               command_print(CMD, "wrote %zd bytes to file %s from flash bank %u"
                        " at offset 0x%8.8" PRIx32 " in %fs (%0.3f KiB/s)",
                        written, CMD_ARGV[1], p->bank_number, offset,
                        duration_elapsed(&bench), duration_kbps(&bench, written));
@@ -904,23 +910,23 @@ COMMAND_HANDLER(handle_flash_verify_bank_command)
        }
 
        if (duration_measure(&bench) == ERROR_OK)
-               command_print(CMD_CTX, "read %zd bytes from file %s and flash bank %u"
+               command_print(CMD, "read %zd bytes from file %s and flash bank %u"
                        " at offset 0x%8.8" PRIx32 " in %fs (%0.3f KiB/s)",
                        length, CMD_ARGV[1], p->bank_number, offset,
                        duration_elapsed(&bench), duration_kbps(&bench, length));
 
        differ = memcmp(buffer_file, buffer_flash, length);
-       command_print(CMD_CTX, "contents %s", differ ? "differ" : "match");
+       command_print(CMD, "contents %s", differ ? "differ" : "match");
        if (differ) {
                uint32_t t;
                int diffs = 0;
                for (t = 0; t < length; t++) {
                        if (buffer_flash[t] == buffer_file[t])
                                continue;
-                       command_print(CMD_CTX, "diff %d address 0x%08x. Was 0x%02x instead of 0x%02x",
+                       command_print(CMD, "diff %d address 0x%08x. Was 0x%02x instead of 0x%02x",
                                        diffs, t + offset, buffer_flash[t], buffer_file[t]);
                        if (diffs++ >= 127) {
-                               command_print(CMD_CTX, "More than 128 errors, the rest are not printed.");
+                               command_print(CMD, "More than 128 errors, the rest are not printed.");
                                break;
                        }
                        keep_alive();
@@ -956,7 +962,7 @@ COMMAND_HANDLER(handle_flash_padded_value_command)
 
        COMMAND_PARSE_NUMBER(u8, CMD_ARGV[1], p->default_padded_value);
 
-       command_print(CMD_CTX, "Default padded value set to 0x%" PRIx8 " for flash bank %u", \
+       command_print(CMD, "Default padded value set to 0x%" PRIx8 " for flash bank %u", \
                        p->default_padded_value, p->bank_number);
 
        return retval;
@@ -989,7 +995,7 @@ static const struct command_registration flash_exec_command_handlers[] = {
                .name = "erase_sector",
                .handler = handle_flash_erase_command,
                .mode = COMMAND_EXEC,
-               .usage = "bank_id first_sector_num last_sector_num",
+               .usage = "bank_id first_sector_num (last_sector_num|'last')",
                .help = "Erase a range of sectors in a flash bank.",
        },
        {
@@ -1006,6 +1012,14 @@ static const struct command_registration flash_exec_command_handlers[] = {
                        "before erasing.",
 
        },
+       {
+               .name = "filld",
+               .handler = handle_flash_fill_command,
+               .mode = COMMAND_EXEC,
+               .usage = "address value n",
+               .help = "Fill n double-words with 64-bit value, starting at "
+                       "word address.  (No autoerase.)",
+       },
        {
                .name = "fillw",
                .handler = handle_flash_fill_command,
@@ -1111,7 +1125,7 @@ COMMAND_HANDLER(handle_flash_bank_command)
        }
 
        const char *driver_name = CMD_ARGV[0];
-       struct flash_driver *driver = flash_driver_find_by_name(driver_name);
+       const struct flash_driver *driver = flash_driver_find_by_name(driver_name);
        if (NULL == driver) {
                /* no matching flash driver found */
                LOG_ERROR("flash driver '%s' not found", driver_name);
@@ -1171,7 +1185,7 @@ COMMAND_HANDLER(handle_flash_banks_command)
 
        unsigned n = 0;
        for (struct flash_bank *p = flash_bank_list(); p; p = p->next, n++) {
-               LOG_USER("#%d : %s (%s) at " TARGET_ADDR_FMT ", size 0x%8.8" PRIx32 ", "
+               command_print(CMD, "#%d : %s (%s) at " TARGET_ADDR_FMT ", size 0x%8.8" PRIx32 ", "
                        "buswidth %u, chipwidth %u", p->bank_number,
                        p->name, p->driver->name, p->base, p->size,
                        p->bus_width, p->chip_width);
@@ -1243,12 +1257,14 @@ static const struct command_registration flash_config_command_handlers[] = {
                .mode = COMMAND_CONFIG,
                .handler = handle_flash_init_command,
                .help = "Initialize flash devices.",
+               .usage = "",
        },
        {
                .name = "banks",
                .mode = COMMAND_ANY,
                .handler = handle_flash_banks_command,
                .help = "Display table with information about flash banks.",
+               .usage = "",
        },
        {
                .name = "list",
@@ -1264,6 +1280,7 @@ static const struct command_registration flash_command_handlers[] = {
                .mode = COMMAND_ANY,
                .help = "NOR flash command group",
                .chain = flash_config_command_handlers,
+               .usage = "",
        },
        COMMAND_REGISTRATION_DONE
 };

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)