137 #define FLASH_ERASE_TIMEOUT 250 
  138 #define FLASH_WRITE_TIMEOUT 50 
  144 #define F_HAS_DUAL_BANK     BIT(0) 
  147 #define F_USE_ALL_WRPXX     BIT(1) 
  149 #define F_HAS_TZ            BIT(2) 
  151 #define F_HAS_L5_FLASH_REGS BIT(3) 
  154 #define F_QUAD_WORD_PROG    BIT(4) 
  157 #define F_WRP_HAS_LOCK      BIT(5) 
  293     { 0x1000, 
"1" }, { 0x1001, 
"2" }, { 0x1003, 
"3" }, { 0x1007, 
"4" }
 
  297     { 0x1000, 
"A" }, { 0x1001, 
"Z" }, { 0x2001, 
"Y" },
 
  302     { 0x1000, 
"A" }, { 0x1001, 
"Z" },
 
  306     { 0x1000, 
"A" }, { 0x1001, 
"Z" },
 
  326     { 0x1000, 
"A/Z" } , { 0x2000, 
"B" },
 
  330     { 0x1000, 
"A" }, { 0x2000, 
"B" },
 
  334     { 0x1000, 
"A" }, { 0x1001, 
"Z" }, { 0x2001, 
"Y" },
 
  338     { 0x1000, 
"A" }, { 0x1001, 
"Z" }, { 0x2001, 
"Y" },
 
  342     { 0x1000, 
"A" }, { 0x1001, 
"Z" }, { 0x2000, 
"B" },
 
  354     { 0x1000, 
"A" }, { 0x1001, 
"Z" },
 
  358     { 0x1000, 
"A" }, { 0x2000, 
"B" }, { 0x2001, 
"Z" },
 
  362     { 0x1000, 
"A" }, { 0x2000, 
"B" }, { 0x2001, 
"Z" },
 
  366     { 0x1000, 
"A" }, { 0x1001, 
"Z" }, { 0x1003, 
"Y" }, { 0x100F, 
"W" },
 
  375     { 0x1000, 
"A" }, { 0x2000, 
"B" }, { 0x2001, 
"Z" },
 
  383     { 0x1000, 
"A" }, { 0x1001, 
"Z" },
 
  387     { 0x1000, 
"A" }, { 0x1001, 
"Z" }, { 0x1003, 
"Y" }, { 0x2000, 
"B" },
 
  388     { 0x2001, 
"X" }, { 0x3000, 
"C" }, { 0x3001, 
"W" }, { 0x3007, 
"U" },
 
  392     { 0x3001, 
"X" }, { 0x3002, 
"W" },
 
  396     { 0x1000, 
"A" }, { 0x1001, 
"Z" },
 
  404     { 0x1000, 
"A" }, { 0x2000, 
"B" },
 
  424       .device_str            = 
"STM32L47/L48xx",
 
  425       .max_flash_size_kb     = 1024,
 
  427       .flash_regs_base       = 0x40022000,
 
  428       .fsize_addr            = 0x1FFF75E0,
 
  429       .otp_base              = 0x1FFF7000,
 
  436       .device_str            = 
"STM32L43/L44xx",
 
  437       .max_flash_size_kb     = 256,
 
  439       .flash_regs_base       = 0x40022000,
 
  440       .fsize_addr            = 0x1FFF75E0,
 
  441       .otp_base              = 0x1FFF7000,
 
  448       .device_str            = 
"STM32C01xx",
 
  449       .max_flash_size_kb     = 32,
 
  451       .flash_regs_base       = 0x40022000,
 
  452       .fsize_addr            = 0x1FFF75A0,
 
  453       .otp_base              = 0x1FFF7000,
 
  460       .device_str            = 
"STM32C03xx",
 
  461       .max_flash_size_kb     = 32,
 
  463       .flash_regs_base       = 0x40022000,
 
  464       .fsize_addr            = 0x1FFF75A0,
 
  465       .otp_base              = 0x1FFF7000,
 
  472       .device_str            = 
"STM32C05xx",
 
  473       .max_flash_size_kb     = 64,
 
  475       .flash_regs_base       = 0x40022000,
 
  476       .fsize_addr            = 0x1FFF75A0,
 
  477       .otp_base              = 0x1FFF7000,
 
  484       .device_str            = 
"STM32C071xx",
 
  485       .max_flash_size_kb     = 128,
 
  487       .flash_regs_base       = 0x40022000,
 
  488       .fsize_addr            = 0x1FFF75A0,
 
  489       .otp_base              = 0x1FFF7000,
 
  496       .device_str            = 
"STM32C09xx",
 
  497       .max_flash_size_kb     = 256,
 
  499       .flash_regs_base       = 0x40022000,
 
  500       .fsize_addr            = 0x1FFF75A0,
 
  501       .otp_base              = 0x1FFF7000,
 
  508       .device_str            = 
"STM32U535/U545",
 
  509       .max_flash_size_kb     = 512,
 
  512       .flash_regs_base       = 0x40022000,
 
  513       .fsize_addr            = 0x0BFA07A0,
 
  514       .otp_base              = 0x0BFA0000,
 
  521       .device_str            = 
"STM32G05/G06xx",
 
  522       .max_flash_size_kb     = 64,
 
  524       .flash_regs_base       = 0x40022000,
 
  525       .fsize_addr            = 0x1FFF75E0,
 
  526       .otp_base              = 0x1FFF7000,
 
  533       .device_str            = 
