Skip to content
This repository was archived by the owner on Mar 7, 2026. It is now read-only.

Commit 267acf8

Browse files
committed
mspm0: Flash target using on-device core loop stub
1 parent 6fe4d68 commit 267acf8

11 files changed

Lines changed: 175 additions & 44 deletions

File tree

src/target/cortexm.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1007,7 +1007,8 @@ static int cortexm_fault_unwind(target_s *target)
10071007
return 0;
10081008
}
10091009

1010-
bool cortexm_run_stub(target_s *target, uint32_t loadaddr, uint32_t r0, uint32_t r1, uint32_t r2, uint32_t r3)
1010+
bool cortexm_run_stub(
1011+
target_s *target, uint32_t loadaddr, uint32_t r0, uint32_t r1, uint32_t r2, uint32_t r3, uint32_t sp)
10111012
{
10121013
uint32_t regs[CORTEXM_MAX_REG_COUNT] = {0};
10131014

@@ -1016,6 +1017,8 @@ bool cortexm_run_stub(target_s *target, uint32_t loadaddr, uint32_t r0, uint32_t
10161017
regs[2] = r2;
10171018
regs[3] = r3;
10181019
regs[15] = loadaddr;
1020+
regs[CORTEX_REG_SP] = sp;
1021+
regs[CORTEX_REG_MSP] = sp;
10191022
regs[CORTEX_REG_XPSR] = CORTEXM_XPSR_THUMB;
10201023
regs[19] = 0;
10211024

src/target/cortexm.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,8 @@ extern unsigned cortexm_wait_timeout;
198198
bool cortexm_attach(target_s *target);
199199
void cortexm_detach(target_s *target);
200200
void cortexm_halt_resume(target_s *target, bool step);
201-
bool cortexm_run_stub(target_s *target, uint32_t loadaddr, uint32_t r0, uint32_t r1, uint32_t r2, uint32_t r3);
201+
bool cortexm_run_stub(
202+
target_s *target, uint32_t loadaddr, uint32_t r0, uint32_t r1, uint32_t r2, uint32_t r3, uint32_t sp);
202203
int cortexm_mem_write_aligned(target_s *target, target_addr_t dest, const void *src, size_t len, align_e align);
203204
uint32_t cortexm_demcr_read(const target_s *target);
204205
void cortexm_demcr_write(target_s *target, uint32_t demcr);

src/target/efm32.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,7 @@ static bool efm32_flash_write(target_flash_s *flash, target_addr_t dest, const v
635635
target_mem32_write(target, STUB_BUFFER_BASE, src, len);
636636
/* Run flashloader */
637637
const bool ret =
638-
cortexm_run_stub(target, SRAM_BASE, dest, STUB_BUFFER_BASE, len, priv_storage->device->msc_addr) == 0;
638+
cortexm_run_stub(target, SRAM_BASE, dest, STUB_BUFFER_BASE, len, priv_storage->device->msc_addr, 0) == 0;
639639

640640
#if ENABLE_DEBUG == 1
641641
/* Check the MSC_IF */

src/target/flashstub/meson.build

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
lmi_stub = []
3333
efm32_stub = []
3434
rp2040_stub = []
35+
mspm0_stub = []
3536

3637
# If we're doing a firmware build, type to find hexdump and objcopy
3738
if is_firmware_build
@@ -189,3 +190,35 @@ rp2040_stub = custom_target(
189190
output: 'rp.stub',
190191
capture: true,
191192
)
193+
194+
# Flash stub for MSPM0 parts
195+
mspm0_stub_elf = executable(
196+
'mspm0_stub.elf',
197+
'mspm0.c',
198+
c_args: [
199+
'-mcpu=cortex-m0plus',
200+
stub_build_args
201+
],
202+
link_args: [
203+
'-mcpu=cortex-m0plus',
204+
stub_build_args,
205+
'-T', '@0@/mspm0.ld'.format(meson.current_source_dir()),
206+
],
207+
link_depends: files('mspm0.ld'),
208+
pie: false,
209+
install: false,
210+
)
211+
212+
mspm0_stub_bin = custom_target(
213+
command: [ objcopy, '-O', 'binary', '@INPUT@', '@OUTPUT@' ],
214+
input: mspm0_stub_elf,
215+
output: 'mspm0_stub.bin'
216+
)
217+
218+
mspm0_stub = custom_target(
219+
'mspm0_stub-hex',
220+
command: [ hexdump, '-v', '-e', '/2 "0x%04X, "' , '@INPUT@' ],
221+
input: mspm0_stub_bin,
222+
output: 'mspm0.stub',
223+
capture: true,
224+
)

src/target/flashstub/mspm0.c

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/*
2+
* This file is part of the Black Magic Debug project.
3+
*
4+
* Copyright (C) 2026 1BitSquared <info@1bitsquared.com>
5+
* Written by hardesk <hardesk17@gmail.com>
6+
*
7+
* This program is free software: you can redistribute it and/or modify
8+
* it under the terms of the GNU General Public License as published by
9+
* the Free Software Foundation, either version 3 of the License, or
10+
* (at your option) any later version.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Public License
18+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
19+
*/
20+
#include <stdint.h>
21+
#include "stub.h"
22+
23+
#define MSPM0_FLASH_MAIN 0x00000000U
24+
#define MSPM0_FLASH_SECTOR_SZ 1024U
25+
26+
#define MSPM0_FLASHCTL_BASE 0x400cd000U
27+
#define MSPM0_FLASHCTL_CMDEXEC *((volatile uint32_t *)(MSPM0_FLASHCTL_BASE + 0x1100U))
28+
#define MSPM0_FLASHCTL_CMDTYPE *((volatile uint32_t *)(MSPM0_FLASHCTL_BASE + 0x1104U))
29+
#define MSPM0_FLASHCTL_CMDCTL *((volatile uint32_t *)(MSPM0_FLASHCTL_BASE + 0x1108U))
30+
#define MSPM0_FLASHCTL_CMDADDR *((volatile uint32_t *)(MSPM0_FLASHCTL_BASE + 0x1120U))
31+
#define MSPM0_FLASHCTL_BYTEN *((volatile uint32_t *)(MSPM0_FLASHCTL_BASE + 0x1124U))
32+
#define MSPM0_FLASHCTL_STATCMD *((volatile uint32_t *)(MSPM0_FLASHCTL_BASE + 0x13d0U))
33+
#define MSPM0_FLASHCTL_CMDDATA0 *((volatile uint32_t *)(MSPM0_FLASHCTL_BASE + 0x1130U))
34+
#define MSPM0_FLASHCTL_CMDDATA1 *((volatile uint32_t *)(MSPM0_FLASHCTL_BASE + 0x1134U))
35+
#define MSPM0_FLASHCTL_CMDWEPROTA *((volatile uint32_t *)(MSPM0_FLASHCTL_BASE + 0x11d0U))
36+
#define MSPM0_FLASHCTL_CMDWEPROTB *((volatile uint32_t *)(MSPM0_FLASHCTL_BASE + 0x11d4U))
37+
#define MSPM0_FLASHCTL_CMDWEPROTC *((volatile uint32_t *)(MSPM0_FLASHCTL_BASE + 0x11d8U))
38+
#define MSPM0_FLASHCTL_CMDTYPE_PROG 1U
39+
#define MSPM0_FLASHCTL_CMDTYPE_SZ_1WORD (0U << 4U)
40+
#define MSPM0_FLASHCTL_CMDEXEC_EXEC 1U
41+
#define MSPM0_FLASHCTL_STATCMD_DONE 0x01U
42+
#define MSPM0_FLASHCTL_STATCMD_CMDPASS 0x02U
43+
44+
void mspm0_flash_write_stub(const uint32_t *const dest, const uint32_t *const src, const uint32_t size)
45+
{
46+
for (uint32_t i = 0U; i < size / 4; i += 2) {
47+
uint32_t addr = (uint32_t)(dest + i);
48+
uint32_t sector = (addr - MSPM0_FLASH_MAIN) / MSPM0_FLASH_SECTOR_SZ;
49+
50+
if (sector < 32U)
51+
MSPM0_FLASHCTL_CMDWEPROTA = ~(1U << sector);
52+
else if (sector < 256U)
53+
MSPM0_FLASHCTL_CMDWEPROTB = 0U;
54+
else
55+
MSPM0_FLASHCTL_CMDWEPROTC = 0U;
56+
57+
MSPM0_FLASHCTL_CMDCTL = 0U;
58+
MSPM0_FLASHCTL_BYTEN = 0xffffffffU;
59+
MSPM0_FLASHCTL_CMDTYPE = MSPM0_FLASHCTL_CMDTYPE_PROG | MSPM0_FLASHCTL_CMDTYPE_SZ_1WORD;
60+
61+
MSPM0_FLASHCTL_CMDADDR = addr;
62+
MSPM0_FLASHCTL_CMDDATA0 = src[i];
63+
MSPM0_FLASHCTL_CMDDATA1 = src[i + 1U];
64+
MSPM0_FLASHCTL_CMDEXEC = MSPM0_FLASHCTL_CMDEXEC_EXEC;
65+
while (!(MSPM0_FLASHCTL_STATCMD & MSPM0_FLASHCTL_STATCMD_DONE))
66+
continue;
67+
if (!(MSPM0_FLASHCTL_STATCMD & MSPM0_FLASHCTL_STATCMD_CMDPASS))
68+
stub_exit(0);
69+
}
70+
71+
stub_exit(1);
72+
}

src/target/flashstub/mspm0.ld

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
MEMORY { sram (rwx): ORIGIN = 0x20000000, LENGTH = 0x00001000 }
2+
3+
SECTIONS
4+
{
5+
.text :
6+
{
7+
KEEP(*(.entry))
8+
*(.text.*, .text)
9+
} > sram
10+
}

src/target/flashstub/mspm0.stub

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
0xB5F7, 0x0893, 0x9301, 0x2380, 0x2580, 0x021B, 0x2601, 0x469C, 0x2200, 0x2301, 0x02ED, 0x4276, 0x9C01, 0x4294, 0xD801, 0xBE01, 0xBDF7, 0x4560, 0xD222, 0x001F, 0x0A84, 0x40A7, 0x43FC, 0x4F13, 0x603C, 0x2700, 0x4C12, 0x6027, 0x4C12, 0x6026, 0x4C12, 0x6023, 0x4C12, 0x6020, 0x680F, 0x4C12, 0x6027, 0x684F, 0x4C11, 0x6027, 0x4C11, 0x6023, 0x4C11, 0x6827, 0x421F, 0xD0FC, 0x6824, 0x07A4, 0xD400, 0xBE00, 0x3202, 0x3008, 0x3108, 0xE7D5, 0x2400, 0x42A8, 0xD201, 0x4F0B, 0xE7DC, 0x4F0B, 0xE7DA, 0x46C0, 0xE1D0, 0x400C, 0xE108, 0x400C, 0xE124, 0x400C, 0xE104, 0x400C, 0xE120, 0x400C, 0xE130, 0x400C, 0xE134, 0x400C, 0xE100, 0x400C, 0xE3D0, 0x400C, 0xE1D4, 0x400C, 0xE1D8, 0x400C,

src/target/lmi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,5 +229,5 @@ static bool lmi_flash_write(target_flash_s *flash, target_addr_t dest, const voi
229229
if (target_check_error(target))
230230
return false;
231231

232-
return cortexm_run_stub(target, LMI_SRAM_BASE, dest, LMI_STUB_BUFFER_BASE, len, 0) == 0;
232+
return cortexm_run_stub(target, LMI_SRAM_BASE, dest, LMI_STUB_BUFFER_BASE, len, 0, 0) == 0;
233233
}

src/target/meson.build

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ target_ti_cortexm = declare_dependency(
370370
'msp432e4.c',
371371
'msp432p4.c',
372372
'mspm0.c'
373-
) + lmi_stub,
373+
) + lmi_stub + mspm0_stub,
374374
compile_args: ['-DCONFIG_TI=1'],
375375
dependencies: target_cortexm,
376376
)

src/target/mspm0.c

Lines changed: 49 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* This file is part of the Black Magic Debug project.
33
*
4-
* Copyright (C) 2024 hardesk <hardesk@gmail.com>
4+
* Copyright (C) 2024-2026 hardesk <hardesk17@gmail.com>
55
*
66
* This program is free software: you can redistribute it and/or modify
77
* it under the terms of the GNU General Public License as published by
@@ -22,7 +22,7 @@
2222
#include "target_internal.h"
2323
#include "buffer_utils.h"
2424
#include "jep106.h"
25-
#include "cortex.h"
25+
#include "cortexm.h"
2626

2727
#define MSPM0_CONFIG_FLASH_DUMP_SUPPORT (CONFIG_BMDA == 1 || ENABLE_DEBUG == 1)
2828

@@ -31,12 +31,14 @@
3131
#define TI_DEVID_MSPM0L_1227_2228 0xbb9fU /* MSPM0L[12]22[78]*/
3232
#define TI_DEVID_MSPM0G 0xbb88U /* MSPM0G310[567], MSPM0G150[567], MSPM0G350[567] */
3333

34-
#define MSPM0_SRAM_BASE 0x20000000U
35-
#define MSPM0_FLASH_MAIN 0x00000000U
36-
#define MSPM0_FLASH_NONMAIN 0x41c00000U /* One Sector, BANK0. Device boot configuration (BCR, BSL) */
37-
#define MSPM0_FLASH_FACTORY 0x41c40000U /* One Sector, BANK0. Non modifiable */
38-
#define MSPM0_FLASH_DATA 0x41d00000U
39-
#define MSPM0_FLASH_SECTOR_SZ 1024U
34+
#define MSPM0_SRAM_BASE 0x20000000U
35+
#define MSPM0_FLASH_MAIN 0x00000000U
36+
#define MSPM0_FLASH_NONMAIN 0x41c00000U /* One Sector, BANK0. Device boot configuration (BCR, BSL) */
37+
#define MSPM0_FLASH_FACTORY 0x41c40000U /* One Sector, BANK0. Non modifiable */
38+
#define MSPM0_FLASH_DATA 0x41d00000U
39+
#define MSPM0_FLASH_SECTOR_SZ 1024U
40+
#define MSPM0_FLASH_WRITE_CHUNK_SZ MSPM0_FLASH_SECTOR_SZ
41+
#define MSPM0_FLASH_STUB_STACK_SIZE 0x20U
4042

4143
#define MSPM0_FACTORYREGION_DEVICEID (MSPM0_FLASH_FACTORY + 0x4U)
4244
#define MSPM0_FACTORYREGION_SRAMFLASH (MSPM0_FLASH_FACTORY + 0x18U)
@@ -89,8 +91,18 @@
8991
typedef struct mspm0_flash {
9092
target_flash_s target_flash;
9193
uint32_t banks;
94+
uint32_t ram_size; /* 0 if not enough ram to use stub flashing */
9295
} mspm0_flash_s;
9396

97+
static const uint16_t mspm0_flash_write_stub[] = {
98+
#include "flashstub/mspm0.stub"
99+
};
100+
#define STUB_BUFFER_BASE ALIGN(MSPM0_SRAM_BASE + sizeof(mspm0_flash_write_stub), 4)
101+
102+
static bool mspm0_flash_erase(target_flash_s *flash, target_addr_t addr, size_t length);
103+
static bool mspm0_flash_write(target_flash_s *flash, target_addr_t dest, const void *src, size_t length);
104+
static bool mspm0_mass_erase(target_s *target, platform_timeout_s *print_progess);
105+
94106
#if MSPM0_CONFIG_FLASH_DUMP_SUPPORT
95107
static bool mspm0_dump_factory_config(target_s *target, int argc, const char **argv);
96108
static bool mspm0_dump_bcr_config(target_s *target, int argc, const char **argv);
@@ -102,10 +114,6 @@ static command_s mspm0_cmds_list[] = {
102114
};
103115
#endif
104116

105-
static bool mspm0_flash_erase(target_flash_s *flash, target_addr_t addr, size_t length);
106-
static bool mspm0_flash_write(target_flash_s *flash, target_addr_t dest, const void *src, size_t length);
107-
static bool mspm0_mass_erase(target_s *target, platform_timeout_s *print_progess);
108-
109117
#if MSPM0_CONFIG_FLASH_DUMP_SUPPORT
110118
typedef struct conf_register {
111119
uint16_t reg_offset;
@@ -185,20 +193,31 @@ static bool mspm0_dump_bcr_config(target_s *const target, const int argc, const
185193
}
186194
#endif
187195

188-
static void mspm0_add_flash(target_s *const target, const uint32_t base, const size_t length, const uint32_t banks)
196+
static void mspm0_add_flash(
197+
target_s *const target, const uint32_t base, const size_t length, const uint32_t banks, uint32_t sram_size)
189198
{
190199
mspm0_flash_s *const flash = calloc(1, sizeof(*flash));
191200
if (flash == NULL) {
192201
DEBUG_WARN("%s: calloc failed for %" PRIu32 " bytes\n", __func__, (uint32_t)length);
193202
return;
194203
}
195204

205+
/* Decrease writesize until it fits within available RAM */
206+
uint32_t write_size = MSPM0_FLASH_WRITE_CHUNK_SZ;
207+
uint32_t stub_plus = ALIGN(sizeof mspm0_flash_write_stub, 4) + MSPM0_FLASH_STUB_STACK_SIZE;
208+
if (sram_size >= stub_plus) {
209+
uint32_t avail_ram = sram_size - stub_plus;
210+
while (write_size > avail_ram)
211+
write_size >>= 1;
212+
flash->ram_size = sram_size;
213+
}
214+
196215
flash->banks = banks;
197216
target_flash_s *target_flash = &flash->target_flash;
198217
target_flash->start = base;
199218
target_flash->length = length;
200219
target_flash->blocksize = MSPM0_FLASH_SECTOR_SZ;
201-
target_flash->writesize = 8U;
220+
target_flash->writesize = write_size;
202221
target_flash->erase = mspm0_flash_erase;
203222
target_flash->write = mspm0_flash_write;
204223
target_flash->erased = 0xffU;
@@ -235,9 +254,9 @@ bool mspm0_probe(target_s *const target)
235254
MSPM0_FACTORYREGION_SRAMFLASH_DATAFLASH_SZ_SHIFT);
236255

237256
target_add_ram32(target, MSPM0_SRAM_BASE, sram_size);
238-
mspm0_add_flash(target, MSPM0_FLASH_MAIN, mainflash_size, main_num_banks);
257+
mspm0_add_flash(target, MSPM0_FLASH_MAIN, mainflash_size, main_num_banks, sram_size);
239258
if (dataflash_size != 0)
240-
mspm0_add_flash(target, MSPM0_FLASH_DATA, dataflash_size, 1U);
259+
mspm0_add_flash(target, MSPM0_FLASH_DATA, dataflash_size, 1U, sram_size);
241260

242261
#if MSPM0_CONFIG_FLASH_DUMP_SUPPORT
243262
target_add_commands(target, mspm0_cmds_list, "MSPM0");
@@ -257,7 +276,7 @@ static uint32_t mspm0_flash_wait_done(target_s *const target)
257276
status = target_mem32_read32(target, MSPM0_FLASHCTL_STATCMD);
258277
if (platform_timeout_is_expired(&timeout))
259278
return 0U;
260-
};
279+
}
261280

