flash/nor: improved API of flash_driver.info & fixed buffer overruns
authorJan Matyas <matyas@codasip.com>
Fri, 23 Apr 2021 08:47:17 +0000 (10:47 +0200)
committerAntonio Borneo <borneo.antonio@gmail.com>
Sun, 13 Jun 2021 18:58:28 +0000 (19:58 +0100)
1) The API of "info" callback in "struct flash_driver" has been
improved. Fixed buffers for strings

2) Removed the calls to snprintf() from the flash_driver.info
implementations. Many of them were used in an unsafe manner
(buffer overruns were possible).

Change-Id: I42ab8a8018d01f9af43c5ba49f650c3cb5d31dcb
Signed-off-by: Jan Matyas <matyas@codasip.com>
Reviewed-on: http://openocd.zylin.com/6182
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
51 files changed:
src/flash/nor/ambiqmicro.c
src/flash/nor/at91sam3.c
src/flash/nor/at91sam4.c
src/flash/nor/at91sam7.c
src/flash/nor/ath79.c
src/flash/nor/atsamv.c
src/flash/nor/avrf.c
src/flash/nor/bluenrg-x.c
src/flash/nor/cc26xx.c
src/flash/nor/cc3220sf.c
src/flash/nor/cfi.c
src/flash/nor/cfi.h
src/flash/nor/driver.h
src/flash/nor/efm32.c
src/flash/nor/esirisc_flash.c
src/flash/nor/faux.c
src/flash/nor/fespi.c
src/flash/nor/fm4.c
src/flash/nor/jtagspi.c
src/flash/nor/kinetis.c
src/flash/nor/kinetis_ke.c
src/flash/nor/lpc2000.c
src/flash/nor/lpcspifi.c
src/flash/nor/max32xxx.c
src/flash/nor/mdr.c
src/flash/nor/mrvlqspi.c
src/flash/nor/msp432.c
src/flash/nor/niietcm4.c
src/flash/nor/nrf5.c
src/flash/nor/pic32mx.c
src/flash/nor/psoc4.c
src/flash/nor/psoc5lp.c
src/flash/nor/psoc6.c
src/flash/nor/sh_qspi.c
src/flash/nor/sim3x.c
src/flash/nor/stellaris.c
src/flash/nor/stm32f1x.c
src/flash/nor/stm32f2x.c
src/flash/nor/stm32h7x.c
src/flash/nor/stm32l4x.c
src/flash/nor/stm32lx.c
src/flash/nor/stmqspi.c
src/flash/nor/stmsmi.c
src/flash/nor/str7x.c
src/flash/nor/tcl.c
src/flash/nor/tms470.c
src/flash/nor/virtual.c
src/flash/nor/w600.c
src/flash/nor/xcf.c
src/flash/nor/xmc1xxx.c
src/flash/nor/xmc4xxx.c

index 1c4dce87dcd525016e789903d3d2d96f046074cb..c4c69ce2be002df1bf970d7b8f70586668726ea6 100644 (file)
@@ -161,10 +161,9 @@ FLASH_BANK_COMMAND_HANDLER(ambiqmicro_flash_bank_command)
        return ERROR_OK;
 }
 
-static int get_ambiqmicro_info(struct flash_bank *bank, char *buf, int buf_size)
+static int get_ambiqmicro_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct ambiqmicro_flash_bank *ambiqmicro_info = bank->driver_priv;
-       int printed;
        char *classname;
 
        if (!ambiqmicro_info->probed) {
@@ -178,16 +177,12 @@ static int get_ambiqmicro_info(struct flash_bank *bank, char *buf, int buf_size)
        else
                classname = ambiqmicroClassname[0];
 
-       printed = snprintf(buf,
-               buf_size,
-               "\nAmbiq Micro information: Chip is "
+       command_print_sameline(cmd, "\nAmbiq Micro information: Chip is "
                "class %d (%s) %s\n",
                ambiqmicro_info->target_class,
                classname,
                ambiqmicro_info->target_name);
 
-       if ((printed < 0))
-               return ERROR_BUF_TOO_SMALL;
        return ERROR_OK;
 }
 
index 9c4afd4af9f0b8ff5472247da7004dcfb1140a86..e0c779a33d8c6dfffad326e88e3914d294868fb7 100644 (file)
@@ -256,7 +256,7 @@ static struct sam3_chip *get_current_sam3(struct command_invocation *cmd)
 
        t = get_current_target(cmd->ctx);
        if (!t) {
-               command_print(cmd, "No current target?");
+               command_print_sameline(cmd, "No current target?\n");
                return NULL;
        }
 
@@ -264,7 +264,7 @@ static struct sam3_chip *get_current_sam3(struct command_invocation *cmd)
        if (!p) {
                /* this should not happen */
                /* the command is not registered until the chip is created? */
-               command_print(cmd, "No SAM3 chips exist?");
+               command_print_sameline(cmd, "No SAM3 chips exist?\n");
                return NULL;
        }
 
@@ -273,7 +273,7 @@ static struct sam3_chip *get_current_sam3(struct command_invocation *cmd)
                        return p;
                p = p->next;
        }
-       command_print(cmd, "Cannot find SAM3 chip?");
+       command_print_sameline(cmd, "Cannot find SAM3 chip?\n");
        return NULL;
 }
 
index d4326e43aedeb8b2e78ca513e3dde35b53ca809b..b7ae7f69132ffb9009815d19a28944910e4548e5 100644 (file)
@@ -235,7 +235,7 @@ static struct sam4_chip *get_current_sam4(struct command_invocation *cmd)
 
        t = get_current_target(cmd->ctx);
        if (!t) {
-               command_print(cmd, "No current target?");
+               command_print_sameline(cmd, "No current target?\n");
                return NULL;
        }
 
@@ -243,7 +243,7 @@ static struct sam4_chip *get_current_sam4(struct command_invocation *cmd)
        if (!p) {
                /* this should not happen */
                /* the command is not registered until the chip is created? */
-               command_print(cmd, "No SAM4 chips exist?");
+               command_print_sameline(cmd, "No SAM4 chips exist?\n");
                return NULL;
        }
 
@@ -252,7 +252,7 @@ static struct sam4_chip *get_current_sam4(struct command_invocation *cmd)
                        return p;
                p = p->next;
        }
-       command_print(cmd, "Cannot find SAM4 chip?");
+       command_print_sameline(cmd, "Cannot find SAM4 chip?\n");
        return NULL;
 }
 
@@ -2656,19 +2656,16 @@ static int sam4_GetDetails(struct sam4_bank_private *pPrivate)
        return ERROR_OK;
 }
 
-static int sam4_info(struct flash_bank *bank, char *buf, int buf_size)
+static int sam4_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct sam4_bank_private *pPrivate;
        int k = bank->size / 1024;
 
        pPrivate = get_sam4_bank_private(bank);
-       if (pPrivate == NULL) {
-               buf[0] = '\0';
+       if (pPrivate == NULL)
                return ERROR_FAIL;
-       }
 
