116
116
117
117
#define FLASH_ERASE_TIMEOUT 250
118
118
119
+
120
+ /* relevant STM32L4 flags ****************************************************/
121
+ #define F_NONE 0
122
+ /* this flag indicates if the device flash is with dual bank architecture */
123
+ #define F_HAS_DUAL_BANK BIT(0)
124
+ /* this flags is used for dual bank devices only, it indicates if the
125
+ * 4 WRPxx are usable if the device is configured in single-bank mode */
126
+ #define F_USE_ALL_WRPXX BIT(1)
127
+ /* this flag indicates if the device embeds a TrustZone security feature */
128
+ #define F_HAS_TZ BIT(2)
129
+ /* end of STM32L4 flags ******************************************************/
130
+
131
+
119
132
enum stm32l4_flash_reg_index {
120
133
STM32_FLASH_ACR_INDEX ,
121
134
STM32_FLASH_KEYR_INDEX ,
@@ -167,10 +180,7 @@ struct stm32l4_part_info {
167
180
const struct stm32l4_rev * revs ;
168
181
const size_t num_revs ;
169
182
const uint16_t max_flash_size_kb ;
170
- const bool has_dual_bank ;
171
- /* this field is used for dual bank devices only, it indicates if the
172
- * 4 WRPxx are usable if the device is configured in single-bank mode */
173
- const bool use_all_wrpxx ;
183
+ const uint32_t flags ; /* one bit per feature, see STM32L4 flags: macros F_XXX */
174
184
const uint32_t flash_regs_base ;
175
185
const uint32_t * default_flash_regs ;
176
186
const uint32_t fsize_addr ;
@@ -280,8 +290,7 @@ static const struct stm32l4_part_info stm32l4_parts[] = {
280
290
.num_revs = ARRAY_SIZE (stm32_415_revs ),
281
291
.device_str = "STM32L47/L48xx" ,
282
292
.max_flash_size_kb = 1024 ,
283
- .has_dual_bank = true,
284
- .use_all_wrpxx = false,
293
+ .flags = F_HAS_DUAL_BANK ,
285
294
.flash_regs_base = 0x40022000 ,
286
295
.default_flash_regs = stm32l4_flash_regs ,
287
296
.fsize_addr = 0x1FFF75E0 ,
@@ -294,8 +303,7 @@ static const struct stm32l4_part_info stm32l4_parts[] = {
294
303
.num_revs = ARRAY_SIZE (stm32_435_revs ),
295
304
.device_str = "STM32L43/L44xx" ,
296
305
.max_flash_size_kb = 256 ,
297
- .has_dual_bank = false,
298
- .use_all_wrpxx = false,
306
+ .flags = F_NONE ,
299
307
.flash_regs_base = 0x40022000 ,
300
308
.default_flash_regs = stm32l4_flash_regs ,
301
309
.fsize_addr = 0x1FFF75E0 ,
@@ -308,8 +316,7 @@ static const struct stm32l4_part_info stm32l4_parts[] = {
308
316
.num_revs = ARRAY_SIZE (stm32_460_revs ),
309
317
.device_str = "STM32G07/G08xx" ,
310
318
.max_flash_size_kb = 128 ,
311
- .has_dual_bank = false,
312
- .use_all_wrpxx = false,
319
+ .flags = F_NONE ,
313
320
.flash_regs_base = 0x40022000 ,
314
321
.default_flash_regs = stm32l4_flash_regs ,
315
322
.fsize_addr = 0x1FFF75E0 ,
@@ -322,8 +329,7 @@ static const struct stm32l4_part_info stm32l4_parts[] = {
322
329
.num_revs = ARRAY_SIZE (stm32_461_revs ),
323
330
.device_str = "STM32L49/L4Axx" ,
324
331
.max_flash_size_kb = 1024 ,
325
- .has_dual_bank = true,
326
- .use_all_wrpxx = false,
332
+ .flags = F_HAS_DUAL_BANK ,
327
333
.flash_regs_base = 0x40022000 ,
328
334
.default_flash_regs = stm32l4_flash_regs ,
329
335
.fsize_addr = 0x1FFF75E0 ,
@@ -336,8 +342,7 @@ static const struct stm32l4_part_info stm32l4_parts[] = {
336
342
.num_revs = ARRAY_SIZE (stm32_462_revs ),
337
343
.device_str = "STM32L45/L46xx" ,
338
344
.max_flash_size_kb = 512 ,
339
- .has_dual_bank = false,
340
- .use_all_wrpxx = false,
345
+ .flags = F_NONE ,
341
346
.flash_regs_base = 0x40022000 ,
342
347
.default_flash_regs = stm32l4_flash_regs ,
343
348
.fsize_addr = 0x1FFF75E0 ,
@@ -350,8 +355,7 @@ static const struct stm32l4_part_info stm32l4_parts[] = {
350
355
.num_revs = ARRAY_SIZE (stm32_464_revs ),
351
356
.device_str = "STM32L41/L42xx" ,
352
357
.max_flash_size_kb = 128 ,
353
- .has_dual_bank = false,
354
- .use_all_wrpxx = false,
358
+ .flags = F_NONE ,
355
359
.flash_regs_base = 0x40022000 ,
356
360
.default_flash_regs = stm32l4_flash_regs ,
357
361
.fsize_addr = 0x1FFF75E0 ,
@@ -364,8 +368,7 @@ static const struct stm32l4_part_info stm32l4_parts[] = {
364
368
.num_revs = ARRAY_SIZE (stm32_466_revs ),
365
369
.device_str = "STM32G03/G04xx" ,
366
370
.max_flash_size_kb = 64 ,
367
- .has_dual_bank = false,
368
- .use_all_wrpxx = false,
371
+ .flags = F_NONE ,
369
372
.flash_regs_base = 0x40022000 ,
370
373
.default_flash_regs = stm32l4_flash_regs ,
371
374
.fsize_addr = 0x1FFF75E0 ,
@@ -378,8 +381,7 @@ static const struct stm32l4_part_info stm32l4_parts[] = {
378
381
.num_revs = ARRAY_SIZE (stm32_468_revs ),
379
382
.device_str = "STM32G43/G44xx" ,
380
383
.max_flash_size_kb = 128 ,
381
- .has_dual_bank = false,
382
- .use_all_wrpxx = false,
384
+ .flags = F_NONE ,
383
385
.flash_regs_base = 0x40022000 ,
384
386
.default_flash_regs = stm32l4_flash_regs ,
385
387
.fsize_addr = 0x1FFF75E0 ,
@@ -392,8 +394,7 @@ static const struct stm32l4_part_info stm32l4_parts[] = {
392
394
.num_revs = ARRAY_SIZE (stm32_469_revs ),
393
395
.device_str = "STM32G47/G48xx" ,
394
396
.max_flash_size_kb = 512 ,
395
- .has_dual_bank = true,
396
- .use_all_wrpxx = true,
397
+ .flags = F_HAS_DUAL_BANK | F_USE_ALL_WRPXX ,
397
398
.flash_regs_base = 0x40022000 ,
398
399
.default_flash_regs = stm32l4_flash_regs ,
399
400
.fsize_addr = 0x1FFF75E0 ,
@@ -406,8 +407,7 @@ static const struct stm32l4_part_info stm32l4_parts[] = {
406
407
.num_revs = ARRAY_SIZE (stm32_470_revs ),
407
408
.device_str = "STM32L4R/L4Sxx" ,
408
409
.max_flash_size_kb = 2048 ,
409
- .has_dual_bank = true,
410
- .use_all_wrpxx = true,
410
+ .flags = F_HAS_DUAL_BANK | F_USE_ALL_WRPXX ,
411
411
.flash_regs_base = 0x40022000 ,
412
412
.default_flash_regs = stm32l4_flash_regs ,
413
413
.fsize_addr = 0x1FFF75E0 ,
@@ -420,8 +420,7 @@ static const struct stm32l4_part_info stm32l4_parts[] = {
420
420
.num_revs = ARRAY_SIZE (stm32_471_revs ),
421
421
.device_str = "STM32L4P5/L4Q5x" ,
422
422
.max_flash_size_kb = 1024 ,
423
- .has_dual_bank = true,
424
- .use_all_wrpxx = true,
423
+ .flags = F_HAS_DUAL_BANK | F_USE_ALL_WRPXX ,
425
424
.flash_regs_base = 0x40022000 ,
426
425
.default_flash_regs = stm32l4_flash_regs ,
427
426
.fsize_addr = 0x1FFF75E0 ,
@@ -434,8 +433,7 @@ static const struct stm32l4_part_info stm32l4_parts[] = {
434
433
.num_revs = ARRAY_SIZE (stm32_472_revs ),
435
434
.device_str = "STM32L55/L56xx" ,
436
435
.max_flash_size_kb = 512 ,
437
- .has_dual_bank = true,
438
- .use_all_wrpxx = true,
436
+ .flags = F_HAS_DUAL_BANK | F_USE_ALL_WRPXX | F_HAS_TZ ,
439
437
.flash_regs_base = 0x40022000 ,
440
438
.default_flash_regs = stm32l5_ns_flash_regs ,
441
439
.fsize_addr = 0x0BFA05E0 ,
@@ -448,8 +446,7 @@ static const struct stm32l4_part_info stm32l4_parts[] = {
448
446
.num_revs = ARRAY_SIZE (stm32_479_revs ),
449
447
.device_str = "STM32G49/G4Axx" ,
450
448
.max_flash_size_kb = 512 ,
451
- .has_dual_bank = false,
452
- .use_all_wrpxx = false,
449
+ .flags = F_NONE ,
453
450
.flash_regs_base = 0x40022000 ,
454
451
.default_flash_regs = stm32l4_flash_regs ,
455
452
.fsize_addr = 0x1FFF75E0 ,
@@ -462,8 +459,7 @@ static const struct stm32l4_part_info stm32l4_parts[] = {
462
459
.num_revs = ARRAY_SIZE (stm32_495_revs ),
463
460
.device_str = "STM32WB5x" ,
464
461
.max_flash_size_kb = 1024 ,
465
- .has_dual_bank = false,
466
- .use_all_wrpxx = false,
462
+ .flags = F_NONE ,
467
463
.flash_regs_base = 0x58004000 ,
468
464
.default_flash_regs = stm32l4_flash_regs ,
469
465
.fsize_addr = 0x1FFF75E0 ,
@@ -476,8 +472,7 @@ static const struct stm32l4_part_info stm32l4_parts[] = {
476
472
.num_revs = ARRAY_SIZE (stm32_496_revs ),
477
473
.device_str = "STM32WB3x" ,
478
474
.max_flash_size_kb = 512 ,
479
- .has_dual_bank = false,
480
- .use_all_wrpxx = false,
475
+ .flags = F_NONE ,
481
476
.flash_regs_base = 0x58004000 ,
482
477
.default_flash_regs = stm32l4_flash_regs ,
483
478
.fsize_addr = 0x1FFF75E0 ,
@@ -490,8 +485,7 @@ static const struct stm32l4_part_info stm32l4_parts[] = {
490
485
.num_revs = ARRAY_SIZE (stm32_497_revs ),
491
486
.device_str = "STM32WLEx" ,
492
487
.max_flash_size_kb = 256 ,
493
- .has_dual_bank = false,
494
- .use_all_wrpxx = false,
488
+ .flags = F_NONE ,
495
489
.flash_regs_base = 0x58004000 ,
496
490
.default_flash_regs = stm32l4_flash_regs ,
497
491
.fsize_addr = 0x1FFF75E0 ,
@@ -847,7 +841,7 @@ static int stm32l4_get_all_wrpxy(struct flash_bank *bank, enum stm32_bank_id dev
847
841
return ret ;
848
842
849
843
/* for some devices (like STM32L4R/S) in single-bank mode, the 4 WRPxx are usable */
850
- if (stm32l4_info -> part_info -> use_all_wrpxx && !stm32l4_info -> dual_bank_mode )
844
+ if (( stm32l4_info -> part_info -> flags & F_USE_ALL_WRPXX ) && !stm32l4_info -> dual_bank_mode )
851
845
wrp2y_sectors_offset = 0 ;
852
846
}
853
847
@@ -1611,7 +1605,7 @@ static int stm32l4_mass_erase(struct flash_bank *bank)
1611
1605
1612
1606
uint32_t action = FLASH_MER1 ;
1613
1607
1614
- if (stm32l4_info -> part_info -> has_dual_bank )
1608
+ if (stm32l4_info -> part_info -> flags & F_HAS_DUAL_BANK )
1615
1609
action |= FLASH_MER2 ;
1616
1610
1617
1611
if (target -> state != TARGET_HALTED ) {
@@ -1858,7 +1852,7 @@ COMMAND_HANDLER(stm32l4_handle_wrp_info_command)
1858
1852
}
1859
1853
1860
1854
if (dev_bank_id == STM32_BANK2 ) {
1861
- if (!stm32l4_info -> part_info -> has_dual_bank ) {
1855
+ if (!( stm32l4_info -> part_info -> flags & F_HAS_DUAL_BANK ) ) {
1862
1856
LOG_ERROR ("this device has no second bank" );
1863
1857
return ERROR_FAIL ;
1864
1858
} else if (!stm32l4_info -> dual_bank_mode ) {
0 commit comments