262281
return status;
263282
}
@@ -278,8 +297,10 @@ static void mspm0_flash_unprotect_sector(target_flash_s *const target_flash, con
278297
uint32_t mask = ~(1U << sector);
279298
target_mem32_write32(target_flash->t, MSPM0_FLASHCTL_CMDWEPROTA, mask);
280299
} else if (sector < 256U) { /* 8 sectors per bit */
281-
/* When main flash is single bank, PROTB covers sectors starting after PROTA which is 32k. In multibank case
282-
* PROTB bits overlap PROTA and starts at sector 0. */
300+
/* Sectors affected by PROTB depend on the flash configuration. In single-bank
301+
* main flash, PROTB applies to sectors after those affected by PROTA
302+
* (that is, starting at sector 32). In multi-bank configurations, PROTA overlaps
303+
* PROTB, so PROTB applies starting at sector 0. */
283304
uint32_t start_protb_sector = mspm0_flash->banks > 1U ? 0U : 32U;
284305
uint32_t mask = ~(1U << ((sector - start_protb_sector) >> 3U));
285306
target_mem32_write32(target_flash->t, MSPM0_FLASHCTL_CMDWEPROTB, mask);
@@ -291,9 +312,7 @@ static void mspm0_flash_unprotect_sector(target_flash_s *const target_flash, con
291312

292313
static bool mspm0_flash_erase(target_flash_s *const target_flash, const target_addr_t addr, const size_t length)
293314
{
294-
#ifdef DEBUG_TARGET_IS_NOOP
295315
(void)length;
296-
#endif
297316

298317
target_s *const target = target_flash->t;
299318

@@ -316,27 +335,19 @@ static bool mspm0_flash_erase(target_flash_s *const target_flash, const target_a
316335
static bool mspm0_flash_write(
317336
target_flash_s *const target_flash, target_addr_t dest, const void *const src, const size_t length)
318337
{
319-
#ifdef DEBUG_TARGET_IS_NOOP
320-
(void)length;
321-
#endif
322-
323338
target_s *const target = target_flash->t;
339+
mspm0_flash_s *flash = (mspm0_flash_s *)target_flash;
340+
if (flash->ram_size == 0)
341+
return false;
324342

325-
mspm0_flash_unprotect_sector(target_flash, dest);
326-
target_mem32_write32(target, MSPM0_FLASHCTL_CMDTYPE, MSPM0_FLASHCTL_CMDTYPE_PROG | MSPM0_FLASHCTL_CMDTYPE_SZ_1WORD);
327-
target_mem32_write32(target, MSPM0_FLASHCTL_CMDCTL, 0U);
328-
target_mem32_write32(target, MSPM0_FLASHCTL_CMDADDR, dest);
329-
target_mem32_write32(target, MSPM0_FLASHCTL_BYTEN, 0xffffffffU);
330-
target_mem32_write32(target, MSPM0_FLASHCTL_CMDDATA0, read_le4((const uint8_t *)src, 0U));
331-
target_mem32_write32(target, MSPM0_FLASHCTL_CMDDATA1, read_le4((const uint8_t *)src, 4U));
332-
target_mem32_write32(target, MSPM0_FLASHCTL_CMDEXEC, MSPM0_FLASHCTL_CMDEXEC_EXEC);
343+
DEBUG_TARGET(
344+
"%s: Writing flash addr %08" PRIx32 " length %08" PRIx32 "\n", __func__, (uint32_t)dest, (uint32_t)length);
333345

334-
const uint32_t status = mspm0_flash_wait_done(target);
335-
if (!(status & MSPM0_FLASHCTL_STAT_CMDPASS))
336-
DEBUG_TARGET("%s: Failed to write to flash, status %08" PRIx32 " addr %08" PRIx32 " length %08" PRIx32 "\n",
337-
__func__, status, dest, (uint32_t)length);
346+
target_mem32_write(target, MSPM0_SRAM_BASE, mspm0_flash_write_stub, sizeof(mspm0_flash_write_stub));
347+
target_mem32_write(target, STUB_BUFFER_BASE, src, length);
338348

339-
return status & MSPM0_FLASHCTL_STAT_CMDPASS;
349+
return cortexm_run_stub(
350+
target, MSPM0_SRAM_BASE, dest, STUB_BUFFER_BASE, length, 0, MSPM0_SRAM_BASE + flash->ram_size);
340351
}
341352

342353
static bool mspm0_mass_erase(target_s *const target, platform_timeout_s *const print_progess)

0 commit comments

Comments
 (0)