-       snprintf(buf, buf_size,
-               "%s bank %d: %d kB at " TARGET_ADDR_FMT,
+       command_print_sameline(cmd, "%s bank %d: %d kB at " TARGET_ADDR_FMT,
                pPrivate->pChip->details.name,
                pPrivate->bank_number,
                k,
index 3d8fee1afe0ab7a591aad667fd3c29b163844d73..88f489f606c0dc11d582875514d5b64205bbcd6a 100644 (file)
@@ -978,23 +978,17 @@ static int at91sam7_probe(struct flash_bank *bank)
        return ERROR_OK;
 }
 
-static int get_at91sam7_info(struct flash_bank *bank, char *buf, int buf_size)
+static int get_at91sam7_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
-       int printed;
        struct at91sam7_flash_bank *at91sam7_info = bank->driver_priv;
 
        if (at91sam7_info->cidr == 0)
                return ERROR_FLASH_BANK_NOT_PROBED;
 
-       printed = snprintf(buf, buf_size,
-                       "\n at91sam7 driver information: Chip is %s\n",
+       command_print_sameline(cmd, "\n at91sam7 driver information: Chip is %s\n",
                        at91sam7_info->target_name);
 
-       buf += printed;
-       buf_size -= printed;
-
-       printed = snprintf(buf,
-                       buf_size,
+       command_print_sameline(cmd,
                        " Cidr: 0x%8.8" PRIx32 " | Arch: 0x%4.4x | Eproc: %s | Version: 0x%3.3x | "
                        "Flashsize: 0x%8.8" PRIx32 "\n",
                        at91sam7_info->cidr,
@@ -1003,31 +997,20 @@ static int get_at91sam7_info(struct flash_bank *bank, char *buf, int buf_size)
                        at91sam7_info->cidr_version,
                        bank->size);
 
-       buf += printed;
-       buf_size -= printed;
-
-       printed = snprintf(buf, buf_size,
-                       " Master clock (estimated): %u KHz | External clock: %u KHz\n",
+       command_print_sameline(cmd,
+                       " Master clock (estimated): %u kHz | External clock: %u kHz\n",
                        (unsigned)(at91sam7_info->mck_freq / 1000),
                        (unsigned)(at91sam7_info->ext_freq / 1000));
 
-       buf += printed;
-       buf_size -= printed;
-
-       printed = snprintf(buf,
-                       buf_size,
+       command_print_sameline(cmd,
                        " Pagesize: %i bytes | Lockbits(%u): %i 0x%4.4x | Pages in lock region: %i\n",
                        at91sam7_info->pagesize,
                        bank->num_sectors,
                        at91sam7_info->num_lockbits_on,
                        at91sam7_info->lockbits,
-                       at91sam7_info->pages_per_sector*at91sam7_info->num_lockbits_on);
-
-       buf += printed;
-       buf_size -= printed;
+                       at91sam7_info->pages_per_sector * at91sam7_info->num_lockbits_on);
 
-       snprintf(buf, buf_size,
-               " Securitybit: %i | Nvmbits(%i): %i 0x%1.1x\n",
+       command_print_sameline(cmd, " Securitybit: %i | Nvmbits(%i): %i 0x%1.1x\n",
                at91sam7_info->securitybit, at91sam7_info->num_nvmbits,
                at91sam7_info->num_nvmbits_on, at91sam7_info->nvmbits);
 
index 9a4595f6d1134d62963686c3b674f4b4ed2991a1..394b6dda06e8f7ae9241f8a1fb2758b2a3ae14d6 100644 (file)
@@ -875,17 +875,16 @@ static int ath79_protect_check(struct flash_bank *bank)
        return ERROR_OK;
 }
 
-static int get_ath79_info(struct flash_bank *bank, char *buf, int buf_size)
+static int get_ath79_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct ath79_flash_bank *ath79_info = bank->driver_priv;
 
        if (!ath79_info->probed) {
-               snprintf(buf, buf_size,
-                        "\nATH79 flash bank not probed yet\n");
+               command_print_sameline(cmd, "\nATH79 flash bank not probed yet\n");
                return ERROR_OK;
        }
 
-       snprintf(buf, buf_size, "\nATH79 flash information:\n"
+       command_print_sameline(cmd, "\nATH79 flash information:\n"
                "  Device \'%s\' (ID 0x%08" PRIx32 ")\n",
                ath79_info->dev->name, ath79_info->dev->device_id);
 
index 8f1450bf7fd6c03bb162a8c556eeb074e37628de..f70e5d01074ad9cd4be8e98bd6dbf420c8fdfda6 100644 (file)
@@ -607,7 +607,7 @@ static int samv_write(struct flash_bank *bank, const uint8_t *buffer,
        return ERROR_OK;
 }
 
-static int samv_get_info(struct flash_bank *bank, char *buf, int buf_size)
+static int samv_get_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct samv_flash_bank *samv_info = bank->driver_priv;
        if (!samv_info->probed) {
@@ -615,7 +615,7 @@ static int samv_get_info(struct flash_bank *bank, char *buf, int buf_size)
                if (ERROR_OK != r)
                        return r;
        }
-       snprintf(buf, buf_size, "Cortex-M7 detected with %" PRIu32 " kB flash",
+       command_print_sameline(cmd, "Cortex-M7 detected with %" PRIu32 " kB flash\n",
                        bank->size / 1024);
        return ERROR_OK;
 }
index dd3d077a09a6a5297a544aafa20daed99212a694..46621e99f100dfb61ae5b6921f9006a8fa6b1a4b 100644 (file)
@@ -367,7 +367,7 @@ static int avrf_auto_probe(struct flash_bank *bank)
        return avrf_probe(bank);
 }
 
-static int avrf_info(struct flash_bank *bank, char *buf, int buf_size)
+static int avrf_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct target *target = bank->target;
        struct avr_common *avr = target->arch_info;
@@ -400,12 +400,12 @@ static int avrf_info(struct flash_bank *bank, char *buf, int buf_size)
 
        if (avr_info != NULL) {
                /* chip found */
-               snprintf(buf, buf_size, "%s - Rev: 0x%" PRIx32 "", avr_info->name,
+               command_print_sameline(cmd, "%s - Rev: 0x%" PRIx32 "", avr_info->name,
                        EXTRACT_VER(device_id));
                return ERROR_OK;
        } else {
                /* chip not supported */
-               snprintf(buf, buf_size, "Cannot identify target as a avr\n");
+               command_print_sameline(cmd, "Cannot identify target as a avr\n");
                return ERROR_FLASH_OPERATION_FAILED;
        }
 }
index cf968cb8c2a35bee97ec03bac2615acfec66e414..f533d54e9c01e8804eb4f7076412b3e6ed862654 100644 (file)
@@ -429,7 +429,7 @@ static int bluenrgx_auto_probe(struct flash_bank *bank)
 }
 
 /* This method must return a string displaying information about the bank */
-static int bluenrgx_get_info(struct flash_bank *bank, char *buf, int buf_size)
+static int bluenrgx_get_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct bluenrgx_flash_bank *bluenrgx_info = bank->driver_priv;
        int mask_number, cut_number;
@@ -437,8 +437,7 @@ static int bluenrgx_get_info(struct flash_bank *bank, char *buf, int buf_size)
        if (!bluenrgx_info->probed) {
                int retval = bluenrgx_probe(bank);
                if (retval != ERROR_OK) {
-                       snprintf(buf, buf_size,
-                                "Unable to find bank information.");
+                       command_print_sameline(cmd, "Unable to find bank information.");
                        return retval;
                }
        }
@@ -446,8 +445,8 @@ static int bluenrgx_get_info(struct flash_bank *bank, char *buf, int buf_size)
        mask_number = (bluenrgx_info->die_id >> 4) & 0xF;
        cut_number = bluenrgx_info->die_id & 0xF;
 
-       snprintf(buf, buf_size,
-                "%s - Rev: %d.%d", bluenrgx_info->flash_ptr->part_name, mask_number, cut_number);
+       command_print_sameline(cmd, "%s - Rev: %d.%d",
+                       bluenrgx_info->flash_ptr->part_name, mask_number, cut_number);
        return ERROR_OK;
 }
 
index 5565aeb41fc8751451ef5a5500b7defa5050b33a..4d58daad852913a8edc4d205386e359c158f8c49 100644 (file)
@@ -498,10 +498,9 @@ static int cc26xx_auto_probe(struct flash_bank *bank)
        return retval;
 }
 
-static int cc26xx_info(struct flash_bank *bank, char *buf, int buf_size)
+static int cc26xx_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct cc26xx_bank *cc26xx_bank = bank->driver_priv;
-       int printed = 0;
        const char *device;
 
        switch (cc26xx_bank->device_type) {
@@ -526,13 +525,10 @@ static int cc26xx_info(struct flash_bank *bank, char *buf, int buf_size)
                        break;
        }
 
-       printed = snprintf(buf, buf_size,
+       command_print_sameline(cmd,
                "%s device: ICEPick ID 0x%08" PRIx32 ", USER ID 0x%08" PRIx32 "\n",
                device, cc26xx_bank->icepick_id, cc26xx_bank->user_id);
 
-       if (printed >= buf_size)
-               return ERROR_BUF_TOO_SMALL;
-
        return ERROR_OK;
 }
 
index 5427bd3a9b3bff6303ad52b99d79febedbb8a291..1d01ba3be3aea4d56d243fa812d58078b912f54d 100644 (file)
@@ -477,15 +477,9 @@ static int cc3220sf_auto_probe(struct flash_bank *bank)
        return retval;
 }
 
-static int cc3220sf_info(struct flash_bank *bank, char *buf, int buf_size)
+static int cc3220sf_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
-       int printed;
-
-       printed = snprintf(buf, buf_size, "CC3220SF with 1MB internal flash\n");
-
-       if (printed >= buf_size)
-               return ERROR_BUF_TOO_SMALL;
-
+       command_print_sameline(cmd, "CC3220SF with 1MB internal flash\n");
        return ERROR_OK;
 }
 
index c9eb38b9b5e1172b526009508411453cbd7a9b5d..6663169323560bc416d3397e5f294b8d7c526f1a 100644 (file)
@@ -728,79 +728,57 @@ static int cfi_read_0002_pri_ext(struct flash_bank *bank)
                return cfi_read_spansion_pri_ext(bank);
 }
 
-static int cfi_spansion_info(struct flash_bank *bank, char *buf, int buf_size)
+static int cfi_spansion_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
-       int printed;
        struct cfi_flash_bank *cfi_info = bank->driver_priv;
        struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
 
-       printed = snprintf(buf, buf_size, "\nSpansion primary algorithm extend information:\n");
-       buf += printed;
-       buf_size -= printed;
+       command_print_sameline(cmd, "\nSpansion primary algorithm extend information:\n");
 
