This is an automated email from Gerrit.

"Name of user not set <cc...@nuvoton.com>" just uploaded a new patch set to 
Gerrit, which you can find at https://review.openocd.org/c/openocd/+/8168

-- gerrit

commit 921f92a60e9ef43bfb73f3547e2dd3513f6c2d45
Author: ccli0 <cc...@nuvoton.com>
Date:   Thu Feb 29 16:10:00 2024 +0800

    src/flash/nor: add support for Nuvoton M0, M23, M4 series.
    
    Change-Id: I47615ab7a4768412dc0066e66b114f3410a039ba
    Signed-off-by: ccli0 <cc...@nuvoton.com>

diff --git a/src/flash/nor/Makefile.am b/src/flash/nor/Makefile.am
index 534a7a804e..41827b4b53 100644
--- a/src/flash/nor/Makefile.am
+++ b/src/flash/nor/Makefile.am
@@ -49,6 +49,7 @@ NOR_DRIVERS = \
        %D%/npcx.c \
        %D%/nrf5.c \
        %D%/numicro.c \
+       %D%/numicro_dap.c \
        %D%/ocl.c \
        %D%/pic32mx.c \
        %D%/psoc4.c \
diff --git a/src/flash/nor/driver.h b/src/flash/nor/driver.h
index a63b72c8fa..dc9f4ac99e 100644
--- a/src/flash/nor/driver.h
+++ b/src/flash/nor/driver.h
@@ -277,6 +277,7 @@ extern const struct flash_driver npcx_flash;
 extern const struct flash_driver nrf51_flash;
 extern const struct flash_driver nrf5_flash;
 extern const struct flash_driver numicro_flash;
+extern const struct flash_driver numicro_dap_flash;
 extern const struct flash_driver ocl_flash;
 extern const struct flash_driver pic32mx_flash;
 extern const struct flash_driver psoc4_flash;