"STM32G07/G08xx",
 
  534       .max_flash_size_kb     = 128,
 
  536       .flash_regs_base       = 0x40022000,
 
  537       .fsize_addr            = 0x1FFF75E0,
 
  538       .otp_base              = 0x1FFF7000,
 
  545       .device_str            = 
"STM32L49/L4Axx",
 
  546       .max_flash_size_kb     = 1024,
 
  548       .flash_regs_base       = 0x40022000,
 
  549       .fsize_addr            = 0x1FFF75E0,
 
  550       .otp_base              = 0x1FFF7000,
 
  557       .device_str            = 
"STM32L45/L46xx",
 
  558       .max_flash_size_kb     = 512,
 
  560       .flash_regs_base       = 0x40022000,
 
  561       .fsize_addr            = 0x1FFF75E0,
 
  562       .otp_base              = 0x1FFF7000,
 
  569       .device_str            = 
"STM32L41/L42xx",
 
  570       .max_flash_size_kb     = 128,
 
  572       .flash_regs_base       = 0x40022000,
 
  573       .fsize_addr            = 0x1FFF75E0,
 
  574       .otp_base              = 0x1FFF7000,
 
  581       .device_str            = 
"STM32G03x/G04xx",
 
  582       .max_flash_size_kb     = 64,
 
  584       .flash_regs_base       = 0x40022000,
 
  585       .fsize_addr            = 0x1FFF75E0,
 
  586       .otp_base              = 0x1FFF7000,
 
  593       .device_str            = 
"STM32G0B/G0Cx",
 
  594       .max_flash_size_kb     = 512,
 
  596       .flash_regs_base       = 0x40022000,
 
  597       .fsize_addr            = 0x1FFF75E0,
 
  598       .otp_base              = 0x1FFF7000,
 
  605       .device_str            = 
"STM32G43/G44xx",
 
  606       .max_flash_size_kb     = 128,
 
  608       .flash_regs_base       = 0x40022000,
 
  609       .fsize_addr            = 0x1FFF75E0,
 
  610       .otp_base              = 0x1FFF7000,
 
  617       .device_str            = 
"STM32G47/G48xx",
 
  618       .max_flash_size_kb     = 512,
 
  620       .flash_regs_base       = 0x40022000,
 
  621       .fsize_addr            = 0x1FFF75E0,
 
  622       .otp_base              = 0x1FFF7000,
 
  629       .device_str            = 
"STM32L4R/L4Sxx",
 
  630       .max_flash_size_kb     = 2048,
 
  632       .flash_regs_base       = 0x40022000,
 
  633       .fsize_addr            = 0x1FFF75E0,
 
  634       .otp_base              = 0x1FFF7000,
 
  641       .device_str            = 
"STM32L4P/L4Qxx",
 
  642       .max_flash_size_kb     = 1024,
 
  644       .flash_regs_base       = 0x40022000,
 
  645       .fsize_addr            = 0x1FFF75E0,
 
  646       .otp_base              = 0x1FFF7000,
 
  653       .device_str            = 
"STM32L55/L56xx",
 
  654       .max_flash_size_kb     = 512,
 
  656       .flash_regs_base       = 0x40022000,
 
  657       .fsize_addr            = 0x0BFA05E0,
 
  658       .otp_base              = 0x0BFA0000,
 
  665       .device_str            = 
"STM32G49/G4Axx",
 
  666       .max_flash_size_kb     = 512,
 
  668       .flash_regs_base       = 0x40022000,
 
  669       .fsize_addr            = 0x1FFF75E0,
 
  670       .otp_base              = 0x1FFF7000,
 
  677       .device_str            = 
"STM32U031xx",
 
  678       .max_flash_size_kb     = 64,
 
  680       .flash_regs_base       = 0x40022000,
 
  681       .fsize_addr            = 0x1FFF3EA0,
 
  682       .otp_base              = 0x1FFF6800,
 
  689       .device_str            = 
"STM32U073/U083xx",
 
  690       .max_flash_size_kb     = 256,
 
  692       .flash_regs_base       = 0x40022000,
 
  693       .fsize_addr            = 0x1FFF6EA0,
 
  694       .otp_base              = 0x1FFF6800,
 
  701       .device_str            = 
"STM32U37/U38xx",
 
  702       .max_flash_size_kb     = 1024,
 
  704       .flash_regs_base       = 0x40022000,
 
  705       .fsize_addr            = 0x0BFA07A0,
 
  706       .otp_base              = 0x0BFA0000,
 
  713       .device_str            = 
"STM32U59/U5Axx",
 
  714       .max_flash_size_kb     = 4096,
 
  717       .flash_regs_base       = 0x40022000,
 
  718       .fsize_addr            = 0x0BFA07A0,
 
  719       .otp_base              = 0x0BFA0000,
 
  726       .device_str            = 
"STM32U57/U58xx",
 
  727       .max_flash_size_kb     = 2048,
 
  730       .flash_regs_base       = 0x40022000,
 
  731       .fsize_addr            = 0x0BFA07A0,
 
  732       .otp_base              = 0x0BFA0000,
 
  739       .device_str            = 
"STM32U5F/U5Gxx",
 
  740       .max_flash_size_kb     = 4096,
 
  743       .flash_regs_base       = 0x40022000,
 
  744       .fsize_addr            = 0x0BFA07A0,
 
  745       .otp_base              = 0x0BFA0000,
 
  752       .device_str            = 
"STM32WBA5x",
 
  753       .max_flash_size_kb     = 1024,
 
  755       .flash_regs_base       = 0x40022000,
 
  756       .fsize_addr            = 0x0FF907A0,
 
  757       .otp_base              = 0x0FF90000,
 
  764       .device_str            = 
