flash/nor/efr32: fixed lockbits and user data
[fw/openocd] / src / flash / nor / kinetis_ke.c
index 9441a9d648b7b4687af89663dc8e0afa5d2593ed..48749e617d63872af94636188a04dbd57fed9f39 100644 (file)
@@ -41,6 +41,7 @@
 #include "imp.h"
 #include <helper/binarybuffer.h>
 #include <target/algorithm.h>
+#include <target/arm_adi_v5.h>
 #include <target/armv7m.h>
 #include <target/cortex_m.h>
 
@@ -434,7 +435,7 @@ static int kinetis_ke_prepare_flash(struct flash_bank *bank)
        return ERROR_OK;
 }
 
-int kinetis_ke_stop_watchdog(struct target *target)
+static int kinetis_ke_stop_watchdog(struct target *target)
 {
        struct working_area *watchdog_algorithm;
        struct armv7m_algorithm armv7m_info;
@@ -764,7 +765,8 @@ static int kinetis_ke_write_words(struct flash_bank *bank, const uint8_t *buffer
        return retval;
 }
 
-static int kinetis_ke_protect(struct flash_bank *bank, int set, int first, int last)
+static int kinetis_ke_protect(struct flash_bank *bank, int set,
+               unsigned int first, unsigned int last)
 {
        LOG_WARNING("kinetis_ke_protect not supported yet");
        /* FIXME: TODO */
@@ -809,12 +811,12 @@ static int kinetis_ke_protect_check(struct flash_bank *bank)
        if (fpopen && fpldis && fphdis) {
                LOG_WARNING("No flash protection found.");
 
-               for (uint32_t i = 0; i < (uint32_t) bank->num_sectors; i++)
+               for (unsigned int i = 0; i < bank->num_sectors; i++)
                        bank->sectors[i].is_protected = 0;
 
                kinfo->protection_size = 0;
        } else {
-               LOG_WARNING("Flash protected. FPOPEN=%i FPLDIS=%i FPHDIS=%i FPLS=%i FPHS=%i", \
+               LOG_WARNING("Flash protected. FPOPEN=%i FPLDIS=%i FPHDIS=%i FPLS=%i FPHS=%i",
                                        fpopen ? 1 : 0, fpldis ? 1 : 0, fphdis ? 1 : 0, fpls, fphs);
 
                /* Retrieve which region is protected and how much */
@@ -840,7 +842,7 @@ static int kinetis_ke_protect_check(struct flash_bank *bank)
                /* hprot_from indicates from where the upper region is protected */
                hprot_from = (0x8000 - hprot_size) / kinfo->sector_size;
 
-               for (uint32_t i = 0; i < (uint32_t) bank->num_sectors; i++) {
+               for (unsigned int i = 0; i < bank->num_sectors; i++) {
 
                        /* Check if the sector is in the lower region */
                        if (bank->sectors[i].offset < 0x4000) {
@@ -931,42 +933,10 @@ static int kinetis_ke_ftmrx_command(struct flash_bank *bank, uint8_t count,
        return ERROR_OK;
 }
 
-COMMAND_HANDLER(kinetis_ke_securing_test)
+static int kinetis_ke_erase(struct flash_bank *bank, unsigned int first,
+               unsigned int last)
 {
        int result;
-       struct target *target = get_current_target(CMD_CTX);
-       struct flash_bank *bank = NULL;
-       uint32_t address;
-
-       uint8_t FCCOBIX[2], FCCOBHI[2], FCCOBLO[2], fstat;
-
-       result = get_flash_bank_by_addr(target, 0x00000000, true, &bank);
-       if (result != ERROR_OK)
-               return result;
-
-       assert(bank != NULL);
-
-       if (target->state != TARGET_HALTED) {
-               LOG_ERROR("Target not halted");
-               return ERROR_TARGET_NOT_HALTED;
-       }
-
-       address = bank->base + 0x00000400;
-
-       FCCOBIX[0] = 0;
-       FCCOBHI[0] = FTMRX_CMD_ERASESECTOR;
-       FCCOBLO[0] = address >> 16;
-
-       FCCOBIX[1] = 1;
-       FCCOBHI[1] = address >> 8;
-       FCCOBLO[1] = address;
-
-       return kinetis_ke_ftmrx_command(bank, 2, FCCOBIX, FCCOBHI, FCCOBLO, &fstat);
-}
-
-static int kinetis_ke_erase(struct flash_bank *bank, int first, int last)
-{
-       int result, i;
        uint8_t FCCOBIX[2], FCCOBHI[2], FCCOBLO[2], fstat;
        bool fcf_erased = false;
 
@@ -982,7 +952,7 @@ static int kinetis_ke_erase(struct flash_bank *bank, int first, int last)
        if (result != ERROR_OK)
                return result;
 
-       for (i = first; i <= last; i++) {
+       for (unsigned int i = first; i <= last; i++) {
                FCCOBIX[0] = 0;
                FCCOBHI[0] = FTMRX_CMD_ERASESECTOR;
                FCCOBLO[0] = (bank->base + bank->sectors[i].offset) >> 16;
@@ -994,12 +964,10 @@ static int kinetis_ke_erase(struct flash_bank *bank, int first, int last)
                result = kinetis_ke_ftmrx_command(bank, 2, FCCOBIX, FCCOBHI, FCCOBLO, &fstat);
 
                if (result != ERROR_OK) {
-                       LOG_WARNING("erase sector %d failed", i);
+                       LOG_WARNING("erase sector %u failed", i);
                        return ERROR_FLASH_OPERATION_FAILED;
                }
 
-               bank->sectors[i].is_erased = 1;
-
                if (i == 2)
                        fcf_erased = true;
        }
@@ -1044,7 +1012,7 @@ static int kinetis_ke_write(struct flash_bank *bank, const uint8_t *buffer,
                uint32_t old_count = count;
                count = (old_count | 3) + 1;
                new_buffer = malloc(count);
-               if (new_buffer == NULL) {
+               if (!new_buffer) {
                        LOG_ERROR("odd number of bytes to write and no memory "
                                "for padding buffer");
                        return ERROR_FAIL;
@@ -1066,7 +1034,7 @@ static int kinetis_ke_write(struct flash_bank *bank, const uint8_t *buffer,
 
 static int kinetis_ke_probe(struct flash_bank *bank)
 {
-       int result, i;
+       int result;
        uint32_t offset = 0;
        struct target *target = bank->target;
        struct kinetis_ke_flash_bank *kinfo = bank->driver_priv;
@@ -1143,15 +1111,12 @@ static int kinetis_ke_probe(struct flash_bank *bank)
                        break;
        }
 
-       if (bank->sectors) {
-               free(bank->sectors);
-               bank->sectors = NULL;
-       }
+       free(bank->sectors);
 
        assert(bank->num_sectors > 0);
        bank->sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors);
 
-       for (i = 0; i < bank->num_sectors; i++) {
+       for (unsigned int i = 0; i < bank->num_sectors; i++) {
                bank->sectors[i].offset = offset;
                bank->sectors[i].size = kinfo->sector_size;
                offset += kinfo->sector_size;
@@ -1172,10 +1137,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;
@@ -1207,9 +1171,7 @@ static int kinetis_ke_blank_check(struct flash_bank *bank)
 
        if (fstat & (FTMRX_FSTAT_MGSTAT0_MASK | FTMRX_FSTAT_MGSTAT1_MASK)) {
                /* the whole bank is not erased, check sector-by-sector */
-               int i;
-
-               for (i = 0; i < bank->num_sectors; i++) {
+               for (unsigned int i = 0; i < bank->num_sectors; i++) {
                        FCCOBIX[0] = 0;
                        FCCOBHI[0] = FTMRX_CMD_SECTIONERASED;
                        FCCOBLO[0] = (bank->base + bank->sectors[i].offset) >> 16;
@@ -1229,14 +1191,13 @@ static int kinetis_ke_blank_check(struct flash_bank *bank)
                        if (result == ERROR_OK) {
                                bank->sectors[i].is_erased = !(fstat & (FTMRX_FSTAT_MGSTAT0_MASK | FTMRX_FSTAT_MGSTAT1_MASK));
                        } else {
-                               LOG_DEBUG("Ignoring errored PFlash sector blank-check");
+                               LOG_DEBUG("Ignoring error on PFlash sector blank-check");
                                bank->sectors[i].is_erased = -1;
                        }
                }
        } else {
                /* the whole bank is erased, update all sectors */
-               int i;
-               for (i = 0; i < bank->num_sectors; i++)
+               for (unsigned int i = 0; i < bank->num_sectors; i++)
                        bank->sectors[i].is_erased = 1;
        }
 
@@ -1247,24 +1208,17 @@ static const struct command_registration kinetis_ke_security_command_handlers[]
        {
                .name = "check_security",
                .mode = COMMAND_EXEC,
-               .help = "",
+               .help = "Check status of device security lock",
                .usage = "",
                .handler = kinetis_ke_check_flash_security_status,
        },
        {
                .name = "mass_erase",
                .mode = COMMAND_EXEC,
-               .help = "",
+               .help = "Issue a complete flash erase via the MDM-AP",
                .usage = "",
                .handler = kinetis_ke_mdm_mass_erase,
        },
-       {
-               .name = "test_securing",
-               .mode = COMMAND_EXEC,
-               .help = "",
-               .usage = "",
-               .handler = kinetis_ke_securing_test,
-       },
        COMMAND_REGISTRATION_DONE
 };
 
@@ -1272,7 +1226,7 @@ static const struct command_registration kinetis_ke_exec_command_handlers[] = {
        {
                .name = "mdm",
                .mode = COMMAND_ANY,
-               .help = "",
+               .help = "MDM-AP command group",
                .usage = "",
                .chain = kinetis_ke_security_command_handlers,
        },
@@ -1290,14 +1244,14 @@ static const struct command_registration kinetis_ke_command_handler[] = {
        {
                .name = "kinetis_ke",
                .mode = COMMAND_ANY,
-               .help = "Kinetis KE NAND flash controller commands",
+               .help = "Kinetis KE flash controller commands",
                .usage = "",
                .chain = kinetis_ke_exec_command_handlers,
        },
        COMMAND_REGISTRATION_DONE
 };
 
-struct flash_driver kinetis_ke_flash = {
+const struct flash_driver kinetis_ke_flash = {
        .name = "kinetis_ke",
        .commands = kinetis_ke_command_handler,
        .flash_bank_command = kinetis_ke_flash_bank_command,