target/arm: optimize architecture flags
[fw/openocd] / src / flash / nor / atsamv.c
index 08f8bb8ba7a2b3e60243bc971d61b30076b20554..f70e5d01074ad9cd4be8e98bd6dbf420c8fdfda6 100644 (file)
  *   (atsamv, atsams, and atsame support)                                  *
  *                                                                         *
  *   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  *
+ *   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.                          *
+ *   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/>. *
  ***************************************************************************/
 
-/* Some of the the lower level code was based on code supplied by
+/* Some of the lower level code was based on code supplied by
  * ATMEL under this copyright. */
 
 /* BEGIN ATMEL COPYRIGHT */
 #define SAMV_PAGE_SIZE                 512
 #define SAMV_FLASH_BASE         0x00400000
 
-extern struct flash_driver atsamv_flash;
+extern const struct flash_driver atsamv_flash;
 
 struct samv_flash_bank {
-       int      probed;
+       bool      probed;
        unsigned size_bytes;
        unsigned gpnvm[SAMV_NUM_GPNVM_BITS];
 };
@@ -145,7 +147,7 @@ static int samv_efc_perform_command(struct target *target,
 {
        int r;
        uint32_t v;
-       long long ms_now, ms_end;
+       int64_t ms_now, ms_end;
 
        if (status)
                *status = 0;
@@ -326,7 +328,7 @@ static int samv_protect_check(struct flash_bank *bank)
        if (r != ERROR_OK)
                return r;
 
-       for (int x = 0; x < bank->num_sectors; x++)
+       for (unsigned int x = 0; x < bank->num_sectors; x++)
                bank->sectors[x].is_protected = (!!(v[x >> 5] & (1 << (x % 32))));
        return ERROR_OK;
 }
@@ -355,12 +357,15 @@ static int samv_probe(struct flash_bank *bank)
 
        uint8_t eproc = (device_id >> 5) & 0x7;
        if (eproc != 0) {
-               LOG_ERROR("unexpected eproc code: %d was expecting 0 (cortex-m7)", eproc);
+               LOG_ERROR("unexpected eproc code: %d was expecting 0 (Cortex-M7)", eproc);
                return ERROR_FAIL;
        }
 
        uint8_t nvm_size_code = (device_id >> 8) & 0xf;
        switch (nvm_size_code) {
+               case 10:
+                       bank->size = 512 * 1024;
+                       break;
                case 12:
                        bank->size = 1024 * 1024;
                        break;
@@ -370,17 +375,16 @@ static int samv_probe(struct flash_bank *bank)
                default:
                        LOG_ERROR("unrecognized flash size code: %d", nvm_size_code);
                        return ERROR_FAIL;
-                       break;
        }
 
        struct samv_flash_bank *samv_info = bank->driver_priv;
        samv_info->size_bytes = bank->size;
-       samv_info->probed = 1;
+       samv_info->probed = true;
 
        bank->base = SAMV_FLASH_BASE;
        bank->num_sectors = bank->size / SAMV_SECTOR_SIZE;
        bank->sectors = calloc(bank->num_sectors, sizeof(struct flash_sector));
-       for (int s = 0; s < (int)bank->num_sectors; s++) {
+       for (unsigned int s = 0; s < bank->num_sectors; s++) {
                bank->sectors[s].size = SAMV_SECTOR_SIZE;
                bank->sectors[s].offset = s * SAMV_SECTOR_SIZE;
                bank->sectors[s].is_erased = -1;
@@ -402,7 +406,8 @@ static int samv_auto_probe(struct flash_bank *bank)
        return samv_probe(bank);
 }
 
-static int samv_erase(struct flash_bank *bank, int first, int last)
+static int samv_erase(struct flash_bank *bank, unsigned int first,
+               unsigned int last)
 {
        const int page_count = 32; /* 32 pages equals 16 KB lock region */
 
@@ -416,31 +421,31 @@ static int samv_erase(struct flash_bank *bank, int first, int last)
                return r;
 
        /* easy case: we've been requested to erase the entire flash */
-       if ((first == 0) && ((last + 1) == (int)(bank->num_sectors)))
+       if ((first == 0) && ((last + 1) == bank->num_sectors))
                return samv_efc_perform_command(bank->target, SAMV_EFC_FCMD_EA, 0, NULL);
 
-       LOG_INFO("erasing lock regions %d-%d...", first, last);
+       LOG_INFO("erasing lock regions %u-%u...", first, last);
 
-       for (int i = first; i <= last; i++) {
+       for (unsigned int i = first; i <= last; i++) {
                uint32_t status;
                r = samv_erase_pages(bank->target, (i * page_count), page_count, &status);
-               LOG_INFO("erasing lock region %d", i);
+               LOG_INFO("erasing lock region %u", i);
                if (r != ERROR_OK)
-                       LOG_ERROR("error performing erase page @ lock region number %d",
-                                       (unsigned int)(i));
+                       LOG_ERROR("error performing erase page @ lock region number %u", i);
                if (status & (1 << 2)) {
-                       LOG_ERROR("lock region %d is locked", (unsigned int)(i));
+                       LOG_ERROR("lock region %u is locked", i);
                        return ERROR_FAIL;
                }
                if (status & (1 << 1)) {
-                       LOG_ERROR("flash command error @lock region %d", (unsigned int)(i));
+                       LOG_ERROR("flash command error @lock region %u", i);
                        return ERROR_FAIL;
                }
        }
        return ERROR_OK;
 }
 
-static int samv_protect(struct flash_bank *bank, int set, int first, int last)
+static int samv_protect(struct flash_bank *bank, int set, unsigned int first,
+               unsigned int last)
 {
        if (bank->target->state != TARGET_HALTED) {
                LOG_ERROR("Target not halted");
@@ -449,9 +454,9 @@ static int samv_protect(struct flash_bank *bank, int set, int first, int last)
 
        int r;
        if (set)
-               r = samv_flash_lock(bank->target, (unsigned)(first), (unsigned)(last));
+               r = samv_flash_lock(bank->target, first, last);
        else
-               r = samv_flash_unlock(bank->target, (unsigned)(first), (unsigned)(last));
+               r = samv_flash_unlock(bank->target, first, last);
 
        return r;
 }
@@ -602,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) {
@@ -610,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 %d kB flash",
+       command_print_sameline(cmd, "Cortex-M7 detected with %" PRIu32 " kB flash\n",
                        bank->size / 1024);
        return ERROR_OK;
 }
@@ -640,7 +645,6 @@ COMMAND_HANDLER(samv_handle_gpnvm_command)
        switch (CMD_ARGC) {
                case 0:
                        goto showall;
-                       break;
                case 1:
                        who = -1;
                        break;
@@ -655,10 +659,9 @@ COMMAND_HANDLER(samv_handle_gpnvm_command)
                        break;
                default:
                        return ERROR_COMMAND_SYNTAX_ERROR;
-                       break;
        }
 
-       uint32_t v;
+       unsigned v;
        if (!strcmp("show", CMD_ARGV[0])) {
                if (who == -1) {
 showall:
@@ -667,22 +670,25 @@ showall:
                                r = samv_get_gpnvm(target, x, &v);
                                if (r != ERROR_OK)
                                        break;
-                               command_print(CMD_CTX, "samv-gpnvm%u: %u", x, v);
+                               command_print(CMD, "samv-gpnvm%u: %u", x, v);
                        }
                        return r;
                }
                if ((who >= 0) && (((unsigned)who) < SAMV_NUM_GPNVM_BITS)) {
                        r = samv_get_gpnvm(target, who, &v);
-                       command_print(CMD_CTX, "samv-gpnvm%u: %u", who, v);
+                       if (r != ERROR_OK)
+                               return r;
+
+                       command_print(CMD, "samv-gpnvm%u: %u", who, v);
                        return r;
                } else {
-                       command_print(CMD_CTX, "invalid gpnvm: %u", who);
+                       command_print(CMD, "invalid gpnvm: %u", who);
                        return ERROR_COMMAND_SYNTAX_ERROR;
                }
        }
 
        if (who == -1) {
-               command_print(CMD_CTX, "missing gpnvm number");
+               command_print(CMD, "missing gpnvm number");
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
@@ -691,7 +697,7 @@ showall:
        else if (!strcmp("clr", CMD_ARGV[0]) || !strcmp("clear", CMD_ARGV[0]))
                r = samv_clear_gpnvm(target, who);
        else {
-               command_print(CMD_CTX, "unknown command: %s", CMD_ARGV[0]);
+               command_print(CMD, "unknown command: %s", CMD_ARGV[0]);
                r = ERROR_COMMAND_SYNTAX_ERROR;
        }
        return r;
@@ -721,7 +727,7 @@ static const struct command_registration atsamv_command_handlers[] = {
        COMMAND_REGISTRATION_DONE
 };
 
-struct flash_driver atsamv_flash = {
+const struct flash_driver atsamv_flash = {
        .name = "atsamv",
        .commands = atsamv_command_handlers,
        .flash_bank_command = samv_flash_bank_command,
@@ -734,4 +740,5 @@ struct flash_driver atsamv_flash = {
        .erase_check = default_flash_blank_check,
        .protect_check = samv_protect_check,
        .info = samv_get_info,
+       .free_driver_priv = default_flash_free_driver_priv,
 };