-       printed = snprintf(buf, buf_size, "pri: '%c%c%c', version: %c.%c\n", pri_ext->pri[0],
-                       pri_ext->pri[1], pri_ext->pri[2],
+       command_print_sameline(cmd, "pri: '%c%c%c', version: %c.%c\n",
+                       pri_ext->pri[0], pri_ext->pri[1], pri_ext->pri[2],
                        pri_ext->major_version, pri_ext->minor_version);
-       buf += printed;
-       buf_size -= printed;
 
-       printed = snprintf(buf, buf_size, "Silicon Rev.: 0x%x, Address Sensitive unlock: 0x%x\n",
+       command_print_sameline(cmd, "Silicon Rev.: 0x%x, Address Sensitive unlock: 0x%x\n",
                        (pri_ext->SiliconRevision) >> 2,
                        (pri_ext->SiliconRevision) & 0x03);
-       buf += printed;
-       buf_size -= printed;
 
-       printed = snprintf(buf, buf_size, "Erase Suspend: 0x%x, Sector Protect: 0x%x\n",
+       command_print_sameline(cmd, "Erase Suspend: 0x%x, Sector Protect: 0x%x\n",
                        pri_ext->EraseSuspend,
                        pri_ext->BlkProt);
-       buf += printed;
-       buf_size -= printed;
 
-       snprintf(buf, buf_size, "VppMin: %u.%x, VppMax: %u.%x\n",
+       command_print_sameline(cmd, "VppMin: %u.%x, VppMax: %u.%x\n",
                (pri_ext->VppMin & 0xf0) >> 4, pri_ext->VppMin & 0x0f,
                (pri_ext->VppMax & 0xf0) >> 4, pri_ext->VppMax & 0x0f);
 
        return ERROR_OK;
 }
 
-static int cfi_intel_info(struct flash_bank *bank, char *buf, int buf_size)
+static int cfi_intel_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
-       int printed;
        struct cfi_flash_bank *cfi_info = bank->driver_priv;
        struct cfi_intel_pri_ext *pri_ext = cfi_info->pri_ext;
 
-       printed = snprintf(buf, buf_size, "\nintel primary algorithm extend information:\n");
-       buf += printed;
-       buf_size -= printed;
+       command_print_sameline(cmd, "\nintel primary algorithm extend information:\n");
 
-       printed = snprintf(buf,
-                       buf_size,
-                       "pri: '%c%c%c', version: %c.%c\n",
+       command_print_sameline(cmd, "pri: '%c%c%c', version: %c.%c\n",
                        pri_ext->pri[0],
                        pri_ext->pri[1],
                        pri_ext->pri[2],
                        pri_ext->major_version,
                        pri_ext->minor_version);
-       buf += printed;
-       buf_size -= printed;
 
-       printed = snprintf(buf,
-                       buf_size,
-                       "feature_support: 0x%" PRIx32 ", "
+       command_print_sameline(cmd, "feature_support: 0x%" PRIx32 ", "
                        "suspend_cmd_support: 0x%x, blk_status_reg_mask: 0x%x\n",
                        pri_ext->feature_support,
                        pri_ext->suspend_cmd_support,
                        pri_ext->blk_status_reg_mask);
-       buf += printed;
-       buf_size -= printed;
 
-       printed = snprintf(buf, buf_size, "Vcc opt: %x.%x, Vpp opt: %u.%x\n",
+       command_print_sameline(cmd, "Vcc opt: %x.%x, Vpp opt: %u.%x\n",
                        (pri_ext->vcc_optimal & 0xf0) >> 4, pri_ext->vcc_optimal & 0x0f,
                        (pri_ext->vpp_optimal & 0xf0) >> 4, pri_ext->vpp_optimal & 0x0f);
-       buf += printed;
-       buf_size -= printed;
 
-       snprintf(buf, buf_size, "protection_fields: %i, prot_reg_addr: 0x%x, "
+       command_print_sameline(cmd, "protection_fields: %i, prot_reg_addr: 0x%x, "
                "factory pre-programmed: %i, user programmable: %i\n",
                pri_ext->num_protection_fields, pri_ext->prot_reg_addr,
                1 << pri_ext->fact_prot_reg_size, 1 << pri_ext->user_prot_reg_size);
@@ -2992,45 +2970,36 @@ int cfi_protect_check(struct flash_bank *bank)
        return ERROR_OK;
 }
 
-int cfi_get_info(struct flash_bank *bank, char *buf, int buf_size)
+int cfi_get_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
-       int printed;
        struct cfi_flash_bank *cfi_info = bank->driver_priv;
 
        if (cfi_info->qry[0] == 0xff) {
-               snprintf(buf, buf_size, "\ncfi flash bank not probed yet\n");
+               command_print_sameline(cmd, "\ncfi flash bank not probed yet\n");
                return ERROR_OK;
        }
 
        if (!cfi_info->not_cfi)
-               printed = snprintf(buf, buf_size, "\nCFI flash: ");
+               command_print_sameline(cmd, "\nCFI flash: ");
        else
-               printed = snprintf(buf, buf_size, "\nnon-CFI flash: ");
-       buf += printed;
-       buf_size -= printed;
+               command_print_sameline(cmd, "\nnon-CFI flash: ");
 
-       printed = snprintf(buf, buf_size, "mfr: 0x%4.4x, id:0x%4.4x\n\n",
+       command_print_sameline(cmd, "mfr: 0x%4.4x, id:0x%4.4x\n",
                        cfi_info->manufacturer, cfi_info->device_id);
-       buf += printed;
-       buf_size -= printed;
 
-       printed = snprintf(buf, buf_size, "qry: '%c%c%c', pri_id: 0x%4.4x, pri_addr: "
+       command_print_sameline(cmd, "qry: '%c%c%c', pri_id: 0x%4.4x, pri_addr: "
                        "0x%4.4x, alt_id: 0x%4.4x, alt_addr: 0x%4.4x\n",
                        cfi_info->qry[0], cfi_info->qry[1], cfi_info->qry[2],
                        cfi_info->pri_id, cfi_info->pri_addr, cfi_info->alt_id, cfi_info->alt_addr);
-       buf += printed;
-       buf_size -= printed;
 
-       printed = snprintf(buf, buf_size, "Vcc min: %x.%x, Vcc max: %x.%x, "
+       command_print_sameline(cmd, "Vcc min: %x.%x, Vcc max: %x.%x, "
                        "Vpp min: %u.%x, Vpp max: %u.%x\n",
                        (cfi_info->vcc_min & 0xf0) >> 4, cfi_info->vcc_min & 0x0f,
                        (cfi_info->vcc_max & 0xf0) >> 4, cfi_info->vcc_max & 0x0f,
                        (cfi_info->vpp_min & 0xf0) >> 4, cfi_info->vpp_min & 0x0f,
                        (cfi_info->vpp_max & 0xf0) >> 4, cfi_info->vpp_max & 0x0f);
-       buf += printed;
-       buf_size -= printed;
 
-       printed = snprintf(buf, buf_size, "typ. word write timeout: %u us, "
+       command_print_sameline(cmd, "typ. word write timeout: %u us, "
                        "typ. buf write timeout: %u us, "
                        "typ. block erase timeout: %u ms, "
                        "typ. chip erase timeout: %u ms\n",
@@ -3038,12 +3007,8 @@ int cfi_get_info(struct flash_bank *bank, char *buf, int buf_size)
                        1 << cfi_info->buf_write_timeout_typ,
                        1 << cfi_info->block_erase_timeout_typ,
                        1 << cfi_info->chip_erase_timeout_typ);
-       buf += printed;
-       buf_size -= printed;
 
-       printed = snprintf(buf,
-                       buf_size,
-                       "max. word write timeout: %u us, "
+       command_print_sameline(cmd, "max. word write timeout: %u us, "
                        "max. buf write timeout: %u us, max. "
                        "block erase timeout: %u ms, max. chip erase timeout: %u ms\n",
                        (1 <<
@@ -3056,24 +3021,20 @@ int cfi_get_info(struct flash_bank *bank, char *buf, int buf_size)
                        (1 <<
                         cfi_info->chip_erase_timeout_max) *
                        (1 << cfi_info->chip_erase_timeout_typ));
-       buf += printed;
-       buf_size -= printed;
 
-       printed = snprintf(buf, buf_size, "size: 0x%" PRIx32 ", interface desc: %i, "
+       command_print_sameline(cmd, "size: 0x%" PRIx32 ", interface desc: %i, "
                        "max buffer write size: 0x%x\n",
                        cfi_info->dev_size,
                        cfi_info->interface_desc,
                        1 << cfi_info->max_buf_write_size);
-       buf += printed;
-       buf_size -= printed;
 
        switch (cfi_info->pri_id) {
            case 1:
            case 3:
-                   cfi_intel_info(bank, buf, buf_size);
+                   cfi_intel_info(bank, cmd);
                    break;
            case 2:
-                   cfi_spansion_info(bank, buf, buf_size);
+                   cfi_spansion_info(bank, cmd);
                    break;
            default:
                    LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
index eceb9a4b3c2895c523432bef4a71d8fee6a54955..80633f49400d176cf9c8e09c5b7d8eac52b1e7ac 100644 (file)
@@ -160,7 +160,7 @@ int cfi_protect(struct flash_bank *bank, int set, unsigned int first,
 int cfi_probe(struct flash_bank *bank);
 int cfi_auto_probe(struct flash_bank *bank);
 int cfi_protect_check(struct flash_bank *bank);
-int cfi_get_info(struct flash_bank *bank, char *buf, int buf_size);
+int cfi_get_info(struct flash_bank *bank, struct command_invocation *cmd);
 int cfi_flash_bank_cmd(struct flash_bank *bank, unsigned int argc, const char **argv);
 
 uint32_t cfi_flash_address(struct flash_bank *bank, int sector, uint32_t offset);
index e29d4f5280a5f50cedadad0bbc1ff4744c31062c..7a5be65174a7876acc9fad8df00c4dd286470d0d 100644 (file)
@@ -205,15 +205,14 @@ struct flash_driver {
 
        /**
         * Display human-readable information about the flash
-        * bank into the given buffer.  Drivers must be careful to avoid
-        * overflowing the buffer.
+        * bank.
         *
         * @param bank - the bank to get info about
-        * @param char - where to put the text for the human to read
-        * @param buf_size - the size of the human buffer.
+        * @param cmd - command invocation instance for which to generate
+        *              the textual output
         * @returns ERROR_OK if successful; otherwise, an error code.
         */
-       int (*info)(struct flash_bank *bank, char *buf, int buf_size);
+       int (*info)(struct flash_bank *bank, struct command_invocation *cmd);
 
        /**
         * A more gentle flavor of flash_driver_s::probe, performing
index 6f290076241da781741f0eb39fb2c44fa02d275b..6461e4c7257521494ba7e9b2fa9c12c5d40959e1 100644 (file)
@@ -324,23 +324,7 @@ static int efm32x_read_info(struct flash_bank *bank,
        return ERROR_OK;
 }
 
-/*
- * Helper to create a human friendly string describing a part
- */
-static int efm32x_decode_info(struct efm32_info *info, char *buf, int buf_size)
-{
-       int printed = 0;
-       printed = snprintf(buf, buf_size, "%s Gecko, rev %d",
-                       info->family_data->name, info->prod_rev);
-
-       if (printed >= buf_size)
-               return ERROR_BUF_TOO_SMALL;
-
-       return ERROR_OK;
-}
-
-/* flash bank efm32 <base> <size> 0 0 <target#>
- */
+/* flash bank efm32 <base> <size> 0 0 <target#> */
 FLASH_BANK_COMMAND_HANDLER(efm32x_flash_bank_command)
 {
        struct efm32x_flash_bank *efm32x_info;
@@ -961,7 +945,6 @@ static int efm32x_probe(struct flash_bank *bank)
        struct efm32_info efm32_mcu_info;
        int ret;
        uint32_t base_address = 0x00000000;
-       char buf[256];
 
        efm32x_info->probed = false;
        memset(efm32x_info->lb_page, 0xff, LOCKBITS_PAGE_SZ);
@@ -970,11 +953,8 @@ static int efm32x_probe(struct flash_bank *bank)
        if (ERROR_OK != ret)
                return ret;
 
-       ret = efm32x_decode_info(&efm32_mcu_info, buf, sizeof(buf));
-       if (ERROR_OK != ret)
-               return ret;
-
-       LOG_INFO("detected part: %s", buf);
+       LOG_INFO("detected part: %s Gecko, rev %d",
+                       efm32_mcu_info.family_data->name, efm32_mcu_info.prod_rev);
        LOG_INFO("flash size = %dkbytes", efm32_mcu_info.flash_sz_kib);
        LOG_INFO("flash page size = %dbytes", efm32_mcu_info.page_size);
 
@@ -1044,10 +1024,10 @@ static int efm32x_protect_check(struct flash_bank *bank)
        return ERROR_OK;
 }
 
-static int get_efm32x_info(struct flash_bank *bank, char *buf, int buf_size)
+static int get_efm32x_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct efm32_info info;
-       int ret = 0;
+       int ret;
 
        ret = efm32x_read_info(bank, &info);
        if (ERROR_OK != ret) {
@@ -1055,7 +1035,8 @@ static int get_efm32x_info(struct flash_bank *bank, char *buf, int buf_size)
                return ret;
        }
 
-       return efm32x_decode_info(&info, buf, buf_size);
+       command_print_sameline(cmd, "%s Gecko, rev %d", info.family_data->name, info.prod_rev);
+       return ERROR_OK;
 }
 
 COMMAND_HANDLER(efm32x_handle_debuglock_command)
index 24e8117045d86cd4be8ca0c5b26a10fa4e28d722..23fd01e55a30b74a4770850e96deab5bbe3f54fe 100644 (file)
@@ -487,11 +487,11 @@ static int esirisc_flash_auto_probe(struct flash_bank *bank)
        return esirisc_flash_probe(bank);
 }
 
-static int esirisc_flash_info(struct flash_bank *bank, char *buf, int buf_size)
+static int esirisc_flash_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct esirisc_flash_bank *esirisc_info = bank->driver_priv;
 
-       snprintf(buf, buf_size,
+       command_print_sameline(cmd,
                        "%4s cfg at 0x%" PRIx32 ", clock %" PRIu32 ", wait_states %" PRIu32,
                        "",     /* align with first line */
                        esirisc_info->cfg,
index d6c6b2dae0326d73b921c1cba12ef95ec1372403..ed278b42402e77b6d7f07adb26d2bc95ce48c44b 100644 (file)
@@ -92,9 +92,9 @@ static int faux_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t o
        return ERROR_OK;
 }
 
-static int faux_info(struct flash_bank *bank, char *buf, int buf_size)
+static int faux_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
-       snprintf(buf, buf_size, "faux flash driver");
+       command_print_sameline(cmd, "faux flash driver");
        return ERROR_OK;
 }
 
index 02630ac24fa521e30b0ae68d187871e3fdaef895..0a14c5092fb394873200608232136308414e3c5e 100644 (file)
@@ -1017,17 +1017,16 @@ static int fespi_protect_check(struct flash_bank *bank)
        return ERROR_OK;
 }
 
-static int get_fespi_info(struct flash_bank *bank, char *buf, int buf_size)
+static int get_fespi_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct fespi_flash_bank *fespi_info = bank->driver_priv;
 
        if (!(fespi_info->probed)) {
-               snprintf(buf, buf_size,
-                               "\nFESPI flash bank not probed yet\n");
+               command_print_sameline(cmd, "\nFESPI flash bank not probed yet\n");
                return ERROR_OK;
        }
 
-       snprintf(buf, buf_size, "\nFESPI flash information:\n"
+       command_print_sameline(cmd, "\nFESPI flash information:\n"
                        "  Device \'%s\' (ID 0x%08" PRIx32 ")\n",
                        fespi_info->dev->name, fespi_info->dev->device_id);
 
index 211a008637f35451f83fcdccf7c53127d2fcf6f5..2c51e007f13a7126e5f6f92d0928751419e448f5 100644 (file)
@@ -539,7 +539,7 @@ static int fm4_auto_probe(struct flash_bank *bank)
        return fm4_probe(bank);
 }
 
-static int fm4_get_info_command(struct flash_bank *bank, char *buf, int buf_size)
+static int fm4_get_info_command(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct fm4_flash_bank *fm4_bank = bank->driver_priv;
        const char *name;
@@ -586,11 +586,10 @@ static int fm4_get_info_command(struct flash_bank *bank, char *buf, int buf_size
        case s6e2cx8:
        case s6e2cx9:
        case s6e2cxa:
-               snprintf(buf, buf_size, "%s MainFlash Macro #%i",
-                       name, fm4_bank->macro_nr);
+               command_print_sameline(cmd, "%s MainFlash Macro #%i", name, fm4_bank->macro_nr);
                break;
        default:
-               snprintf(buf, buf_size, "%s MainFlash", name);
+               command_print_sameline(cmd, "%s MainFlash", name);
                break;
        }
 
index 20362f38423bd1ef4925546e7e92fe6c3c3978b1..f40efe84fa0d496eb98653e2b34eef996460129a 100644 (file)
@@ -421,16 +421,16 @@ static int jtagspi_write(struct flash_bank *bank, const uint8_t *buffer, uint32_
        return ERROR_OK;
 }
 
-static int jtagspi_info(struct flash_bank *bank, char *buf, int buf_size)
+static int jtagspi_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct jtagspi_flash_bank *info = bank->driver_priv;
 
        if (!(info->probed)) {
-               snprintf(buf, buf_size, "\nJTAGSPI flash bank not probed yet\n");
+               command_print_sameline(cmd, "\nJTAGSPI flash bank not probed yet\n");
                return ERROR_OK;
        }
 
-       snprintf(buf, buf_size, "\nSPIFI flash information:\n"
+       command_print_sameline(cmd, "\nSPIFI flash information:\n"
                "  Device \'%s\' (ID 0x%08" PRIx32 ")\n",
                info->dev->name, info->dev->device_id);
 
index 1fee6eb2e32c9c160dde471436c6b88be7792537..45046d6072463f80054c4ae69a99784c1ca23756 100644 (file)
@@ -2778,7 +2778,7 @@ static int kinetis_auto_probe(struct flash_bank *bank)
        return kinetis_probe(bank);
 }
 
-static int kinetis_info(struct flash_bank *bank, char *buf, int buf_size)
+static int kinetis_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        const char *bank_class_names[] = {
                "(ANY)", "PFlash", "FlexNVM", "FlexRAM"
@@ -2788,7 +2788,7 @@ static int kinetis_info(struct flash_bank *bank, char *buf, int buf_size)
        struct kinetis_chip *k_chip = k_bank->k_chip;
        uint32_t size_k = bank->size / 1024;
 
-       snprintf(buf, buf_size,
+       command_print_sameline(cmd,
                "%s %s: %" PRIu32 "k %s bank %s at " TARGET_ADDR_FMT,
                bank->driver->name, k_chip->name,
                size_k, bank_class_names[k_bank->flash_class],
index 5aba7fc644c12db519ceef420aa7b8a16b563bd8..0d094b5f9eec5500e4aa9439ab313c11aa1e63e5 100644 (file)
@@ -1171,10 +1171,9 @@ static int kinetis_ke_auto_probe(struct flash_bank *bank)
        return kinetis_ke_probe(bank);
 }
 
-static int kinetis_ke_info(struct flash_bank *bank, char *buf, int buf_size)
+static int kinetis_ke_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
-       (void) snprintf(buf, buf_size,
-                       "%s driver for flash bank %s at " TARGET_ADDR_FMT,
+       command_print_sameline(cmd, "%s driver for flash bank %s at " TARGET_ADDR_FMT,
                        bank->driver->name,     bank->name, bank->base);
 
        return ERROR_OK;
index 3ad62d669d872b7e27a7ba8a28bc607f75601ab6..09b5c6aec71f34dc0c573cf2ef5e39fc3547d80f 100644 (file)
@@ -1552,12 +1552,12 @@ static int lpc2000_erase_check(struct flash_bank *bank)
        return lpc2000_iap_blank_check(bank, 0, bank->num_sectors - 1);
 }
 
-static int get_lpc2000_info(struct flash_bank *bank, char *buf, int buf_size)
+static int get_lpc2000_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct lpc2000_flash_bank *lpc2000_info = bank->driver_priv;
 
-       snprintf(buf, buf_size, "lpc2000 flash driver variant: %i, clk: %" PRIu32 "kHz", lpc2000_info->variant,
-                       lpc2000_info->cclk);
+       command_print_sameline(cmd, "lpc2000 flash driver variant: %i, clk: %" PRIu32 "kHz",
+                       lpc2000_info->variant, lpc2000_info->cclk);
 
        return ERROR_OK;
 }
index dd1c63d747cd1a3a8f66ea9ec8f0d54dfe3a30ec..c99ce8d4c8305a7556774c56b2cbc5a3227bfd44 100644 (file)
@@ -926,17 +926,16 @@ static int lpcspifi_protect_check(struct flash_bank *bank)
        return ERROR_OK;
 }
 
-static int get_lpcspifi_info(struct flash_bank *bank, char *buf, int buf_size)
+static int get_lpcspifi_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct lpcspifi_flash_bank *lpcspifi_info = bank->driver_priv;
 
        if (!(lpcspifi_info->probed)) {
-               snprintf(buf, buf_size,
-                       "\nSPIFI flash bank not probed yet\n");
+               command_print_sameline(cmd, "\nSPIFI flash bank not probed yet\n");
                return ERROR_OK;
        }
 
-       snprintf(buf, buf_size, "\nSPIFI flash information:\n"
+       command_print_sameline(cmd, "\nSPIFI flash information:\n"
                "  Device \'%s\' (ID 0x%08" PRIx32 ")\n",
                lpcspifi_info->dev->name, lpcspifi_info->dev->device_id);
 
index 586a73b1d480ba5ad77febc6a7e9cf36ec0f3020..33d7868894a60a70ca66cc32508e6e53000457b0 100644 (file)
@@ -113,17 +113,14 @@ FLASH_BANK_COMMAND_HANDLER(max32xxx_flash_bank_command)
        return ERROR_OK;
 }
 
-static int get_info(struct flash_bank *bank, char *buf, int buf_size)
+static int get_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
-       int printed;
        struct max32xxx_flash_bank *info = bank->driver_priv;
 
        if (!info->probed)
                return ERROR_FLASH_BANK_NOT_PROBED;
 
-       printed = snprintf(buf, buf_size, "\nMaxim Integrated max32xxx flash driver\n");
-       buf += printed;
-       buf_size -= printed;
+       command_print_sameline(cmd, "\nMaxim Integrated max32xxx flash driver\n");
        return ERROR_OK;
 }
 
index 2518c229b25d1320118a05f486c4dd19cc8c07a1..e8484199ae3ce502502a1244469cff4605000fc6 100644 (file)
@@ -597,11 +597,11 @@ static int mdr_auto_probe(struct flash_bank *bank)
        return mdr_probe(bank);
 }
 
-static int get_mdr_info(struct flash_bank *bank, char *buf, int buf_size)
+static int get_mdr_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct mdr_flash_bank *mdr_info = bank->driver_priv;
-       snprintf(buf, buf_size, "MDR32Fx - %s",
-                mdr_info->mem_type ? "info memory" : "main memory");
+       command_print_sameline(cmd, "MDR32Fx - %s",
+                       mdr_info->mem_type ? "info memory" : "main memory");
 
        return ERROR_OK;
 }
index b98c49dbc09d5c0320a451d7652069e595819e59..44de98907fde1b59f66b79ccbb030a3ba67cd9d7 100644 (file)
@@ -914,17 +914,16 @@ static int mrvlqspi_flash_erase_check(struct flash_bank *bank)
        return ERROR_OK;
 }
 
-static int mrvlqspi_get_info(struct flash_bank *bank, char *buf, int buf_size)
+static int mrvlqspi_get_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct mrvlqspi_flash_bank *mrvlqspi_info = bank->driver_priv;
 
        if (!(mrvlqspi_info->probed)) {
-               snprintf(buf, buf_size,
-                       "\nQSPI flash bank not probed yet\n");
+               command_print_sameline(cmd, "\nQSPI flash bank not probed yet\n");
                return ERROR_OK;
        }
 
-       snprintf(buf, buf_size, "\nQSPI flash information:\n"
+       command_print_sameline(cmd, "\nQSPI flash information:\n"
                "  Device \'%s\' ID 0x%08" PRIx32 "\n",
                mrvlqspi_info->dev->name, mrvlqspi_info->dev->device_id);
 
index b6933e1e9bbdd5b1c3d25821592390da9a6b9c23..22f7c77a2e3ccc51996eda02cd0fac2dcbb5916a 100644 (file)
@@ -975,60 +975,50 @@ static int msp432_auto_probe(struct flash_bank *bank)
        return retval;
 }
 
-static int msp432_info(struct flash_bank *bank, char *buf, int buf_size)
+static int msp432_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct msp432_bank *msp432_bank = bank->driver_priv;
-       int printed = 0;
 
        switch (msp432_bank->device_type) {
                case MSP432P401X_DEPR:
                        if (0xFFFF == msp432_bank->device_id) {
                                /* Very early pre-production silicon currently deprecated */
-                               printed = snprintf(buf, buf_size,
-                                       "MSP432P401x pre-production device (deprecated silicon)\n"
+                               command_print_sameline(cmd, "MSP432P401x pre-production device (deprecated silicon)\n"
                                        SUPPORT_MESSAGE);
                        } else {
                                /* Revision A or B silicon, also deprecated */
-                               printed = snprintf(buf, buf_size,
-                                       "MSP432P401x Device Rev %c (deprecated silicon)\n"
+                               command_print_sameline(cmd, "MSP432P401x Device Rev %c (deprecated silicon)\n"
                                        SUPPORT_MESSAGE, (char)msp432_bank->hardware_rev);
                        }
                        break;
                case MSP432P401X:
-                       printed = snprintf(buf, buf_size,
-                               "MSP432P401x Device Rev %c\n",
+                       command_print_sameline(cmd, "MSP432P401x Device Rev %c\n",
                                (char)msp432_bank->hardware_rev);
                        break;
                case MSP432P411X:
-                       printed = snprintf(buf, buf_size,
-                               "MSP432P411x Device Rev %c\n",
+                       command_print_sameline(cmd, "MSP432P411x Device Rev %c\n",
                                (char)msp432_bank->hardware_rev);
                        break;
                case MSP432E401Y:
-                       printed = snprintf(buf, buf_size, "MSP432E401Y Device\n");
+                       command_print_sameline(cmd, "MSP432E401Y Device\n");
                        break;
                case MSP432E411Y:
-                       printed = snprintf(buf, buf_size, "MSP432E411Y Device\n");
+                       command_print_sameline(cmd, "MSP432E411Y Device\n");
                        break;
                case MSP432E4X_GUESS:
-                       printed = snprintf(buf, buf_size,
+                       command_print_sameline(cmd,
                                "Unrecognized MSP432E4 DID0 and DID1 IDs (%08" PRIX32 ", %08" PRIX32 ")",
                                msp432_bank->device_id, msp432_bank->hardware_rev);
                        break;
                case MSP432P401X_GUESS:
                case MSP432P411X_GUESS:
                default:
-                       printed = snprintf(buf, buf_size,
+                       command_print_sameline(cmd,
                                "Unrecognized MSP432P4 Device ID and Hardware Rev (%04" PRIX32 ", %02" PRIX32 ")",
                                msp432_bank->device_id, msp432_bank->hardware_rev);
                        break;
        }
 
-       buf_size -= printed;
-
-       if (0 > buf_size)
-               return ERROR_BUF_TOO_SMALL;
-
        return ERROR_OK;
 }
 
index 1831314ddd1386b3f56a69ba3d9af0a47f34ae29..d485694230a06ee4ec55a9e713436267b9947635 100644 (file)
@@ -1719,12 +1719,11 @@ static int niietcm4_auto_probe(struct flash_bank *bank)
        return niietcm4_probe(bank);
 }
 
-static int get_niietcm4_info(struct flash_bank *bank, char *buf, int buf_size)
+static int get_niietcm4_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct niietcm4_flash_bank *niietcm4_info = bank->driver_priv;
-       LOG_INFO("\nNIIET Cortex-M4F %s\n%s", niietcm4_info->chip_name, niietcm4_info->chip_brief);
-       snprintf(buf, buf_size, " ");
-
+       command_print_sameline(cmd, "\nNIIET Cortex-M4F %s\n%s",
+                       niietcm4_info->chip_name, niietcm4_info->chip_brief);
        return ERROR_OK;
 }
 
index 5e17a8c7b9aabdc95329a06c3b3b1832a8f942f0..9decbea9df42e8ad53177756828c9ce4fe0e1c83 100644 (file)
@@ -624,35 +624,42 @@ static const char *nrf5_decode_info_package(uint32_t package)
        return "xx";
 }
 
-static int nrf5_info(struct flash_bank *bank, char *buf, int buf_size)
+static int get_nrf5_chip_type_str(const struct nrf5_info *chip, char *buf, unsigned int buf_size)
 {
-       struct nrf5_bank *nbank = bank->driver_priv;
-       struct nrf5_info *chip = nbank->chip;
        int res;
-
        if (chip->spec) {
-               res = snprintf(buf, buf_size,
-                               "nRF%s-%s(build code: %s)",
+               res = snprintf(buf, buf_size, "nRF%s-%s(build code: %s)",
                                chip->spec->part, chip->spec->variant, chip->spec->build_code);
-
        } else if (chip->ficr_info_valid) {
                char variant[5];
                nrf5_info_variant_to_str(chip->ficr_info.variant, variant);
-               res = snprintf(buf, buf_size,
-                               "nRF%" PRIx32 "-%s%.2s(build code: %s)",
+               res = snprintf(buf, buf_size, "nRF%" PRIx32 "-%s%.2s(build code: %s)",
                                chip->ficr_info.part,
                                nrf5_decode_info_package(chip->ficr_info.package),
                                variant, &variant[2]);
-
        } else {
-               res = snprintf(buf, buf_size, "nRF51xxx (HWID 0x%04" PRIx16 ")",
-                               chip->hwid);
+               res = snprintf(buf, buf_size, "nRF51xxx (HWID 0x%04" PRIx16 ")", chip->hwid);
        }
-       if (res <= 0)
+
+       /* safety: */
+       if (res <= 0 || (unsigned int)res >= buf_size) {
+               LOG_ERROR("BUG: buffer problem in %s", __func__);
                return ERROR_FAIL;
+       }
+       return ERROR_OK;
+}
 
-       snprintf(buf + res, buf_size - res, " %ukB Flash, %ukB RAM",
-                               chip->flash_size_kb, chip->ram_size_kb);
+static int nrf5_info(struct flash_bank *bank, struct command_invocation *cmd)
+{
+       struct nrf5_bank *nbank = bank->driver_priv;
+       struct nrf5_info *chip = nbank->chip;
+
+       char chip_type_str[256];
+       if (get_nrf5_chip_type_str(chip, chip_type_str, sizeof(chip_type_str)) != ERROR_OK)
+               return ERROR_FAIL;
+
+       command_print_sameline(cmd, "%s %ukB Flash, %ukB RAM",
+                       chip_type_str, chip->flash_size_kb, chip->ram_size_kb);
        return ERROR_OK;
 }
 
@@ -824,13 +831,15 @@ static int nrf5_probe(struct flash_bank *bank)
        chip->flash_size_kb = num_sectors * flash_page_size / 1024;
 
        if (!chip->bank[0].probed && !chip->bank[1].probed) {
-               char buf[80];
-               nrf5_info(bank, buf, sizeof(buf));
-               if (!chip->spec && !chip->ficr_info_valid) {
-                       LOG_INFO("Unknown device: %s", buf);
-               } else {
-                       LOG_INFO("%s", buf);
-               }
+               char chip_type_str[256];
+               if (get_nrf5_chip_type_str(chip, chip_type_str, sizeof(chip_type_str)) != ERROR_OK)
+                       return ERROR_FAIL;
+               const bool device_is_unknown = (!chip->spec && !chip->ficr_info_valid);
+               LOG_INFO("%s%s %ukB Flash, %ukB RAM",
+                               device_is_unknown ? "Unknown device: " : "",
+                               chip_type_str,
+                               chip->flash_size_kb,
+                               chip->ram_size_kb);
        }
 
        free(bank->sectors);
index c42cfb2bbe9207c2bf153ce1629b7c07d2130e8d..6844975e24795d8ab0c9b9b46b610f6b919416e6 100644 (file)
@@ -801,37 +801,35 @@ static int pic32mx_auto_probe(struct flash_bank *bank)
        return pic32mx_probe(bank);
 }
 
-static int pic32mx_info(struct flash_bank *bank, char *buf, int buf_size)
+static int pic32mx_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct target *target = bank->target;
        struct mips32_common *mips32 = target->arch_info;
        struct mips_ejtag *ejtag_info = &mips32->ejtag_info;
        uint32_t device_id;
-       int printed = 0, i;
 
        device_id = ejtag_info->idcode;
 
        if (((device_id >> 1) & 0x7ff) != PIC32MX_MANUF_ID) {
-               snprintf(buf, buf_size,
-                                "Cannot identify target as a PIC32MX family (manufacturer 0x%03x != 0x%03x)\n",
-                                (unsigned)((device_id >> 1) & 0x7ff),
-                                PIC32MX_MANUF_ID);
+               command_print_sameline(cmd,
+                               "Cannot identify target as a PIC32MX family (manufacturer 0x%03x != 0x%03x)\n",
+                               (unsigned)((device_id >> 1) & 0x7ff),
+                               PIC32MX_MANUF_ID);
                return ERROR_FLASH_OPERATION_FAILED;
        }
 
+       int i;
        for (i = 0; pic32mx_devs[i].name != NULL; i++) {
                if (pic32mx_devs[i].devid == (device_id & 0x0fffffff)) {
-                       printed = snprintf(buf, buf_size, "PIC32MX%s", pic32mx_devs[i].name);
+                       command_print_sameline(cmd, "PIC32MX%s", pic32mx_devs[i].name);
                        break;
                }
        }
 
        if (pic32mx_devs[i].name == NULL)
-               printed = snprintf(buf, buf_size, "Unknown");
+               command_print_sameline(cmd, "Unknown");
 
-       buf += printed;
-       buf_size -= printed;
-       snprintf(buf, buf_size, " Ver: 0x%02x",
+       command_print_sameline(cmd, " Ver: 0x%02x",
                        (unsigned)((device_id >> 28) & 0xf));
 
        return ERROR_OK;
index 3ca1f369c6a2984ade28f3e6fbb6d622cafb56a7..cc2521b0dd6a1d862f3b55eb4ce280020bc526f0 100644 (file)
@@ -851,7 +851,7 @@ static int psoc4_auto_probe(struct flash_bank *bank)
 }
 
 
-static int get_psoc4_info(struct flash_bank *bank, char *buf, int buf_size)
+static int get_psoc4_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct target *target = bank->target;
        struct psoc4_flash_bank *psoc4_info = bank->driver_priv;
@@ -863,35 +863,30 @@ static int get_psoc4_info(struct flash_bank *bank, char *buf, int buf_size)
        uint32_t size_in_kb = bank->size / 1024;
 
        if (target->state != TARGET_HALTED) {
-               snprintf(buf, buf_size, "%s, flash %" PRIu32 " kb"
+               command_print_sameline(cmd, "%s, flash %" PRIu32 " kb"
                        " (halt target to see details)", family->name, size_in_kb);
                return ERROR_OK;
        }
 
-       int retval;
-       int printed = 0;
        uint32_t silicon_id;
        uint16_t family_id;
        uint8_t protection;
 
-       retval = psoc4_get_silicon_id(bank, &silicon_id, &family_id, &protection);
+       int retval = psoc4_get_silicon_id(bank, &silicon_id, &family_id, &protection);
        if (retval != ERROR_OK)
                return retval;
 
        if (family_id != psoc4_info->family_id)
-               printed = snprintf(buf, buf_size, "Family id mismatch 0x%02" PRIx16
+               command_print_sameline(cmd, "Family id mismatch 0x%02" PRIx16
                        "/0x%02" PRIx16 ", silicon id 0x%08" PRIx32,
                        psoc4_info->family_id, family_id, silicon_id);
        else {
-               printed = snprintf(buf, buf_size, "%s silicon id 0x%08" PRIx32 "",
+               command_print_sameline(cmd, "%s silicon id 0x%08" PRIx32 "",
                        family->name, silicon_id);
        }
 
-       buf += printed;
-       buf_size -= printed;
-
        const char *prot_txt = psoc4_decode_chip_protection(protection);
-       snprintf(buf, buf_size, ", flash %" PRIu32 " kb %s", size_in_kb, prot_txt);
+       command_print_sameline(cmd, ", flash %" PRIu32 " kb %s", size_in_kb, prot_txt);
        return ERROR_OK;
 }
 
index c651dea7a66241373761d5edbba80ceb9edf9bba..1b268b53d80ab98b318cf6ac5a328cfebf57c724 100644 (file)
@@ -753,14 +753,14 @@ static int psoc5lp_nvl_write(struct flash_bank *bank,
 }
 
 static int psoc5lp_nvl_get_info_command(struct flash_bank *bank,
-       char *buf, int buf_size)
+       struct command_invocation *cmd)
 {
        struct psoc5lp_nvl_flash_bank *psoc_nvl_bank = bank->driver_priv;
        char part_number[PART_NUMBER_LEN];
 
        psoc5lp_get_part_number(psoc_nvl_bank->device, part_number);
 
-       snprintf(buf, buf_size, "%s", part_number);
+       command_print_sameline(cmd, "%s", part_number);
 
        return ERROR_OK;
 }
@@ -934,14 +934,14 @@ static int psoc5lp_eeprom_write(struct flash_bank *bank,
        return ERROR_OK;
 }
 
-static int psoc5lp_eeprom_get_info_command(struct flash_bank *bank, char *buf, int buf_size)
+static int psoc5lp_eeprom_get_info_command(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct psoc5lp_eeprom_flash_bank *psoc_eeprom_bank = bank->driver_priv;
        char part_number[PART_NUMBER_LEN];
 
        psoc5lp_get_part_number(psoc_eeprom_bank->device, part_number);
 
-       snprintf(buf, buf_size, "%s", part_number);
+       command_print_sameline(cmd, "%s", part_number);
 
        return ERROR_OK;
 }
@@ -1397,7 +1397,7 @@ static int psoc5lp_protect_check(struct flash_bank *bank)
        return ERROR_OK;
 }
 
-static int psoc5lp_get_info_command(struct flash_bank *bank, char *buf, int buf_size)
+static int psoc5lp_get_info_command(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct psoc5lp_flash_bank *psoc_bank = bank->driver_priv;
        char part_number[PART_NUMBER_LEN];
@@ -1406,7 +1406,7 @@ static int psoc5lp_get_info_command(struct flash_bank *bank, char *buf, int buf_
        psoc5lp_get_part_number(psoc_bank->device, part_number);
        ecc = psoc_bank->ecc_enabled ? "ECC enabled" : "ECC disabled";
 
-       snprintf(buf, buf_size, "%s %s", part_number, ecc);
+       command_print_sameline(cmd, "%s %s", part_number, ecc);
 
        return ERROR_OK;
 }
index 9c834fde6ba8b12853ff4bdf422c5df74e7a8fbc..c65411bb9cfb98ce85609ada2ca5e0c56d424e5d 100644 (file)
@@ -495,7 +495,7 @@ static const char *protection_to_str(uint8_t protection)
  * @param buf_size size of the buffer
  * @return ERROR_OK in case of success, ERROR_XXX code otherwise
  *************************************************************************************************/
-static int psoc6_get_info(struct flash_bank *bank, char *buf, int buf_size)
+static int psoc6_get_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct psoc6_target_info *psoc6_info = bank->driver_priv;
 
@@ -506,7 +506,7 @@ static int psoc6_get_info(struct flash_bank *bank, char *buf, int buf_size)
        if (hr != ERROR_OK)
                return hr;
 
-       snprintf(buf, buf_size,
+       command_print_sameline(cmd,
                "PSoC6 Silicon ID: 0x%08" PRIX32 "\n"
                "Protection: %s\n"
                "Main Flash size: %" PRIu32 " kB\n"
index 4ec7ebe6584a51a94d75213dfc2a2dfe56cb2b05..a1598449c1766d1bbdfb071b91791ebaf6897f12 100644 (file)
@@ -851,17 +851,16 @@ static int sh_qspi_protect_check(struct flash_bank *bank)
        return ERROR_OK;
 }
 
-static int sh_qspi_get_info(struct flash_bank *bank, char *buf, int buf_size)
+static int sh_qspi_get_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct sh_qspi_flash_bank *info = bank->driver_priv;
 
        if (!info->probed) {
-               snprintf(buf, buf_size,
-                        "\nSH QSPI flash bank not probed yet\n");
+               command_print_sameline(cmd, "\nSH QSPI flash bank not probed yet\n");
                return ERROR_OK;
        }
 
-       snprintf(buf, buf_size, "\nSH QSPI flash information:\n"
+       command_print_sameline(cmd, "\nSH QSPI flash information:\n"
                "  Device \'%s\' (ID 0x%08" PRIx32 ")\n",
                info->dev->name, info->dev->device_id);
 
index 76280f1abc9e0851bd66b608c66f97fee97967d3..b42add96eab5ed0c6e7f25afde90214972198138 100644 (file)
@@ -834,53 +834,32 @@ static int sim3x_auto_probe(struct flash_bank *bank)
        }
 }
 
-static int sim3x_flash_info(struct flash_bank *bank, char *buf, int buf_size)
+static int sim3x_flash_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
-       int ret;
-       int printed = 0;
        struct sim3x_info *sim3x_info;
 
        sim3x_info = bank->driver_priv;
 
        /* Read info about chip */
-       ret = sim3x_read_info(bank);
+       int ret = sim3x_read_info(bank);
        if (ret != ERROR_OK)
                return ret;
 
        /* Part */
        if (sim3x_info->part_family && sim3x_info->part_number) {
-               printed = snprintf(buf, buf_size, "SiM3%c%d", sim3x_info->part_family, sim3x_info->part_number);
-               buf += printed;
-               buf_size -= printed;
-
-               if (buf_size <= 0)
-                       return ERROR_BUF_TOO_SMALL;
+               command_print_sameline(cmd, "SiM3%c%d", sim3x_info->part_family, sim3x_info->part_number);
 
                /* Revision */
                if (sim3x_info->device_revision && sim3x_info->device_revision <= 'Z' - 'A') {
-                       printed = snprintf(buf, buf_size, "-%c", sim3x_info->device_revision + 'A');
-                       buf += printed;
-                       buf_size -= printed;
-
-                       if (buf_size <= 0)
-                               return ERROR_BUF_TOO_SMALL;
+                       command_print_sameline(cmd, "-%c", sim3x_info->device_revision + 'A');
 
                        /* Package */
-                       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;
+                       command_print_sameline(cmd, "-G%s", sim3x_info->device_package);
                }
        }
 
        /* Print flash size */
-       printed = snprintf(buf, buf_size, " flash_size = %dKB", sim3x_info->flash_size_kb);
-       buf_size -= printed;
-
-       if (buf_size <= 0)
-               return ERROR_BUF_TOO_SMALL;
+       command_print_sameline(cmd, " flash_size = %dKB", sim3x_info->flash_size_kb);
 
        return ERROR_OK;
 }
index 55b99de3fc719dee3c9097fc3752211386dbb7b6..b4c959f05c089033d55f578fcf0fe386f7f17f49 100644 (file)
@@ -479,9 +479,8 @@ FLASH_BANK_COMMAND_HANDLER(stellaris_flash_bank_command)
        return ERROR_OK;
 }
 
-static int get_stellaris_info(struct flash_bank *bank, char *buf, int buf_size)
+static int get_stellaris_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
-       int printed;
        struct stellaris_flash_bank *stellaris_info = bank->driver_priv;
 
        if (stellaris_info->did1 == 0)
@@ -490,41 +489,34 @@ static int get_stellaris_info(struct flash_bank *bank, char *buf, int buf_size)
        /* Read main and master clock frequency register */
        stellaris_read_clock_info(bank);
 
-       printed = snprintf(buf,
-                          buf_size,
-                          "\nTI/LMI Stellaris information: Chip is "
-                          "class %i (%s) %s rev %c%i\n",
-                          stellaris_info->target_class,
-                          StellarisClassname[stellaris_info->target_class],
-                          stellaris_info->target_name,
-                          (int)('A' + ((stellaris_info->did0 >> 8) & 0xFF)),
-                          (int)((stellaris_info->did0) & 0xFF));
-       buf += printed;
-       buf_size -= printed;
-
-       printed = snprintf(buf,
-                          buf_size,
-                          "did1: 0x%8.8" PRIx32 ", arch: 0x%4.4" PRIx32
-                          ", eproc: %s, ramsize: %" PRIu32 "k, flashsize: %" PRIu32 "k\n",
-                          stellaris_info->did1,
-                          stellaris_info->did1,
-                          "ARMv7M",
-                          stellaris_info->sramsiz,
-                          (uint32_t)(stellaris_info->num_pages * stellaris_info->pagesize / 1024));
-       buf += printed;
-       buf_size -= printed;
-
-       snprintf(buf,
-                          buf_size,
-                          "master clock: %ikHz%s, "
-                          "rcc is 0x%" PRIx32 ", rcc2 is 0x%" PRIx32 ", "
-                          "pagesize: %" PRIu32 ", pages: %" PRIu32,
-                          (int)(stellaris_info->mck_freq / 1000),
-                          stellaris_info->mck_desc,
-                          stellaris_info->rcc,
-                          stellaris_info->rcc2,
-                          stellaris_info->pagesize,
-                          stellaris_info->num_pages);
+       command_print_sameline(cmd,
+                       "\nTI/LMI Stellaris information: Chip is "
+                       "class %i (%s) %s rev %c%i\n",
+                       stellaris_info->target_class,
+                       StellarisClassname[stellaris_info->target_class],
+                       stellaris_info->target_name,
+                       (int)('A' + ((stellaris_info->did0 >> 8) & 0xFF)),
+                       (int)((stellaris_info->did0) & 0xFF));
+
+       command_print_sameline(cmd,
+                       "did1: 0x%8.8" PRIx32 ", arch: 0x%4.4" PRIx32
+                       ", eproc: %s, ramsize: %" PRIu32 "k, flashsize: %" PRIu32 "k\n",
+                       stellaris_info->did1,
+                       stellaris_info->did1,
+                       "ARMv7M",
+                       stellaris_info->sramsiz,
+                       (uint32_t)(stellaris_info->num_pages * stellaris_info->pagesize / 1024));
+
+       command_print_sameline(cmd,
+                       "master clock: %ikHz%s, "
+                       "rcc is 0x%" PRIx32 ", rcc2 is 0x%" PRIx32 ", "
+                       "pagesize: %" PRIu32 ", pages: %" PRIu32,
+                       (int)(stellaris_info->mck_freq / 1000),
+                       stellaris_info->mck_desc,
+                       stellaris_info->rcc,
+                       stellaris_info->rcc2,
+                       stellaris_info->pagesize,
+                       stellaris_info->num_pages);
 
        return ERROR_OK;
 }
index 125f77691574d58fefd0dd1df58ced9434327c92..91f2aef86246f11d5450aa5a870a9b59efc17637 100644 (file)
@@ -954,11 +954,11 @@ static const char *get_stm32f0_revision(uint16_t rev_id)
        return rev_str;
 }
 
-static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size)
+static int get_stm32x_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        uint32_t dbgmcu_idcode;
 
-               /* read stm32 device id register */
+       /* read stm32 device id register */
        int retval = stm32x_get_device_id(bank, &dbgmcu_idcode);
        if (retval != ERROR_OK)
                return retval;
@@ -1174,14 +1174,14 @@ static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size)
                break;
 
        default:
-               snprintf(buf, buf_size, "Cannot identify target as a STM32F0/1/3\n");
+               command_print_sameline(cmd, "Cannot identify target as a STM32F0/1/3\n");
                return ERROR_FAIL;
        }
 
        if (rev_str != NULL)
-               snprintf(buf, buf_size, "%s - Rev: %s", device_str, rev_str);
+               command_print_sameline(cmd, "%s - Rev: %s", device_str, rev_str);
        else
-               snprintf(buf, buf_size, "%s - Rev: unknown (0x%04x)", device_str, rev_id);
+               command_print_sameline(cmd, "%s - Rev: unknown (0x%04x)", device_str, rev_id);
 
        return ERROR_OK;
 }
index e3625f32268840d818e99e000ee00cf43dbf2cea..44f06f4fde32a2d0d956395239eebbee5e5121ae 100644 (file)
@@ -1251,7 +1251,7 @@ static int stm32x_auto_probe(struct flash_bank *bank)
        return stm32x_probe(bank);
 }
 
-static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size)
+static int get_stm32x_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        uint32_t dbgmcu_idcode;
 
@@ -1416,14 +1416,14 @@ static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size)
                break;
 
        default:
-               snprintf(buf, buf_size, "Cannot identify target as a STM32F2/4/7\n");
+               command_print_sameline(cmd, "Cannot identify target as a STM32F2/4/7\n");
                return ERROR_FAIL;
        }
 
        if (rev_str != NULL)
-               snprintf(buf, buf_size, "%s - Rev: %s", device_str, rev_str);
+               command_print_sameline(cmd, "%s - Rev: %s", device_str, rev_str);
        else
-               snprintf(buf, buf_size, "%s - Rev: unknown (0x%04" PRIx16 ")", device_str, rev_id);
+               command_print_sameline(cmd, "%s - Rev: unknown (0x%04" PRIx16 ")", device_str, rev_id);
 
        return ERROR_OK;
 }
index 52e3e0e87a4a9cb8d33174b1acaa2245bd61f422..4c503db381fefaac3ae8a21bad3af4c51635a6f5 100644 (file)
@@ -916,7 +916,7 @@ static int stm32x_auto_probe(struct flash_bank *bank)
 }
 
 /* This method must return a string displaying information about the bank */
