openocd: fix SPDX tag format for files .c
[fw/openocd] / src / flash / nor / cc26xx.c
index 176211a0777d2fb453db3c05d2e5aaee967aa3c3..6256ba6e712b72e4b2afada1455ae231d0afe408 100644 (file)
@@ -1,18 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /***************************************************************************
  *   Copyright (C) 2017 by Texas Instruments, Inc.                         *
- *                                                                         *
- *   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
@@ -45,6 +34,16 @@ struct cc26xx_bank {
        uint32_t params_addr[2];
 };
 
+/* Flash helper algorithm for CC26x0 Chameleon targets */
+static const uint8_t cc26x0_algo[] = {
+#include "../../../contrib/loaders/flash/cc26xx/cc26x0_algo.inc"
+};
+
+/* Flash helper algorithm for CC26x2 Agama targets */
+static const uint8_t cc26x2_algo[] = {
+#include "../../../contrib/loaders/flash/cc26xx/cc26x2_algo.inc"
+};
+
 static int cc26xx_auto_probe(struct flash_bank *bank);
 
 static uint32_t cc26xx_device_type(uint32_t icepick_id, uint32_t user_id)
@@ -107,9 +106,9 @@ static int cc26xx_wait_algo_done(struct flash_bank *bank, uint32_t params_addr)
        int retval = ERROR_OK;
 
        start_ms = timeval_ms();
