openocd: fix SPDX tag format for files .c
[fw/openocd] / src / flash / nor / nrf5.c
index 12bbac64f4b55941cbb5e1fc780b29c6f258ba3d..d5de4a4644b338942fc9610ea7df315f3993b564 100644 (file)
@@ -1,21 +1,10 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /***************************************************************************
  *   Copyright (C) 2013 Synapse Product Development                        *
  *   Andrey Smirnov <andrew.smironv@gmail.com>                             *
  *   Angus Gratton <gus@projectgus.com>                                    *
  *   Erdem U. Altunyurt <spamjunkeater@gmail.com>                          *
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- *   This program is distributed in the hope that it will be useful,       *
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
- *   GNU General Public License for more details.                          *
- *                                                                         *
- *   You should have received a copy of the GNU General Public License     *
- *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
@@ -23,6 +12,7 @@
 #endif
 
 #include "imp.h"
+#include <helper/binarybuffer.h>
 #include <target/algorithm.h>
 #include <target/armv7m.h>
 #include <helper/types.h>
@@ -146,7 +136,7 @@ struct nrf5_device_spec {
 };
 
 struct nrf5_info {
-       uint32_t refcount;
+       unsigned int refcount;
 
        struct nrf5_bank {
                struct nrf5_info *chip;
@@ -293,7 +283,7 @@ static bool nrf5_bank_is_probed(const struct flash_bank *bank)
 {
        struct nrf5_bank *nbank = bank->driver_priv;
 
-       assert(nbank != NULL);
+       assert(nbank);
 
        return nbank->probed;
 }
@@ -444,7 +434,7 @@ static int nrf5_protect_check_clenr0(struct flash_bank *bank)
        struct nrf5_bank *nbank = bank->driver_priv;
        struct nrf5_info *chip = nbank->chip;
 
-       assert(chip != NULL);
+       assert(chip);
 
        res = target_read_u32(chip->target, NRF51_FICR_CLENR0,
                              &clenr0);
@@ -474,7 +464,7 @@ static int nrf5_protect_check_bprot(struct flash_bank *bank)
        struct nrf5_bank *nbank = bank->driver_priv;
        struct nrf5_info *chip = nbank->chip;
 
-       assert(chip != NULL);
+       assert(chip);
 
        static uint32_t nrf5_bprot_offsets[4] = { 0x600, 0x604, 0x610, 0x614 };
        uint32_t bprot_reg = 0;
@@ -505,7 +495,7 @@ static int nrf5_protect_check(struct flash_bank *bank)
        struct nrf5_bank *nbank = bank->driver_priv;
        struct nrf5_info *chip = nbank->chip;
 
-       assert(chip != NULL);
+       assert(chip);
 
        if (chip->features & NRF5_FEATURE_BPROT)
                return nrf5_protect_check_bprot(bank);
@@ -624,35 +614,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);
+       }
+
+       /* safety: */
+       if (res <= 0 || (unsigned int)res >= buf_size) {
+               LOG_ERROR("BUG: buffer problem in %s", __func__);
+               return ERROR_FAIL;
        }
-       if (res <= 0)
+       return ERROR_OK;
+}
+
+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;
 
-       snprintf(buf + res, buf_size - res, " %ukB Flash, %ukB RAM",
-                               chip->flash_size_kb, chip->ram_size_kb);
+       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 +821,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);
@@ -1038,7 +1037,7 @@ static int nrf5_write(struct flash_bank *bank, const uint8_t *buffer,
         * RM reads: Code running from code region 1 will not be able to write
         * to code region 0.
         * Unfortunately the flash loader running from RAM can write to both
-        * code regions whithout any hint the protection is violated.
+        * code regions without any hint the protection is violated.
         *
         * Update protection state and check if any flash sector to be written
         * is protected. */
@@ -1124,7 +1123,7 @@ static void nrf5_free_driver_priv(struct flash_bank *bank)
 {
        struct nrf5_bank *nbank = bank->driver_priv;
        struct nrf5_info *chip = nbank->chip;
-       if (chip == NULL)
+       if (!chip)
                return;
 
        chip->refcount--;
@@ -1188,7 +1187,7 @@ FLASH_BANK_COMMAND_HANDLER(nrf5_flash_bank_command)
                nbank = &chip->bank[1];
                break;
        }
-       assert(nbank != NULL);
+       assert(nbank);
 
        chip->refcount++;
        nbank->chip = chip;
@@ -1209,7 +1208,7 @@ COMMAND_HANDLER(nrf5_handle_mass_erase_command)
        if (res != ERROR_OK)
                return res;
 
-       assert(bank != NULL);
+       assert(bank);
 
        struct nrf5_info *chip;
 
@@ -1256,7 +1255,7 @@ COMMAND_HANDLER(nrf5_handle_info_command)
        if (res != ERROR_OK)
                return res;
 
-       assert(bank != NULL);
+       assert(bank);
 
        struct nrf5_info *chip;