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(®_params[0], "r0", 32, PARAM_OUT); /* faddr */ + init_reg_param(®_params[1], "sp", 32, PARAM_OUT); /* update SP */ + init_reg_param(®_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(®_params[0]); + destroy_reg_param(®_params[1]); + destroy_reg_param(®_params[2]); + } else { + retval = target_read_u32(target, NUMICRO_M55_CLK_SRCCTL, ®_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, ®_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, ®_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, ®_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, ®_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(®_params[0], "r0", 32, PARAM_OUT); /* faddr */ + init_reg_param(®_params[1], "sp", 32, PARAM_OUT); /* update SP */ + init_reg_param(®_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(®_params[0]); + destroy_reg_param(®_params[1]); + destroy_reg_param(®_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(®_params[0], "r0", 32, PARAM_OUT); /* faddr */ + init_reg_param(®_params[1], "sp", 32, PARAM_OUT); /* update SP */ + init_reg_param(®_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(®_params[0], "r0", 32, PARAM_OUT); /* faddr */ + init_reg_param(®_params[1], "r1", 32, PARAM_OUT); /* number of words to program */ + init_reg_param(®_params[2], "r2", 32, PARAM_OUT); /* *pLW (*buffer) */ + init_reg_param(®_params[3], "sp", 32, PARAM_OUT); /* update SP */ + init_reg_param(®_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(®_params[0]); + destroy_reg_param(®_params[1]); + destroy_reg_param(®_params[2]); + destroy_reg_param(®_params[3]); + destroy_reg_param(®_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, ®value); + 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 */ --