- /* only devices with < 1024 kiB may be set to single bank dual banks */
- if ((flash_size_in_kb == 1024) || !(options & OPT_DUALBANK))
- stm32l4_info->bank2_start = 256;
- else
- stm32l4_info->bank2_start = num_pages / 2;
+ switch (device_id & 0xfff) {
+ case 0x470:
+ /* L4R/S have 1M or 2M FLASH and dual/single bank mode.
+ * Page size is 4K or 8K.*/
+ if (flash_size_in_kb == 2048) {
+ stm32l4_info->bank2_start = 256;
+ if (options & OPT_DBANK_GE_2M) {
+ page_size = 4096;
+ num_pages = 512;
+ } else {
+ page_size = 8192;
+ num_pages = 256;
+ }
+ break;
+ }
+ if (flash_size_in_kb == 1024) {
+ stm32l4_info->bank2_start = 128;
+ if (options & OPT_DBANK_LE_1M) {
+ page_size = 4096;
+ num_pages = 256;
+ } else {
+ page_size = 8192;
+ num_pages = 128;
+ }
+ break;
+ }
+ /* Invalid FLASH size for this device. */
+ LOG_WARNING("Invalid flash size for STM32L4+ family device.");
+ return ERROR_FAIL;
+ case 0x461:
+ case 0x415:
+ /* These are dual-bank devices, we need to check the OPT_DBANK_LE_1M bit here */
+ page_size = 2048;
+ num_pages = flash_size_in_kb / 2;
+ /* check that calculation result makes sense */
+ assert(num_pages > 0);
+ if ((flash_size_in_kb == 1024) || !(options & OPT_DBANK_LE_1M))
+ stm32l4_info->bank2_start = 256;
+ else
+ stm32l4_info->bank2_start = num_pages / 2;
+ break;
+ case 0x462:
+ case 0x435:
+ default:
+ /* These are single-bank devices */
+ page_size = 2048;
+ num_pages = flash_size_in_kb / 2;
+ /* check that calculation result makes sense */
+ assert(num_pages > 0);
+ stm32l4_info->bank2_start = UINT16_MAX;
+ break;
+ }