-       while (CC26XX_BUFFER_FULL == status) {
+       while (status == CC26XX_BUFFER_FULL) {
                retval = target_read_u32(target, status_addr, &status);
-               if (ERROR_OK != retval)
+               if (retval != ERROR_OK)
                        return retval;
 
                elapsed_ms = timeval_ms() - start_ms;
@@ -119,7 +118,7 @@ static int cc26xx_wait_algo_done(struct flash_bank *bank, uint32_t params_addr)
                        break;
        };
 
-       if (CC26XX_BUFFER_EMPTY != status) {
+       if (status != CC26XX_BUFFER_EMPTY) {
                LOG_ERROR("%s: Flash operation failed", cc26xx_bank->family_name);
                return ERROR_FAIL;
        }
@@ -136,28 +135,30 @@ static int cc26xx_init(struct flash_bank *bank)
 
        /* Make sure we've probed the flash to get the device and size */
        retval = cc26xx_auto_probe(bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        /* Check for working area to use for flash helper algorithm */
-       if (NULL != cc26xx_bank->working_area)
-               target_free_working_area(target, cc26xx_bank->working_area);
+       target_free_working_area(target, cc26xx_bank->working_area);
+       cc26xx_bank->working_area = NULL;
+
        retval = target_alloc_working_area(target, cc26xx_bank->algo_working_size,
                                &cc26xx_bank->working_area);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        /* Confirm the defined working address is the area we need to use */
-       if (CC26XX_ALGO_BASE_ADDRESS != cc26xx_bank->working_area->address)
+       if (cc26xx_bank->working_area->address != CC26XX_ALGO_BASE_ADDRESS)
                return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
 
        /* Write flash helper algorithm into target memory */
        retval = target_write_buffer(target, CC26XX_ALGO_BASE_ADDRESS,
                                cc26xx_bank->algo_size, cc26xx_bank->algo_code);
-       if (ERROR_OK != retval) {
+       if (retval != ERROR_OK) {
                LOG_ERROR("%s: Failed to load flash helper algorithm",
                        cc26xx_bank->family_name);
                target_free_working_area(target, cc26xx_bank->working_area);
+               cc26xx_bank->working_area = NULL;
                return retval;
        }
 
@@ -168,10 +169,11 @@ static int cc26xx_init(struct flash_bank *bank)
        /* Begin executing the flash helper algorithm */
        retval = target_start_algorithm(target, 0, NULL, 0, NULL,
                                CC26XX_ALGO_BASE_ADDRESS, 0, &cc26xx_bank->armv7m_info);
-       if (ERROR_OK != retval) {
+       if (retval != ERROR_OK) {
                LOG_ERROR("%s: Failed to start flash helper algorithm",
                        cc26xx_bank->family_name);
                target_free_working_area(target, cc26xx_bank->working_area);
+               cc26xx_bank->working_area = NULL;
                return retval;
        }
 
@@ -211,13 +213,13 @@ static int cc26xx_mass_erase(struct flash_bank *bank)
 
        int retval;
 
-       if (TARGET_HALTED != target->state) {
+       if (target->state != TARGET_HALTED) {
                LOG_ERROR("Target not halted");
                return ERROR_TARGET_NOT_HALTED;
        }
 
        retval = cc26xx_init(bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        /* Initialize algorithm parameters */
@@ -231,7 +233,7 @@ static int cc26xx_mass_erase(struct flash_bank *bank)
                                sizeof(algo_params), (uint8_t *)&algo_params);
 
        /* Wait for command to complete */
-       if (ERROR_OK == retval)
+       if (retval == ERROR_OK)
                retval = cc26xx_wait_algo_done(bank, cc26xx_bank->params_addr[0]);
 
        /* Regardless of errors, try to close down algo */
@@ -248,7 +250,7 @@ FLASH_BANK_COMMAND_HANDLER(cc26xx_flash_bank_command)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
        cc26xx_bank = malloc(sizeof(struct cc26xx_bank));
-       if (NULL == cc26xx_bank)
+       if (!cc26xx_bank)
                return ERROR_FAIL;
 
        /* Initialize private flash information */
@@ -264,7 +266,8 @@ FLASH_BANK_COMMAND_HANDLER(cc26xx_flash_bank_command)
        return ERROR_OK;
 }
 
-static int cc26xx_erase(struct flash_bank *bank, int first, int last)
+static int cc26xx_erase(struct flash_bank *bank, unsigned int first,
+               unsigned int last)
 {
        struct target *target = bank->target;
        struct cc26xx_bank *cc26xx_bank = bank->driver_priv;
@@ -274,7 +277,7 @@ static int cc26xx_erase(struct flash_bank *bank, int first, int last)
        uint32_t length;
        int retval;
 
-       if (TARGET_HALTED != target->state) {
+       if (target->state != TARGET_HALTED) {
                LOG_ERROR("Target not halted");
                return ERROR_TARGET_NOT_HALTED;
        }
@@ -289,7 +292,7 @@ static int cc26xx_erase(struct flash_bank *bank, int first, int last)
        length = (last - first + 1) * cc26xx_bank->sector_length;
 
        retval = cc26xx_init(bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        /* Set up algorithm parameters for erase command */
@@ -303,7 +306,7 @@ static int cc26xx_erase(struct flash_bank *bank, int first, int last)
                                sizeof(algo_params), (uint8_t *)&algo_params);
 
        /* If no error, wait for erase to finish */
-       if (ERROR_OK == retval)
+       if (retval == ERROR_OK)
                retval = cc26xx_wait_algo_done(bank, cc26xx_bank->params_addr[0]);
 
        /* Regardless of errors, try to close down algo */
@@ -326,13 +329,13 @@ static int cc26xx_write(struct flash_bank *bank, const uint8_t *buffer,
        uint32_t index;
        int retval;
 
-       if (TARGET_HALTED != target->state) {
+       if (target->state != TARGET_HALTED) {
                LOG_ERROR("Target not halted");
                return ERROR_TARGET_NOT_HALTED;
        }
 
        retval = cc26xx_init(bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        /* Initialize algorithm parameters to default values */
@@ -353,7 +356,7 @@ static int cc26xx_write(struct flash_bank *bank, const uint8_t *buffer,
                /* Put next block of data to flash into buffer */
                retval = target_write_buffer(target, cc26xx_bank->buffer_addr[index],
                                        size, buffer);
-               if (ERROR_OK != retval) {
+               if (retval != ERROR_OK) {
                        LOG_ERROR("Unable to write data to target memory");
                        break;
                }
@@ -366,13 +369,13 @@ static int cc26xx_write(struct flash_bank *bank, const uint8_t *buffer,
                /* Issue flash helper algorithm parameters for block write */
                retval = target_write_buffer(target, cc26xx_bank->params_addr[index],
                                        sizeof(algo_params[index]), (uint8_t *)&algo_params[index]);
-               if (ERROR_OK != retval)
+               if (retval != ERROR_OK)
                        break;
 
                /* Wait for next ping pong buffer to be ready */
                index ^= 1;
                retval = cc26xx_wait_algo_done(bank, cc26xx_bank->params_addr[index]);
-               if (ERROR_OK != retval)
+               if (retval != ERROR_OK)
                        break;
 
                count -= size;
@@ -385,7 +388,7 @@ static int cc26xx_write(struct flash_bank *bank, const uint8_t *buffer,
        }
 
        /* If no error yet, wait for last buffer to finish */
-       if (ERROR_OK == retval) {
+       if (retval == ERROR_OK) {
                index ^= 1;
                retval = cc26xx_wait_algo_done(bank, cc26xx_bank->params_addr[index]);
        }
@@ -409,12 +412,12 @@ static int cc26xx_probe(struct flash_bank *bank)
        int retval;
 
        retval = target_read_u32(target, FCFG1_ICEPICK_ID, &value);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
        cc26xx_bank->icepick_id = value;
 
        retval = target_read_u32(target, FCFG1_USER_ID, &value);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
        cc26xx_bank->user_id = value;
 
@@ -453,14 +456,14 @@ static int cc26xx_probe(struct flash_bank *bank)
        }
 
        retval = target_read_u32(target, CC26XX_FLASH_SIZE_INFO, &value);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
        num_sectors = value & 0xff;
        if (num_sectors > max_sectors)
                num_sectors = max_sectors;
 
        bank->sectors = malloc(sizeof(struct flash_sector) * num_sectors);
-       if (NULL == bank->sectors)
+       if (!bank->sectors)
                return ERROR_FAIL;
 
        bank->base = CC26XX_FLASH_BASE_ADDR;
@@ -497,10 +500,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) {
@@ -525,13 +527,10 @@ static int cc26xx_info(struct flash_bank *bank, char *buf, int buf_size)
                        break;
        }
 
-       printed = snprintf(buf, buf_size,
-               "%s device: ICEPick ID 0x%08x, USER ID 0x%08x\n",
+       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;
 }