"STM32WB1x",
 
  765       .max_flash_size_kb     = 320,
 
  767       .flash_regs_base       = 0x58004000,
 
  768       .fsize_addr            = 0x1FFF75E0,
 
  769       .otp_base              = 0x1FFF7000,
 
  776       .device_str            = 
"STM32WB5x",
 
  777       .max_flash_size_kb     = 1024,
 
  779       .flash_regs_base       = 0x58004000,
 
  780       .fsize_addr            = 0x1FFF75E0,
 
  781       .otp_base              = 0x1FFF7000,
 
  788       .device_str            = 
"STM32WB3x",
 
  789       .max_flash_size_kb     = 512,
 
  791       .flash_regs_base       = 0x58004000,
 
  792       .fsize_addr            = 0x1FFF75E0,
 
  793       .otp_base              = 0x1FFF7000,
 
  800       .device_str            = 
"STM32WLE/WL5x",
 
  801       .max_flash_size_kb     = 256,
 
  803       .flash_regs_base       = 0x58004000,
 
  804       .fsize_addr            = 0x1FFF75E0,
 
  805       .otp_base              = 0x1FFF7000,
 
  825     bank->driver_priv = stm32l4_info;
 
  827     stm32l4_info->
probed = 
false;
 
  841         struct range *ranges, 
