jtag: linuxgpiod: drop extra parenthesis
[openocd.git] / src / flash / nor / cc26xx.c
index 7b8744143365474e2b02afbf9da6f90930074fa9..54d61421ce272088a161a7214f11650948e4a910 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 */
@@ -259,12 +261,12 @@ FLASH_BANK_COMMAND_HANDLER(cc26xx_flash_bank_command)
 
        /* Finish initialization of bank */
        bank->driver_priv = cc26xx_bank;
-       bank->next = NULL;
 
        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 +276,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 +291,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 +305,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 +328,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 +355,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 +368,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 +387,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 +411,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 +455,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;
@@ -491,21 +493,15 @@ static int cc26xx_auto_probe(struct flash_bank *bank)
 
        int retval = ERROR_OK;
 
-       if (bank->bank_number != 0) {
-               /* Invalid bank number somehow */
-               return ERROR_FAIL;
-       }
-
        if (!cc26xx_bank->probed)
                retval = cc26xx_probe(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) {
@@ -530,17 +526,14 @@ 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;
 }
 
-struct flash_driver cc26xx_flash = {
+const struct flash_driver cc26xx_flash = {
        .name = "cc26xx",
        .flash_bank_command = cc26xx_flash_bank_command,
        .erase = cc26xx_erase,

Linking to existing account procedure

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

SSH host keys fingerprints

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