-static int stm32x_get_info(struct flash_bank *bank, char *buf, int buf_size)
+static int stm32x_get_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct stm32h7x_flash_bank *stm32x_info = bank->driver_priv;
        const struct stm32h7x_part_info *info = stm32x_info->part_info;
@@ -924,7 +924,7 @@ static int stm32x_get_info(struct flash_bank *bank, char *buf, int buf_size)
        if (!stm32x_info->probed) {
                int retval = stm32x_probe(bank);
                if (retval != ERROR_OK) {
-                       snprintf(buf, buf_size, "Unable to find bank information.");
+                       command_print_sameline(cmd, "Unable to find bank information.");
                        return retval;
                }
        }
@@ -938,16 +938,16 @@ static int stm32x_get_info(struct flash_bank *bank, char *buf, int buf_size)
                                rev_str = info->revs[i].str;
 
                if (rev_str != NULL) {
-                       snprintf(buf, buf_size, "%s - Rev: %s",
+                       command_print_sameline(cmd, "%s - Rev: %s",
                                stm32x_info->part_info->device_str, rev_str);
                } else {
-                       snprintf(buf, buf_size,
+                       command_print_sameline(cmd,
                                 "%s - Rev: unknown (0x%04" PRIx16 ")",
                                stm32x_info->part_info->device_str, rev_id);
                }
        } else {
-         snprintf(buf, buf_size, "Cannot identify target as a STM32H7x");
-         return ERROR_FAIL;
+               command_print_sameline(cmd, "Cannot identify target as a STM32H7x");
+               return ERROR_FAIL;
        }
        return ERROR_OK;
 }
