flash/nor/numicro: Use 'bool' data type
[fw/openocd] / src / flash / nor / numicro.c
index 8d8ed6ebbec538f7e0e22f82823c5e8c5716e13a..d9ea16d279a5337ab6636ab919a15a2331d53a53 100644 (file)
@@ -20,6 +20,9 @@
  *   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
@@ -1129,7 +1132,7 @@ static const struct numicro_cpu_type NuMicroParts[] = {
 /* Private bank information for NuMicro. */
 struct  numicro_flash_bank {
        struct working_area *write_algorithm;
-       int probed;
+       bool probed;
        const struct numicro_cpu_type *cpu;
 };
 
@@ -1213,7 +1216,7 @@ static int numicro_init_isp(struct target *target)
        return ERROR_OK;
 }
 
-static uint32_t numicro_fmc_cmd(struct target *target, uint32_t cmd, uint32_t addr, uint32_t wdata, uint32_trdata)
+static uint32_t numicro_fmc_cmd(struct target *target, uint32_t cmd, uint32_t addr, uint32_t wdata, uint32_t *rdata)
 {
        uint32_t timeout, status;
        int retval = ERROR_OK;
@@ -1240,7 +1243,7 @@ static uint32_t numicro_fmc_cmd(struct target *target, uint32_t cmd, uint32_t ad
                retval = target_read_u32(target, NUMICRO_FLASH_ISPTRG, &status);
                if (retval != ERROR_OK)
                        return retval;
-                       LOG_DEBUG("status: 0x%" PRIx32 "", status);
+               LOG_DEBUG("status: 0x%" PRIx32 "", status);
                if ((status & (ISPTRG_ISPGO)) == 0)
                        break;
                if (timeout-- <= 0) {
@@ -1430,7 +1433,7 @@ static int numicro_protect_check(struct flash_bank *bank)
 {
        struct target *target = bank->target;
        uint32_t set, config[2];
-       int i, retval = ERROR_OK;
+       int retval = ERROR_OK;
 
        if (target->state != TARGET_HALTED) {
                LOG_ERROR("Target not halted");
@@ -1464,25 +1467,26 @@ static int numicro_protect_check(struct flash_bank *bank)
            set = 0;
        }
 
-       for (i = 0; i < bank->num_sectors; i++)
+       for (unsigned int i = 0; i < bank->num_sectors; i++)
                bank->sectors[i].is_protected = set;
 
        return ERROR_OK;
 }
 
 
-static int numicro_erase(struct flash_bank *bank, int first, int last)
+static int numicro_erase(struct flash_bank *bank, unsigned int first,
+               unsigned int last)
 {
        struct target *target = bank->target;
        uint32_t timeout, status;
-       int i, retval = ERROR_OK;
+       int retval = ERROR_OK;
 
        if (target->state != TARGET_HALTED) {
                LOG_ERROR("Target not halted");
                return ERROR_TARGET_NOT_HALTED;
        }
 
-       LOG_INFO("Nuvoton NuMicro: Sector Erase ... (%d to %d)", first, last);
+       LOG_INFO("Nuvoton NuMicro: Sector Erase ... (%u to %u)", first, last);
 
        retval = numicro_init_isp(target);
        if (retval != ERROR_OK)
@@ -1492,8 +1496,9 @@ static int numicro_erase(struct flash_bank *bank, int first, int last)
        if (retval != ERROR_OK)
                return retval;
 
-       for (i = first; i <= last; i++) {
-               LOG_DEBUG("erasing sector %d at address 0x%" PRIx32 "", i, bank->base + bank->sectors[i].offset);
+       for (unsigned int i = first; i <= last; i++) {
+               LOG_DEBUG("erasing sector %u at address " TARGET_ADDR_FMT, i,
+                               bank->base + bank->sectors[i].offset);
                retval = target_write_u32(target, NUMICRO_FLASH_ISPADR, bank->base + bank->sectors[i].offset);
                if (retval != ERROR_OK)
                        return retval;
@@ -1507,7 +1512,7 @@ static int numicro_erase(struct flash_bank *bank, int first, int last)
                        retval = target_read_u32(target, NUMICRO_FLASH_ISPTRG, &status);
                        if (retval != ERROR_OK)
                                return retval;
-                               LOG_DEBUG("status: 0x%" PRIx32 "", status);
+                       LOG_DEBUG("status: 0x%" PRIx32 "", status);
                        if (status == 0)
                                break;
                        if (timeout-- <= 0) {
@@ -1544,7 +1549,6 @@ static int numicro_write(struct flash_bank *bank, const uint8_t *buffer,
 {
        struct target *target = bank->target;
        uint32_t timeout, status;
-       uint8_t *new_buffer = NULL;
        int retval = ERROR_OK;
 
        if (target->state != TARGET_HALTED) {
@@ -1562,20 +1566,8 @@ static int numicro_write(struct flash_bank *bank, const uint8_t *buffer,
        if (retval != ERROR_OK)
                return retval;
 
-       if (count & 0x3) {
-               uint32_t old_count = count;
-               count = (old_count | 3) + 1;
-               new_buffer = malloc(count);
-               if (new_buffer == NULL) {
-                       LOG_ERROR("odd number of bytes to write and no memory "
-                               "for padding buffer");
-                       return ERROR_FAIL;
-               }
-               LOG_INFO("odd number of bytes to write (%d), extending to %d "
-                       "and padding with 0xff", old_count, count);
-               memset(new_buffer, 0xff, count);
-               buffer = memcpy(new_buffer, buffer, old_count);
-       }
+       assert(offset % 4 == 0);
+       assert(count % 4 == 0);
 
        uint32_t words_remaining = count / 4;
 
@@ -1591,15 +1583,12 @@ static int numicro_write(struct flash_bank *bank, const uint8_t *buffer,
                /* program command */
                for (uint32_t i = 0; i < count; i += 4) {
 
-                       LOG_DEBUG("write longword @ %08X", offset + i);
-
-                       uint8_t padding[4] = {0xff, 0xff, 0xff, 0xff};
-                       memcpy(padding, buffer + i, MIN(4, count-i));
+                       LOG_DEBUG("write longword @ %08" PRIX32, offset + i);
 
                        retval = target_write_u32(target, NUMICRO_FLASH_ISPADR, bank->base + offset + i);
                        if (retval != ERROR_OK)
                                return retval;
-                       retval = target_write_memory(target, NUMICRO_FLASH_ISPDAT, 4, 1, padding);
+                       retval = target_write_memory(target, NUMICRO_FLASH_ISPDAT, 4, 1, buffer + i);
                        if (retval != ERROR_OK)
                                return retval;
                        retval = target_write_u32(target, NUMICRO_FLASH_ISPTRG, ISPTRG_ISPGO);
@@ -1612,7 +1601,7 @@ static int numicro_write(struct flash_bank *bank, const uint8_t *buffer,
                                retval = target_read_u32(target, NUMICRO_FLASH_ISPTRG, &status);
                                if (retval != ERROR_OK)
                                        return retval;
-                                       LOG_DEBUG("status: 0x%" PRIx32 "", status);
+                               LOG_DEBUG("status: 0x%" PRIx32 "", status);
                                if (status == 0)
                                        break;
                                if (timeout-- <= 0) {
@@ -1645,7 +1634,7 @@ static int numicro_write(struct flash_bank *bank, const uint8_t *buffer,
        return ERROR_OK;
 }
 
-static int numicro_get_cpu_type(struct target *target, const struct numicro_cpu_type** cpu)
+static int numicro_get_cpu_type(struct target *target, const struct numicro_cpu_type **cpu)
 {
        uint32_t part_id;
        int retval = ERROR_OK;
@@ -1659,7 +1648,7 @@ static int numicro_get_cpu_type(struct target *target, const struct numicro_cpu_
 
        LOG_INFO("Device ID: 0x%08" PRIx32 "", part_id);
        /* search part numbers */
-       for (size_t i = 0; i < sizeof(NuMicroParts)/sizeof(NuMicroParts[0]); i++) {
+       for (size_t i = 0; i < ARRAY_SIZE(NuMicroParts); i++) {
                if (part_id == NuMicroParts[i].partid) {
                        *cpu = &NuMicroParts[i];
                        LOG_INFO("Device Name: %s", (*cpu)->partname);
@@ -1675,7 +1664,8 @@ static int numicro_get_flash_size(struct flash_bank *bank, const struct numicro_
        for (size_t i = 0; i < cpu->n_banks; i++) {
                if (bank->base == cpu->bank[i].base) {
                        *flash_size = cpu->bank[i].size;
-                       LOG_INFO("bank base = 0x%08" PRIx32 ", size = 0x%08" PRIx32 "", bank->base, *flash_size);
+                       LOG_INFO("bank base = " TARGET_ADDR_FMT ", size = 0x%08"
+                                       PRIx32, bank->base, *flash_size);
                        return ERROR_OK;
                }
        }
@@ -1749,6 +1739,7 @@ FLASH_BANK_COMMAND_HANDLER(numicro_flash_bank_command)
        memset(bank_info, 0, sizeof(struct numicro_flash_bank));
 
        bank->driver_priv = bank_info;
+       bank->write_start_alignment = bank->write_end_alignment = 4;
 
        return ERROR_OK;
 
@@ -1822,11 +1813,11 @@ COMMAND_HANDLER(numicro_handle_chip_erase_command)
 
        retval = numicro_fmc_cmd(target, ISPCMD_CHIPERASE, 0, 0, &rdat);
        if (retval != ERROR_OK) {
-               command_print(CMD_CTX, "numicro chip_erase failed");
+               command_print(CMD, "numicro chip_erase failed");
                return retval;
        }
 
-       command_print(CMD_CTX, "numicro chip_erase complete");
+       command_print(CMD, "numicro chip_erase complete");
 
        return ERROR_OK;
 }
@@ -1851,6 +1842,7 @@ static const struct command_registration numicro_exec_command_handlers[] = {
                .handler = numicro_handle_chip_erase_command,
                .mode = COMMAND_EXEC,
                .help = "chip erase through ISP.",
+               .usage = "",
        },
        COMMAND_REGISTRATION_DONE
 };
@@ -1866,7 +1858,7 @@ static const struct command_registration numicro_command_handlers[] = {
        COMMAND_REGISTRATION_DONE
 };
 
-struct flash_driver numicro_flash = {
+const struct flash_driver numicro_flash = {
        .name = "numicro",
        .commands = numicro_command_handlers,
        .flash_bank_command = numicro_flash_bank_command,
@@ -1877,4 +1869,5 @@ struct flash_driver numicro_flash = {
        .auto_probe = numicro_auto_probe,
        .erase_check = default_flash_blank_check,
        .protect_check = numicro_protect_check,
+       .free_driver_priv = default_flash_free_driver_priv,
 };