diff --git a/src/flash/nor/drivers.c b/src/flash/nor/drivers.c
index 3157bd3292..84fa02bb7a 100644
--- a/src/flash/nor/drivers.c
+++ b/src/flash/nor/drivers.c
@@ -51,6 +51,7 @@ static const struct flash_driver * const flash_drivers[] = {
        &msp432_flash,
        &niietcm4_flash,
        &npcx_flash,
+       &numicro_dap_flash,
        &nrf5_flash,
        &nrf51_flash,
        &numicro_flash,
diff --git a/src/flash/nor/numicro_dap.c b/src/flash/nor/numicro_dap.c
new file mode 100644
index 0000000000..8a830f05ac
--- /dev/null
+++ b/src/flash/nor/numicro_dap.c
@@ -0,0 +1,1888 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+/***************************************************************************
+ *   Copyright (C) 2023 by Nuvoton Technology Corporation                  *
+ *   ccli0 <cc...@nuvoton.com>                                             *
+ *                                                                         *
+ *   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
+#include "config.h"
+#endif
+
+#include "imp.h"
+#include "numicro_dap.h"
+#include <helper/binarybuffer.h>
+#include <helper/bits.h>
+#include <target/algorithm.h>
+#include <target/armv7m.h>
+
+#include <target/image.h>
+
+/* Definition NUMICRO_DAP Flash Memory Address */
+#define NUMICRO_DAP_APROM_BASE         0x00000000
+#define NUMICRO_DAP_APROM_BASE2                0x00100000
+#define NUMICRO_DAP_LDROM_BASE         0x00100000
+#define NUMICRO_NEW_FLASH_OFFSET       0x0F000000UL
+
+/* Definition NUVOICE_N574_DAP Flash Memory Address */
+#define NUVOICE_N574_DAP_APROM_BASE            0x00000000
+#define NUVOICE_N574_DAP_LDROM_BASE            0x00200000
+#define NUVOICE_N574F128_DAP_LDROM_BASE 0x00100000
+
+/* Definition NUMICRO_DAP Flash Memory Type */
+#define FLASH_TYPE_M2L31                               0x00000000
+#define FLASH_TYPE_M4                                  0x00000001
+#define FLASH_TYPE_M0_AHB5                             0x00000002
+#define FLASH_TYPE_M0_AHB4                             0x00000003
+#define FLASH_TYPE_M23                                 0x00000004
+#define FLASH_TYPE_M0_AHB5_NUVIOCE_N574 0x00000005
+#define FLASH_TYPE_M55                                 0x00000006
+
+#define NUMICRO_M55_CLK_SRCCTL 0x40001000UL
+#define NUMICRO_M55_CLK_FMCCTL 0x4000123CUL
+#define NUMICRO_M55_CLK_SCLKSEL        0x40001400UL
+#define NUMICRO_M55_CLK_SCLKDIV        0x40001500UL
+#define NUMICRO_M55_FMC_ISPCTL 0x40044000UL
+#define NUMICRO_M55_FMC_BASE   0x40044000UL
+
+#define CLK_SRCCTL_HIRCEN              BIT(3)
+#define CLK_SRCCTL_HIRC48MEN   BIT(5)
+#define CLK_FMCCTL_FMC0CKEN            BIT(0)
+#define CLK_FMCCTL_ISP0CKEN            BIT(16)
+#define CLK_SCLKSEL_HIRC48M            BIT(2)
+
+/* Nuvoton NuMicro register locations */
+#define NUMICRO_SYS_WRPROT             0x50000100UL
+#define NUMICRO_SYSCLK_AHBCLK  0x50000204UL
+
+#define NUMICRO_FMC_BASE4              0x4000C000UL
+
+#define NUMICRO_FMC_BASE               0x5000C000UL
+#define NUMICRO_FLASH_ISPCTL   0x00000000UL
+#define NUMICRO_FLASH_ISPADR   0x00000004UL
+#define NUMICRO_FLASH_ISPDAT   0x00000008UL
+#define NUMICRO_FLASH_ISPCMD   0x0000000CUL
+#define NUMICRO_FLASH_ISPTRG   0x00000010UL
+#define NUMICRO_FLASH_CHEAT            0x0000001CUL
+#define NUMICRO_FLASH_ISPSTS   0x00000040UL
+#define NUMICRO_FLASH_MPSTS            0x000000C0UL
+
+#define NUMICRO_SCS_DHCSR       0xE000EDF0UL
+#define ARM_SRAM_START_ADDRESS                 0x20000000UL
+#define NUMICRO_NS_OFFSET                              0x10000000UL
+
+#define AHBCLK_ISP_EN          BIT(2)
+#define ISPCTL_ISPEN           BIT(0)
+#define ISPCTL_SPUEN           BIT(2)
+#define ISPCTL_APUEN           BIT(3)
+#define ISPCTL_CFGUEN          BIT(4)
+#define ISPCTL_LDUEN           BIT(5)
+#define ISPCTL_ISPFF           BIT(6)
+#define FMC_MPSTS_MPBUSY       BIT(0)
+#define ISPCMD_ERASE           0x22U
+#define ISPTRG_ISPGO           BIT(0)
+
+#define DHCSR_S_SDE                    BIT(20)
+
+/* access unlock keys */
+#define REG_KEY1       0x59U
+#define REG_KEY2       0x16U
+#define REG_KEY3       0x88U
+#define REG_LOCK       0x00U
+
+#define NUMICRO_DAP_BANKS(aprom_size, ldrom_size) \
+       .n_banks = 2, \
+       {{NUMICRO_DAP_APROM_BASE, aprom_size}, \
+       {NUMICRO_DAP_LDROM_BASE, ldrom_size}}
+
+#define NUMICRO_DAP_BANKS_2(aprom_size, ldrom_size) \
+       .n_banks = 2, \
+       {{NUMICRO_DAP_APROM_BASE, aprom_size}, \
+       {NUMICRO_DAP_LDROM_BASE + NUMICRO_NEW_FLASH_OFFSET, ldrom_size}}
+
+#define NUMICRO_DAP_BANKS_3(aprom_size, ldrom_size) \
+       .n_banks = 2, \
+       {{NUMICRO_DAP_APROM_BASE2, aprom_size}, \
+       {NUMICRO_DAP_LDROM_BASE + NUMICRO_NEW_FLASH_OFFSET, ldrom_size}}
+
+#define NUVOICE_N574_DAP_BANKS(aprom_size, ldrom_size) \
+       .n_banks = 2, \
+       {{NUVOICE_N574_DAP_APROM_BASE, aprom_size}, \
+       {NUVOICE_N574_DAP_LDROM_BASE, ldrom_size}}
+
+static int m_addressminusoffset = 0x10000000;
+const struct numicro_dap_cpu_type *m_cpu;
+bool m_b_secure_debug;
+
+static const struct numicro_dap_cpu_type numicro_dap_parts[] = {
+       {"NDA102SD2", 0x00F25112, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(64 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"NDA102SE3", 0x00F25116, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"NUC1262SE4AE", 0x01812610, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC1262LE4AE", 0x01812600, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC1262NE4AE", 0x01812690, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC1263SD4AE", 0x01D12610, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC1263LD4AE", 0x01D12600, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC1263ND4AE", 0x01D12690, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC1263ZD4AE", 0x01D126E0, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M2351KIAAE", 0x00235100, FLASH_TYPE_M23, 
NUMICRO_DAP_BANKS(0x10080000, 4 * 1024), SECTOR_SIZE_2K},
+       {"M2351SIAAE", 0x00235101, FLASH_TYPE_M23, 
NUMICRO_DAP_BANKS(0x10080000, 4 * 1024), SECTOR_SIZE_2K},
+       {"M2351CIAAE", 0x00235102, FLASH_TYPE_M23, 
NUMICRO_DAP_BANKS(0x10080000, 4 * 1024), SECTOR_SIZE_2K},
+       {"M2351ZIAAE", 0x00235103, FLASH_TYPE_M23, 
NUMICRO_DAP_BANKS(0x10080000, 4 * 1024), SECTOR_SIZE_2K},
+       {"M2351SFSIAAP", 0x00235300, FLASH_TYPE_M23, 
NUMICRO_DAP_BANKS(0x10080000, 4 * 1024), SECTOR_SIZE_2K},
+       {"M2354KJFAE", 0xA1735440, FLASH_TYPE_M23, 
NUMICRO_DAP_BANKS(0x10100000, 16 * 1024), SECTOR_SIZE_2K},
+       {"M2354SJFAE", 0xA1735410, FLASH_TYPE_M23, 
NUMICRO_DAP_BANKS(0x10100000, 16 * 1024), SECTOR_SIZE_2K},
+       {"M2354LJFAE", 0xA1735400, FLASH_TYPE_M23, 
NUMICRO_DAP_BANKS(0x10100000, 16 * 1024), SECTOR_SIZE_2K},
+       {"M2354LJFCE", 0xA173540C, FLASH_TYPE_M23, 
NUMICRO_DAP_BANKS(0x10100000, 16 * 1024), SECTOR_SIZE_2K},
+       {"M261ZIAAE", 0x00261000, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M261SIAAE", 0x00261001, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M261KIAAE", 0x00261002, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M262ZIAAE", 0x00262000, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M262SIAAE", 0x00262001, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M262KIAAE", 0x00262002, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M263ZIAAE", 0x00263000, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M263SIAAE", 0x00263001, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M263KIAAE", 0x00263002, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M252FC2AE", 0x00F252B0, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(32 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M252EC2AE", 0x00F252A0, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(32 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M252ZC2AE", 0x00F252E0, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(32 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M251FC2AE", 0x00F251B0, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(32 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M251EC2AE", 0x00F251A0, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(32 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M251ZC2AE", 0x00F251E0, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(32 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M251SD2AE", 0x00F25110, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(64 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M251LD2AE", 0x00F25101, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(64 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M251ZD2AE", 0x00F251C2, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(64 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M251SC2AE", 0x00F25113, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(32 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M251LC2AE", 0x00F25104, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(32 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M252SD2AE", 0x00F25210, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(64 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M252LD2AE", 0x00F25201, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(64 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M252ZD2AE", 0x00F252C2, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(64 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M252SC2AE", 0x00F25213, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(32 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M252LC2AE", 0x00F25204, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(32 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M252KE3AE", 0x00F25243, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M252SE3AE", 0x00F25214, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M252LE3AE", 0x00F25205, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M251KE3AE", 0x00F25143, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M251SE3AE", 0x00F25114, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M251LE3AE", 0x00F25105, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M252KG6AE", 0x00F25240, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M252SG6AE", 0x00F25211, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M252LG6AE", 0x00F25202, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M251KG6AE", 0x00F25140, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M251SG6AE", 0x00F25111, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M251LG6AE", 0x00F25102, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M254SD3AE", 0x00F25410, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(64 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M254SE3AE", 0x00F25411, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M254KE3AE", 0x00F25441, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M256SE3AE", 0x00F25611, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M256KE3AE", 0x00F25641, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M258SE3AE", 0x00F25811, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M258KE3AE", 0x00F25841, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M254SD2AE", 0x01A25411, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(64 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M256MD2AE", 0x01A256A1, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(64 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M256SD2AE", 0x01A25611, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(64 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M254MD2AE", 0x01A254A1, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(64 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M258KG6AE", 0x01925841, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M256KG6AE", 0x01925641, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M254KG6AE", 0x01925441, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M258SG6AE", 0x01925811, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M256SG6AE", 0x01925611, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M254SG6AE", 0x01925411, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M253ZE3AE", 0x00F250E0, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M253ZE3BE", 0x00F250E1, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M253LE3AE", 0x00F25001, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M253LE3BE", 0x00F25003, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M253LD3AE", 0x00F25000, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(64 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M253LD3BE", 0x00F25002, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(64 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M2L31KIDAE", 0x01F31040, FLASH_TYPE_M2L31, NUMICRO_DAP_BANKS_2(512 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M2L31KGDAE", 0x01F31041, FLASH_TYPE_M2L31, NUMICRO_DAP_BANKS_2(256 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M2L31SIDAE", 0x01F31010, FLASH_TYPE_M2L31, NUMICRO_DAP_BANKS_2(512 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M2L31SGDAE", 0x01F31011, FLASH_TYPE_M2L31, NUMICRO_DAP_BANKS_2(256 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M2L31SG4AE", 0x01F31012, FLASH_TYPE_M2L31, NUMICRO_DAP_BANKS_2(256 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M2L31SE4AE", 0x01F31013, FLASH_TYPE_M2L31, NUMICRO_DAP_BANKS_2(128 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M2L31LIDAE", 0x01F31000, FLASH_TYPE_M2L31, NUMICRO_DAP_BANKS_2(512 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M2L31LGDAE", 0x01F31001, FLASH_TYPE_M2L31, NUMICRO_DAP_BANKS_2(256 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M2L31LG4AE", 0x01F31002, FLASH_TYPE_M2L31, NUMICRO_DAP_BANKS_2(256 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M2L31LE4AE", 0x01F31003, FLASH_TYPE_M2L31, NUMICRO_DAP_BANKS_2(128 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M2L31LD4AE", 0x01F31004, FLASH_TYPE_M2L31, NUMICRO_DAP_BANKS_2(64 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M2L31YIDAE", 0x01F31090, FLASH_TYPE_M2L31, NUMICRO_DAP_BANKS_2(512 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M2L31YGDAE", 0x01F31091, FLASH_TYPE_M2L31, NUMICRO_DAP_BANKS_2(256 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M2L31YG4AE", 0x01F31092, FLASH_TYPE_M2L31, NUMICRO_DAP_BANKS_2(256 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M2L31YE4AE", 0x01F31093, FLASH_TYPE_M2L31, NUMICRO_DAP_BANKS_2(128 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M2L31YD4AE", 0x01F31094, FLASH_TYPE_M2L31, NUMICRO_DAP_BANKS_2(64 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M2L31ZE4AE", 0x01F310C3, FLASH_TYPE_M2L31, NUMICRO_DAP_BANKS_2(128 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M2L31ZD4AE", 0x01F310C4, FLASH_TYPE_M2L31, NUMICRO_DAP_BANKS_2(64 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M2L31CIDAE", 0x01F310A0, FLASH_TYPE_M2L31, NUMICRO_DAP_BANKS_2(512 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M2L31CGDAE", 0x01F310A1, FLASH_TYPE_M2L31, NUMICRO_DAP_BANKS_2(256 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M2L31XD4AE", 0x01F310B4, FLASH_TYPE_M2L31, NUMICRO_DAP_BANKS_2(64 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M2003FPGA", 0xFFFFFFFF, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(32 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M2003FC1AE", 0x01F03CB0, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(32 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M2003XC1AE", 0x01F03C80, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(32 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M2P481QC1AE", 0x01F03C9F, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"KN44490A", 0x01F03CFF, FLASH_TYPE_M23, NUMICRO_DAP_BANKS(32 * 1024, 4 
* 1024), SECTOR_SIZE_512},
+       {"NUC442RG8AE", 0x00044212, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 
1024, 16 * 1024), SECTOR_SIZE_2K},
+       {"NUC442RI8AE", 0x00044210, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 
1024, 16 * 1024), SECTOR_SIZE_2K},
+       {"NUC442VG8AE", 0x00044209, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 
1024, 16 * 1024), SECTOR_SIZE_2K},
+       {"NUC442VI8AE", 0x00044207, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 
1024, 16 * 1024), SECTOR_SIZE_2K},
+       {"NUC442KG8AE", 0x00044206, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 
1024, 16 * 1024), SECTOR_SIZE_2K},
+       {"NUC442KI8AE", 0x00044204, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 
1024, 16 * 1024), SECTOR_SIZE_2K},
+       {"NUC442JG8AE", 0x00044203, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 
1024, 16 * 1024), SECTOR_SIZE_2K},
+       {"NUC442JI8AE", 0x00044201, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 
1024, 16 * 1024), SECTOR_SIZE_2K},
+       {"NUC472VG8AE", 0x00047212, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 
1024, 16 * 1024), SECTOR_SIZE_2K},
+       {"NUC472VI8AE", 0x00047210, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 
1024, 16 * 1024), SECTOR_SIZE_2K},
+       {"NUC472KG8AE", 0x00047209, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 
1024, 16 * 1024), SECTOR_SIZE_2K},
+       {"NUC472KI8AE", 0x00047207, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 
1024, 16 * 1024), SECTOR_SIZE_2K},
+       {"NUC472JG8AE", 0x00047206, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 
1024, 16 * 1024), SECTOR_SIZE_2K},
+       {"NUC472JI8AE", 0x00047204, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 
1024, 16 * 1024), SECTOR_SIZE_2K},
+       {"NUC472HG8AE", 0x00047203, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 
1024, 16 * 1024), SECTOR_SIZE_2K},
+       {"NUC472HI8AE", 0x00047201, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 
1024, 16 * 1024), SECTOR_SIZE_2K},
+       {"M451VG6AE", 0x00845130, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M451VE6AE", 0x00845131, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M451RG6AE", 0x00845120, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M451RE6AE", 0x00845121, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M451LG6AE", 0x00845100, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M451LE6AE", 0x00845101, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M451RD3AE", 0x00945120, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(72 * 1024, 4 
* 1024), SECTOR_SIZE_2K},
+       {"M451RC3AE", 0x00945121, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(40 * 1024, 4 
* 1024), SECTOR_SIZE_2K},
+       {"M451LD3AE", 0x00945100, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(72 * 1024, 4 
* 1024), SECTOR_SIZE_2K},
+       {"M451LC3AE", 0x00945101, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(40 * 1024, 4 
* 1024), SECTOR_SIZE_2K},
+       {"M452VG6AE", 0x00845230, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M452VE6AE", 0x00845231, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M452RG6AE", 0x00845220, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M452RE6AE", 0x00845221, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M452LG6AE", 0x00845200, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M452LE6AE", 0x00845201, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M452RD3AE", 0x00945220, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(72 * 1024, 4 
* 1024), SECTOR_SIZE_2K},
+       {"M452LD3AE", 0x00945200, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(72 * 1024, 4 
* 1024), SECTOR_SIZE_2K},
+       {"M452LC3AE", 0x00945201, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(40 * 1024, 4 
* 1024), SECTOR_SIZE_2K},
+       {"M453VG6AE", 0x00845330, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M453VE6AE", 0x00845331, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M453RG6AE", 0x00845320, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M453RE6AE", 0x00845321, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M453LG6AE", 0x00845300, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M453LE6AE", 0x00845301, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M453VD3AE", 0x00945330, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(72 * 1024, 4 
* 1024), SECTOR_SIZE_2K},
+       {"M453RD3AE", 0x00945320, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(72 * 1024, 4 
* 1024), SECTOR_SIZE_2K},
+       {"M453LD3AE", 0x00945300, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(72 * 1024, 4 
* 1024), SECTOR_SIZE_2K},
+       {"M453LC3AE", 0x00945301, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(40 * 1024, 4 
* 1024), SECTOR_SIZE_2K},
+       {"M451MLG6AE", 0x00845000, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M451MLE6AE", 0x00845001, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M451MSD3AE", 0x00945010, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(72 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M451MSC3AE", 0x00945011, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(40 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M451MLD3AE", 0x00945000, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(72 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M451MLC3AE", 0x00945001, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(40 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M4LEDLG6AE", 0x00845700, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M4LEDLE6AE", 0x00845701, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M4LEDRG6AE", 0x00845720, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M4LEDRE6AE", 0x00845721, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M4TKLE6AE", 0x00845401, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M4TKLG6AE", 0x00845400, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M4TKRE6AE", 0x00845421, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M4TKRG6AE", 0x00845420, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M4TKVE6AE", 0x00845431, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M4TKVG6AE", 0x00845430, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M4521SE6AE", 0x00E45210, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M4521LE6AE", 0x00E45200, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M481SIDAE", 0x00D48110, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M481LIDAE", 0x00D48100, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M481ZIDAE", 0x00D481E0, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M482KIDAE", 0x00D48240, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M482SIDAE", 0x00D48210, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M482LIDAE", 0x00D48200, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M482ZIDAE", 0x00D482E0, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M483KIDAE", 0x00D48340, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M483SIDAE", 0x00D48310, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M484KIDAE", 0x00D48440, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M484SIDAE", 0x00D48410, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M484SIDAE2U", 0x00D48412, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 
1024, 4 * 1024), SECTOR_SIZE_4K},
+       {"M485KIDAE", 0x00D48540, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M485SIDAE", 0x00D48510, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M485LIDAE", 0x00D48500, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M485YIDAE", 0x00D48590, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M485ZIDAE", 0x00D485E0, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M487JIDAE", 0x00D48750, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M487KMCAN", 0x00D4874E, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M487KIDAE", 0x00D48740, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M487SIDAE", 0x00D48710, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M481SGCAE", 0x01348110, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M481SE8AE", 0x01348112, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M481SGCAE2A", 0x01348114, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_4K},
+       {"M481LGCAE", 0x01348100, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M481LE8AE", 0x01348102, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M481ZGCAE", 0x013481E0, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M481ZE8AE", 0x013481E2, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M482KGCAE", 0x01348240, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M482SGCAE", 0x01348210, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M482SE8AE", 0x01348212, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M482LGCAE", 0x01348200, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M482LE8AE", 0x01348202, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M482ZGCAE", 0x013482E0, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M482ZE8AE", 0x013482E2, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M483KGCAE", 0x01348340, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M483SGCAE", 0x01348310, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M483SE8AE", 0x01348312, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M483KGCAE2A", 0x01348344, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_4K},
+       {"M483SGCAE2A", 0x01348314, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_4K},
+       {"M479SG8AEE", 0x01347911, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M479LG8AEE", 0x01347901, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M479NG8AEE", 0x01347991, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M467SJHAE", 0x01B46710, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(1024 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M467S2JHAE", 0x01B46712, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(1024 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M467KJHAE", 0x01B46740, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(1024 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M467K2JHAE", 0x01B46742, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(1024 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M467JJHAE", 0x01B46750, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(1024 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M467J2JHAE", 0x01B46752, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(1024 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M467HJHAE", 0x01B46760, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(1024 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M467H2JHAE", 0x01B46762, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(1024 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M467H3KJHAE", 0x01B46F40, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(1024 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M467H3JJHAE", 0x01B46F51, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(1024 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M467SJHAN", 0x01B46F11, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(1024 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M467KJHAN", 0x01B46F41, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(1024 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M467JJHAN", 0x01B46F52, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(1024 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M467HJHAN", 0x01B46F61, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(1024 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M463KGCAE", 0x01C46340, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(256 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M463VGCAE", 0x01C46330, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(256 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M463SGCAE", 0x01C46310, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(256 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M463LGCAE", 0x01C46300, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(256 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M463YGCAE", 0x01C46390, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(256 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M463K2GCAC", 0x01C4634E, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(256 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M460KGCAE", 0x01C46040, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(256 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M460SGCAE", 0x01C46010, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(256 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M460LGCAE", 0x01C46000, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(256 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M460YGCAE", 0x01C46090, FLASH_TYPE_M4, NUMICRO_DAP_BANKS_2(256 * 
1024, 8 * 1024), SECTOR_SIZE_4K},
+       {"M471KI8AE", 0x01647140, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M471VI8AE", 0x01647130, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M471VG7AE", 0x01647131, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M471CI8AE", 0x016471F0, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M471R1E6AE", 0x01647192, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M471R1D6AE", 0x01647193, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(64 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M471SE6AE", 0x01647112, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M471SD6AE", 0x01647113, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(64 * 1024, 4 
* 1024), SECTOR_SIZE_2K},
+       {"M471MD6AE", 0x016471A3, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(64 * 1024, 4 
* 1024), SECTOR_SIZE_2K},
+       {"M4521RE6AE", 0x00E45220, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M4521RD6AE", 0x00E45221, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(64 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M4521SE6AE", 0x00E45210, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M4521SD6AE", 0x00E45211, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(64 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M4521LE6AE", 0x00E45200, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"M4521LD6AE", 0x00E45201, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(64 * 1024, 
4 * 1024), SECTOR_SIZE_2K},
+       {"I94124A", 0x1D0105BA, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 4 
* 1024), SECTOR_SIZE_4K},
+       {"I94123A", 0x1D0105B8, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 4 
* 1024), SECTOR_SIZE_4K},
+       {"I94121A", 0x1D0105B6, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 4 
* 1024), SECTOR_SIZE_4K},
+       {"I94120A", 0x1D0105B5, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 4 
* 1024), SECTOR_SIZE_4K},
+       {"I94114A", 0x1D01059A, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 4 
* 1024), SECTOR_SIZE_4K},
+       {"I94113A", 0x1D010598, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 4 
* 1024), SECTOR_SIZE_4K},
+       {"I94111A", 0x1D010596, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 4 
* 1024), SECTOR_SIZE_4K},
+       {"I94110A", 0x1D010595, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 4 
* 1024), SECTOR_SIZE_4K},
+       {"I94134A", 0x1D01058A, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 4 
* 1024), SECTOR_SIZE_4K},
+       {"I94133A", 0x1D010588, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 4 
* 1024), SECTOR_SIZE_4K},
+       {"I94131A", 0x1D010586, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 4 
* 1024), SECTOR_SIZE_4K},
+       {"I94130A", 0x1D010585, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 4 
* 1024), SECTOR_SIZE_4K},
+       {"I94124B", 0x1D0A05BA, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 4 
* 1024), SECTOR_SIZE_4K},
+       {"I94123B", 0x1D0A05B8, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 4 
* 1024), SECTOR_SIZE_4K},
+       {"I94113B", 0x1D0A0598, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 4 
* 1024), SECTOR_SIZE_4K},
+       {"I94124C", 0x1D0705BA, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 4 
* 1024), SECTOR_SIZE_4K},
+       {"I94123C", 0x1D0705B8, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 4 
* 1024), SECTOR_SIZE_4K},
+       {"I94113C", 0x1D070598, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(256 * 1024, 4 
* 1024), SECTOR_SIZE_4K},
+       {"I94124E", 0x1D0605BA, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 4 
* 1024), SECTOR_SIZE_4K},
+       {"I94100A", 0x1D0005BA, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 4 
* 1024), SECTOR_SIZE_4K},
+       {"I94120ARI", 0x1D800500, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(512 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M433LE8AE", 0x01343302, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M433SE8AE", 0x01343312, FLASH_TYPE_M4, NUMICRO_DAP_BANKS(128 * 1024, 
4 * 1024), SECTOR_SIZE_4K},
+       {"M55M1ES", 0x00551000, FLASH_TYPE_M55, NUMICRO_DAP_BANKS_3(0x10200000, 
8 * 1024), SECTOR_SIZE_8K},
+       {"M029GGC0AE", 0x011296F1, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M030GGD1AE", 0x011306F0, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(64 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M030GTD1AE", 0x011306E0, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(64 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M030GGC1AE", 0x011306F2, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M030GTC1AE", 0x011306E2, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M030GGC0AE", 0x011306F1, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M030GTC0AE", 0x011306E1, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M031GGD2AE", 0x011316F0, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(64 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M031GTD2AE", 0x011316E0, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(64 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M031GGC2AE", 0x011316F2, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M031GTC2AE", 0x011316E2, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M031GGC1AE", 0x011316F1, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M031GTC1AE", 0x011316E1, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M091TD2AE", 0x011916E0, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(64 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M091YD2AE", 0x01191690, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(64 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M091TC2AE", 0x011916E2, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M091YC2AE", 0x01191692, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M031SIAAE", 0x01131110, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(512 * 
1024, 8 * 1024), SECTOR_SIZE_2K},
+       {"M032SIAAE", 0x01132110, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(512 * 
1024, 8 * 1024), SECTOR_SIZE_2K},
+       {"M031KIAAE", 0x01131140, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(512 * 
1024, 8 * 1024), SECTOR_SIZE_2K},
+       {"M032KIAAE", 0x01132140, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(512 * 
1024, 8 * 1024), SECTOR_SIZE_2K},
+       {"M031LG8AE", 0x01131600, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"M032LG8AE", 0x01132600, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"M031SG8AE", 0x01131610, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"M032SG8AE", 0x01132610, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"M031KG8AE", 0x01131640, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"M032KG8AE", 0x01132640, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"M031LG6AE", 0x01131601, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"M032LG6AE", 0x01132601, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"M031SG6AE", 0x01131611, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"M032SG6AE", 0x01132611, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"M031KG6AE", 0x01131641, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"M032KG6AE", 0x01132641, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"M031LE3AE", 0x01131E00, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M031SE3AE", 0x01131E10, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M031BTYE3AN", 0x01131E90, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M031TE3AE", 0x01131EE0, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M032LE3AE", 0x01132E00, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M032SE3AE", 0x01132E10, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M032TD2AE", 0x01132DE0, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(64 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M032LD2AE", 0x01132D00, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(64 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M032LC2AE", 0x01132D01, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M030TD2AE", 0x01130DE0, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(64 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M030LD2AE", 0x01130D00, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(64 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M030FD2AE", 0x01130DB0, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(64 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M032FC1AE", 0x01132CB0, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M032EC1AE", 0x01132CA0, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M032TC1AE", 0x01132CE0, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M031TD2AE", 0x01131DE0, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(64 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M031BTYD2AN", 0x01131D90, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(64 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M031LD2AE", 0x01131D00, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(64 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M031LC2AE", 0x01131D01, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M031SD2AE", 0x01131D10, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(64 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M031SC2AE", 0x01131D11, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M031FC1AE", 0x01131CB0, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M031EC1AE", 0x01131CA0, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M031TC1AE", 0x01131CE0, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M031FB0AE", 0x01131BB0, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(16 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M031EB0AE", 0x01131BA0, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(16 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M031TB0AE", 0x01131BE0, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(16 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M071MC2AE", 0x016071A5, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M071MD2AE", 0x016071A4, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M071R1D3AE", 0x01607193, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"M071R1E3AE", 0x01607192, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"M071SD3AE", 0x01607113, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"M071SE3AE", 0x01607112, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"M071VG4AE", 0x01607130, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"M0A21OB1AC", 0x015A2121, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(16 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M0A21OC1AC", 0x015A2120, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M0A21EB1AC", 0x015A21A1, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(16 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M0A21EC1AC", 0x015A21A0, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M0A23OC1AC", 0x015A2320, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M0A23EC1AC", 0x015A23A0, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M0A23OC1ACU", 0x015A2321, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M0A23EC1ACU", 0x015A23A1, FLASH_TYPE_M0_AHB4, NUMICRO_DAP_BANKS(32 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"M052LAN", 0x00005200, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(8 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M052ZAN", 0x00005203, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(8 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M054LAN", 0x00005400, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(16 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M054ZAN", 0x00005403, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(16 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M058LAN", 0x00005800, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M058ZAN", 0x00005803, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M0516LAN", 0x00005A00, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M0516ZAN", 0x00005A03, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M052LBN", 0x10005200, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(8 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M052ZBN", 0x10005203, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(8 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M054LBN", 0x10005400, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(16 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M054ZBN", 0x10005403, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(16 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M058LBN", 0x10005800, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M058ZBN", 0x10005803, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M0516LBN", 0x10005A00, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M0516ZBN", 0x10005A03, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M052LDN", 0x20005200, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(8 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M052ZDN", 0x20005203, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(8 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M054LDN", 0x20005400, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(16 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M054ZDN", 0x20005403, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(16 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M058LDN", 0x20005800, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M058ZDN", 0x20005803, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M0516LDN", 0x20005A00, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M0516ZDN", 0x20005A03, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M052LDE", 0x30005200, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(8 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M052ZDE", 0x30005203, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(8 * 1024, 
4 * 1024), SECTOR_SIZE_512},
+       {"M054LDE", 0x30005400, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(16 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M054ZDE", 0x30005403, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(16 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M058LDE", 0x30005800, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M058ZDE", 0x30005803, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M058MDE", 0x30005807, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M0516LDE", 0x30005A00, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M0516ZDE", 0x30005A03, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M058SFAN", 0x00005818, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M058SZAN", 0x00005813, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M058SLAN", 0x00005810, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M058SSAN", 0x00005816, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"MINI51LAN", 0x00205100, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(4 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI51ZAN", 0x00205103, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(4 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI51TAN", 0x00205104, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(4 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI52LAN", 0x00205200, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(8 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI52ZAN", 0x00205203, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(8 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI52TAN", 0x00205204, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(8 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI54LAN", 0x00205400, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(16 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI54ZAN", 0x00205403, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(16 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI54TAN", 0x00205404, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(16 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI51LDE", 0x20205100, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(4 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI51QDE", 0x20205101, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(4 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI51ZDE", 0x20205103, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(4 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI51TDE", 0x20205104, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(4 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI51FDE", 0x20205105, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(4 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI52LDE", 0x20205200, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(8 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI52QDE", 0x20205201, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(8 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI52ZDE", 0x20205203, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(8 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI52TDE", 0x20205204, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(8 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI52FDE", 0x20205205, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(8 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI54LDE", 0x20205400, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(16 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI54QDE", 0x20205401, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(16 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI54ZDE", 0x20205403, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(16 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI54TDE", 0x20205404, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(16 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI54FDE", 0x20205405, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(16 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI54FHC", 0x20205406, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(16 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI58LDE", 0x00A05800, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024,  5 * 512), SECTOR_SIZE_512},
+       {"MINI58QDE", 0x00A05801, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024,  5 * 512), SECTOR_SIZE_512},
+       {"MINI58ZDE", 0x00A05803, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024,  5 * 512), SECTOR_SIZE_512},
+       {"MINI58TDE", 0x00A05804, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024,  5 * 512), SECTOR_SIZE_512},
+       {"MINI58FDE", 0x00A05805, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024,  5 * 512), SECTOR_SIZE_512},
+       {"MINI55LDE", 0x00505500, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(35 * 
512, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI55ZDE", 0x00505503, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(35 * 
512, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI55TDE", 0x00505504, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(35 * 
512, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI57FDE", 0x00B05720, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(59 * 
512, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI57EDE", 0x00B05740, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(59 * 
512, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI57XDE", 0x00B05750, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(59 * 
512, 2 * 1024), SECTOR_SIZE_512},
+       {"MINI57TDE", 0x00B05760, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(59 * 
512, 2 * 1024), SECTOR_SIZE_512},
+       {"NUC029LAN", 0x00295A00, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC029NAN", 0x00295A06, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC029TAN", 0x00295804, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC029CIG1", 0x00295824, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC029ZAN", 0x00295A03, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC029TAE", 0x30295804, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC029FAE", 0x00295415, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(16 * 
1024, 2 * 1024), SECTOR_SIZE_512},
+       {"NUC029LDE", 0x00295A30, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC029SDE", 0x00295A31, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC029LEE", 0x00295B40, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"NUC029SEE", 0x00295B41, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"NUC029LGE", 0x00295C50, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"NUC029SGE", 0x00295C51, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"NUC029KGE", 0x00295C52, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"NUC100LD3AN", 0x00010003, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC100LE3AN", 0x00010000, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC100RD3AN", 0x00010012, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC100RE3AN", 0x00010009, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC100VD2AN", 0x00010022, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC100VD3AN", 0x00010021, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC100VE3AN", 0x00100018, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC100LC1DN", 0x30010008, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC100LD1DN", 0x30010005, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC100LD2DN", 0x30010004, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC100LD3DN", 0x30010003, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC100LE3DN", 0x30010000, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC100RC1DN", 0x30010017, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC100RD1DN", 0x30010014, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC100RD2DN", 0x30010013, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC100RD3DN", 0x30010012, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC100RE3DN", 0x30010009, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC100VD2DN", 0x30010022, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC100VD3DN", 0x30010021, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC100VE3DN", 0x30010018, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC100VE3DE", 0x40010018, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC120LD3AN", 0x00012003, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC120LE3AN", 0x00120000, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC120RD3AN", 0x00012012, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC120RE3AN", 0x00012009, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC120VD2AN", 0x00012022, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC120VD3AN", 0x00012021, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC120VE3AN", 0x00012018, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC120LC1DN", 0x30012008, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC120LD1DN", 0x30012005, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC120LD2DN", 0x30012004, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC120LD2DE", 0x40012004, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC120LD3DN", 0x30012003, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC120LE3DN", 0x30012000, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC120RC1DN", 0x30012035, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC120RD1DN", 0x30012032, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC120RD2DN", 0x30012031, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC120RD3DN", 0x30012030, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC120RE3DN", 0x30012027, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC120VD2DN", 0x30012022, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC120VD3DN", 0x30012021, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC120VE3DN", 0x30012018, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC121WC2AE", 0x00012180, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024,  9 * 512), SECTOR_SIZE_512},
+       {"NUC121Y25CN", 0x00012160, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024,  9 * 512), SECTOR_SIZE_512},
+       {"NUC121ZC2AE", 0x00012145, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024,  9 * 512), SECTOR_SIZE_512},
+       {"NUC121LC2AE", 0x00012125, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024,  9 * 512), SECTOR_SIZE_512},
+       {"NUC121SC2AE", 0x00012105, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024,  9 * 512), SECTOR_SIZE_512},
+       {"NUC125ZC2AE", 0x00012545, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024,  9 * 512), SECTOR_SIZE_512},
+       {"NUC125LC2AE", 0x00012525, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024,  9 * 512), SECTOR_SIZE_512},
+       {"NUC125SC2AE", 0x00012505, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024,  9 * 512), SECTOR_SIZE_512},
+       {"NUC122ZC1AN", 0x00012235, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC122ZD2AN", 0x00012231, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC122LC1AN", 0x00012208, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC122LD2AN", 0x00012204, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC122SC1AN", 0x00012226, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC122SD2AN", 0x00012222, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC122ZD2DN", 0x30012231, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC122LD2DN", 0x30012204, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC122SD2DN", 0x30012222, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC122ZC1DN", 0x30012235, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC122LC1DN", 0x30012208, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC122SC1DN", 0x30012226, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC123ZC2AN1", 0x00012345, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC123ZD4AN0", 0x00012355, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC123LC2AN1", 0x00012325, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC123LD4AN0", 0x00012335, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC123SC2AN1", 0x00012305, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC123SD4AN0", 0x00012315, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC123ZC2AE1", 0x10012345, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC123ZD4AE0", 0x10012355, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC123LC2AE1", 0x10012325, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC123LD4AE0", 0x10012335, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC123SC2AE1", 0x10012305, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC123SD4AE0", 0x10012315, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC130LC1CN", 0x20013008, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC130LD2CN", 0x20013004, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC130LE3CN", 0x20013000, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC130RC1CN", 0x20013017, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC130RD2CN", 0x20013013, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC130RE3CN", 0x20013009, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC130VE3CN", 0x20013018, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC140LC1CN", 0x20014008, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC140LD2CN", 0x20014004, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC140LE3CN", 0x20014000, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC140RC1CN", 0x20014017, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC140RD2CN", 0x20014013, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC140RE3CN", 0x20014009, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC140VE3CN", 0x20014018, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M0515LDE", 0x11413103, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC1311LD2AE", 0x11413100, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC1311LC2AE", 0x11413101, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC131LC2AE", 0x10013103, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC131LD2AE", 0x10013100, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC131SC2AE", 0x10013113, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC131SD2AE", 0x10013110, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC131LC2AEU", 0xF0013103, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC131LD2AEU", 0xF0013100, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC131SC2AEU", 0xF0013113, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC131SD2AEU", 0xF0013110, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M0518LC2AE", 0x10051803, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M0518LD2AE", 0x10051800, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M0518SC2AE", 0x10051813, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M0518SD2AE", 0x10051810, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"M0519VE3AE", 0x00051930, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"M0519SE3AE", 0x00051920, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"M0519SD3AE", 0x00051922, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"M0519LE3AE", 0x00051900, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"M0519LD3AE", 0x00051902, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"M0564LE4AE", 0x00C56405, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"M0564LG4AE", 0x00C56404, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"M0564SE4AE", 0x00C56413, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"M0564SG4AE", 0x00C56412, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"M0564VG4AE", 0x00C56431, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"NUC126NE4AE", 0x00C05206, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"NUC126LE4AE", 0x00C05205, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"NUC126LG4AE", 0x00C05204, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"NUC126SE4AE", 0x00C05213, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"NUC126SG4AE", 0x00C05212, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"NUC126VG4AE", 0x00C05231, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(256 * 
1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"NUC1261SG4AE", 0x01205212, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(256 
* 1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"NUC1261SE4AE", 0x01205213, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 
* 1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"NUC1261LG4AE", 0x01205204, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(256 
* 1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"NUC1261LE4AE", 0x01205205, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 
* 1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"NUC1261NE4AE", 0x01205206, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 
* 1024, 4 * 1024), SECTOR_SIZE_2K},
+       {"NUC200LC2AN", 0x00020007, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC200LD2AN", 0x00020004, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC200LE3AN", 0x00020000, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC200SC2AN", 0x00020034, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC200SD2AN", 0x00020031, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC200SE3AN", 0x00020027, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC200VE3AN", 0x00020018, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC220LC2AN", 0x00022007, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC220LD2AN", 0x00022004, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC220LE3AN", 0x00022000, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC220SC2AN", 0x00022034, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC220SD2AN", 0x00022031, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC220SE3AN", 0x00022027, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC220VE3AN", 0x00022018, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC220LE3AE", 0x40022000, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"NUC230LC2AE", 0x10023007, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"NUC230LD2AE", 0x10023004, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"NUC230LE3AE", 0x10023000, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"NUC230SC2AE", 0x10023034, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"NUC230SD2AE", 0x10023031, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"NUC230SE3AE", 0x10023027, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"NUC230VE3AE", 0x10023018, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"NUC240LC2AE", 0x10024007, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"NUC240LD2AE", 0x10024004, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"NUC240LE3AE", 0x10024000, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"NUC240SC2AE", 0x10024034, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"NUC240SD2AE", 0x10024031, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"NUC240SE3AE", 0x10024027, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"NUC240VE3AE", 0x10024018, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 8 * 1024), SECTOR_SIZE_512},
+       {"NUC2201LE3AE", 0x20024000, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 
* 1024, 8 * 1024), SECTOR_SIZE_512},
+       {"NUC2201SE3AE", 0x20024027, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 
* 1024, 8 * 1024), SECTOR_SIZE_512},
+       {"Nano100ZC2AN", 0x00110029, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100ZD2AN", 0x00110028, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100ZD3AN", 0x00110027, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100LC2AN", 0x00110025, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100LD2AN", 0x00110019, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100LD3AN", 0x00110018, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100SC2AN", 0x00110023, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100SD2AN", 0x00110016, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100SD3AN", 0x00110015, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100VD2AN", 0x00110013, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100VD3AN", 0x00110012, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100LC2BN", 0x00110043, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100LD2BN", 0x0011003F, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100LD3BN", 0x0011003E, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100LE3BN", 0x00110036, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(123 
* 1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100SC2BN", 0x00110042, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100SD2BN", 0x0011003D, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100SD3BN", 0x0011003C, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100SE3BN", 0x00110034, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(123 
* 1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100KD3BN", 0x00110038, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100KE3BN", 0x00110030, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(123 
* 1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100NE3BN", 0x00110044, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(123 
* 1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100ND3BN", 0x00110045, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100ND2BN", 0x00110046, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano100WE3BN", 0x00110047, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(123 
* 1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano110SC2BN", 0x00111042, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano110SD2BN", 0x0011103D, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano110SD3BN", 0x0011103C, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano110SE3BN", 0x00111034, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(123 
* 1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano110RC2BN", 0x00111043, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano110RD2BN", 0x00111044, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano110RD3BN", 0x00111045, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano110KC2BN", 0x00111040, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano110KD2BN", 0x00111039, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano110KD3BN", 0x00111038, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano110KE3BN", 0x00111030, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(123 
* 1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano120ZC2AN", 0x00112029, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano120ZD2AN", 0x00112028, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano120ZD3AN", 0x00112027, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano120LC2AN", 0x00112025, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano120LD2AN", 0x00112019, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano120LD3AN", 0x00112018, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano120SC2AN", 0x00112023, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano120SD2AN", 0x00112016, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano120SD3AN", 0x00112015, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano120VD2AN", 0x00112013, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano120VD3AN", 0x00112012, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano120LC2BN", 0x00112043, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano120LD2BN", 0x0011203F, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano120LD3BN", 0x0011203E, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano120LE3BN", 0x00112036, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(123 
* 1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano120SC2BN", 0x00112042, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano120SD2BN", 0x0011203D, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano120SD3BN", 0x0011203C, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano120SE3BN", 0x00112034, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(123 
* 1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano120KD3BN", 0x00112038, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano120KE3BN", 0x00112030, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(123 
* 1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano130VD3AN", 0x00113012, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano130SC2BN", 0x00113042, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano130SD2BN", 0x0011303D, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano130SD3BN", 0x0011303C, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano130SE3BN", 0x00113034, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(123 
* 1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano130KC2BN", 0x00113040, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano130KD2BN", 0x00113039, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano130KD3BN", 0x00113038, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano130KE3BN", 0x00113030, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(123 
* 1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano102ZB1AN", 0x00110202, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(16 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano102ZC2AN", 0x00110204, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano102LB1AN", 0x00110206, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(16 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano102LC2AN", 0x00110208, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano102SC2AN", 0x00110212, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano112LB1AN", 0x00111202, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(16 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano112LC2AN", 0x00111204, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano112SB1AN", 0x00111206, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(16 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano112SC2AN", 0x00111208, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano112RB1AN", 0x00111210, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(16 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano112RC2AN", 0x00111212, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano112VC2AN", 0x00111216, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(32 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano103SD3AE", 0x00110301, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano103LD3AE", 0x00110304, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"Nano103ZD3AE", 0x00110307, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(64 * 
1024, 4 * 1024), SECTOR_SIZE_512},
+       {"N574F128", 0x0B010D83, FLASH_TYPE_M0_AHB5, NUMICRO_DAP_BANKS(128 * 
1024, 6 * 1024), SECTOR_SIZE_512},
+       {"N574F256", 0x0B010B93, FLASH_TYPE_M0_AHB5, NUVOICE_N574_DAP_BANKS(256 
* 1024, 6 * 1024), SECTOR_SIZE_512},
+       {"N574F512", 0x0B010BB3, FLASH_TYPE_M0_AHB5, NUVOICE_N574_DAP_BANKS(512 
* 1024, 6 * 1024), SECTOR_SIZE_512},
+       {"N574F1K0", 0x0B010BC3, FLASH_TYPE_M0_AHB5, 
NUVOICE_N574_DAP_BANKS(1024 * 1024, 6 * 1024), SECTOR_SIZE_512},
+       {"N574F1K5", 0x0B010BD3, FLASH_TYPE_M0_AHB5, 
NUVOICE_N574_DAP_BANKS(1536 * 1024, 6 * 1024), SECTOR_SIZE_512}
+};
+
+/* Definition for static functions */
+static int numicro_dap_get_cpu_type(struct target *target, const struct 
numicro_dap_cpu_type **cpu, uint32_t part_id);
+static int numicro_dap_get_flash_size(struct flash_bank *bank,
+                                                                       const 
struct numicro_dap_cpu_type *cpu,
+                                                                       
uint32_t *flash_size);
+
+static const uint32_t numicro_m0_ahb5_flash_algorithm_code[] = {
+0xE00ABE00, 0xbf00b501, 0x1e419800, 0x28009100, 0xbd08d1fa, 0x4604b5f0, 
0x4616460d, 0x22002164,
+0x20592300, 0x60384f94, 0x60382016, 0x60382088, 0x68004638, 0x0fc007c0, 
0x2001d101, 0x488fbdf0,
+0x27046800, 0x4f8d4338, 0x46386038, 0x27046840, 0x4f8a4338, 0xbf006078, 
0x1e494608, 0xd1fb2800,
+0x68004887, 0x43382721, 0x60384f85, 0x69c04638, 0x43382701, 0x61f84f82, 
0x68004638, 0x0fc007c0,
+0x2001d101, 0x487ee7da, 0x27406800, 0x4f7c4338, 0x20006038, 0x4601e7d2, 
0x4879bf00, 0x07c06900,
+0xd1fa0fc0, 0x68004876, 0x43902221, 0x60104a74, 0x69c04610, 0x00400840, 
0x200061d0, 0x46014770,
+0x486fbf00, 0x07c06900, 0xd1fa0fc0, 0x6800486c, 0x43102240, 0x60104a6a, 
0x60d02022, 0x00800888,
+0x20016050, 0xf3bf6110, 0xbf008f60, 0x69004864, 0x0fc007c0, 0x4862d1fa, 
0x22406800, 0xd0064210,
+0x6800485f, 0x4a5e4310, 0x20016010, 0x20004770, 0xb570e7fc, 0x460c4603, 
0xe0092500, 0x1c6d4629,
+0x58580089, 0xffcbf7ff, 0xd0010006, 0xbd704630, 0xd3f342a5, 0xe7fa2000, 
0x4603b510, 0x08811cc8,
+0xbf000089, 0x6900484e, 0x0fc007c0, 0x484cd1fa, 0x24406800, 0x4c4a4320, 
0xe0206020, 0x4c482021,
+0x089860e0, 0x60600080, 0x60a06810, 0x61202001, 0x8f60f3bf, 0x4842bf00, 
0x07c06900, 0xd1fa0fc0,
+0x6800483f, 0x42202440, 0x483dd006, 0x43206800, 0x60204c3b, 0xbd102001, 
0x1d121d1b, 0x29001f09,
+0x2000d1dc, 0xb5fee7f7, 0x460c4606, 0x20004617, 0x90009001, 0x4832bf00, 
0x07c06900, 0xd1fa0fc0,
+0x6800482f, 0x43082140, 0x6008492d, 0x08841ce0, 0xe01200a4, 0x98014625, 
0x4629183a, 0xf7ff4630,
+0x9000ffab, 0x1936462c, 0x19009801, 0x1b2c9001, 0x28009800, 0x2001d001, 
0x2c00bdfe, 0x2000d1ea,
+0xb510e7fa, 0x08991ccb, 0xbf000089, 0x691b4b1c, 0x0fdb07db, 0x4b1ad1fa, 
0x2440681b, 0x4c184323,
+0xe0256023, 0x4c162300, 0x088360e3, 0x6063009b, 0x60a32300, 0x61232301, 
0x8f60f3bf, 0x4b10bf00,
+0x07db691b, 0xd1fa0fdb, 0x681b4b0d, 0x42232440, 0x4b0bd005, 0x4323681b, 
0x60234c09, 0x4b08bd10,
+0x6814689b, 0xd00042a3, 0x1d00e7f8, 0x1f091d12, 0xd1d72900, 0xe7f1bf00, 
0x50000100, 0x50000200,
+0x5000c000, 0x00000000
+};
+
+static const uint32_t numicro_m0_ahb4_flash_algorithm_code[] = {
+0xE00ABE00, 0x4603b510, 0x4c7d2059, 0x20166020, 0x20886020, 0x46206020, 
0x28006800, 0x2001d101,
+0x4878bd10, 0x24046800, 0x4c764320, 0x46206020, 0x24046840, 0x4c734320, 
0xbf006060, 0x30404871,
+0x24106900, 0xd0f94220, 0x6800486f, 0x4320242d, 0x60204c6d, 0x68004620, 
0x4020242d, 0xd001282d,
+0xe7dd2001, 0xe7db2000, 0xbf004601, 0x30404866, 0x07c06800, 0xd1f90fc0, 
0x68004863, 0x00400840,
+0x60104a61, 0x47702000, 0xbf004601, 0x3040485e, 0x07c06800, 0xd1f90fc0, 
0x6800485b, 0x43102240,
+0x60104a59, 0x60d02022, 0x60414610, 0x05402001, 0xd1024281, 0x60904855, 
0x2000e003, 0x4a5243c0,
+0x20016090, 0x61104a50, 0x8f60f3bf, 0x484ebf00, 0x68003040, 0x0fc007c0, 
0x484bd1f9, 0x22406800,
+0xd0064210, 0x68004848, 0x4a474310, 0x20016010, 0x20004770, 0xb530e7fc, 
0x460c4603, 0xe0092500,
+0x1c6d4629, 0x58580089, 0xffbef7ff, 0xd0012800, 0xbd302001, 0xd3f342a5, 
0xe7fa2000, 0x4603b510,
+0x4839bf00, 0x68003040, 0x0fc007c0, 0x4836d1f9, 0x24406800, 0x4c344320, 
0x1cc86020, 0x00890881,
+0x60e02021, 0x4830e01e, 0x4c2f6043, 0x60a06810, 0x61202001, 0x8f60f3bf, 
0x482bbf00, 0x68003040,
+0x0fc007c0, 0x4828d1f9, 0x24406800, 0xd0064220, 0x68004825, 0x4c244320, 
0x20016020, 0x1d1bbd10,
+0x1f091d12, 0xd1de2900, 0xe7f72000, 0xbf00b510, 0x33404b1d, 0x07db681b, 
0xd1f90fdb, 0x681b4b1a,
+0x43232440, 0x60234c18, 0x08991ccb, 0x23000089, 0xe02160e3, 0x60584b14, 
0x4c132301, 0xf3bf6123,
+0xbf008f60, 0x33404b10, 0x07db681b, 0xd1f90fdb, 0x681b4b0d, 0x42232440, 
0x4b0bd005, 0x4323681b,
+0x60234c09, 0x4b08bd10, 0x6814689b, 0xd00042a3, 0x1d00e7f8, 0x1f091d12, 
0xd1db2900, 0xe7f1bf00,
+0x40000100, 0x40000200, 0x4000c000, 0x0055aa03, 0x00000000
+};
+
+static const uint32_t numicro_m23_flash_algorithm_code[] = {
+0xE00ABE00, 0xb087b5b0, 0x460c4613, 0x90054605, 0x92039104, 0x21594825, 
0x21166001, 0x21886001,
+0x68006001, 0x93022801, 0x95009401, 0xe7ffd003, 0x90062001, 0x481ee036, 
0x21106800, 0xd10e4208,
+0x481ce7ff, 0x22046801, 0x60014311, 0x4818e7ff, 0x21106800, 0xd1014208, 
0xe7f8e7ff, 0x4816e7ff,
+0x21076800, 0x28054008, 0xe7ffd008, 0x68014812, 0x43912207, 0x43112205, 
0xe7ff6001, 0x6801480f,
+0x43112202, 0x480e6001, 0x6001216d, 0x212d6800, 0x282d4008, 0xe7ffd003, 
0x90062001, 0x2000e002,
+0xe7ff9006, 0xb0079806, 0x46c0bdb0, 0x40000100, 0x40000250, 0x40000200, 
0x40000210, 0x40000204,
+0x4000c000, 0x4601b082, 0x91009001, 0x4806e7ff, 0x21016800, 0xd0014208, 
0xe7f8e7ff, 0x21004803,
+0x46086001, 0x4770b002, 0x4000c040, 0x4000c000, 0x4601b084, 0x91009002, 
0x4824e7ff, 0x21016800,
+0xd0014208, 0xe7f8e7ff, 0x68014821, 0x43112240, 0x48206001, 0x60012122, 
0x491f9802, 0x98026008,
+0x05492101, 0xd0054288, 0x9802e7ff, 0x4288491b, 0xe7ffd104, 0x491b481a, 
0xe0046001, 0x43c02000,
+0x60084917, 0x4818e7ff, 0x60012101, 0x8f6ff3bf, 0x480ee7ff, 0x21016800, 
0xd0014208, 0xe7f8e7ff,
+0x6800480b, 0xa8019001, 0x06407800, 0xd5062800, 0x9801e7ff, 0x60084906, 
0x90032001, 0x2000e002,
+0xe7ff9003, 0xb0049803, 0x46c04770, 0x4000c040, 0x4000c000, 0x4000c00c, 
0x4000c004, 0x00200200,
+0x4000c008, 0x0055aa03, 0x4000c010, 0xb088b5b0, 0x460c4613, 0x90064605, 
0x92049105, 0x90032000,
+0x28009804, 0x94019302, 0xd0039500, 0x2001e7ff, 0xe0179007, 0x9803e7ff, 
0x42889905, 0xe7ffd20f,
+0x99039806, 0x92031c4a, 0x58400089, 0xff80f7ff, 0xd0032800, 0x2001e7ff, 
0xe0039007, 0x2000e7eb,
+0xe7ff9007, 0xb0089807, 0x46c0bdb0, 0xb088b5b0, 0x460c4613, 0x90064605, 
0x92049105, 0x7800a806,
+0x28000780, 0x94019302, 0xd0039500, 0x2001e7ff, 0xe0499007, 0x1cc09805, 
0x43882103, 0xe7ff9005,
+0x68004823, 0x42082101, 0xe7ffd001, 0x4821e7f8, 0x22406801, 0x60014311, 
0x2121481f, 0xe7ff6001,
+0x28009805, 0xe7ffd02d, 0x491c9806, 0x98046008, 0x491b6800, 0x481b6008, 
0x60012101, 0x8f6ff3bf,
+0x4813e7ff, 0x21016800, 0xd0014208, 0xe7f8e7ff, 0x68004810, 0xa8039003, 
0x06407800, 0xd5062800,
+0x9803e7ff, 0x6008490b, 0x90072001, 0x9806e00c, 0x90061d00, 0x1d009804, 
0x98059004, 0x90051f00,
+0x2000e7ce, 0xe7ff9007, 0xb0089807, 0x46c0bdb0, 0x4000c040, 0x4000c000, 
0x4000c00c, 0x4000c004,
+0x4000c008, 0x4000c010, 0xb088b5b0, 0x460c4613, 0x90064605, 0x92049105, 
0x7800a806, 0x28000780,
+0x94019302, 0xd0039500, 0x9806e7ff, 0xe04d9007, 0x1cc09805, 0x43882103, 
0xe7ff9005, 0x68004825,
+0x42082101, 0xe7ffd001, 0x4823e7f8, 0x22406801, 0x60014311, 0x21004821, 
0xe7ff6001, 0x28009805,
+0xe7ffd031, 0x491e9806, 0x481e6008, 0x60012101, 0x8f6ff3bf, 0x4817e7ff, 
0x21016800, 0xd0014208,
+0xe7f8e7ff, 0x68004814, 0xa8039003, 0x06407800, 0xd5042800, 0x9803e7ff, 
0x6008490f, 0x4812e013,
+0x90036800, 0x99049803, 0x42886809, 0xe7ffd001, 0x9806e009, 0x90061d00, 
0x1d009804, 0x98059004,
+0x90051f00, 0x9806e7ca, 0xe7ff9007, 0xb0089807, 0x46c0bdb0, 0x4000c040, 
0x4000c000, 0x4000c00c,
+0x4000c004, 0x4000c010, 0x4000c008, 0x00000000
+};
+
+static const uint32_t numicro_m2l31_flash_algorithm_code[] = {
+0xE00ABE00, 0xb087b5b0, 0x460c4613, 0x90054605, 0x92039104, 0x21594833, 
0x21166001, 0x21886001,
+0x68006001, 0x93022801, 0x95009401, 0xe7ffd003, 0x90062001, 0x482ce052, 
0x4a2c6801, 0x60014311,
+0x6801482b, 0x43112204, 0xe7ff6001, 0x68004829, 0x40082150, 0xd0012850, 
0xe7f7e7ff, 0x21694826,
+0x68006001, 0x40082129, 0xd0032829, 0x2001e7ff, 0xe0339006, 0x68004821, 
0x7100f240, 0xf2404008,
+0x42881100, 0xe7ffd018, 0x481ce7ff, 0x21016800, 0xd0014208, 0xe7f8e7ff, 
0x68014819, 0x43912207,
+0x43112201, 0xe7ff6001, 0x68004814, 0x42082101, 0xe7ffd001, 0xe7ffe7f8, 
0x68014812, 0x43912207,
+0x43112206, 0x48106001, 0x220f6801, 0x60014391, 0x2103480e, 0x20006001, 
0xe7ff9006, 0xb0079806,
+0x46c0bdb0, 0x40000100, 0x40000200, 0x00040004, 0x40000204, 0x40000250, 
0x4000c000, 0x400001fc,
+0x400001f8, 0x40000210, 0x40000220, 0x4000c04c, 0x4601b082, 0x91009001, 
0x4807e7ff, 0x21016800,
+0xd0014208, 0xe7f8e7ff, 0x68014804, 0x43912201, 0x20006001, 0x4770b002, 
0x4000c040, 0x4000c000,
+0x4601b082, 0x20009001, 0xb0029100, 0x46c04770, 0x4601b084, 0x91009002, 
0x481be7ff, 0x21016800,
+0xd0014208, 0xe7f8e7ff, 0x68014818, 0x43112240, 0x98026001, 0x60084916, 
0x49174816, 0x48176001,
+0x60012122, 0x21014816, 0xf3bf6001, 0xe7ff8f6f, 0x6800480d, 0x42082101, 
0xe7ffd001, 0x480be7f8,
+0x90016800, 0x7800a801, 0x28000640, 0xe7ffd506, 0x49069801, 0x20016008, 
0xe0029003, 0x90032000,
+0x9803e7ff, 0x4770b004, 0x4000c040, 0x4000c000, 0x4000c004, 0x4000c008, 
0x0055aa03, 0x4000c00c,
+0x4000c010, 0xb088b580, 0x4603460a, 0x91059006, 0x90042000, 0x93009201, 
0x9804e7ff, 0x42889905,
+0xe7ffd222, 0x99049806, 0x58400089, 0x98039003, 0x050921ff, 0x21794008, 
0x42880549, 0xe7ffd110,
+0x490c9803, 0x90031840, 0xf7ff9803, 0x9002ff91, 0x28009802, 0xe7ffd003, 
0x90079802, 0xe7ffe007,
+0x1c409804, 0xe7d89004, 0x90072000, 0x9807e7ff, 0xbd80b008, 0xf0e00000, 
0xb088b5b0, 0x460c4613,
+0x90064605, 0x92049105, 0x7800a806, 0x28000780, 0x94019302, 0xd0039500, 
0x2001e7ff, 0xe08d9007,
+0x1cc09805, 0x43882103, 0xe7ff9005, 0x68004845, 0x42082101, 0xe7ffd001, 
0x4843e7f8, 0x22406801,
+0x60014311, 0x9805e7ff, 0xd0742800, 0x483fe7ff, 0x60012100, 0x212f483e, 
0x483e6001, 0x60012101,
+0x8f6ff3bf, 0x4837e7ff, 0x21016800, 0xd0014208, 0xe7f8e7ff, 0x68004834, 
0xa8039003, 0x06407800,
+0xd5062800, 0x9803e7ff, 0x6008492f, 0x90072001, 0x9806e054, 0x6008492d, 
0x68009804, 0x6008492e,
+0x2127482b, 0x482b6001, 0x60012101, 0x8f6ff3bf, 0x4824e7ff, 0x21016800, 
0xd0014208, 0xe7f8e7ff,
+0x68004821, 0xa8039003, 0x06407800, 0xd5062800, 0x9803e7ff, 0x6008491c, 
0x90072001, 0x9806e02e,
+0x6008491a, 0x2121481a, 0x481a6001, 0x60012101, 0x8f6ff3bf, 0x4813e7ff, 
0x21016800, 0xd0014208,
+0xe7f8e7ff, 0x68004810, 0xa8039003, 0x06407800, 0xd5062800, 0x9803e7ff, 
0x6008490b, 0x90072001,
+0x9806e00c, 0x90061d00, 0x1d009804, 0x98059004, 0x90051f00, 0x2000e787, 
0xe7ff9007, 0xb0089807,
+0x46c0bdb0, 0x4000c040, 0x4000c000, 0x4000c004, 0x4000c00c, 0x4000c010, 
0x4000c008, 0xb088b5b0,
+0x460c4613, 0x90064605, 0x92049105, 0x7800a806, 0x28000780, 0x94019302, 
0xd0039500, 0x9806e7ff,
+0xe04b9007, 0x1cc09805, 0x43882103, 0xe7ff9005, 0x68004824, 0x42082101, 
0xe7ffd001, 0x4822e7f8,
+0x22406801, 0x60014311, 0x21004820, 0xe7ff6001, 0x28009805, 0xe7ffd02f, 
0x491d9806, 0x481d6008,
+0x60012101, 0x8f6ff3bf, 0x4816e7ff, 0x21016800, 0xd0014208, 0xe7f8e7ff, 
0x68004813, 0xa8039003,
+0x06407800, 0xd5042800, 0x9803e7ff, 0x6008490e, 0x4811e011, 0x99046800, 
0x42886809, 0xe7ffd001,
+0x9806e009, 0x90061d00, 0x1d009804, 0x98059004, 0x90051f00, 0x9806e7cc, 
0xe7ff9007, 0xb0089807,
+0x46c0bdb0, 0x4000c040, 0x4000c000, 0x4000c00c, 0x4000c004, 0x4000c010, 
0x4000c008, 0x00000000
+};
+
+static const uint32_t numicro_m4_flash_algorithm_code[] = {
+0xE00ABE00, 0x4770ba40, 0x4770bac0, 0x0030ea4f, 0x00004770, 0x4603b510, 
0x4c8e2059, 0x20166020,
+0xf8c405a4, 0x20880100, 0x0100f8c4, 0xf8d006c0, 0x28010100, 0x2001d001, 
0x4887bd10, 0xf0406800,
+0xf04f0004, 0xf8c44480, 0x46200200, 0x0204f8d0, 0x0004f040, 0x0204f8c4, 
0x68004880, 0x0029f040,
+0x60204c7e, 0x68004620, 0x0029f000, 0xd0012829, 0xe7e12001, 0xe7df2000, 
0xbf004601, 0x30c04877,
+0xf0006800, 0x28000001, 0x4874d1f8, 0xf0206800, 0x4a720001, 0x20006010, 
0xb5304770, 0x460c4603,
+0x486ebf00, 0x680030c0, 0x0001f000, 0xd1f82800, 0x6800486a, 0x0040f040, 
0x60284d68, 0x60444628,
+0x60c36082, 0x61282001, 0xbf00bf00, 0xf3bfbf00, 0xbf008f6f, 0xbf00bf00, 
0x4860bf00, 0x680030c0,
+0x0001f000, 0xd1f82800, 0x6801485c, 0x0040f001, 0x485ab118, 0x20016001, 
0x2000bd30, 0xb530e7fc,
+0x25004604, 0x040bf36f, 0x607ff004, 0x6f72f1b0, 0xf1a4d102, 0x4d526472, 
0x4621462a, 0xf7ff2022,
+0xbd30ffbc, 0x4604b570, 0x2600460d, 0x4631e008, 0xf8541c76, 0xf7ff0021, 
0xb108ffe2, 0xbd702001,
+0xd3f442ae, 0xe7fa2000, 0x4603b530, 0x0003f003, 0x2001b108, 0x1cc8bd30, 
0x0103f020, 0x483fbf00,
+0x680030c0, 0x0001f000, 0xd1f82800, 0x6800483b, 0x0040f040, 0x60284d39, 
0x60e82021, 0x4837e022,
+0x4d366043, 0x60a86810, 0x61282001, 0xbf00bf00, 0xf3bfbf00, 0xbf008f6f, 
0xbf00bf00, 0x482fbf00,
+0x680030c0, 0x0001f000, 0xd1f82800, 0x6804482b, 0x0040f004, 0x4829b118, 
0x20016004, 0x1d1be7ca,
+0x1f091d12, 0xd1da2900, 0xe7c32000, 0xf000b530, 0xb1040403, 0x1cccbd30, 
0x0103f024, 0x4c1fbf00,
+0x682434c0, 0x0401f004, 0xd1f82c00, 0x68244c1b, 0x0440f044, 0x602c4d19, 
0x60ec2400, 0x4c17e025,
+0x24016060, 0x612c4d15, 0xbf00bf00, 0xf3bfbf00, 0xbf008f6f, 0xbf00bf00, 
0x4c10bf00, 0x682434c0,
+0x0401f004, 0xd1f82c00, 0x68234c0c, 0x0440f003, 0x4c0ab114, 0xe00a6023, 
0x68a34c08, 0x429c6814,
+0xe004d000, 0x1d121d00, 0x29001f09, 0xbf00d1d7, 0xe7bfbf00, 0x40000100, 
0x40000200, 0x4000c000,
+0x0055aa03, 0x00000000
+};
+
+static const uint32_t nuvoice_n574_m0_ahb5_flash_algorithm_code[] = {
+0xE00ABE00, 0x4603b530, 0x2164460c, 0x4d842059, 0x20166028, 0x20886028, 
0x46286028, 0x07c06800,
+0x28000fc0, 0x2001d101, 0x487ebd30, 0x25046800, 0x4d7c4328, 0x46286028, 
0x25046840, 0x4d794328,
+0xbf006068, 0x1e494608, 0xd1fb2800, 0x68004876, 0x43282521, 0x60284d74, 
0x69c04628, 0x43282501,
+0x61e84d71, 0x68004628, 0x0fc007c0, 0xd1012800, 0xe7d92001, 0x6800486c, 
0x43282540, 0x60284d6a,
+0xe7d12000, 0xbf004601, 0x69004867, 0x0fc007c0, 0xd1f92800, 0x68004864, 
0x43902221, 0x60104a62,
+0x69c04610, 0x00400840, 0x200061d0, 0x46014770, 0x485dbf00, 0x07c06900, 
0x28000fc0, 0x485ad1f9,
+0x22406800, 0x4a584310, 0x20226010, 0x088860d0, 0x60500080, 0x61102001, 
0x8f60f3bf, 0x4852bf00,
+0x07c06900, 0x28000fc0, 0x484fd1f9, 0x22406800, 0x28004010, 0x484cd006, 
0x43106800, 0x60104a4a,
+0x47702001, 0xe7fc2000, 0x4603b570, 0x2500460c, 0x4629e009, 0x00891c6d, 
0xf7ff5858, 0x1e06ffc8,
+0x4630d001, 0x42a5bd70, 0x2000d3f3, 0xb510e7fa, 0x1cc84603, 0x00890881, 
0x483bbf00, 0x07c06900,
+0x28000fc0, 0x4838d1f9, 0x24406800, 0x4c364320, 0xe0226020, 0x4c342021, 
0x089860e0, 0x60600080,
+0x60a06810, 0x61202001, 0x8f60f3bf, 0x482ebf00, 0x07c06900, 0x28000fc0, 
0x482bd1f9, 0x24406800,
+0x28004020, 0x4828d006, 0x43206800, 0x60204c26, 0xbd102001, 0x1d121d1b, 
0x29001f09, 0x2000d1da,
+0xb510e7f7, 0x08991ccb, 0xbf000089, 0x691b4b1e, 0x0fdb07db, 0xd1f92b00, 
0x681b4b1b, 0x43232440,
+0x60234c19, 0x2300e027, 0x60e34c17, 0x009b0883, 0x23006063, 0x230160a3, 
0xf3bf6123, 0xbf008f60,
+0x691b4b11, 0x0fdb07db, 0xd1f92b00, 0x681b4b0e, 0x40232440, 0xd0052b00, 
0x681b4b0b, 0x4c0a4323,
+0xbd106023, 0x689b4b08, 0x42a36814, 0xe7f8d000, 0x1d121d00, 0x29001f09, 
0xbf00d1d5, 0x0000e7f1,
+0x50000100, 0x50000200, 0x5000c000, 0x00000000
+};
+
+static const uint32_t numicro_m55_flash_algorithm_code[] = {
+0xE00ABE00, 0x9002b084, 0x92009101, 0x1000f240, 0x0000f2c4, 0x60012159, 
0x60012116, 0x60012188,
+0x28016800, 0xe7ffd003, 0x90032001, 0xf241e05a, 0xf2c40100, 0x68080100, 
0x0028f040, 0xf2416008,
+0xf2c4213c, 0xf04f0100, 0x60081001, 0x0000f244, 0x0004f2c4, 0x60012169, 
0xf0006800, 0x28290029,
+0xe7ffd003, 0x90032001, 0xe7ffe03c, 0x0004f241, 0x0000f2c4, 0xf0006800, 
0x28280028, 0xe7ffd001,
+0xf242e7f4, 0xf2c40014, 0x68000000, 0xd11b2803, 0xe7ffe7ff, 0x0010f242, 
0x0000f2c4, 0x0fc06800,
+0xe7ffb108, 0xf242e7f6, 0xf2c40110, 0x20020100, 0xe7ff6008, 0x0014f242, 
0x0000f2c4, 0x0fc06800,
+0xe7ffb108, 0xe7ffe7f6, 0x4100f241, 0x0100f2c4, 0x60082002, 0x5100f241, 
0x0100f2c4, 0x60082000,
+0xe7ff9003, 0xb0049803, 0xbf004770, 0x9000b081, 0xf244e7ff, 0xf2c40040, 
0x68000004, 0xb10807c0,
+0xe7f6e7ff, 0x0100f244, 0x0104f2c4, 0xf0206808, 0x60080001, 0xb0012000, 
0xbf004770, 0x9003b085,
+0x92019102, 0xf244e7ff, 0xf2c40040, 0x68000004, 0xb10807c0, 0xe7f6e7ff, 
0x0100f244, 0x0104f2c4,
+0xf0406808, 0x60080040, 0xf2449803, 0xf2c4010c, 0x60080104, 0xf2449802, 
0xf2c40104, 0x60080104,
+0xf2449801, 0xf2c40108, 0x60080104, 0x0110f244, 0x0104f2c4, 0x60082001, 
0x8f6ff3bf, 0xf244e7ff,
+0xf2c40040, 0x68000004, 0xb10807c0, 0xe7f6e7ff, 0x0000f244, 0x0004f2c4, 
0x90006800, 0x0000f89d,
+0x28000640, 0xe7ffd509, 0xf2449800, 0xf2c40100, 0x60080104, 0x90042001, 
0x2000e002, 0xe7ff9004,
+0xb0059804, 0xbf004770, 0xb082b580, 0x98019001, 0x5080f020, 0x98019001, 
0x71fff641, 0x90014388,
+0x20229901, 0xf7ff2200, 0xb002ff99, 0xbf00bd80, 0xb088b580, 0x91059006, 
0x20009204, 0x98049003,
+0xd3032802, 0x2001e7ff, 0xe02d9007, 0x28009804, 0xf64abf1c, 0xf2c02003, 
0x90010055, 0x9803e7ff,
+0x42889905, 0xe7ffd21d, 0x99039806, 0x92031c4a, 0x0021f850, 0x98029002, 
0x5080f020, 0x98029002,
+0x71fff641, 0x90024388, 0x9a019902, 0xf7ff2022, 0x9000ff65, 0xb1189800, 
0x2001e7ff, 0xe0039007,
+0x2000e7dd, 0xe7ff9007, 0xb0089807, 0xbf00bd80, 0x9003b085, 0x92019102, 
0x000cf89d, 0xb1180780,
+0x2001e7ff, 0xe0669004, 0x30039802, 0x0003f020, 0x98039002, 0x5080f020, 
0xe7ff9003, 0x0040f244,
+0x0004f2c4, 0x07c06800, 0xe7ffb108, 0xf244e7f6, 0xf2c40100, 0x68080104, 
0x0040f040, 0xf2446008,
+0xf2c4010c, 0x20210104, 0xe7ff6008, 0x28009802, 0xe7ffd03e, 0xf2449803, 
0xf2c40104, 0x60080104,
+0x68009801, 0x0108f244, 0x0104f2c4, 0xf2446008, 0xf2c40110, 0x20010104, 
0xf3bf6008, 0xe7ff8f6f,
+0x0040f244, 0x0004f2c4, 0x07c06800, 0xe7ffb108, 0xf244e7f6, 0xf2c40000, 
0x68000004, 0xf89d9000,
+0x06400000, 0xd5092800, 0x9800e7ff, 0x0100f244, 0x0104f2c4, 0x20016008, 
0xe00c9004, 0x30049803,
+0x98019003, 0x90013004, 0x38049802, 0xe7bd9002, 0x90042000, 0x9804e7ff, 
0x4770b005, 0x9004b086,
+0x92029103, 0x0010f89d, 0xb1180780, 0x9804e7ff, 0xe06e9005, 0x30039803, 
0x0003f020, 0x98049003,
+0x5080f000, 0x98049000, 0x5080f020, 0xe7ff9004, 0x0040f244, 0x0004f2c4, 
0x07c06800, 0xe7ffb108,
+0xf244e7f6, 0xf2c40100, 0x68080104, 0x0040f040, 0xf2446008, 0xf2c4010c, 
0x20000104, 0xe7ff6008,
+0x28009803, 0xe7ffd040, 0xf2449804, 0xf2c40104, 0x60080104, 0x0110f244, 
0x0104f2c4, 0x60082001,
+0x8f6ff3bf, 0xf244e7ff, 0xf2c40040, 0x68000004, 0xb10807c0, 0xe7f6e7ff, 
0x0000f244, 0x0004f2c4,
+0x90016800, 0x0004f89d, 0x28000640, 0xe7ffd507, 0xf2449801, 0xf2c40100, 
0x60080104, 0xf244e014,
+0xf2c40008, 0x68000004, 0x68099902, 0xd0014288, 0xe009e7ff, 0x30049804, 
0x98029004, 0x90023004,
+0x38049803, 0xe7bb9003, 0x99009804, 0x90054308, 0x9805e7ff, 0x4770b006, 
0x00000000
+};
+
+static const uint32_t numicro_m55_flash_algorithm_ns_code[] = {
+0xE00ABE00, 0x9004b086, 0x92029103, 0x90014678, 0x90009801, 0x0003f89d, 
0x280006c0, 0xe7ffd528,
+0x40a0f04f, 0xb9186800, 0x2001e7ff, 0xe08d9005, 0x1000f240, 0x0000f2c5, 
0x60012159, 0x60012116,
+0x60012188, 0x28016800, 0xe7ffd003, 0x90052001, 0xf244e07c, 0xf2c50000, 
0x21490004, 0x68006001,
+0xe7ffb918, 0x90052001, 0x2000e070, 0xe06d9005, 0x1000f240, 0x0000f2c4, 
0x60012159, 0x60012116,
+0x60012188, 0x28016800, 0xe7ffd003, 0x90052001, 0xf241e05c, 0xf2c40100, 
0x68080100, 0x0028f040,
+0xf2416008, 0xf2c4213c, 0xf04f0100, 0x60081001, 0x0000f244, 0x0004f2c4, 
0x60012169, 0xf0006800,
+0x28290029, 0xe7ffd003, 0x90052001, 0xe7ffe03e, 0x0004f241, 0x0000f2c4, 
0xf0006800, 0x28280028,
+0xe7ffd001, 0xf242e7f4, 0xf2c40014, 0x68000000, 0xd11b2803, 0xe7ffe7ff, 
0x0010f242, 0x0000f2c4,
+0x0fc06800, 0xe7ffb108, 0xf242e7f6, 0xf2c40110, 0x20020100, 0xe7ff6008, 
0x0014f242, 0x0000f2c4,
+0x0fc06800, 0xe7ffb108, 0xe7ffe7f6, 0x4100f241, 0x0100f2c4, 0x60082002, 
0x5100f241, 0x0100f2c4,
+0x60082000, 0x2000e7ff, 0xe7ff9005, 0xb0069805, 0xbf004770, 0x9003b084, 
0x90014678, 0x90009801,
+0x00c19800, 0x0000f244, 0x0004f2c4, 0xbf442900, 0x0000f244, 0x0004f2c5, 
0xe7ff9002, 0x6c009802,
+0xb10807c0, 0xe7f9e7ff, 0x20009902, 0xb0046008, 0xbf004770, 0x9003b085, 
0x92019102, 0x9803e7ff,
+0x07c06c00, 0xe7ffb108, 0x9903e7f9, 0xf0406808, 0x60080040, 0x20229903, 
0x980260c8, 0x60489903,
+0x99039801, 0x99036088, 0x61082001, 0x8f6ff3bf, 0x9803e7ff, 0x07c06c00, 
0xe7ffb108, 0x9803e7f9,
+0x90006800, 0x0000f89d, 0x28000640, 0xe7ffd506, 0x99039800, 0x20016008, 
0xe0029004, 0x90042000,
+0x9804e7ff, 0x4770b005, 0xb084b580, 0x46789003, 0x98019001, 0x98009000, 
0xf24400c1, 0xf2c40000,
+0x29000004, 0xf244bf44, 0xf2c50000, 0x90020004, 0xf0209803, 0x90035080, 
0xf6419803, 0xea2071ff,
+0x90030001, 0x99039802, 0x0200f04f, 0xffa2f7ff, 0xbd80b004, 0xb08cb580, 
0x9109900a, 0x20009208,
+0x98089006, 0xd3032802, 0x2001e7ff, 0xe03e900b, 0x90024678, 0x90019802, 
0x00c19801, 0x0000f244,
+0x0004f2c4, 0xbf442900, 0x0000f244, 0x0004f2c5, 0x98089007, 0xbf1c2800, 
0x2003f64a, 0x0055f2c0,
+0xe7ff9004, 0x99099806, 0xd21d4288, 0x980ae7ff, 0x1c4a9906, 0xf8509206, 
0x90050021, 0xf0209805,
+0x90055080, 0xf6419805, 0x438871ff, 0x98079005, 0x9a049905, 0xff5ef7ff, 
0x98039003, 0xe7ffb118,
+0x900b2001, 0xe7dde003, 0x900b2000, 0x980be7ff, 0xbd80b00c, 0x9006b088, 
0x92049105, 0x0018f89d,
+0xb1180780, 0x2001e7ff, 0xe05c9007, 0x90014678, 0x90009801, 0x00c19800, 
0x0000f244, 0x0004f2c4,
+0xbf442900, 0x0000f244, 0x0004f2c5, 0x98059003, 0x0003f100, 0x0003f020, 
0x98069005, 0x5080f020,
+0xe7ff9006, 0x6c009803, 0xb10807c0, 0xe7f9e7ff, 0x68089903, 0x0040f040, 
0x99036008, 0x60c82021,
+0x9805e7ff, 0xe7ffb360, 0x99039806, 0x98046048, 0x99036800, 0x99036088, 
0x61082001, 0x8f6ff3bf,
+0x9803e7ff, 0x07c06c00, 0xe7ffb108, 0x9803e7f9, 0x90026800, 0x0008f89d, 
0x28000640, 0xe7ffd506,
+0x99039802, 0x20016008, 0xe00c9007, 0x30049806, 0x98049006, 0x90043004, 
0x38049805, 0xe7d09005,
+0x90072000, 0x9807e7ff, 0x4770b008, 0x9007b089, 0x92059106, 0x001cf89d, 
0xb1180780, 0x9807e7ff,
+0xe0649008, 0x90014678, 0x90009801, 0x00c19800, 0x0000f244, 0x0004f2c4, 
0xbf442900, 0x0000f244,
+0x0004f2c5, 0x98069004, 0x0003f100, 0x0003f020, 0x98079006, 0x5080f000, 
0x98079002, 0x5080f020,
+0xe7ff9007, 0x6c009804, 0xb10807c0, 0xe7f9e7ff, 0x68089904, 0x0040f040, 
0x99046008, 0x60c82000,
+0x9806e7ff, 0xe7ffb370, 0x99049807, 0x99046048, 0x61082001, 0x8f6ff3bf, 
0x9804e7ff, 0x07c06c00,
+0xe7ffb108, 0x9804e7f9, 0x90036800, 0x000cf89d, 0x28000640, 0xe7ffd504, 
0x99049803, 0xe0116008,
+0x68809804, 0x68099905, 0xd0014288, 0xe009e7ff, 0x30049807, 0x98059007, 
0x90053004, 0x38049806,
+0xe7ce9006, 0x99029807, 0x90084308, 0x9808e7ff, 0x4770b009, 0x00000000
+};
+
+/**
+ * @brief      "flash bank" Command
+ * @date       February, 2023
+ * @note       [Usage] flash bank $_FLASHNAME numicro_dap
+ *                                     <Address> <size> <ChipWidth> <BusWidth> 
<Target> <Type>
+ *                                             <Address>       : Flash memory 
base address
+ *                                             <Size>          : Flash memory 
size
+ *                                             <ChipWidth>     : Chip width in 
byte (Not use)
+ *                                             <BusWidth>      : Bus width in 
byte (Not use)
+ *                                             <Target>        : Target device 
(***.cpu)
+ *                                             <Type>          : Write control 
type
+ * @param
+ * @return     int                     ERROR_OK or the non-zero
+ **/
+FLASH_BANK_COMMAND_HANDLER(numicro_dap_flash_bank_command)
+{
+       struct numicro_dap_flash_bank   *flash_bank_info;
+
+       flash_bank_info = malloc(sizeof(struct numicro_dap_flash_bank));
+       if (!flash_bank_info) {
+               LOG_ERROR("NuMicro flash driver: Out of memory");
+               return ERROR_FAIL;
+       }
+
+       memset(flash_bank_info, 0, sizeof(struct numicro_dap_flash_bank));
+
+       bank->driver_priv = flash_bank_info;
+       flash_bank_info->probed = 0;
+
+       return ERROR_OK;
+}
+
+static int numicro_reg_unlock(struct target *target)
+{
+       uint32_t is_protected;
+       int retval = ERROR_OK;
+
+       /* Check to see if NUC is register unlocked or not */
+       retval = target_read_u32(target, NUMICRO_SYS_WRPROT - 
m_addressminusoffset, &is_protected);
+       if (retval != ERROR_OK)
+               return retval;
+
+       LOG_DEBUG("protected = 0x%08" PRIx32 "", is_protected);
+       if (is_protected == 0) {        /* means protected - so unlock it */
+               /* unlock flash registers */
+               retval = target_write_u32(target, NUMICRO_SYS_WRPROT - 
m_addressminusoffset, REG_KEY1);
+               if (retval != ERROR_OK)
+                       return retval;
+               retval = target_write_u32(target, NUMICRO_SYS_WRPROT - 
m_addressminusoffset, REG_KEY2);
+               if (retval != ERROR_OK)
+                       return retval;
+               retval = target_write_u32(target, NUMICRO_SYS_WRPROT - 
m_addressminusoffset, REG_KEY3);
+               if (retval != ERROR_OK)
+                       return retval;
+       }
+       /* Check that unlock worked */
+       retval = target_read_u32(target, NUMICRO_SYS_WRPROT - 
m_addressminusoffset, &is_protected);
+       if (retval != ERROR_OK)
+               return retval;
+
+       if (is_protected == 1) {        /* means unprotected */
+               LOG_DEBUG("protection removed");
+       } else {
+               LOG_DEBUG("still protected!!");
+       }
+
+       return ERROR_OK;
+}
+
+static int numicro_init_isp(struct target *target)
+{
+       int     retval = ERROR_OK;
+       uint32_t reg_stat = 0;
+       uint32_t algorithm_init_entry_offset = 0;
+       uint32_t algorithm_lr = 0;
+       struct reg_param reg_params[3];
+       struct armv7m_common *armv7m = target_to_armv7m(target);
+       struct armv7m_algorithm armv7m_info;
+       struct working_area *init_algorithm;
+
+       retval = numicro_reg_unlock(target);
+       if (retval != ERROR_OK)
+               return retval;
+
+       if (m_cpu->flash_type == FLASH_TYPE_M55) {
+               if (!m_b_secure_debug) {
+                       algorithm_init_entry_offset = 0x5;
+                       algorithm_lr = 0x30200001;
+
+                       /* allocate working area with init info code */
+                       if (target_alloc_working_area(target, 
sizeof(numicro_m55_flash_algorithm_ns_code),
+                               &init_algorithm) != ERROR_OK) {
+                               LOG_WARNING("no working area available, can't 
do block memory erase");
+                               return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
+                       }
+
+                       retval = target_write_buffer(target, 
init_algorithm->address,
+                               sizeof(numicro_m55_flash_algorithm_ns_code), 
(const uint8_t *)numicro_m55_flash_algorithm_ns_code);
+
+                       if (retval != ERROR_OK)
+                               return retval;
+
+                       init_reg_param(&reg_params[0], "r0", 32, PARAM_OUT);    
/* faddr */
+                       init_reg_param(&reg_params[1], "sp", 32, PARAM_OUT);    
/* update SP */
+                       init_reg_param(&reg_params[2], "lr", 32, PARAM_OUT);
+
+                       buf_set_u32(reg_params[0].value, 0, 32, 0);
+                       buf_set_u32(reg_params[1].value, 0, 32, 
init_algorithm->address + target->working_area_size);
+                       buf_set_u32(reg_params[2].value, 0, 32, algorithm_lr);
+
+                       retval = target_run_algorithm(target, 0, NULL, 3, 
reg_params,
+                               init_algorithm->address + 
algorithm_init_entry_offset, 0, 100000, &armv7m_info);
+
+                       if (retval != ERROR_OK) {
+                               LOG_ERROR("Error executing NuMicro Flash init 
algorithm");
+                               retval = ERROR_FLASH_OPERATION_FAILED;
+                       }
+
+                       target_free_working_area(target, init_algorithm);
+                       destroy_reg_param(&reg_params[0]);
+                       destroy_reg_param(&reg_params[1]);
+                       destroy_reg_param(&reg_params[2]);
+               } else {
+                       retval = target_read_u32(target, 
NUMICRO_M55_CLK_SRCCTL, &reg_stat);
+                       if (retval != ERROR_OK)
+                               return retval;
+
+                       reg_stat |= CLK_SRCCTL_HIRCEN | CLK_SRCCTL_HIRC48MEN;
+                       retval = target_write_u32(target, 
NUMICRO_M55_CLK_SRCCTL, reg_stat);
+                       if (retval != ERROR_OK)
+                               return retval;
+
+                       retval = target_read_u32(target, 
NUMICRO_M55_CLK_FMCCTL, &reg_stat);
+                       if (retval != ERROR_OK)
+                               return retval;
+
+                       reg_stat |= CLK_FMCCTL_FMC0CKEN | CLK_FMCCTL_ISP0CKEN;
+                       retval = target_write_u32(target, 
NUMICRO_M55_CLK_FMCCTL, reg_stat);
+                       if (retval != ERROR_OK)
+                               return retval;
+
+                       retval = target_read_u32(target, 
NUMICRO_M55_FMC_ISPCTL, &reg_stat);
+                       if (retval != ERROR_OK)
+                               return retval;
+
+                       reg_stat |= ISPCTL_ISPEN | ISPCTL_APUEN | ISPCTL_LDUEN 
| ISPCTL_ISPFF;
+                       retval = target_write_u32(target, 
NUMICRO_M55_FMC_ISPCTL, reg_stat);
+                       if (retval != ERROR_OK)
+                               return retval;
+
+                       retval = target_write_u32(target, 
NUMICRO_M55_CLK_SCLKSEL, CLK_SCLKSEL_HIRC48M);
+                       if (retval != ERROR_OK)
+                               return retval;
+
+                       retval = target_write_u32(target, 
NUMICRO_M55_CLK_SCLKDIV, 0);
+                       if (retval != ERROR_OK)
+                               return retval;
+               }
+       } else {
+               /* Enable ISP/SRAM/TICK Clock */
+               retval = target_read_u32(target, NUMICRO_SYSCLK_AHBCLK - 
m_addressminusoffset, &reg_stat);
+               if (retval != ERROR_OK)
+                       return retval;
+
+               reg_stat |= AHBCLK_ISP_EN;
+               retval = target_write_u32(target, NUMICRO_SYSCLK_AHBCLK - 
m_addressminusoffset, reg_stat);
+               if (retval != ERROR_OK)
+                       return retval;
+
+               /* Enable ISP */
+               retval = target_read_u32(target, NUMICRO_FLASH_ISPCTL - 
m_addressminusoffset, &reg_stat);
+               if (retval != ERROR_OK)
+                       return retval;
+
+               reg_stat |= ISPCTL_ISPFF | ISPCTL_SPUEN | ISPCTL_LDUEN | 
ISPCTL_APUEN | ISPCTL_CFGUEN | ISPCTL_ISPEN;
+               retval = target_write_u32(target, NUMICRO_FLASH_ISPCTL - 
m_addressminusoffset, reg_stat);
+               if (retval != ERROR_OK)
+                       return retval;
+       }
+
+       if (!armv7m) {
+               /* something is very wrong if armv7m is NULL */
+               LOG_ERROR("unable to get armv7m target");
+               return retval;
+       }
+
+       if (armv7m->arm.arch == ARM_ARCH_V6M) {
+               if (m_cpu->flash_type == FLASH_TYPE_M0_AHB5) {
+                       retval = target_write_u32(target, NUMICRO_FLASH_CHEAT, 
1);
+                       if (retval != ERROR_OK)
+                               return retval;
+               }
+       }
+
+       LOG_DEBUG("%s is done.", __func__);
+       return retval;
+}
+
+static int numicro_dap_erase(struct flash_bank *bank, unsigned int first, 
unsigned int last)
+{
+       int     result = ERROR_OK;
+       uint32_t address = 0, i = 0;
+       uint32_t timeout, status;
+       uint32_t fmc_isp_base = NUMICRO_FMC_BASE;
+       uint32_t reg_isp_busy = NUMICRO_FLASH_ISPTRG;
+       uint32_t algorithm_init_entry_offset = 0;
+       uint32_t algorithm_erasesector_entry_offset = 0;
+       uint32_t algorithm_lr = 0;
+       struct working_area *algorithm;
+       struct target *target = bank->target;
+       struct reg_param reg_params[3];
+       struct armv7m_common *armv7m = target_to_armv7m(target);
+       struct armv7m_algorithm armv7m_info;
+
+       if (armv7m->arm.arch == ARM_ARCH_V6M) {
+               if (m_cpu->flash_type == FLASH_TYPE_M0_AHB4) {
+                       fmc_isp_base = NUMICRO_FMC_BASE4;
+                       m_addressminusoffset = 0x10000000;
+                       reg_isp_busy = NUMICRO_FLASH_ISPSTS;
+               } else {
+                       m_addressminusoffset = 0;
+                       reg_isp_busy = NUMICRO_FLASH_ISPTRG;
+               }
+       } else if (armv7m->arm.arch == ARM_ARCH_V7M) {
+               fmc_isp_base = NUMICRO_FMC_BASE4;
+               m_addressminusoffset = 0x10000000;
+               reg_isp_busy = NUMICRO_FLASH_MPSTS;
+       } else {
+               if (m_cpu->flash_type == FLASH_TYPE_M2L31)
+                       return ERROR_OK;
+
+               if (m_cpu->flash_type == FLASH_TYPE_M55) {
+                       fmc_isp_base = NUMICRO_M55_FMC_BASE;
+                       m_addressminusoffset = 0x10000000;
+                       reg_isp_busy = NUMICRO_FLASH_ISPSTS;
+               } else {
+                       fmc_isp_base = NUMICRO_FMC_BASE4;
+                       m_addressminusoffset = 0x10000000;
+                       reg_isp_busy = NUMICRO_FLASH_MPSTS;
+               }
+       }
+
+       if (m_cpu->flash_type == FLASH_TYPE_M55 && !m_b_secure_debug) {
+               algorithm_init_entry_offset = 0x5;
+               algorithm_lr = 0x30200001;
+
+               /* allocate working area with init info code */
+               if (target_alloc_working_area(target, 
sizeof(numicro_m55_flash_algorithm_ns_code),
+                       &algorithm) != ERROR_OK) {
+                       LOG_WARNING("no working area available, can't do block 
memory erase");
+                       return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
+               }
+
+               result = target_write_buffer(target, algorithm->address,
+                       sizeof(numicro_m55_flash_algorithm_ns_code), (const 
uint8_t *)numicro_m55_flash_algorithm_ns_code);
+
+               if (result != ERROR_OK)
+                       return result;
+
+               init_reg_param(&reg_params[0], "r0", 32, PARAM_OUT);    /* 
faddr */
+               init_reg_param(&reg_params[1], "sp", 32, PARAM_OUT);    /* 
update SP */
+               init_reg_param(&reg_params[2], "lr", 32, PARAM_OUT);
+
+               buf_set_u32(reg_params[0].value, 0, 32, 0);
+               buf_set_u32(reg_params[1].value, 0, 32, algorithm->address + 
target->working_area_size);
+               buf_set_u32(reg_params[2].value, 0, 32, algorithm_lr);
+
+               armv7m_info.common_magic = ARMV7M_COMMON_MAGIC;
+               armv7m_info.core_mode = ARM_MODE_THREAD;
+
+               result = target_run_algorithm(target, 0, NULL, 3, reg_params,
+                       algorithm->address + algorithm_init_entry_offset, 0, 
100000, &armv7m_info);
+
+               if (result != ERROR_OK) {
+                       LOG_ERROR("Error executing NuMicro Flash init 
algorithm");
+                       result = ERROR_FLASH_OPERATION_FAILED;
+                       return result;
+               }
+
+               algorithm_erasesector_entry_offset = 0x209;
+
+               /* use Flash erase code within NuMicro            */
+               /* set breakpoint to 0 with time-out of 100000 ms */
+               for (i = first; i <= last; i++) {
+                       if (bank->sectors[i].is_erased == 1) {
+                               LOG_DEBUG("sector %d has been erased recently. 
Skip to the next sector.", i);
+                               continue;
+                       }
+
+                       address = (bank->base + bank->sectors[i].offset);
+                       buf_set_u32(reg_params[0].value, 0, 32, address);
+                       buf_set_u32(reg_params[1].value, 0, 32, 
algorithm->address + target->working_area_size);
+                       buf_set_u32(reg_params[2].value, 0, 32, algorithm_lr);
+
+                       result = target_run_algorithm(target, 0, NULL, 3, 
reg_params,
+                               algorithm->address + 
algorithm_erasesector_entry_offset, 0, 100000, &armv7m_info);
+
+                       if (result != ERROR_OK) {
+                               LOG_ERROR("Error executing NuMicro Flash erase 
algorithm");
+                               result = ERROR_FLASH_OPERATION_FAILED;
+                               break;
+                       }
+
+                       bank->sectors[i].is_erased = 1;
+               }
+
+               target_free_working_area(target, algorithm);
+               destroy_reg_param(&reg_params[0]);
+               destroy_reg_param(&reg_params[1]);
+               destroy_reg_param(&reg_params[2]);
+       } else {
+               for (i = first; i <= last; i++) {
+                       if (i == first) {
+                               numicro_init_isp(target);
+                               result = target_write_u32(target, fmc_isp_base 
+ NUMICRO_FLASH_ISPCMD, ISPCMD_ERASE);
+                               if (result != ERROR_OK)
+                                       return result;
+                       }
+
+                       if (bank->sectors[i].is_erased == 1) {
+                               LOG_DEBUG("sector %d has been erased recently. 
Skip to the next sector.", i);
+                               continue;
+                       }
+
+                       address = bank->base + bank->sectors[i].offset;
+                       LOG_DEBUG("erasing sector %d at address 0x%" PRIx32 "", 
i, address);
+
+                       result = target_write_u32(target, fmc_isp_base + 
NUMICRO_FLASH_ISPADR, address);
+                       if (result != ERROR_OK)
+                               return result;
+
+                       /* This is the only bit available */
+                       result = target_write_u32(target, fmc_isp_base + 
NUMICRO_FLASH_ISPTRG, ISPTRG_ISPGO);
+                       if (result != ERROR_OK)
+                               return result;
+
+                       /* wait for busy to clear - check the GO flag */
+                       timeout = 1000;
+                       for (;;) {
+                               result = target_read_u32(target, fmc_isp_base + 
reg_isp_busy, &status);
+                               if (result != ERROR_OK)
+                                       return result;
+
+                               if ((status & FMC_MPSTS_MPBUSY) == 0)
+                                       break;
+                               if (timeout-- <= 0) {
+                                       LOG_DEBUG("timed out waiting for 
flash");
+                                       return ERROR_FAIL;
+                               }
+                       }
+
+                       /* check for failure */
+                       result = target_read_u32(target, fmc_isp_base + 
NUMICRO_FLASH_ISPCTL, &status);
+                       if (result != ERROR_OK)
+                               return result;
+                       if ((status & ISPCTL_ISPFF) != 0) {
+                               LOG_DEBUG("failure: 0x%" PRIx32 "", status);
+                               /* if bit is set, then must write to it to 
clear it. */
+                               result = target_write_u32(target, fmc_isp_base 
+ NUMICRO_FLASH_ISPCTL, (status | ISPCTL_ISPFF));
+                               if (result != ERROR_OK)
+                                       return result;
+                       } else {
+                               bank->sectors[i].is_erased = 1;
+                       }
+               }
+       }
+
+       return result;
+}
+
+static int numicro_dap_write(struct flash_bank *bank, const uint8_t *buffer, 
uint32_t offset, uint32_t count)
+{
+       int     result = ERROR_OK;
+       struct target *target = bank->target;
+       struct armv7m_common *armv7m = target_to_armv7m(target);
+       struct working_area     *algorithm = NULL;
+       struct working_area     *source = NULL;
+       struct armv7m_algorithm armv7m_info;
+
+       struct reg_param reg_params[5];
+
+       uint32_t remain_size = 0;
+       uint32_t buffer_size = 0;
+       uint32_t write_address = 0;
+       uint32_t write_size     = 0;
+       uint8_t *write_data     = 0;
+
+       uint32_t algorithm_init_entry_offset = 0;
+       uint32_t algorithm_programpage_entry_offset = 0;
+       uint32_t algorithm_lr = 0x20000001;
+
+       if (armv7m->arm.arch == ARM_ARCH_V6M) {
+               if (m_cpu->flash_type == FLASH_TYPE_M0_AHB4) {
+                       /* Get working area for code */
+                       result = target_alloc_working_area(target,
+                                                                               
                sizeof(numicro_m0_ahb4_flash_algorithm_code),
+                                                                               
                &algorithm);
+                       if (result != ERROR_OK) {
+                               LOG_DEBUG("target_alloc_working_area() = %d\n", 
result);
+                               return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
+                       }
+
+                       /* Transfer write program to RAM */
+                       result = target_write_buffer(target,
+                                                                               
algorithm->address,
+                                                                               
sizeof(numicro_m0_ahb4_flash_algorithm_code),
+                                                                               
(const uint8_t *)numicro_m0_ahb4_flash_algorithm_code);
+                       if (result != ERROR_OK) {
+                               LOG_DEBUG("target_write_buffer() = %d\n", 
result);
+                               target_free_working_area(target, algorithm);
+                               return result;
+                       }
+                       algorithm_init_entry_offset = 0x5;
+                       algorithm_programpage_entry_offset = 0x11d;
+               } else if (m_cpu->flash_type == 
FLASH_TYPE_M0_AHB5_NUVIOCE_N574) {
+                       /* Get working area for code */
+                       result = target_alloc_working_area(target,
+                                                                               
                sizeof(nuvoice_n574_m0_ahb5_flash_algorithm_code),
+                                                                               
                &algorithm);
+                       if (result != ERROR_OK) {
+                               LOG_DEBUG("target_alloc_working_area() = %d\n", 
result);
+                               return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
+                       }
+
+                       /* Transfer write program to RAM */
+                       result = target_write_buffer(target,
+                                                                               
algorithm->address,
+                                                                               
sizeof(nuvoice_n574_m0_ahb5_flash_algorithm_code),
+                                                                               
(const uint8_t *)nuvoice_n574_m0_ahb5_flash_algorithm_code);
+                       if (result != ERROR_OK) {
+                               LOG_DEBUG("target_write_buffer() = %d\n", 
result);
+                               target_free_working_area(target, algorithm);
+                               return result;
+                       }
+                       algorithm_init_entry_offset = 0x5;
+                       algorithm_programpage_entry_offset = 0x12f;
+               } else {
+                       /* Get working area for code */
+                       result = target_alloc_working_area(target,
+                                                                               
                sizeof(numicro_m0_ahb5_flash_algorithm_code),
+                                                                               
                &algorithm);
+                       if (result != ERROR_OK) {
+                               LOG_DEBUG("target_alloc_working_area() = %d\n", 
result);
+                               return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
+                       }
+
+                       /* Transfer write program to RAM */
+                       result = target_write_buffer(target,
+                                                                               
algorithm->address,
+                                                                               
sizeof(numicro_m0_ahb5_flash_algorithm_code),
+                                                                               
(const uint8_t *)numicro_m0_ahb5_flash_algorithm_code);
+                       if (result != ERROR_OK) {
+                               LOG_DEBUG("target_write_buffer() = %d\n", 
result);
+                               target_free_working_area(target, algorithm);
+                               return result;
+                       }
+                       algorithm_init_entry_offset = 0x15;
+                       algorithm_programpage_entry_offset = 0x1a7;
+               }
+       } else if (armv7m->arm.arch == ARM_ARCH_V7M) {
+               /* Get working area for code */
+               result = target_alloc_working_area(target,
+                                                                               
        sizeof(numicro_m4_flash_algorithm_code),
+                                                                               
        &algorithm);
+               if (result != ERROR_OK) {
+                       LOG_DEBUG("target_alloc_working_area() = %d\n", result);
+                       return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
+               }
+
+               /* Transfer write program to RAM */
+               result = target_write_buffer(target,
+                                                                       
algorithm->address,
+                                                                       
sizeof(numicro_m4_flash_algorithm_code),
+                                                                       (const 
uint8_t *)numicro_m4_flash_algorithm_code);
+               if (result != ERROR_OK) {
+                       LOG_DEBUG("target_write_buffer() = %d\n", result);
+                       target_free_working_area(target, algorithm);
+                       return result;
+               }
+               algorithm_init_entry_offset = 0x15;
+               algorithm_programpage_entry_offset = 0x149;
+       } else {
+               if (m_cpu->flash_type == FLASH_TYPE_M2L31) {
+                       /* Get working area for code */
+                       result = target_alloc_working_area(target,
+                                                                               
                sizeof(numicro_m2l31_flash_algorithm_code),
+                                                                               
                &algorithm);
+                       if (result != ERROR_OK) {
+                               LOG_DEBUG("target_alloc_working_area() = %d\n", 
result);
+                               return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
+                       }
+
+                       /* Transfer write program to RAM */
+                       result = target_write_buffer(target,
+                                                                               
algorithm->address,
+                                                                               
sizeof(numicro_m2l31_flash_algorithm_code),
+                                                                               
(const uint8_t *)numicro_m2l31_flash_algorithm_code);
+                       if (result != ERROR_OK) {
+                               LOG_DEBUG("target_write_buffer() = %d\n", 
result);
+                               target_free_working_area(target, algorithm);
+                               return result;
+                       }
+                       algorithm_init_entry_offset = 0x5;
+                       algorithm_programpage_entry_offset = 0x259;
+               } else if (m_cpu->flash_type == FLASH_TYPE_M55) {
+                       /* Get working area for code */
+                       if (!m_b_secure_debug) {
+                               result = target_alloc_working_area(target,
+                                                                               
                        sizeof(numicro_m55_flash_algorithm_ns_code),
+                                                                               
                        &algorithm);
+                               if (result != ERROR_OK) {
+                                       LOG_DEBUG("target_alloc_working_area() 
= %d\n", result);
+                                       return 
ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
+                               }
+
+                               /* Transfer write program to RAM */
+                               result = target_write_buffer(target,
+                                                                               
        algorithm->address,
+                                                                               
        sizeof(numicro_m55_flash_algorithm_ns_code),
+                                                                               
        (const uint8_t *)numicro_m55_flash_algorithm_ns_code);
+                               if (result != ERROR_OK) {
+                                       LOG_DEBUG("target_write_buffer() = 
%d\n", result);
+                                       target_free_working_area(target, 
algorithm);
+                                       return result;
+                               }
+                               algorithm_init_entry_offset = 0x5;
+                               algorithm_programpage_entry_offset = 0x2f5;
+                               algorithm_lr = 0x30200001;
+                       } else {
+                               result = target_alloc_working_area(target,
+                                                                               
                        sizeof(numicro_m55_flash_algorithm_code),
+                                                                               
                        &algorithm);
+                               if (result != ERROR_OK) {
+                                       LOG_DEBUG("target_alloc_working_area() 
= %d\n", result);
+                                       return 
ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
+                               }
+
+                               /* Transfer write program to RAM */
+                               result = target_write_buffer(target,
+                                                                               
        algorithm->address,
+                                                                               
        sizeof(numicro_m55_flash_algorithm_code),
+                                                                               
        (const uint8_t *)numicro_m55_flash_algorithm_code);
+                               if (result != ERROR_OK) {
+                                       LOG_DEBUG("target_write_buffer() = 
%d\n", result);
+                                       target_free_working_area(target, 
algorithm);
+                                       return result;
+                               }
+                               algorithm_init_entry_offset = 0x5;
+                               algorithm_programpage_entry_offset = 0x271;
+                       }
+               } else {
+                       /* Get working area for code */
+                       result = target_alloc_working_area(target,
+                                                                               
                sizeof(numicro_m23_flash_algorithm_code),
+                                                                               
                &algorithm);
+                       if (result != ERROR_OK) {
+                               LOG_DEBUG("target_alloc_working_area() = %d\n", 
result);
+                               return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
+                       }
+
+                       /* Transfer write program to RAM */
+                       result = target_write_buffer(target,
+                                                                               
algorithm->address,
+                                                                               
sizeof(numicro_m23_flash_algorithm_code),
+                                                                               
(const uint8_t *)numicro_m23_flash_algorithm_code);
+                       if (result != ERROR_OK) {
+                               LOG_DEBUG("target_write_buffer() = %d\n", 
result);
+                               target_free_working_area(target, algorithm);
+                               return result;
+                       }
+                       algorithm_init_entry_offset = 0x5;
+                       algorithm_programpage_entry_offset = 0x20D;
+               }
+       }
+
+       /* Get working area for data */
+       buffer_size     = target->working_area_size;
+       result          = ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
+       while (result != ERROR_OK) {
+               LOG_DEBUG("buffer_size: 0x%x\n", buffer_size);
+               result = target_alloc_working_area_try(target, buffer_size, 
&source);
+               if (result == ERROR_OK)
+                       break;
+
+               buffer_size -= bank->sectors[0].size;
+               if (buffer_size < 256) {
+                       LOG_DEBUG("target_alloc_working_area_try() = %d\n", 
result);
+                       target_free_working_area(target, algorithm);
+                       return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
+               }
+       }
+
+       LOG_DEBUG("target->working_area_size: 0x%x\n", 
target->working_area_size);
+       init_reg_param(&reg_params[0], "r0", 32, PARAM_OUT);    /* faddr */
+       init_reg_param(&reg_params[1], "sp", 32, PARAM_OUT);    /* update SP */
+       init_reg_param(&reg_params[2], "lr", 32, PARAM_OUT);    /* update LR */
+
+       buf_set_u32(reg_params[0].value, 0, 32, 0);
+       buf_set_u32(reg_params[1].value, 0, 32, algorithm->address + 
target->working_area_size);
+       buf_set_u32(reg_params[2].value, 0, 32, algorithm_lr);
+
+       armv7m_info.common_magic        = ARMV7M_COMMON_MAGIC;
+       armv7m_info.core_mode           = ARM_MODE_THREAD;
+
+       result = target_run_algorithm(target, 0, NULL, 3, reg_params,
+                                                                       
algorithm->address + algorithm_init_entry_offset, 0, 100000, &armv7m_info);
+       if (result != ERROR_OK) {
+               LOG_ERROR("Error executing NuMicro Flash init algorithm");
+               result = ERROR_FLASH_OPERATION_FAILED;
+       }
+
+       init_reg_param(&reg_params[0], "r0", 32, PARAM_OUT);    /* faddr */
+       init_reg_param(&reg_params[1], "r1", 32, PARAM_OUT);    /* number of 
words to program */
+       init_reg_param(&reg_params[2], "r2", 32, PARAM_OUT);    /* *pLW 
(*buffer) */
+       init_reg_param(&reg_params[3], "sp", 32, PARAM_OUT);    /* update SP */
+       init_reg_param(&reg_params[4], "lr", 32, PARAM_OUT);    /* update LR */
+
+       /* Program in units */
+       remain_size             = count;
+       write_address   = bank->base + offset;
+       write_data              = (uint8_t *)buffer;
+       write_size              = buffer_size;
+
+       while (remain_size != 0) {
+               if (remain_size < buffer_size)
+                       write_size = remain_size;
+
+               LOG_INFO("Program at 0x%08x to 0x%08x",
+                               write_address, (write_address + write_size - 
1));
+
+               /* Set parameter (Write data) */
+               result = target_write_buffer(target,
+                                                                       
source->address,
+                                                                       
write_size,
+                                                                       
write_data);
+               if (result != ERROR_OK) {
+                       LOG_DEBUG("target_write_buffer() = %d\n", result);
+                       break;
+               }
+
+               buf_set_u32(reg_params[0].value, 0, 32, write_address);
+               buf_set_u32(reg_params[1].value, 0, 32, write_size);
+               buf_set_u32(reg_params[2].value, 0, 32, source->address);
+               buf_set_u32(reg_params[3].value, 0, 32, algorithm->address + 
target->working_area_size);
+               buf_set_u32(reg_params[4].value, 0, 32, algorithm_lr);
+
+               /* Run program */
+               result = target_run_algorithm(target,
+                                                                               
0, NULL,
+                                                                               
ARRAY_SIZE(reg_params), reg_params,
+                                                                               
algorithm->address + algorithm_programpage_entry_offset,
+                                                                               
0,
+                                                                               
10000,
+                                                                               
&armv7m_info);
+               if (result != ERROR_OK) {
+                       LOG_DEBUG("target_run_algorithm() = %d\n", result);
+                       result = ERROR_FLASH_OPERATION_FAILED;
+                       break;
+               }
+
+               /* Next */
+               remain_size             -= write_size;
+               write_address   += write_size;
+               write_data              += write_size;
+       }
+
+       /* Free allocated area */
+       target_free_working_area(target, algorithm);
+       target_free_working_area(target, source);
+       destroy_reg_param(&reg_params[0]);
+       destroy_reg_param(&reg_params[1]);
+       destroy_reg_param(&reg_params[2]);
+       destroy_reg_param(&reg_params[3]);
+       destroy_reg_param(&reg_params[4]);
+
+       return result;
+}
+
+static int numicro_dap_get_cpu_type(struct target *target, const struct 
numicro_dap_cpu_type **cpu, uint32_t part_id)
+{
+       /* search part numbers */
+       for (size_t i = 0; i < ARRAY_SIZE(numicro_dap_parts); i++) {
+               if (part_id == numicro_dap_parts[i].partid) {
+                       *cpu = &numicro_dap_parts[i];
+                       LOG_INFO("Device Name: %s", (*cpu)->partname);
+                       return ERROR_OK;
+               }
+       }
+
+       return ERROR_FAIL;
+}
+
+static int numicro_dap_get_flash_size(struct flash_bank *bank,
+                                                                       const 
struct numicro_dap_cpu_type *cpu,
+                                                                       
uint32_t *flash_size)
+{
+       for (size_t i = 0; i < cpu->n_banks; i++) {
+               if (cpu->bank[i].base & NUMICRO_NEW_FLASH_OFFSET)
+                       bank->base = (bank->base | NUMICRO_NEW_FLASH_OFFSET);
+
+               if (bank->base == cpu->bank[i].base || ((bank->base & 
~NUMICRO_NS_OFFSET) == cpu->bank[i].base)) {
+                       *flash_size = cpu->bank[i].size;
+                       LOG_INFO("bank base = " TARGET_ADDR_FMT ", size = 0x%08"
+                                       PRIx32, bank->base, *flash_size);
+                       return ERROR_OK;
+               }
+       }
+       return ERROR_FLASH_OPERATION_FAILED;
+}
+
+static int numicro_dap_probe(struct flash_bank *bank)
+{
+       int     cnt;
+       uint32_t part_id = 0x00000000;
+       uint32_t flash_size, offset = 0, regvalue;
+       struct target *target = bank->target;
+       struct armv7m_common *armv7m = target_to_armv7m(target);
+       int retval = ERROR_OK;
+
+       /* Check target access */
+       if (armv7m->arm.arch == ARM_ARCH_V6M) {
+               retval = target_read_u32(target, NUMICRO_AHB4_SYS_BASE, 
&part_id);
+               if (retval != ERROR_OK || part_id == 0x00000000 || part_id == 
0xffffffff)
+                       retval = target_read_u32(target, NUMICRO_AHB5_SYS_BASE, 
&part_id);
+       } else if (armv7m->arm.arch == ARM_ARCH_V7M) {
+               retval = target_read_u32(target, NUMICRO_AHB4_SYS_BASE, 
&part_id);
+       } else {
+               retval = target_read_u32(target, NUMICRO_AHB4_SYS_BASE, 
&part_id);
+               if (retval != ERROR_OK || part_id == 0x00000000 || part_id == 
0xffffffff)
+                       retval = target_read_u32(target, NUMICRO_AHB5_SYS_BASE, 
&part_id);
+       }
+
+       if (retval != ERROR_OK || part_id == 0x00000000 || part_id == 
0xffffffff) {
+               LOG_ERROR("NuMicro flash driver: Failed to detect pdid\n");
+               return ERROR_FLASH_OPERATION_FAILED;
+       }
+
+       retval = numicro_dap_get_cpu_type(target, &m_cpu, part_id);
+       if (retval != ERROR_OK) {
+               LOG_ERROR("NuMicro flash driver: Failed to detect a known 
part\n");
+               return ERROR_FLASH_OPERATION_FAILED;
+       }
+
+       retval = numicro_dap_get_flash_size(bank, m_cpu, &flash_size);
+       if (retval != ERROR_OK) {
+               LOG_ERROR("NuMicro flash driver: Failed to detect flash 
size\n");
+               return ERROR_FLASH_OPERATION_FAILED;
+       }
+
+       bank->size                      = flash_size;
+       bank->num_sectors       = bank->size / m_cpu->page_size;
+       bank->sectors           = malloc(sizeof(struct flash_sector) * 
bank->num_sectors);
+
+       offset = 0;
+       for (cnt = 0; cnt < (int)(bank->num_sectors); cnt++) {
+               bank->sectors[cnt].offset               = offset;
+               bank->sectors[cnt].size                 = m_cpu->page_size;
+               bank->sectors[cnt].is_erased    = -1;
+               bank->sectors[cnt].is_protected = -1;
+               offset += m_cpu->page_size;
+       }
+
+       struct numicro_dap_flash_bank   *flash_bank_info;
+       flash_bank_info                 = bank->driver_priv;
+       flash_bank_info->probed = 1;
+       flash_bank_info->cpu    = m_cpu;
+
+       if (m_cpu->flash_type == FLASH_TYPE_M55) {
+               retval = target_read_u32(target, NUMICRO_SCS_DHCSR, &regvalue);
+               if (retval != ERROR_OK) {
+                       m_b_secure_debug = true;
+               } else {
+                       if ((regvalue & DHCSR_S_SDE) == DHCSR_S_SDE)
+                               m_b_secure_debug = true;
+                       else
+                               m_b_secure_debug = false;
+               }
+       } else {
+               m_b_secure_debug = true;
+       }
+
+       return ERROR_OK;
+}
+
+static int numicro_dap_protect(struct flash_bank *bank, int set, unsigned int 
first, unsigned int last)
+{
+       LOG_INFO("protect function is unsupported\n");
+       return ERROR_FLASH_OPER_UNSUPPORTED;
+}
+
+static int numicro_dap_erase_check(struct flash_bank *bank)
+{
+       LOG_INFO("erase_check function is unsupported\n");
+       return ERROR_FLASH_OPER_UNSUPPORTED;
+}
+
+static int numicro_dap_protect_check(struct flash_bank *bank)
+{
+       LOG_INFO("protect_check function is unsupported\n");
+       return ERROR_OK;
+}
+
+static int numicro_dap_info(struct flash_bank *bank, struct command_invocation 
*cmd)
+{
+       return ERROR_OK;
+}
+
+static int numicro_dap_auto_probe(struct flash_bank *bank)
+{
+       struct numicro_dap_flash_bank *flash_bank_info = bank->driver_priv;
+
+       if (flash_bank_info->probed)
+               return ERROR_OK;
+
+       return numicro_dap_probe(bank);
+}
+
+const struct flash_driver numicro_dap_flash = {
+       .name                                   = "numicro_dap",
+       .usage                                  = "",
+       .flash_bank_command             = numicro_dap_flash_bank_command,
+       .erase                                  = numicro_dap_erase,
+       .protect                                = numicro_dap_protect,
+       .write                                  = numicro_dap_write,
+       .read                                   = default_flash_read,
+       .probe                                  = numicro_dap_probe,
+       .auto_probe                             = numicro_dap_auto_probe,
+       .erase_check                    = numicro_dap_erase_check,
+       .protect_check                  = numicro_dap_protect_check,
+       .info                                   = numicro_dap_info,
+       .free_driver_priv               = default_flash_free_driver_priv,
+};
diff --git a/src/flash/nor/numicro_dap.h b/src/flash/nor/numicro_dap.h
new file mode 100644
index 0000000000..5b7e19f9a0
--- /dev/null
+++ b/src/flash/nor/numicro_dap.h
@@ -0,0 +1,61 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+/***************************************************************************
+ *   Copyright (C) 2023 by Nuvoton Technology Corporation                  *
+ *   ccli0 <cc...@nuvoton.com>                                             *
+ *                                                                         *
+ *   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/>. *
+ ***************************************************************************/
+
+#ifndef OPENOCD_FLASH_NOR_NUMICRO_DAP_H
+#define OPENOCD_FLASH_NOR_NUMICRO_DAP_H
+
+/* Nuvoton NUMICROM Series register locations */
+#define NUMICRO_AHB5_SYS_BASE          0x50000000
+#define NUMICRO_AHB4_SYS_BASE          0x40000000
+
+/* Definition for Erase timeout */
+#define        TIMEOUT_ERASE                           100000
+
+/* Definition for Flash Memory */
+#define        SECTOR_SIZE_512         0x00000200
+#define        SECTOR_SIZE_2K          0x00000800
+#define        SECTOR_SIZE_4K          0x00001000
+#define        SECTOR_SIZE_8K          0x00002000
+
+/* flash MAX banks */
+#define NUMICRO_DAP_MAX_FLASH_BANKS            2
+
+/* flash bank structs */
+struct numicro_dap_flash_bank_type {
+       uint32_t base;
+       uint32_t size;
+};
+
+/* part structs */
+struct numicro_dap_cpu_type {
+       char *partname;
+       uint32_t partid;
+       unsigned int flash_type;
+       unsigned int n_banks;
+       struct numicro_dap_flash_bank_type bank[NUMICRO_DAP_MAX_FLASH_BANKS];
+       unsigned int page_size;
+};
+
+struct numicro_dap_flash_bank {
+       int             probed;
+       const struct numicro_dap_cpu_type *cpu;
+};
+
+#endif /* OPENOCD_FLASH_NOR_NUMICRO_DAP_H */

-- 

Reply via email to