index 7e1fe7cecd12c19816d1251e332113b89768e1dd..cd6229548cd924a68a06c9cd7ebbcb2f9473374d 100644 (file)
@@ -1332,13 +1332,36 @@ static int stm32l4_read_idcode(struct flash_bank *bank, uint32_t *id)
        return (retval == ERROR_OK) ? ERROR_FAIL : retval;
 }
 
+static const char *get_stm32l4_rev_str(struct flash_bank *bank)
+{
+       struct stm32l4_flash_bank *stm32l4_info = bank->driver_priv;
+       const struct stm32l4_part_info *part_info = stm32l4_info->part_info;
+       assert(part_info);
+
+       const uint16_t rev_id = stm32l4_info->idcode >> 16;
+       for (unsigned int i = 0; i < part_info->num_revs; i++) {
+               if (rev_id == part_info->revs[i].rev)
+                       return part_info->revs[i].str;
+       }
+       return "'unknown'";
+}
+
+static const char *get_stm32l4_bank_type_str(struct flash_bank *bank)
+{
+       struct stm32l4_flash_bank *stm32l4_info = bank->driver_priv;
+       assert(stm32l4_info->part_info);
+       assert(stm32l4_info->probed);
+       return stm32l4_is_otp(bank) ? "OTP" :
+                       stm32l4_info->dual_bank_mode ? "Flash dual" :
+                       "Flash single";
+}
+
 static int stm32l4_probe(struct flash_bank *bank)
 {
        struct target *target = bank->target;
        struct stm32l4_flash_bank *stm32l4_info = bank->driver_priv;
        const struct stm32l4_part_info *part_info;
        uint16_t flash_size_kb = 0xffff;
-       uint32_t device_id;
        uint32_t options;
 
        stm32l4_info->probed = false;
@@ -1348,7 +1371,9 @@ static int stm32l4_probe(struct flash_bank *bank)
        if (retval != ERROR_OK)
                return retval;
 
-       device_id = stm32l4_info->idcode & 0xFFF;
+       const uint32_t device_id = stm32l4_info->idcode & 0xFFF;
+       const uint16_t rev_id = stm32l4_info->idcode >> 16;
+       const char *rev_str = get_stm32l4_rev_str(bank);
 
        for (unsigned int n = 0; n < ARRAY_SIZE(stm32l4_parts); n++) {
                if (device_id == stm32l4_parts[n].id) {
@@ -1365,12 +1390,9 @@ static int stm32l4_probe(struct flash_bank *bank)
        part_info = stm32l4_info->part_info;
        stm32l4_info->flash_regs = stm32l4_info->part_info->default_flash_regs;
 
-       char device_info[1024];
-       retval = bank->driver->info(bank, device_info, sizeof(device_info));
-       if (retval != ERROR_OK)
-               return retval;
-
-       LOG_INFO("device idcode = 0x%08" PRIx32 " (%s)", stm32l4_info->idcode, device_info);
+       LOG_INFO("device idcode = 0x%08" PRIx32 " (%s - Rev %s : 0x%04x - %s-bank)",
+                       stm32l4_info->idcode, part_info->device_str, rev_str, rev_id,
+                       get_stm32l4_bank_type_str(bank));
 
        /* read flash option register */
        retval = stm32l4_read_flash_reg_by_index(bank, STM32_FLASH_OPTR_INDEX, &options);
@@ -1610,33 +1632,19 @@ static int stm32l4_auto_probe(struct flash_bank *bank)
        return stm32l4_probe(bank);
 }
 
-static int get_stm32l4_info(struct flash_bank *bank, char *buf, int buf_size)
+static int get_stm32l4_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct stm32l4_flash_bank *stm32l4_info = bank->driver_priv;
        const struct stm32l4_part_info *part_info = stm32l4_info->part_info;
 
        if (part_info) {
-               const char *rev_str = NULL;
-               uint16_t rev_id = stm32l4_info->idcode >> 16;
-               for (unsigned int i = 0; i < part_info->num_revs; i++) {
-                       if (rev_id == part_info->revs[i].rev) {
-                               rev_str = part_info->revs[i].str;
-                               break;
-                       }
-               }
-
-               int buf_len = snprintf(buf, buf_size, "%s - Rev %s : 0x%04x",
-                               part_info->device_str, rev_str ? rev_str : "'unknown'", rev_id);
-
+               const uint16_t rev_id = stm32l4_info->idcode >> 16;
+               command_print_sameline(cmd, "%s - Rev %s : 0x%04x", part_info->device_str,
+                               get_stm32l4_rev_str(bank), rev_id);
                if (stm32l4_info->probed)
-                       snprintf(buf + buf_len, buf_size - buf_len, " - %s-bank",
-                                       stm32l4_is_otp(bank) ? "OTP" :
-                                       stm32l4_info->dual_bank_mode ? "Flash dual" : "Flash single");
-
-               return ERROR_OK;
+                       command_print_sameline(cmd, " - %s-bank", get_stm32l4_bank_type_str(bank));
        } else {
-               snprintf(buf, buf_size, "Cannot identify target as an %s device", device_families);
-               return ERROR_FAIL;
+               command_print_sameline(cmd, "Cannot identify target as an %s device", device_families);
        }
 
        return ERROR_OK;
index b014d097dc92fbe221f3163699813a71b6c7a1c1..1ea1b1d0e9dc4e4178e9334cc76aa61e36f34661 100644 (file)
@@ -870,7 +870,7 @@ static int stm32lx_auto_probe(struct flash_bank *bank)
 }
 
 /* This method must return a string displaying information about the bank */
-static int stm32lx_get_info(struct flash_bank *bank, char *buf, int buf_size)
+static int stm32lx_get_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct stm32lx_flash_bank *stm32lx_info = bank->driver_priv;
        const struct stm32lx_part_info *info = &stm32lx_info->part_info;
@@ -880,8 +880,7 @@ static int stm32lx_get_info(struct flash_bank *bank, char *buf, int buf_size)
        if (!stm32lx_info->probed) {
                int retval = stm32lx_probe(bank);
                if (retval != ERROR_OK) {
-                       snprintf(buf, buf_size,
-                               "Unable to find bank information.");
+                       command_print_sameline(cmd, "Unable to find bank information.");
                        return retval;
                }
        }
@@ -891,13 +890,9 @@ static int stm32lx_get_info(struct flash_bank *bank, char *buf, int buf_size)
                        rev_str = info->revs[i].str;
 
        if (rev_str != NULL) {
-               snprintf(buf, buf_size,
-                       "%s - Rev: %s",
-                       info->device_str, rev_str);
+               command_print_sameline(cmd, "%s - Rev: %s", info->device_str, rev_str);
        } else {
-               snprintf(buf, buf_size,
-                       "%s - Rev: unknown (0x%04x)",
-                       info->device_str, rev_id);
+               command_print_sameline(cmd, "%s - Rev: unknown (0x%04x)", info->device_str, rev_id);
        }
 
        return ERROR_OK;
index a3555a4a6e2d9f782daeaa01f8436503d263ce73..978188ec10df73437847c2761703468b5c55e54c 100644 (file)
@@ -2397,17 +2397,16 @@ static int stmqspi_protect_check(struct flash_bank *bank)
        return ERROR_OK;
 }
 