unsigned int *ranges_count)
 
  844     bool last_bit = 0, cur_bit;
 
  845     for (
unsigned int i = 0; i < nbits; i++) {
 
  848         if (cur_bit && !last_bit) {
 
  850             ranges[*ranges_count - 1].
start = i;
 
  851             ranges[*ranges_count - 1].
end = i;
 
  852         } 
else if (cur_bit && last_bit) {
 
  854             ranges[*ranges_count - 1].
end = i;
 
  877     char *str = calloc(1, ranges_count * (24 * 
sizeof(
char)) + 1);
 
  880     for (
unsigned int i = 0; i < ranges_count; i++) {
 
  883         if (i < ranges_count - 1)
 
  905     char *op_str = enable ? 
"enabled" : 
"disabled";
 
  907     LOG_INFO(
"OTP memory (bank #%d) is %s%s for write commands",
 
  909             stm32l4_info->
otp_enabled == enable ? 
"already " : 
"",
 
 1004             LOG_ERROR(
"timed out waiting for flash");
 
 1046     LOG_DEBUG(
"setting secure block-based areas registers (SECBBxRy) to 0x%08x", value);
 
 1048     const uint8_t secbb_regs[] = {
 
 1054     unsigned int num_secbb_regs = 
ARRAY_SIZE(secbb_regs);
 
 1060         num_secbb_regs /= 2;
 
 1062     for (
unsigned int i = 0; i < num_secbb_regs; i++) {
 
 1107         LOG_ERROR(
"flash not unlocked STM32_FLASH_CR: %" PRIx32, 
ctrl);
 
 1140         LOG_ERROR(
"options not unlocked STM32_FLASH_CR: %" PRIx32, 
ctrl);
 
 1149     int retval, retval2;
 
 1172     stm32l4_info->
probed = 
false;
 
 1185     uint32_t value, uint32_t 
mask)
 
 1188     uint32_t optiondata;
 
 1189     int retval, retval2;
 
 1197     const uint32_t *saved_flash_regs = stm32l4_info->
flash_regs;
 
 1209     optiondata = (optiondata & ~
mask) | (value & 
mask);
 
 1267     int wrp2y_sectors_offset = -1; 
 
 1283             wrp2y_sectors_offset = 0;
 
 1290     if (wrp2y_sectors_offset >= 0) {
 
 1312     uint32_t wrp_value = (wrp_start & stm32l4_info->
wrpxxr_mask) | ((wrp_end & stm32l4_info->
wrpxxr_mask) << 16);
 
 1323     for (
unsigned int i = 0; i < n_wrp; i++) {
 
 1342     for (
unsigned int i = 0; i < 
bank->num_sectors; i++)
 
 1343         bank->sectors[i].is_protected = 0;
 
 1346     for (
unsigned int i = 0; i < n_wrp; i++) {
 
 1347         if (wrpxy[i].
used) {
 
 1348             for (
int s = wrpxy[i].
first; s <= wrpxy[i].
last; s++)
 
 1349                 bank->sectors[s].is_protected = 1;
 
 1360     int retval, retval2;
 
 1362     assert((first <= last) && (last < bank->num_sectors));
 
 1403     for (
unsigned int i = first; i <= last; i++) {
 
 1404         uint32_t erase_flags;
 
 1439         unsigned int first, 
unsigned int last)
 
 1444     for (i = first; i <= last; i++) {
 
 1445         if (
bank->sectors[i].is_protected != set)
 
 1447         else if (i == last) {
 
 1448             LOG_INFO(
"The specified sectors are already %s", set ? 
"protected" : 
"unprotected");
 
 1466     for (i = 0; i < n_wrp; i++) {
 
 1467         if (wrpxy[i].
used) {
 
 1468             for (
int p = wrpxy[i].
first; p <= wrpxy[i].
last; p++)
 
 1475     struct range ranges[n_wrp + 1];
 
 1476     unsigned int ranges_count = 0;
 
 1481     if (ranges_count > 0) {
 
 1483         LOG_DEBUG(
"current protected areas: %s", ranges_str);
 
 1486         LOG_DEBUG(
"current protected areas: none");
 
 1489         for (i = first; i <= last; i++)
 
 1492         for (i = first; i <= last; i++)
 
 1500     if (ranges_count > 0) {
 
 1502         LOG_DEBUG(
"requested areas for protection: %s", ranges_str);
 
 1505         LOG_DEBUG(
"requested areas for protection: none");
 
 1507     if (ranges_count > n_wrp) {
 
 1508         LOG_ERROR(
"cannot set the requested protection " 
 1509                 "(only %u write protection areas are available)" , n_wrp);
 
 1514     for (i = 0; i < n_wrp; i++) {
 
 1520     for (i = 0; i < ranges_count; i++) {
 
 1522         wrpxy[i].
last = ranges[i].
end;
 
 1535         LOG_ERROR(
"cannot protect/unprotect OTP memory");
 
 1576     static const uint8_t stm32l4_flash_write_code[] = {
 
 1577 #include "../../../contrib/loaders/flash/stm32/stm32l4x.inc" 
 1582         LOG_WARNING(
"no working area available, can't do block memory writes");
 
 1587             sizeof(stm32l4_flash_write_code),
 
 1588             stm32l4_flash_write_code);
 
 1602         LOG_WARNING(
"large enough working area not available, can't do block memory writes");
 
 1611         LOG_ERROR(
"allocating working area failed");
 
 1634     struct stm32l4_loader_params loader_extra_params;
 
 1646             (uint8_t *) &loader_extra_params);
 
 1659         LOG_ERROR(
"error executing stm32l4 flash write algorithm");
 
 1666             LOG_ERROR(
"flash memory write protected");
 
 1669             LOG_ERROR(
"flash write failed = %08" PRIx32, error);
 
 1709     const uint8_t *src = 
buffer;
 
 1710     const uint32_t data_width_in_words = stm32l4_info->
data_width / 4;
 
 1740         LOG_ERROR(
"OTP memory is disabled for write commands");
 
 1765     while ((head < tail) && (
offset >= (head + 1)->
offset)) {
 
 1775     LOG_DEBUG(
"data: 0x%08" PRIx32 
" - 0x%08" PRIx32 
", sectors: 0x%08" PRIx32 
" - 0x%08" PRIx32,
 
 1781     while (head < tail) {
 
 1782         if (head->
offset + head->
size != (head + 1)->offset) {
 
 1785                 bank->base + (head + 1)->offset - 1);
 
 1817         LOG_WARNING(
"RDP = 0x55, the work-area should be in non-secure RAM (check SAU partitioning)");
 
 1825         LOG_WARNING(
"falling back to programming without a flash loader (slower)");
 
 1855     for (
unsigned int i = 0; i < 
ARRAY_SIZE(dbgmcu_idcode); i++) {
 
 1857         if ((retval == 
ERROR_OK) && ((*
id & 0xfff) != 0) && ((*
id & 0xfff) != 0xfff))
 
 1867         LOG_ERROR(
"Flash requires Cortex-M target");
 
 1902     const uint16_t rev_id = stm32l4_info->
idcode >> 16;
 
 1903     for (
unsigned int i = 0; i < part_info->
num_revs; i++) {
 
 1904         if (rev_id == part_info->
revs[i].
rev)
 
 1905             return part_info->
revs[i].
str;
 
 1924     uint16_t flash_size_kb = 0xffff;
 
 1933         LOG_ERROR(
"Flash requires Cortex-M target");
 
 1937     stm32l4_info->
probed = 
false;
 
 1944     const uint32_t device_id = stm32l4_info->
idcode & 0xFFF;
 
 1960     const uint16_t rev_id = stm32l4_info->
idcode >> 16;
 
 1962     LOG_INFO(
"device idcode = 0x%08" PRIx32 
" (%s - Rev %s : 0x%04x)",
 
 1994             LOG_ERROR(
"BUG: device supported incomplete");
 
 2000         LOG_INFO(
"TZEN = %d : TrustZone %s by option bytes",
 
 2002                 stm32l4_info->
tzen ? 
"enabled" : 
"disabled");
 
 2014         free(
bank->sectors);
 
 2015         bank->num_sectors = 1;
 
 2018         if (!
bank->sectors) {
 
 2019             LOG_ERROR(
"failed to allocate bank sectors");
 
 2023         stm32l4_info->
probed = 
true;
 
 2035     if (retval != 
ERROR_OK || flash_size_kb == 0xffff || flash_size_kb == 0
 
 2037         LOG_WARNING(
"STM32 flash size failed, probe inaccurate - assuming %dk flash",
 
 2045         LOG_WARNING(
"overriding size register by configured bank size - MAY CAUSE TROUBLE");
 
 2049     LOG_INFO(
"flash size = %d KiB", flash_size_kb);
 
 2052     assert((flash_size_kb != 0xffff) && flash_size_kb);
 
 2060     int page_size_kb = 0;
 
 2064     switch (device_id) {
 
 2076         num_pages = flash_size_kb / page_size_kb;
 
 2103         num_pages = flash_size_kb / page_size_kb;
 
 2109         num_pages = flash_size_kb / page_size_kb;
 
 2126         num_pages = flash_size_kb / page_size_kb;
 
 2131             num_pages = flash_size_kb / page_size_kb;
 
 2149         num_pages = flash_size_kb / page_size_kb;
 
 2155             num_pages = flash_size_kb / page_size_kb;
 
 2168         num_pages = flash_size_kb / page_size_kb;
 
 2179         num_pages = flash_size_kb / page_size_kb;
 
 2204         num_pages = flash_size_kb / page_size_kb;
 
 2214         num_pages = flash_size_kb / page_size_kb;
 
 2221         num_pages = flash_size_kb / page_size_kb;
 
 2227         num_pages = flash_size_kb / page_size_kb;
 
 2241     if (num_pages == 0) {
 
 2243             LOG_ERROR(
"The specified flash size is less than page size");
 
 2245         LOG_ERROR(
"Flash pages count cannot be zero");
 
 2251     const int gap_size_kb = stm32l4_info->
hole_sectors * page_size_kb;
 
 2253     if (gap_size_kb != 0) {
 
 2254         LOG_INFO(
"gap detected from 0x%08x to 0x%08x",
 
 2256                 * page_size_kb * 1024,
 
 2258                 * page_size_kb + gap_size_kb) * 1024 - 1);
 
 2274     assert((stm32l4_info->
wrpxxr_mask & 0xFFFF0000) == 0);
 
 2277     free(
bank->sectors);
 
 2279     bank->size = (flash_size_kb + gap_size_kb) * 1024;
 
 2280     bank->num_sectors = num_pages;
 
 2282     if (!
bank->sectors) {
 
 2283         LOG_ERROR(
"failed to allocate bank sectors");
 
 2287     for (
unsigned int i = 0; i < 
bank->num_sectors; i++) {
 
 2288         bank->sectors[i].offset = i * page_size_kb * 1024;
 
 2292             bank->sectors[i].offset += gap_size_kb * 1024;
 
 2293         bank->sectors[i].size = page_size_kb * 1024;
 
 2294         bank->sectors[i].is_erased = -1;
 
 2295         bank->sectors[i].is_protected = 1;
 
 2298     stm32l4_info->
probed = 
true;
 
 2305     if (stm32l4_info->
probed) {
 
 2324         if (stm32l4_info->
optr == optr_cur)
 
 2337         const uint16_t rev_id = stm32l4_info->
idcode >> 16;
 
 2340         if (stm32l4_info->
probed)
 
 2351     int retval, retval2;
 
 2444     uint32_t reg_offset;
 
 2468     uint32_t reg_offset;
 
 2470     uint32_t 
mask = 0xFFFFFFFF;
 
 2479                 "INFO: a reset or power cycle is required " 
 2480                 "for the new settings to take effect.", 
bank->driver->name);
 
 2488     if (CMD_ARGC < 1 || CMD_ARGC > 2)
 
 2498         LOG_ERROR(
"This device does not have a TrustZone");
 
 2510         LOG_INFO(
"Global TrustZone Security is %s", stm32l4_info->
tzen ? 
"enabled" : 
"disabled");
 
 2517     if (new_tzen == stm32l4_info->
tzen) {
 
 2518         LOG_INFO(
"The requested TZEN is already programmed");
 
 2524             LOG_ERROR(
"TZEN can be set only when RDP level is 0");
 
 2533             LOG_ERROR(
"Deactivation of TZEN is only possible when the RDP is changing to level 0");
 
 2564     command_print(
CMD, 
"stm32l4x option load completed. Power-on reset might be required");
 
 2582         LOG_ERROR(
"cannot lock/unlock OTP memory");
 
 2617         LOG_ERROR(
"cannot lock/unlock OTP memory");
 
 2640     if (CMD_ARGC < 1 || CMD_ARGC > 2)
 
 2649         LOG_ERROR(
"OTP memory does not have write protection areas");
 
 2656         if (strcmp(
CMD_ARGV[1], 
"bank1") == 0)
 
 2658         else if (strcmp(
CMD_ARGV[1], 
"bank2") == 0)
 
 2666             LOG_ERROR(
"this device has no second bank");
 
 2669             LOG_ERROR(
"this device is configured in single bank mode");
 
 2675     unsigned int n_wrp, i;
 
 2686     for (i = 0; i < n_wrp; i++) {
 
 2687         if (wrpxy[i].
used) {
 
 2688             for (
int p = wrpxy[i].
first; p <= wrpxy[i].
last; p++)
 
 2694     struct range ranges[n_wrp];
 
 2695     unsigned int ranges_count = 0;
 
 2699     if (ranges_count > 0) {
 
 2724     if (strcmp(
CMD_ARGV[1], 
"enable") == 0)
 
 2726     else if (strcmp(
CMD_ARGV[1], 
"disable") == 0)
 
 2728     else if (strcmp(
CMD_ARGV[1], 
"show") == 0)
 
 2740         .handler = stm32l4_handle_lock_command,
 
 2743         .help = 
"Lock entire flash device.",
 
 2747         .handler = stm32l4_handle_unlock_command,
 
 2750         .help = 
"Unlock entire protected flash device.",
 
 2753         .name = 
"mass_erase",
 
 2754         .handler = stm32l4_handle_mass_erase_command,
 
 2757         .help = 
"Erase entire flash device.",
 
 2760         .name = 
"option_read",
 
 2761         .handler = stm32l4_handle_option_read_command,
 
 2763         .usage = 
"bank_id reg_offset",
 
 2764         .help = 
"Read & Display device option bytes.",
 
 2767         .name = 
"option_write",
 
 2768         .handler = stm32l4_handle_option_write_command,
 
 2770         .usage = 
"bank_id reg_offset value [mask]",
 
 2771         .help = 
"Write device option bit fields with provided value.",
 
 2774         .name = 
"trustzone",
 
 2775         .handler = stm32l4_handle_trustzone_command,
 
 2777         .usage = 
"<bank_id> [enable|disable]",
 
 2778         .help = 
"Configure TrustZone security",
 
 2782         .handler = stm32l4_handle_wrp_info_command,
 
 2784         .usage = 
"bank_id [bank1|bank2]",
 
 2785         .help = 
"list the protected areas using WRP",
 
 2788         .name = 
"option_load",
 
 2789         .handler = stm32l4_handle_option_load_command,
 
 2792         .help = 
"Force re-load of device options (will cause device reset).",
 
 2796         .handler = stm32l4_handle_otp_command,
 
 2798         .usage = 
"<bank_id> <enable|disable|show>",
 
 2799         .help = 
"OTP (One Time Programmable) memory write enable/disable",
 
 2808         .help = 
"stm32l4x flash command group",
 
 2818     .flash_bank_command = stm32l4_flash_bank_command,
 
void init_reg_param(struct reg_param *param, const char *reg_name, uint32_t size, enum param_direction direction)
 
void destroy_reg_param(struct reg_param *param)
 
This defines formats and data structures used to talk to ADIv5 entities.
 
static struct armv7m_common * target_to_armv7m_safe(struct target *target)
 
#define ARMV7M_COMMON_MAGIC
 
Support functions to access arbitrary bits in a byte array.
 
static void buf_set_u32(uint8_t *_buffer, unsigned int first, unsigned int num, uint32_t value)
Sets num bits in _buffer, starting at the first bit, using the bits in value.
 
static int test_bit(unsigned int nr, const volatile unsigned long *addr)
test_bit - Determine whether a bit is set
 
static void bitmap_zero(unsigned long *dst, unsigned int nbits)
bitmap_zero - Clears all the bits in memory
 
static void set_bit(unsigned int nr, volatile unsigned long *addr)
set_bit - Set a bit in memory
 
static void clear_bit(unsigned int nr, volatile unsigned long *addr)
clear_bit - Clear a bit in memory
 
#define DECLARE_BITMAP(name, bits)
 
void command_print_sameline(struct command_invocation *cmd, const char *format,...)
 
void command_print(struct command_invocation *cmd, const char *format,...)
 
#define CMD
Use this macro to access the command being handled, rather than accessing the variable directly.
 
#define CALL_COMMAND_HANDLER(name, extra ...)
Use this to macro to call a command helper (or a nested handler).
 
#define CMD_ARGV
Use this macro to access the arguments for the command being handled, rather than accessing the varia...
 
#define ERROR_COMMAND_SYNTAX_ERROR
 
#define CMD_ARGC
Use this macro to access the number of arguments for the command being handled, rather than accessing...
 
#define COMMAND_PARSE_ENABLE(in, out)
parses an enable/disable command argument
 
#define COMMAND_PARSE_NUMBER(type, in, out)
parses the string in into out as a type, or prints a command error and passes the error code to the c...
 
#define COMMAND_REGISTRATION_DONE
Use this as the last entry in an array of command_registration records.
 
#define ERROR_COMMAND_ARGUMENT_INVALID
 
static enum cortex_m_impl_part cortex_m_get_impl_part(struct target *target)
 
uint64_t buffer
Pointer to data buffer to send over SPI.
 
uint32_t size
Size of dw_spi_transaction::buffer.
 
uint32_t buffer_size
Size of dw_spi_program::buffer.
 
uint32_t address
Starting address. Sector aligned.
 
#define ERROR_FLASH_OPER_UNSUPPORTED
 
#define ERROR_FLASH_OPERATION_FAILED
 
#define ERROR_FLASH_DST_OUT_OF_BANK
 
struct flash_sector * alloc_block_array(uint32_t offset, uint32_t size, unsigned int num_blocks)
Allocate and fill an array of sectors or protection blocks.
 
int default_flash_blank_check(struct flash_bank *bank)
Provides default erased-bank check handling.
 
int default_flash_read(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
Provides default read implementation for flash memory.
 
void default_flash_free_driver_priv(struct flash_bank *bank)
Deallocates bank->driver_priv.
 
void alive_sleep(uint64_t ms)
 
#define ERROR_NOT_IMPLEMENTED
 
#define LOG_WARNING(expr ...)
 
#define LOG_ERROR(expr ...)
 
#define LOG_INFO(expr ...)
 
#define LOG_DEBUG(expr ...)
 
struct rtt_control ctrl
Control block.
 
static const struct stm32l4_rev stm32g05_g06xx_revs[]
 
static const struct stm32l4_rev stm32c071xx_revs[]
 
static int stm32l4_get_all_wrpxy(struct flash_bank *bank, enum stm32_bank_id dev_bank_id, struct stm32l4_wrp *wrpxy, unsigned int *n_wrp)
 
static int stm32l4_protect_check(struct flash_bank *bank)
 
#define FLASH_ERASE_TIMEOUT
 
static int stm32l4_get_one_wrpxy(struct flash_bank *bank, struct stm32l4_wrp *wrpxy, enum stm32l4_flash_reg_index reg_idx, int offset)
 
static const struct stm32l4_rev stm32l43_l44xx_revs[]
 
static const struct stm32l4_rev stm32u53_u54xx_revs[]
 
static const struct stm32l4_rev stm32u59_u5axx_revs[]
 
static const struct command_registration stm32l4_exec_command_handlers[]
 
static int stm32l4_write_flash_reg(struct flash_bank *bank, uint32_t reg_offset, uint32_t value)
 
static const uint32_t stm32l4_flash_regs[STM32_FLASH_REG_INDEX_NUM]
 
@ STM32_FLASH_CR_WLK_INDEX
 
@ STM32_FLASH_WRP1AR_INDEX
 
@ STM32_FLASH_WRP2BR_INDEX
 
@ STM32_FLASH_OPTKEYR_INDEX
 
@ STM32_FLASH_WRP1BR_INDEX
 
@ STM32_FLASH_WRP2AR_INDEX
 
@ STM32_FLASH_REG_INDEX_NUM
 
static const struct stm32l4_rev stm32c09xx_revs[]
 
static int stm32l4_perform_obl_launch(struct flash_bank *bank)
 
static const struct stm32l4_part_info stm32l4_parts[]
 
static char * range_print_alloc(struct range *ranges, unsigned int ranges_count)
 
static int stm32l4_read_idcode(struct flash_bank *bank, uint32_t *id)
 
static const struct stm32l4_rev stm32g47_g48xx_revs[]
 
static int stm32l4_read_flash_reg(struct flash_bank *bank, uint32_t reg_offset, uint32_t *value)
 
static bool stm32l4_otp_is_enabled(struct flash_bank *bank)
 
#define F_HAS_L5_FLASH_REGS
 
static const char * get_stm32l4_bank_type_str(struct flash_bank *bank)
 
static bool stm32l4_is_otp(struct flash_bank *bank)
 
static int stm32l4_get_flash_cr_with_lock_index(struct flash_bank *bank)
 
static const struct stm32l4_rev stm32u37_u38xx_revs[]
 
static int range_print_one(struct range *range, char *str)
 
static const struct stm32l4_rev stm32g03_g04xx_revs[]
 
static const struct stm32l4_rev stm32c01xx_revs[]
 
static const char * device_families
 
static const struct stm32l4_rev stm32u57_u58xx_revs[]
 
static const struct command_registration stm32l4_command_handlers[]
 
static const struct stm32l4_rev stm32l45_l46xx_revs[]
 
static int stm32l4_erase(struct flash_bank *bank, unsigned int first, unsigned int last)
 
static const struct stm32l4_rev stm32l4p_l4qxx_revs[]
 
static const struct stm32l4_rev stm32l41_l42xx_revs[]
 
static int stm32l4_otp_enable(struct flash_bank *bank, bool enable)
 
static const struct stm32l4_rev stm32l47_l48xx_revs[]
 
static const struct stm32l4_rev stm32l4r_l4sxx_revs[]
 
static const struct stm32l4_rev stm32c05xx_revs[]
 
static int stm32l4_write_option(struct flash_bank *bank, uint32_t reg_offset, uint32_t value, uint32_t mask)
 
static const struct stm32l4_rev stm32l55_l56xx_revs[]
 
static const struct stm32l4_rev stm32wb1xx_revs[]
 
static int stm32l4_wait_status_busy(struct flash_bank *bank, int timeout)
 
static const struct stm32l4_rev stm32wba5x_revs[]
 
static int stm32l4_mass_erase(struct flash_bank *bank)
 
static const char * get_stm32l4_rev_str(struct flash_bank *bank)
 
static int get_stm32l4_info(struct flash_bank *bank, struct command_invocation *cmd)
 
COMMAND_HANDLER(stm32l4_handle_mass_erase_command)
 
static const struct stm32l4_rev stm32_g07_g08xx_revs[]
 
static const struct stm32l4_rev stm32g43_g44xx_revs[]
 
static const struct stm32l4_rev stm32c03xx_revs[]
 
static uint32_t stm32l4_get_flash_reg(struct flash_bank *bank, uint32_t reg_offset)
 
static const struct stm32l4_rev stm32wle_wl5xx_revs[]
 
static int stm32l4_protect_same_bank(struct flash_bank *bank, enum stm32_bank_id bank_id, int set, unsigned int first, unsigned int last)
 
FLASH_BANK_COMMAND_HANDLER(stm32l4_flash_bank_command)
 
static int stm32l4_set_secbb(struct flash_bank *bank, uint32_t value)
set all FLASH_SECBB registers to the same value
 
static int stm32l4_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
 
static const struct stm32l4_rev stm32g49_g4axx_revs[]
 
const struct flash_driver stm32l4x_flash
 
static int stm32l4_probe(struct flash_bank *bank)
 
static const uint32_t stm32l5_s_flash_regs[STM32_FLASH_REG_INDEX_NUM]
 
static int stm32l4_write_block_without_loader(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
 
static int stm32l4_read_flash_reg_by_index(struct flash_bank *bank, enum stm32l4_flash_reg_index reg_index, uint32_t *value)
 
static const struct stm32l4_rev stm32u0xx_revs[]
 
static int stm32l4_unlock_option_reg(struct flash_bank *bank)
 
static const uint32_t stm32wl_cpu2_flash_regs[STM32_FLASH_REG_INDEX_NUM]
 
static int stm32l4_unlock_reg(struct flash_bank *bank)
 
static int stm32l4_write_all_wrpxy(struct flash_bank *bank, struct stm32l4_wrp *wrpxy, unsigned int n_wrp)
 
static void stm32l4_sync_rdp_tzen(struct flash_bank *bank)
 
static const struct stm32l4_rev stm32wb3xx_revs[]
 
#define FLASH_WRITE_TIMEOUT
 
static const struct stm32l4_rev stm32wb5xx_revs[]
 
static void bitmap_to_ranges(unsigned long *bitmap, unsigned int nbits, struct range *ranges, unsigned int *ranges_count)
 
static const struct stm32l4_rev stm32u5f_u5gxx_revs[]
 
static const uint32_t stm32l5_ns_flash_regs[STM32_FLASH_REG_INDEX_NUM]
 
static int stm32l4_write_block(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
 
static int stm32l4_write_flash_reg_by_index(struct flash_bank *bank, enum stm32l4_flash_reg_index reg_index, uint32_t value)
 
static int stm32l4_protect(struct flash_bank *bank, int set, unsigned int first, unsigned int last)
 
static uint32_t stm32l4_get_flash_reg_by_index(struct flash_bank *bank, enum stm32l4_flash_reg_index reg_index)
 
static int stm32l4_write_one_wrpxy(struct flash_bank *bank, struct stm32l4_wrp *wrpxy)
 
static const struct stm32l4_rev stm32l49_l4axx_revs[]
 
static int stm32l4_auto_probe(struct flash_bank *bank)
 
static const struct stm32l4_rev stm32g0b_g0cxx_revs[]
 
#define DEVID_STM32G03_G04XX
 
#define DEVID_STM32L55_L56XX
 
#define DEVID_STM32G0B_G0CXX
 
#define FLASH_SECBB_SECURE
 
#define FLASH_G0_DUAL_BANK
 
#define STM32_FLASH_S_BANK_BASE
 
#define DEVID_STM32G49_G4AXX
 
#define DEVID_STM32U53_U54XX
 
#define DEVID_STM32L4R_L4SXX
 
#define FLASH_L4_DUAL_BANK
 
#define DEVID_STM32G47_G48XX
 
#define FLASH_U5_DUALBANK
 
#define DEVID_STM32U5F_U5GXX
 
#define STM32_FLASH_BANK_BASE
 
#define FLASH_G4_DUAL_BANK
 
#define DEVID_STM32L47_L48XX
 
#define DEVID_STM32G07_G08XX
 
#define DEVID_STM32C071XX
 
#define DEVID_STM32U59_U5AXX
 
#define DEVID_STM32L49_L4AXX
 
#define DEVID_STM32L43_L44XX
 
#define DEVID_STM32L41_L42XX
 
#define DEVID_STM32U073_U083XX
 
#define DEVID_STM32WLE_WL5XX
 
#define DEVID_STM32G05_G06XX
 
#define DEVID_STM32U031XX
 
#define DEVID_STM32U37_U38XX
 
#define FLASH_WRPXYR_UNLOCK
 
#define DEVID_STM32G43_G44XX
 
#define UID64_IDS_STM32WL
 
#define FLASH_SECBB_NON_SECURE
 
#define STM32L5_REGS_SEC_OFFSET
 
#define DEVID_STM32U57_U58XX
 
#define DBGMCU_IDCODE_L4_G4
 
#define DEVID_STM32L4P_L4QXX
 
#define DEVID_STM32L45_L46XX
 
uint64_t ap_num
ADIv5: Number of this AP (0~255) ADIv6: Base address of this AP (4k aligned) TODO: to be more coheren...
 
unsigned int common_magic
 
struct adiv5_ap * debug_ap
 
When run_command is called, a new instance will be created on the stack, filled with the proper value...
 
Provides details of a flash bank, available either on-chip or through a major interface.
 
Provides the implementation-independent structure that defines all of the callbacks required by OpenO...
 
const char * name
Gives a human-readable name of this flash driver, This field is used to select and initialize the dri...
 
Describes the geometry and status of a single flash sector within a flash bank.
 
uint32_t offset
Bus offset from start of the flash chip (in bytes).
 
uint32_t size
Number of bytes in this flash sector.
 
unsigned int bank1_sectors
 
const uint32_t * flash_regs
 
const struct stm32l4_part_info * part_info
 
const struct stm32l4_rev * revs
 
const uint32_t fsize_addr
 
const uint32_t flash_regs_base
 
const uint16_t max_flash_size_kb
 
uint8_t stack[LDR_STACK_SIZE]
 
enum stm32l4_flash_reg_index reg_idx
 
void target_buffer_set_u32(struct target *target, uint8_t *buffer, uint32_t value)
 
int target_write_buffer(struct target *target, target_addr_t address, uint32_t size, const uint8_t *buffer)
 
int target_write_memory(struct target *target, target_addr_t address, uint32_t size, uint32_t count, const uint8_t *buffer)
Write count items of size bytes to the memory of target at the address given.
 
uint32_t target_get_working_area_avail(struct target *target)
 
int target_alloc_working_area(struct target *target, uint32_t size, struct working_area **area)
 
int target_write_u32(struct target *target, target_addr_t address, uint32_t value)
 
int target_free_working_area(struct target *target, struct working_area *area)
Free a working area.
 
int target_alloc_working_area_try(struct target *target, uint32_t size, struct working_area **area)
 
int target_read_u16(struct target *target, target_addr_t address, uint16_t *value)
 
int target_run_flash_async_algorithm(struct target *target, const uint8_t *buffer, uint32_t count, int block_size, int num_mem_params, struct mem_param *mem_params, int num_reg_params, struct reg_param *reg_params, uint32_t buffer_start, uint32_t buffer_size, uint32_t entry_point, uint32_t exit_point, void *arch_info)
Streams data to a circular buffer on target intended for consumption by code running asynchronously o...
 
int target_read_u32(struct target *target, target_addr_t address, uint32_t *value)
 
#define ERROR_TARGET_NOT_HALTED
 
static bool target_was_examined(const struct target *target)
 
#define ERROR_TARGET_INVALID
 
#define ERROR_TARGET_NOT_EXAMINED
 
#define ERROR_TARGET_RESOURCE_NOT_AVAILABLE
 
#define ERROR_TARGET_FAILURE
 
#define ARRAY_SIZE(x)
Compute the number of elements of a variable length array.