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

Commit 63f0061

Browse files
committed
mspm0: for packed register descriptions, check if offset fits into byte; cleanup
1 parent ec8dcaf commit 63f0061

1 file changed

Lines changed: 53 additions & 101 deletions

File tree

src/target/mspm0.c

Lines changed: 53 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ static bool mspm0_mass_erase(target_s *target, platform_timeout_s *print_progess
9090
typedef struct mspm0_flash {
9191
target_flash_s target_flash;
9292
uint32_t banks;
93-
uint32_t ram_size; /* 0 if stub flashing is disabled */
93+
uint32_t ram_size; /* 0 if not enough ram to use stub flashing */
9494
} mspm0_flash_s;
9595

9696
static const uint16_t mspm0_flash_write_stub[] = {
@@ -110,64 +110,65 @@ static command_s mspm0_cmds_list[] = {
110110
#endif
111111

112112
#if MSPM0_CONFIG_FLASH_DUMP_SUPPORT
113-
114-
#define PACKED_ENTRY(offset, len, ...) len, (uint8_t)((offset) >> 2), __VA_ARGS__,
113+
#define MSPM0_ASSERT_PACKED_OFFSET(x) sizeof(char[((x) >> 2) >= 0x100 || (((x) & 0x3U) != 0) ? -1 : 1])
114+
#define MSPM0_PACKED_ENTRY(offset, len, ...) \
115+
len, (uint8_t)((offset) >> (2 * MSPM0_ASSERT_PACKED_OFFSET(offset))), __VA_ARGS__,
115116

116117
/* clang-format off */
117-
static char const mspm0_factory_regs[] = {
118-
PACKED_ENTRY(0x00U, 1U, 'T','R','A','C','E','I','D')
119-
PACKED_ENTRY(0x04U, 1U, 'D','E','V','I','C','E','I','D')
120-
PACKED_ENTRY(0x08U, 1U, 'U','S','E','R','I','D')
121-
PACKED_ENTRY(0x0cU, 1U, 'B','S','L','P','I','N','_','U','A','R','T')
122-
PACKED_ENTRY(0x10U, 1U, 'B','S','L','P','I','N','_','I','2','C')
123-
PACKED_ENTRY(0x14U, 1U, 'B','S','L','P','I','N','_','I','N','V','O','K','E')
124-
PACKED_ENTRY(0x18U, 1U, 'S','R','A','M','F','L','A','S','H')
125-
PACKED_ENTRY(0x3cU, 1U, 'T','E','M','P','_','S','E','N','S','E','0')
126-
PACKED_ENTRY(0x7cU, 1U, 'B','O','O','T','C','R','C')
118+
static uint8_t const mspm0_factory_regs[] = {
119+
MSPM0_PACKED_ENTRY(0x00U, 1U, 'T','R','A','C','E','I','D')
120+
MSPM0_PACKED_ENTRY(0x04U, 1U, 'D','E','V','I','C','E','I','D')
121+
MSPM0_PACKED_ENTRY(0x08U, 1U, 'U','S','E','R','I','D')
122+
MSPM0_PACKED_ENTRY(0x0cU, 1U, 'B','S','L','P','I','N','_','U','A','R','T')
123+
MSPM0_PACKED_ENTRY(0x10U, 1U, 'B','S','L','P','I','N','_','I','2','C')
124+
MSPM0_PACKED_ENTRY(0x14U, 1U, 'B','S','L','P','I','N','_','I','N','V','O','K','E')
125+
MSPM0_PACKED_ENTRY(0x18U, 1U, 'S','R','A','M','F','L','A','S','H')
126+
MSPM0_PACKED_ENTRY(0x3cU, 1U, 'T','E','M','P','_','S','E','N','S','E','0')
127+
MSPM0_PACKED_ENTRY(0x7cU, 1U, 'B','O','O','T','C','R','C')
127128
0U
128129
};
129130

130-
static char const mspm0_bcr_regs[] = {
131-
PACKED_ENTRY(0x00U, 1U, 'B','C','R','C','O','N','F','I','G','I','D')
132-
PACKED_ENTRY(0x04U, 1U, 'B','O','O','T','C','F','G','0')
133-
PACKED_ENTRY(0x08U, 1U, 'B','O','O','T','C','F','G','1')
134-
PACKED_ENTRY(0x0cU, 4U, 'P','W','D','D','E','B','U','G','L','O','C','K')
135-
PACKED_ENTRY(0x1cU, 4U, 'B','O','O','T','C','F','G','2')
136-
PACKED_ENTRY(0x20U, 1U, 'B','O','O','T','C','F','G','3')
137-
PACKED_ENTRY(0x24U, 4U, 'P','W','D','M','A','S','S','E','R','A','S','E')
138-
PACKED_ENTRY(0x34U, 4U, 'P','W','D','F','A','C','T','O','R','Y','R','E','S','E','T')
139-
PACKED_ENTRY(0x44U, 1U, 'F','L','A','S','H','S','W','P','0')
140-
PACKED_ENTRY(0x48U, 1U, 'F','L','A','S','H','S','W','P','1')
141-
PACKED_ENTRY(0x4cU, 1U, 'B','O','O','T','C','F','G','4')
142-
PACKED_ENTRY(0x50U, 1U, 'A','P','P','C','R','C','S','T','A','R','T')
143-
PACKED_ENTRY(0x54U, 1U, 'A','P','P','C','R','C','L','E','N','G','T','H')
144-
PACKED_ENTRY(0x58U, 1U, 'A','P','P','C','R','C')
145-
PACKED_ENTRY(0x5cU, 1U, 'B','O','O','T','C','R','C')
146-
PACKED_ENTRY(0x100U, 1U, 'B','S','L','C','O','N','F','I','G','I','D')
147-
PACKED_ENTRY(0x104U, 1U, 'B','S','L','P','I','N','C','F','G','0')
148-
PACKED_ENTRY(0x108U, 1U, 'B','S','L','P','I','N','C','F','G','1')
149-
PACKED_ENTRY(0x10cU, 1U, 'B','S','L','C','O','N','F','I','G','0')
150-
PACKED_ENTRY(0x110U, 8U, 'B','S','L','P','W')
151-
PACKED_ENTRY(0x130U, 1U, 'B','S','L','P','L','U','G','I','N','C','F','G')
152-
PACKED_ENTRY(0x134U, 4U, 'B','S','L','P','L','U','G','I','N','H','O','O','K')
153-
PACKED_ENTRY(0x144U, 1U, 'P','A','T','C','H','H','O','O','K','I','D')
154-
PACKED_ENTRY(0x148U, 1U, 'S','B','L','A','D','D','R','E','S','S')
155-
PACKED_ENTRY(0x14cU, 1U, 'B','S','L','A','P','P','V','E','R')
156-
PACKED_ENTRY(0x150U, 1U, 'B','S','L','C','O','N','F','I','G','1')
157-
PACKED_ENTRY(0x154U, 1U, 'B','S','L','C','R','C')
131+
static uint8_t const mspm0_bcr_regs[] = {
132+
MSPM0_PACKED_ENTRY(0x00U, 1U, 'B','C','R','C','O','N','F','I','G','I','D')
133+
MSPM0_PACKED_ENTRY(0x04U, 1U, 'B','O','O','T','C','F','G','0')
134+
MSPM0_PACKED_ENTRY(0x08U, 1U, 'B','O','O','T','C','F','G','1')
135+
MSPM0_PACKED_ENTRY(0x0cU, 4U, 'P','W','D','D','E','B','U','G','L','O','C','K')
136+
MSPM0_PACKED_ENTRY(0x1cU, 4U, 'B','O','O','T','C','F','G','2')
137+
MSPM0_PACKED_ENTRY(0x20U, 1U, 'B','O','O','T','C','F','G','3')
138+
MSPM0_PACKED_ENTRY(0x24U, 4U, 'P','W','D','M','A','S','S','E','R','A','S','E')
139+
MSPM0_PACKED_ENTRY(0x34U, 4U, 'P','W','D','F','A','C','T','O','R','Y','R','E','S','E','T')
140+
MSPM0_PACKED_ENTRY(0x44U, 1U, 'F','L','A','S','H','S','W','P','0')
141+
MSPM0_PACKED_ENTRY(0x48U, 1U, 'F','L','A','S','H','S','W','P','1')
142+
MSPM0_PACKED_ENTRY(0x4cU, 1U, 'B','O','O','T','C','F','G','4')
143+
MSPM0_PACKED_ENTRY(0x50U, 1U, 'A','P','P','C','R','C','S','T','A','R','T')
144+
MSPM0_PACKED_ENTRY(0x54U, 1U, 'A','P','P','C','R','C','L','E','N','G','T','H')
145+
MSPM0_PACKED_ENTRY(0x58U, 1U, 'A','P','P','C','R','C')
146+
MSPM0_PACKED_ENTRY(0x5cU, 1U, 'B','O','O','T','C','R','C')
147+
MSPM0_PACKED_ENTRY(0x100U, 1U, 'B','S','L','C','O','N','F','I','G','I','D')
148+
MSPM0_PACKED_ENTRY(0x104U, 1U, 'B','S','L','P','I','N','C','F','G','0')
149+
MSPM0_PACKED_ENTRY(0x108U, 1U, 'B','S','L','P','I','N','C','F','G','1')
150+
MSPM0_PACKED_ENTRY(0x10cU, 1U, 'B','S','L','C','O','N','F','I','G','0')
151+
MSPM0_PACKED_ENTRY(0x110U, 8U, 'B','S','L','P','W')
152+
MSPM0_PACKED_ENTRY(0x130U, 1U, 'B','S','L','P','L','U','G','I','N','C','F','G')
153+
MSPM0_PACKED_ENTRY(0x134U, 4U, 'B','S','L','P','L','U','G','I','N','H','O','O','K')
154+
MSPM0_PACKED_ENTRY(0x144U, 1U, 'P','A','T','C','H','H','O','O','K','I','D')
155+
MSPM0_PACKED_ENTRY(0x148U, 1U, 'S','B','L','A','D','D','R','E','S','S')
156+
MSPM0_PACKED_ENTRY(0x14cU, 1U, 'B','S','L','A','P','P','V','E','R')
157+
MSPM0_PACKED_ENTRY(0x150U, 1U, 'B','S','L','C','O','N','F','I','G','1')
158+
MSPM0_PACKED_ENTRY(0x154U, 1U, 'B','S','L','C','R','C')
158159
0U
159160
};
160161
/* clang-format on */
161162

162-
static void mspm0_dump_regs_packed(target_s *const target, const char *regs, const uint32_t base)
163+
static void mspm0_dump_regs(target_s *const target, uint8_t const *regs, const uint32_t base)
163164
{
164165
while (*regs != 0) {
165166
uint32_t words = *regs++;
166167
uint32_t reg_offset = (uint32_t)*regs++ << 2;
167168
char const *reg_name = (char const *)regs;
168169
while (*regs >= ' ')
169170
regs++;
170-
uint32_t name_len = regs - reg_name;
171+
int name_len = (char const *)regs - reg_name;
171172
tc_printf(target, "%15.*s: ", name_len, reg_name);
172173
for (size_t i = 0; i < words; ++i) {
173174
uint32_t value = target_mem32_read32(target, base + reg_offset + (uint32_t)(i * 4U));
@@ -176,7 +177,6 @@ static void mspm0_dump_regs_packed(target_s *const target, const char *regs, con
176177
}
177178
}
178179

179-
#if 0
180180
static bool mspm0_dump_factory_config(target_s *const target, const int argc, const char **const argv)
181181
{
182182
(void)argc;
@@ -192,24 +192,6 @@ static bool mspm0_dump_bcr_config(target_s *const target, const int argc, const
192192
mspm0_dump_regs(target, mspm0_bcr_regs, MSPM0_FLASH_NONMAIN);
193193
return true;
194194
}
195-
#else
196-
static bool mspm0_dump_factory_config(target_s *const target, const int argc, const char **const argv)
197-
{
198-
(void)argc;
199-
(void)argv;
200-
mspm0_dump_regs_packed(target, mspm0_factory_regs, MSPM0_FLASH_FACTORY);
201-
return true;
202-
}
203-
204-
static bool mspm0_dump_bcr_config(target_s *const target, const int argc, const char **const argv)
205-
{
206-
(void)argc;
207-
(void)argv;
208-
mspm0_dump_regs_packed(target, mspm0_bcr_regs, MSPM0_FLASH_NONMAIN);
209-
return true;
210-
}
211-
#endif
212-
213195
#endif
214196

215197
static uint16_t g_mspm0_partnums[] = {
@@ -219,7 +201,7 @@ static uint16_t g_mspm0_partnums[] = {
219201
0xbb82U, /* MSPM0L: 1105 1106 1304 1305 1305 1344 1345 1346 1345-Q1 1346-Q1 */
220202
0xbb9fU, /* MSPM0L: 1227 1228 2227 2228 1227-Q1 1228-Q1 2227-Q1 2228-Q1 */
221203
0xbbb4U, /* MSPM0L: 1116 1117 1116-Q1 1117-Q1 */
222-
0xbbc7U, /* MSPM0L: 2116 2117 1126 1127 */
204+
0xbbc7U, /* MSPM0L: 1126 1127 2116 2117 */
223205
0x0bbaU, /* MSPM0H: 3215 3216 */
224206
0xbb88U, /* MSPM0G: 1105 1106 1107 1505 1506 1507 3105 3106 3107 3505 3506 3507 3105-Q1 3106-Q1 3107-Q1 3505-Q1 3506-Q1 3507-Q1 */
225207
0xbba9U, /* MSPM0G: 1518 1519 3518 3519 3518-Q1 3519-Q1 3529-Q1 */
@@ -234,6 +216,7 @@ static void mspm0_add_flash(
234216
return;
235217
}
236218

219+
/* Accounting for available ram, figure out the writesize when flashing */
237220
uint32_t write_size = MSPM0_FLASH_WRITE_CHUNK_SZ;
238221
uint32_t stub_plus = ALIGN(sizeof mspm0_flash_write_stub, 4) + MSPM0_FLASH_STUB_STACK_SIZE;
239222
if (sram_size >= stub_plus) {
@@ -309,7 +292,7 @@ static uint32_t mspm0_flash_wait_done(target_s *const target)
309292
status = target_mem32_read32(target, MSPM0_FLASHCTL_STATCMD);
310293
if (platform_timeout_is_expired(&timeout))
311294
return 0U;
312-
};
295+
}
313296

314297
return status;
315298
}
@@ -370,48 +353,17 @@ static bool mspm0_flash_write(
370353
{
371354
target_s *const target = target_flash->t;
372355
mspm0_flash_s *flash = (mspm0_flash_s *)target_flash;
356+
if (flash->ram_size == 0)
357+
return false;
373358

374359
DEBUG_TARGET(
375360
"%s: Writing flash addr %08" PRIx32 " length %08" PRIx32 "\n", __func__, (uint32_t)dest, (uint32_t)length);
376361

377-
if (flash->ram_size == 0) {
378-
#if CONFIG_BMDA == 1
379-
uint32_t status = 0;
380-
target_mem32_write32(target, MSPM0_FLASHCTL_CMDCTL, 0U);
381-
target_mem32_write32(target, MSPM0_FLASHCTL_BYTEN, 0xffffffffU);
382-
target_mem32_write32(
383-
target, MSPM0_FLASHCTL_CMDTYPE, MSPM0_FLASHCTL_CMDTYPE_PROG | MSPM0_FLASHCTL_CMDTYPE_SZ_1WORD);
384-
385-
for (uint32_t written = 0U; written < length; written += 8) {
386-
mspm0_flash_unprotect_sector(target_flash, dest);
387-
target_mem32_write32(target, MSPM0_FLASHCTL_CMDADDR, dest + written);
388-
target_mem32_write32(target, MSPM0_FLASHCTL_CMDDATA0, read_le4((const uint8_t *)src, written + 0U));
389-
target_mem32_write32(target, MSPM0_FLASHCTL_CMDDATA1, read_le4((const uint8_t *)src, written + 4U));
390-
target_mem32_write32(target, MSPM0_FLASHCTL_CMDEXEC, MSPM0_FLASHCTL_CMDEXEC_EXEC);
391-
392-
status = mspm0_flash_wait_done(target);
393-
if (!(status & MSPM0_FLASHCTL_STAT_CMDPASS)) {
394-
DEBUG_TARGET("%s: Failed to write to flash, status %08" PRIx32 " addr %08" PRIx32 " length %08" PRIx32
395-
"\n",
396-
__func__, status, dest, (uint32_t)length);
397-
break;
398-
}
399-
}
362+
target_mem32_write(target, MSPM0_SRAM_BASE, mspm0_flash_write_stub, sizeof(mspm0_flash_write_stub));
363+
target_mem32_write(target, STUB_BUFFER_BASE, src, length);
400364

401-
return status & MSPM0_FLASHCTL_STAT_CMDPASS;
402-
#else
403-
return false;
404-
#endif
405-
} else {
406-
target_check_error(target);
407-
target_mem32_write(target, MSPM0_SRAM_BASE, mspm0_flash_write_stub, sizeof(mspm0_flash_write_stub));
408-
target_mem32_write(target, STUB_BUFFER_BASE, src, length);
409-
if (target_check_error(target))
410-
return false;
411-
412-
return cortexm_run_stub(
413-
target, MSPM0_SRAM_BASE, dest, STUB_BUFFER_BASE, length, 0, MSPM0_SRAM_BASE + flash->ram_size) == 0;
414-
}
365+
return cortexm_run_stub(
366+
target, MSPM0_SRAM_BASE, dest, STUB_BUFFER_BASE, length, 0, MSPM0_SRAM_BASE + flash->ram_size);
415367
}
416368

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

0 commit comments

Comments
 (0)