stm32l4x: add OTP support for STM32 G0/G4/L4/L4+/L5/WB/WL devices
[fw/openocd] / src / flash / nor / efm32.c
index d2ac3a8fb1d5ac9c7ab65186e96a233c98c6dc52..6f290076241da781741f0eb39fb2c44fa02d275b 100644 (file)
@@ -99,7 +99,7 @@ struct efm32_family_data {
 };
 
 struct efm32x_flash_bank {
-       int probed;
+       bool probed;
        uint32_t lb_page[LOCKBITS_PAGE_SZ/4];
        uint32_t reg_base;
        uint32_t reg_lock;
@@ -140,6 +140,7 @@ static const struct efm32_family_data efm32_families[] = {
                { 43, "EFR32BG13P Blue", .series = 1 },
                { 44, "EFR32BG13B Blue", .series = 1 },
                { 45, "EFR32BG13V Blue", .series = 1 },
+               { 46, "EFR32ZG13P Zen", .series = 1 },
                { 49, "EFR32FG13P Flex", .series = 1 },
                { 50, "EFR32FG13B Flex", .series = 1 },
                { 51, "EFR32FG13V Flex", .series = 1 },
@@ -149,6 +150,7 @@ static const struct efm32_family_data efm32_families[] = {
                { 55, "EFR32BG14P Blue", .series = 1 },
                { 56, "EFR32BG14B Blue", .series = 1 },
                { 57, "EFR32BG14V Blue", .series = 1 },
+               { 58, "EFR32ZG14P Zen", .series = 1 },
                { 61, "EFR32FG14P Flex", .series = 1 },
                { 62, "EFR32FG14B Flex", .series = 1 },
                { 63, "EFR32FG14V Flex", .series = 1 },
@@ -166,7 +168,8 @@ static const struct efm32_family_data efm32_families[] = {
                { 89, "EFM32PG13B Pearl", .series = 1 },
                { 91, "EFM32JG13B Jade", .series = 1 },
                { 100, "EFM32GG11B Giant", .series = 1, .msc_regbase = 0x40000000 },
-               { 103, "EFM32TG11B Tiny", .series = 1 },
+               { 103, "EFM32TG11B Tiny", .series = 1, .msc_regbase = 0x40000000 },
+               { 106, "EFM32GG12B Giant", .series = 1, .msc_regbase = 0x40000000 },
                { 120, "EZR32WG Wonder", .series = 0 },
                { 121, "EZR32LG Leopard", .series = 0 },
                { 122, "EZR32HG Happy", .series = 0, .page_size = 1024 },
@@ -348,7 +351,7 @@ FLASH_BANK_COMMAND_HANDLER(efm32x_flash_bank_command)
        efm32x_info = malloc(sizeof(struct efm32x_flash_bank));
 
        bank->driver_priv = efm32x_info;
-       efm32x_info->probed = 0;
+       efm32x_info->probed = false;
        memset(efm32x_info->lb_page, 0xff, LOCKBITS_PAGE_SZ);
 
        return ERROR_OK;
@@ -464,10 +467,10 @@ static int efm32x_erase_page(struct flash_bank *bank, uint32_t addr)
                EFM32_MSC_STATUS_BUSY_MASK, 0);
 }
 
-static int efm32x_erase(struct flash_bank *bank, int first, int last)
+static int efm32x_erase(struct flash_bank *bank, unsigned int first,
+               unsigned int last)
 {
        struct target *target = bank->target;
-       int i = 0;
        int ret = 0;
 
        if (TARGET_HALTED != target->state) {
@@ -482,7 +485,7 @@ static int efm32x_erase(struct flash_bank *bank, int first, int last)
                return ret;
        }
 
-       for (i = first; i <= last; i++) {
+       for (unsigned int i = first; i <= last; i++) {
                ret = efm32x_erase_page(bank, bank->sectors[i].offset);
                if (ERROR_OK != ret)
                        LOG_ERROR("Failed to erase page %d", i);
@@ -498,7 +501,6 @@ static int efm32x_read_lock_data(struct flash_bank *bank)
 {
        struct efm32x_flash_bank *efm32x_info = bank->driver_priv;
        struct target *target = bank->target;
-       int i = 0;
        int data_size = 0;
        uint32_t *ptr = NULL;
        int ret = 0;
@@ -510,7 +512,7 @@ static int efm32x_read_lock_data(struct flash_bank *bank)
 
        ptr = efm32x_info->lb_page;
 
-       for (i = 0; i < data_size; i++, ptr++) {
+       for (int i = 0; i < data_size; i++, ptr++) {
                ret = target_read_u32(target, EFM32_MSC_LOCK_BITS+i*4, ptr);
                if (ERROR_OK != ret) {
                        LOG_ERROR("Failed to read PLW %d", i);
@@ -613,10 +615,10 @@ static int efm32x_set_page_lock(struct flash_bank *bank, size_t page, int set)
        return ERROR_OK;
 }
 
-static int efm32x_protect(struct flash_bank *bank, int set, int first, int last)
+static int efm32x_protect(struct flash_bank *bank, int set, unsigned int first,
+               unsigned int last)
 {
        struct target *target = bank->target;
-       int i = 0;
        int ret = 0;
 
        if (!set) {
@@ -629,7 +631,7 @@ static int efm32x_protect(struct flash_bank *bank, int set, int first, int last)
                return ERROR_TARGET_NOT_HALTED;
        }
 
-       for (i = first; i <= last; i++) {
+       for (unsigned int i = first; i <= last; i++) {
                ret = efm32x_set_page_lock(bank, i, set);
                if (ERROR_OK != ret) {
                        LOG_ERROR("Failed to set lock on page %d", i);
@@ -949,9 +951,7 @@ reset_pg_and_lock:
                retval = retval2;
 
 cleanup:
-       if (new_buffer)
-               free(new_buffer);
-
+       free(new_buffer);
        return retval;
 }
 
@@ -960,11 +960,10 @@ static int efm32x_probe(struct flash_bank *bank)
        struct efm32x_flash_bank *efm32x_info = bank->driver_priv;
        struct efm32_info efm32_mcu_info;
        int ret;
-       int i;
        uint32_t base_address = 0x00000000;
        char buf[256];
 
-       efm32x_info->probed = 0;
+       efm32x_info->probed = false;
        memset(efm32x_info->lb_page, 0xff, LOCKBITS_PAGE_SZ);
 
        ret = efm32x_read_info(bank, &efm32_mcu_info);
@@ -986,10 +985,8 @@ static int efm32x_probe(struct flash_bank *bank)
 
        assert(num_pages > 0);
 
-       if (bank->sectors) {
-               free(bank->sectors);
-               bank->sectors = NULL;
-       }
+       free(bank->sectors);
+       bank->sectors = NULL;
 
        bank->base = base_address;
        bank->size = (num_pages * efm32_mcu_info.page_size);
@@ -1003,14 +1000,14 @@ static int efm32x_probe(struct flash_bank *bank)
 
        bank->sectors = malloc(sizeof(struct flash_sector) * num_pages);
 
-       for (i = 0; i < num_pages; i++) {
+       for (int i = 0; i < num_pages; i++) {
                bank->sectors[i].offset = i * efm32_mcu_info.page_size;
                bank->sectors[i].size = efm32_mcu_info.page_size;
                bank->sectors[i].is_erased = -1;
                bank->sectors[i].is_protected = 1;
        }
 
-       efm32x_info->probed = 1;
+       efm32x_info->probed = true;
 
        return ERROR_OK;
 }
@@ -1027,7 +1024,6 @@ static int efm32x_protect_check(struct flash_bank *bank)
 {
        struct target *target = bank->target;
        int ret = 0;
-       int i = 0;
 
        if (target->state != TARGET_HALTED) {
                LOG_ERROR("Target not halted");
@@ -1042,7 +1038,7 @@ static int efm32x_protect_check(struct flash_bank *bank)
 
        assert(NULL != bank->sectors);
 
-       for (i = 0; i < bank->num_sectors; i++)
+       for (unsigned int i = 0; i < bank->num_sectors; i++)
                bank->sectors[i].is_protected = efm32x_get_page_lock(bank, i);
 
        return ERROR_OK;
@@ -1093,7 +1089,7 @@ COMMAND_HANDLER(efm32x_handle_debuglock_command)
                return retval;
        }
 
-       command_print(CMD_CTX, "efm32x debug interface locked, reset the device to apply");
+       command_print(CMD, "efm32x debug interface locked, reset the device to apply");
 
        return ERROR_OK;
 }