-static int get_stmqspi_info(struct flash_bank *bank, char *buf, int buf_size)
+static int get_stmqspi_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct stmqspi_flash_bank *stmqspi_info = bank->driver_priv;
 
        if (!(stmqspi_info->probed)) {
-               snprintf(buf, buf_size,
-                       "\nQSPI flash bank not probed yet\n");
+               command_print_sameline(cmd, "\nQSPI flash bank not probed yet\n");
                return ERROR_FLASH_BANK_NOT_PROBED;
        }
 
-       snprintf(buf, buf_size, "flash%s%s \'%s\', device id = 0x%06" PRIx32
+       command_print_sameline(cmd, "flash%s%s \'%s\', device id = 0x%06" PRIx32
                        ", flash size = %" PRIu32 "%sbytes\n(page size = %" PRIu32
                        ", read = 0x%02" PRIx8 ", qread = 0x%02" PRIx8
                        ", pprog = 0x%02" PRIx8 ", mass_erase = 0x%02" PRIx8
index f633e361924d4a0165e6d58f51234d9de32dbbc5..662b4595353915db6e888c6d9657a04cd07be5b5 100644 (file)
@@ -631,17 +631,16 @@ static int stmsmi_protect_check(struct flash_bank *bank)
        return ERROR_OK;
 }
 
-static int get_stmsmi_info(struct flash_bank *bank, char *buf, int buf_size)
+static int get_stmsmi_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct stmsmi_flash_bank *stmsmi_info = bank->driver_priv;
 
        if (!(stmsmi_info->probed)) {
-               snprintf(buf, buf_size,
-                       "\nSMI flash bank not probed yet\n");
+               command_print_sameline(cmd, "\nSMI flash bank not probed yet\n");
                return ERROR_OK;
        }
 
-       snprintf(buf, buf_size, "\nSMI flash information:\n"
+       command_print_sameline(cmd, "\nSMI flash information:\n"
                "  Device \'%s\' (ID 0x%08" PRIx32 ")\n",
                stmsmi_info->dev->name, stmsmi_info->dev->device_id);
 
index e028c1ffd15aeefbc6ccbaf5081ef5b6157c682e..958b0fa2b7d475109549d081576550b5aec7027f 100644 (file)
@@ -702,13 +702,13 @@ COMMAND_HANDLER(str7x_handle_part_id_command)
 }
 #endif
 
-static int get_str7x_info(struct flash_bank *bank, char *buf, int buf_size)
+static int get_str7x_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        /* Setting the write protection on a sector is a permanent change but it
         * can be disabled temporarily. FLASH_NVWPAR reflects the permanent
         * protection state of the sectors, not the temporary.
         */
-       snprintf(buf, buf_size, "STR7x flash protection info is only valid after a power cycle, "
+       command_print_sameline(cmd, "STR7x flash protection info is only valid after a power cycle, "
                        "clearing the protection is only temporary and may not be reflected in the current "
                        "info returned.");
        return ERROR_OK;
index 3f737aca3b030121e884ef3e1ba707820e5a8044..199bf2d4ebe51a3c76b1f199d29bc41069547bf9 100644 (file)
@@ -89,7 +89,6 @@ COMMAND_HANDLER(handle_flash_info_command)
                return retval;
 
        if (p != NULL) {
-               char buf[1024];
                int num_blocks;
                struct flash_sector *block_array;
 
@@ -150,10 +149,10 @@ 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, "%s", buf);
-                       else
+                       /* Let the flash driver print extra custom info */
+                       retval = p->driver->info(p, CMD);
+                       command_print_sameline(CMD, "\n");
+                       if (retval != ERROR_OK)
                                LOG_ERROR("error retrieving flash info");
                }
        }
