@@ -90,7 +90,7 @@ static bool mspm0_mass_erase(target_s *target, platform_timeout_s *print_progess
9090typedef 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
9696static 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
180180static 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
215197static 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
417369static bool mspm0_mass_erase (target_s * const target , platform_timeout_s * const print_progess )
0 commit comments