Source file: /~heha/hs/bl/stm32flash.zip/src/dev_table.cpp

#include "stm32.h"

// Page-size-shift for page-by-page flash erase.
// Arrays are zero terminated; last non-zero value is automatically repeated

// fixed size pages
static const char p_128[] = "\7";	// means 1<<7 == 128 Byte
static const char p_256[] = "\10";	// means 1<<8 == 256 Byte
static const char p_1k[]  = "\12";	// means 1<<10 (12 is octal!!) == 1 KiByte
static const char p_2k[]  = "\13";
static const char p_128k[]= "\21";	// means 1<<17 == 128 KiByte
// F2 and F4 page sizes
static const char f2f4[]  = "\16\16\16\16\20\21";
// F4 dual bank page sizes
static const char f4db[]  = "\16\16\16\16\20\21\21\21"
			    "\16\16\16\16\20\21";
// F7 page sizes
static const char f7[]    = "\17\17\17\17\21\22";

// Device table, corresponds to the "Bootloader device-dependant parameters" table in ST document AN2606.
// Note that the option bytes upper range is inclusive!
const stm32_dev_t devices[] = {
//ID PPSH FLAGS	"name"			SRAM range		FLASH range	    PSize  Option range		  System-mem range
	/* F0 */
 {0x440,2,0,"F030x8/F05xxx",		0x20000800,0x20002000, 0x08000000,0x08010000,p_1k, 0x1FFFF800,0x1FFFF80F, 0x1FFFEC00,0x1FFFF800},
 {0x444,2,0,"F03xx4/6",			0x20000800,0x20001000, 0x08000000,0x08008000,p_1k, 0x1FFFF800,0x1FFFF80F, 0x1FFFEC00,0x1FFFF800},
 {0x442,1,F_OBLL,"STM32F030xC/F09xxx",	0x20001800,0x20008000, 0x08000000,0x08040000,p_2k, 0x1FFFF800,0x1FFFF80F, 0x1FFFD800,0x1FFFF800},
 {0x445,2,0,"F04xxx/F070x6",		0x20001800,0x20001800, 0x08000000,0x08008000,p_1k, 0x1FFFF800,0x1FFFF80F, 0x1FFFC400,0x1FFFF800},
 {0x448,1,0,"F070xB/F071xx/F72xx",	0x20001800,0x20004000, 0x08000000,0x08020000,p_2k, 0x1FFFF800,0x1FFFF80F, 0x1FFFC800,0x1FFFF800},
	/* F1 */
 {0x412,2,0,"F10xxx Low-density",	0x20000200,0x20002800, 0x08000000,0x08008000,p_1k, 0x1FFFF800,0x1FFFF80F, 0x1FFFF000,0x1FFFF800},
 {0x410,2,0,"F10xxx Medium-density",	0x20000200,0x20005000, 0x08000000,0x08020000,p_1k, 0x1FFFF800,0x1FFFF80F, 0x1FFFF000,0x1FFFF800},
 {0x414,2,0,"F10xxx High-density",	0x20000200,0x20010000, 0x08000000,0x08080000,p_2k, 0x1FFFF800,0x1FFFF80F, 0x1FFFF000,0x1FFFF800},
 {0x420,2,0,"F10xxx Medium-density VL",	0x20000200,0x20002000, 0x08000000,0x08020000,p_1k, 0x1FFFF800,0x1FFFF80F, 0x1FFFF000,0x1FFFF800},
 {0x428,1,0,"F10xxx High-density VL",	0x20000200,0x20008000, 0x08000000,0x08080000,p_2k, 0x1FFFF800,0x1FFFF80F, 0x1FFFF000,0x1FFFF800},
 {0x418,1,0,"F105xx/F107xx",		0x20001000,0x20010000, 0x08000000,0x08040000,p_2k, 0x1FFFF800,0x1FFFF80F, 0x1FFFB000,0x1FFFF800},
 {0x430,1,0,"F10xxx XL-density",	0x20000800,0x20018000, 0x08000000,0x08100000,p_2k, 0x1FFFF800,0x1FFFF80F, 0x1FFFE000,0x1FFFF800},
	/* F2 */
 {0x411,0,0,"STM32F2xxxx",		0x20002000,0x20020000, 0x08000000,0x08100000,f2f4, 0x1FFFC000,0x1FFFC00F, 0x1FFF0000,0x1FFF7800},
	/* F3 */
 {0x432,1,0,"F373xx/F378xx",		0x20001400,0x20008000, 0x08000000,0x08040000,p_2k, 0x1FFFF800,0x1FFFF80F, 0x1FFFD800,0x1FFFF800},
 {0x422,1,0,"F302xB(C)/F303xB(C)/F358xx",0x20001400,0x2000A000,0x08000000,0x08040000,p_2k, 0x1FFFF800,0x1FFFF80F, 0x1FFFD800,0x1FFFF800},
 {0x439,1,0,"F301xx/F302x4(6/8)/F318xx",0x20001800,0x20004000, 0x08000000,0x08010000,p_2k, 0x1FFFF800,0x1FFFF80F, 0x1FFFD800,0x1FFFF800},
 {0x438,1,0,"F303x4(6/8)/F334xx/F328xx",0x20001800,0x20003000, 0x08000000,0x08010000,p_2k, 0x1FFFF800,0x1FFFF80F, 0x1FFFD800,0x1FFFF800},
 {0x446,1,0,"F302xD(E)/F303xD(E)/F398xx",0x20001800,0x20010000,0x08000000,0x08080000,p_2k, 0x1FFFF800,0x1FFFF80F, 0x1FFFD800,0x1FFFF800},
	/* F4 */
 {0x413,0,0,"F40xxx/41xxx",		0x20003000,0x20020000, 0x08000000,0x08100000,f2f4, 0x1FFFC000,0x1FFFC00F, 0x1FFF0000,0x1FFF7800},
 {0x419,0,0,"F42xxx/43xxx",		0x20003000,0x20030000, 0x08000000,0x08200000,f4db, 0x1FFEC000,0x1FFFC00F, 0x1FFF0000,0x1FFF7800},
 {0x423,0,0,"F401xB(C)",		0x20003000,0x20010000, 0x08000000,0x08040000,f2f4, 0x1FFFC000,0x1FFFC00F, 0x1FFF0000,0x1FFF7800},
 {0x433,0,0,"F401xD(E)",		0x20003000,0x20018000, 0x08000000,0x08080000,f2f4, 0x1FFFC000,0x1FFFC00F, 0x1FFF0000,0x1FFF7800},
 {0x458,0,0,"F410xx",			0x20003000,0x20008000, 0x08000000,0x08020000,f2f4, 0x1FFFC000,0x1FFFC00F, 0x1FFF0000,0x1FFF7800},
 {0x431,0,0,"F411xx",			0x20003000,0x20020000, 0x08000000,0x08080000,f2f4, 0x1FFFC000,0x1FFFC00F, 0x1FFF0000,0x1FFF7800},
 {0x441,0,0,"F412xx",			0x20003000,0x20040000, 0x08000000,0x08100000,f2f4, 0x1FFFC000,0x1FFFC00F, 0x1FFF0000,0x1FFF7800},
 {0x421,0,0,"F446xx",			0x20003000,0x20020000, 0x08000000,0x08080000,f2f4, 0x1FFFC000,0x1FFFC00F, 0x1FFF0000,0x1FFF7800},
 {0x434,0,0,"F469xx/479xx",		0x20003000,0x20060000, 0x08000000,0x08200000,f4db, 0x1FFEC000,0x1FFFC00F, 0x1FFF0000,0x1FFF7800},
 {0x463,0,0,"F413xx/423xx",		0x20003000,0x20050000, 0x08000000,0x08180000,f2f4, 0x1FFFC000,0x1FFFC00F, 0x1FFF0000,0x1FFF7800},
	/* F7 */
 {0x452,0,0,"F72xxx/73xxx",		0x20004000,0x20040000, 0x08000000,0x08080000,f2f4, 0x1FFF0000,0x1FFF001F, 0x1FF00000,0x1FF0EDC0},
 {0x449,0,0,"F74xxx/75xxx",		0x20004000,0x20050000, 0x08000000,0x08100000,f7,   0x1FFF0000,0x1FFF001F, 0x1FF00000,0x1FF0EDC0},
 {0x451,0,0,"F76xxx/77xxx",		0x20004000,0x20080000, 0x08000000,0x08200000,f7,   0x1FFF0000,0x1FFF001F, 0x1FF00000,0x1FF0EDC0},
	/* H7 */
 {0x450,0,0,"H74xxx/75xxx",		0x20004100,0x20020000, 0x08000000,0x08200000,p_128k, 0       ,0         , 0x1FF00000,0x1FF1E800},
	/* L0 */
 {0x457,5,0,"L01xxx/02xxx",		0x20000800,0x20000800, 0x08000000,0x08004000,p_128,0x1FF80000,0x1FF8001F, 0x1FF00000,0x1FF01000},
 {0x425,5,0,"L031xx/041xx",		0x20001000,0x20002000, 0x08000000,0x08008000,p_128,0x1FF80000,0x1FF8001F, 0x1FF00000,0x1FF01000},
 {0x417,5,F_NO_ME,"STM32L05xxx/06xxx",	0x20001000,0x20002000, 0x08000000,0x08010000,p_128,0x1FF80000,0x1FF8001F, 0x1FF00000,0x1FF01000},
 {0x447,5,0,"L07xxx/08xxx",		0x20002000,0x20005000, 0x08000000,0x08030000,p_128,0x1FF80000,0x1FF8001F, 0x1FF00000,0x1FF02000},
	/* L1 */
 {0x416,4,F_NO_ME,"L1xxx6(8/B)",	0x20000800,0x20004000, 0x08000000,0x08020000,p_256,0x1FF80000,0x1FF8001F, 0x1FF00000,0x1FF01000},
 {0x429,4,F_NO_ME,"L1xxx6(8/B)A",	0x20001000,0x20008000, 0x08000000,0x08020000,p_256,0x1FF80000,0x1FF8001F, 0x1FF00000,0x1FF01000},
 {0x427,4,F_NO_ME,"L1xxxC",		0x20001000,0x20008000, 0x08000000,0x08040000,p_256,0x1FF80000,0x1FF8001F, 0x1FF00000,0x1FF02000},
 {0x436,4,0,"L1xxxD",			0x20001000,0x2000C000, 0x08000000,0x08060000,p_256,0x1FF80000,0x1FF8009F, 0x1FF00000,0x1FF02000},
 {0x437,4,F_NO_ME,"L1xxxE",		0x20001000,0x20014000, 0x08000000,0x08080000,p_256,0x1FF80000,0x1FF8009F, 0x1FF00000,0x1FF02000},
	/* L4 */
 {0x435,0,0,"L43xxx/44xxx",		0x20003100,0x2000C000, 0x08000000,0x08040000,p_2k, 0x1FFF7800,0x1FFF780F, 0x1FFF0000,0x1FFF7000},
 {0x462,0,F_PEMPTY,"L45xxx/46xxx",	0x20003100,0x20020000, 0x08000000,0x08080000,p_2k, 0x1FFF7800,0x1FFF780F, 0x1FFF0000,0x1FFF7000},
 {0x415,0,0,"L47xxx/48xxx",		0x20003100,0x20018000, 0x08000000,0x08100000,p_2k, 0x1FFF7800,0x1FFFF80F, 0x1FFF0000,0x1FFF7000},
 {0x461,0,0,"L496xx/4A6xx",		0x20003100,0x20040000, 0x08000000,0x08100000,p_2k, 0x1FFF7800,0x1FFFF80F, 0x1FFF0000,0x1FFF7000},
	/* These are not (yet) in AN2606: */
 {0x641,2,F_GEN,"Medium_Density PL",	0x20000200,0x20005000, 0x08000000,0x08020000,p_1k, 0x1FFFF800,0x1FFFF80F, 0x1FFFF000,0x1FFFF800},
 {0x9a8,2,0,"W-128K",			0x20000200,0x20002000, 0x08000000,0x08020000,p_1k, 0x08040800,0x0804080F, 0x08040000,0x08040800},
 {0x9b0,2,0,"W-256K",			0x20000200,0x20004000, 0x08000000,0x08040000,p_2k, 0x08040800,0x0804080F, 0x08040000,0x08040800},
 {0 /* sentinel */ }
};

// <ceil>=false: returns the page that contains address <addr>
// <ceil>=true: returns the first page whose start addr is >= <addr>
int stm32_dev_t::flash_addr_to_page(uint32_t addr, bool ceil) const{
 if (!addr_in_flash(addr,ceil)) return 0;
 int page = 0;
 addr -= fl_start;
 for (const char*pshift=fl_psh;;) {
  uint32_t size=1<<*pshift;
  if (addr<size) return ceil&&addr ? page+1 : page;
  addr-=size;
  if (pshift[1]) ++pshift;	// go to next page, otherwise, repeat last page
 }
}

// returns the lower address of flash page <page>
// No overflow check for <page>
uint32_t stm32_dev_t::flash_page_to_addr(int page) const{
 uint32_t addr = fl_start;
 const char*pshift = fl_psh;
 for (int i = 0; i < page; i++) {
  addr += 1<<*pshift;
  if (pshift[1]) ++pshift;	// go to next page, otherwise, repeat last page
 }
 return addr;
}
Detected encoding: ASCII (7 bit)2