index 3004682b8ed4c8b9a973f922880fd3f41b1dc66d..c5d74c30c63c9ffceb227ab0a6cddaddae76af06 100644 (file)
@@ -1118,26 +1118,20 @@ static int tms470_protect_check(struct flash_bank *bank)
 
 /* ---------------------------------------------------------------------- */
 
-static int get_tms470_info(struct flash_bank *bank, char *buf, int buf_size)
+static int get_tms470_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
-       int used = 0;
        struct tms470_flash_bank *tms470_info = bank->driver_priv;
 
        if (!tms470_info->device_ident_reg)
                tms470_read_part_info(bank);
 
        if (!tms470_info->device_ident_reg) {
-               (void)snprintf(buf, buf_size, "Cannot identify target as a TMS470\n");
+               command_print_sameline(cmd, "Cannot identify target as a TMS470\n");
                return ERROR_FLASH_OPERATION_FAILED;
        }
 
-       used =
-               snprintf(buf, buf_size, "\ntms470 information: Chip is %s\n",
-                       tms470_info->part_name);
-       buf += used;
-       buf_size -= used;
-
-       snprintf(buf, buf_size, "Flash protection level 2 is %s\n",
+       command_print_sameline(cmd, "\ntms470 information: Chip is %s\n", tms470_info->part_name);
+       command_print_sameline(cmd, "Flash protection level 2 is %s\n",
                tms470_check_flash_unlocked(bank->target) == ERROR_OK ? "disabled" : "enabled");
 
        return ERROR_OK;
index 1aa12fecdd9e1455fcff34cc19604f6179d9f836..c9525d179b2d86b938a7e43a2a95d176609cc106 100644 (file)
@@ -172,14 +172,14 @@ static int virtual_auto_probe(struct flash_bank *bank)
        return ERROR_OK;
 }
 
-static int virtual_info(struct flash_bank *bank, char *buf, int buf_size)
+static int virtual_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct flash_bank *master_bank = virtual_get_master_bank(bank);
 
        if (master_bank == NULL)
                return ERROR_FLASH_OPERATION_FAILED;
 
-       snprintf(buf, buf_size, "%s driver for flash bank %s at " TARGET_ADDR_FMT,
+       command_print_sameline(cmd, "%s driver for flash bank %s at " TARGET_ADDR_FMT,
                        bank->driver->name, master_bank->name, master_bank->base);
 
        return ERROR_OK;
index 2506f2b550efdb99a6cbcbfc6a5149bb8bd5ef5d..cd2aa01824f2c976298969b45cff7f34f218438e 100644 (file)
@@ -362,7 +362,7 @@ static int w600_auto_probe(struct flash_bank *bank)
        return w600_probe(bank);
 }
 
-static int get_w600_info(struct flash_bank *bank, char *buf, int buf_size)
+static int get_w600_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        uint32_t flash_id;
 
@@ -371,7 +371,7 @@ static int get_w600_info(struct flash_bank *bank, char *buf, int buf_size)
        if (retval != ERROR_OK)
                return retval;
 
-       snprintf(buf, buf_size, "w600 : 0x%08" PRIx32 "", flash_id);
+       command_print_sameline(cmd, "w600 : 0x%08" PRIx32 "", flash_id);
        return ERROR_OK;
 }
 
index 01329f47a94de4a53e1e3c1c63f01e7573fd4075..33f79f51068575aaa29b55b7d1cd00897dd0715b 100644 (file)
@@ -581,15 +581,15 @@ FLASH_BANK_COMMAND_HANDLER(xcf_flash_bank_command)
        return ERROR_OK;
 }
 
-static int xcf_info(struct flash_bank *bank, char *buf, int buf_size)
+static int xcf_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        const struct xcf_priv *priv = bank->driver_priv;
 
        if (!priv->probed) {
-               snprintf(buf, buf_size, "\nXCF flash bank not probed yet\n");
+               command_print_sameline(cmd, "\nXCF flash bank not probed yet\n");
                return ERROR_OK;
        }
-       snprintf(buf, buf_size, "%s", product_name(bank));
+       command_print_sameline(cmd, "%s", product_name(bank));
        return ERROR_OK;
 }
 
index 757dd952f5910d863a0d716cf09c3e4072c86e60..11542ac5bb16e9a7aef21c4438aed077a3aa9991 100644 (file)
@@ -403,7 +403,7 @@ static int xmc1xxx_protect_check(struct flash_bank *bank)
        return ERROR_OK;
 }
 
-static int xmc1xxx_get_info_command(struct flash_bank *bank, char *buf, int buf_size)
+static int xmc1xxx_get_info_command(struct flash_bank *bank, struct command_invocation *cmd)
 {
        uint32_t chipid[8];
        int i, retval;
@@ -429,7 +429,8 @@ static int xmc1xxx_get_info_command(struct flash_bank *bank, char *buf, int buf_
        }
        LOG_DEBUG("ID[7] = %08" PRIX32, chipid[7]);
 
-       snprintf(buf, buf_size, "XMC%" PRIx32 "00 %" PRIX32 " flash %" PRIu32 "KB ROM %" PRIu32 "KB SRAM %" PRIu32 "KB",
+       command_print_sameline(cmd,
+                       "XMC%" PRIx32 "00 %" PRIX32 " flash %" PRIu32 "KB ROM %" PRIu32 "KB SRAM %" PRIu32 "KB",
                        (chipid[0] >> 12) & 0xff,
                        0xAA + (chipid[7] >> 28) - 1,
                        (((chipid[6] >> 12) & 0x3f) - 1) * 4,
index a032e4d46fe879466ac5fb21672e15f4d9d58511..a2cf6a0b1e58f88b20bd4e17598c9634165a819e 100644 (file)
@@ -805,7 +805,7 @@ abort_write_and_exit:
 
 }
 
-static int xmc4xxx_get_info_command(struct flash_bank *bank, char *buf, int buf_size)
+static int xmc4xxx_get_info_command(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct xmc4xxx_flash_bank *fb = bank->driver_priv;
        uint32_t scu_idcode;
@@ -914,9 +914,7 @@ static int xmc4xxx_get_info_command(struct flash_bank *bank, char *buf, int buf_
                break;
 
        default:
-               snprintf(buf, buf_size,
-                        "Cannot identify target as an XMC4xxx. SCU_ID: %"PRIx32"\n",
-                        scu_idcode);
+               command_print_sameline(cmd, "Cannot identify target as an XMC4xxx. SCU_ID: %"PRIx32 "\n", scu_idcode);
                return ERROR_OK;
        }
 
@@ -944,11 +942,9 @@ static int xmc4xxx_get_info_command(struct flash_bank *bank, char *buf, int buf_
        }
 
        if (rev_str != NULL)
-               snprintf(buf, buf_size, "%s - Rev: %s%s",
-                        dev_str, rev_str, prot_str);
+               command_print_sameline(cmd, "%s - Rev: %s%s", dev_str, rev_str, prot_str);
        else
-               snprintf(buf, buf_size, "%s - Rev: unknown (0x%01x)%s",
-                        dev_str, rev_id, prot_str);
+               command_print_sameline(cmd, "%s - Rev: unknown (0x%01x)%s", dev_str, rev_id, prot_str);
 
        return ERROR_OK;
 }