| diff -aruN stm32flash.orig/dev_table.c stm32flash/dev_table.c |
| --- stm32flash.orig/dev_table.c 2014-10-03 14:35:08.000000000 -0700 |
| +++ stm32flash/dev_table.c 2015-02-02 17:25:20.752854394 -0800 |
| @@ -57,9 +57,10 @@ |
| /* L0 */ |
| {0x417, "L05xxx/06xxx" , 0x20001000, 0x20002000, 0x08000000, 0x08010000, 32, 128, 0x1FF80000, 0x1FF8000F, 0x1FF00000, 0x1FF01000}, |
| /* L1 */ |
| - {0x416, "L1xxx6(8/B)" , 0x20000800, 0x20004000, 0x08000000, 0x08020000, 16, 256, 0x1FF80000, 0x1FF8000F, 0x1FF00000, 0x1FF01000}, |
| - {0x429, "L1xxx6(8/B)A" , 0x20001000, 0x20008000, 0x08000000, 0x08020000, 16, 256, 0x1FF80000, 0x1FF8000F, 0x1FF00000, 0x1FF01000}, |
| - {0x427, "L1xxxC" , 0x20001000, 0x20008000, 0x08000000, 0x08020000, 16, 256, 0x1FF80000, 0x1FF8000F, 0x1FF00000, 0x1FF02000}, |
| + {0x416, "Medium-density ULP", 0x20000800, 0x20004000, 0x08000000, 0x08020000, 16, 256, 0x1FF80000, 0x1FF8000F, 0x1FF00000, 0x1FF01000}, |
| + {0x429, "Medium-density ULP Shrink", 0x20000800, 0x20004000, 0x08000000, 0x08020000, 16, 256, 0x1FF80000, 0x1FF8000F, 0x1FF00000, 0x1FF01000}, |
| + {0x427, "Medium+-density ULP", 0x20001000, 0x20008000, 0x08000000, 0x08040000, 16, 256, 0x1FF80000, 0x1FF8000F, 0x1FF00000, 0x1FF01000}, |
| + |
| {0x436, "L1xxxD" , 0x20001000, 0x2000C000, 0x08000000, 0x08060000, 16, 256, 0x1ff80000, 0x1ff8000F, 0x1FF00000, 0x1FF02000}, |
| {0x437, "L1xxxE" , 0x20001000, 0x20014000, 0x08000000, 0x08060000, 16, 256, 0x1ff80000, 0x1ff8000F, 0x1FF00000, 0x1FF02000}, |
| /* These are not (yet) in AN2606: */ |
| diff -aruN stm32flash.orig/stm32.c stm32flash/stm32.c |
| --- stm32flash.orig/stm32.c 2014-10-02 00:20:26.000000000 -0700 |
| +++ stm32flash/stm32.c 2015-02-02 17:25:20.752854394 -0800 |
| @@ -96,6 +96,7 @@ |
| static const uint32_t stm_reset_code_length = sizeof(stm_reset_code); |
| |
| extern const stm32_dev_t devices[]; |
| +extern char reset_flag; |
| |
| static void stm32_warn_stretching(const char *f) |
| { |
| @@ -698,7 +699,16 @@ |
| return STM32_ERR_OK; |
| } |
| |
| -stm32_err_t stm32_erase_memory(const stm32_t *stm, uint8_t spage, uint8_t pages) |
| +int supports_mass_erase(uint16_t chip_id) |
| +{ |
| + int retval = 1; |
| + if(chip_id == 0x416 || chip_id == 0x417 || chip_id == 0x427 || chip_id == 0x429) { |
| + retval = 0; |
| + } |
| + return retval; |
| +} |
| + |
| +stm32_err_t stm32_erase_memory(const stm32_t *stm, uint16_t spage, uint16_t pages) |
| { |
| struct port_interface *port = stm->port; |
| stm32_err_t s_err; |
| @@ -725,8 +735,11 @@ |
| /* Currently known as not supporting mass erase is the Ultra Low Power STM32L15xx range */ |
| /* So if someone has not overridden the default, but uses one of these chips, take it out of */ |
| /* mass erase mode, so it will be done page by page. This maximum might not be correct either! */ |
| - if (stm->pid == 0x416 && pages == 0xFF) |
| + |
| + if (!supports_mass_erase(stm->pid) && pages == 0xFF) { |
| pages = 0xF8; /* works for the STM32L152RB with 128Kb flash */ |
| + reset_flag = 1; /* To mimic earlier behavior*/ |
| + } |
| |
| if (pages == 0xFF) { |
| uint8_t buf[3]; |
| @@ -756,6 +769,12 @@ |
| uint8_t *buf; |
| int i = 0; |
| |
| + if (pages == 0xF8) { |
| + /* Erase the whole flash */ |
| + pages = (stm->dev->fl_end - stm->dev->fl_start) / stm->dev->fl_ps; |
| + fprintf(stderr, "Erase 0x%x pages\n", pages); |
| + } |
| + |
| buf = malloc(2 + 2 * pages + 1); |
| if (!buf) |
| return STM32_ERR_UNKNOWN; |
| diff -aruN stm32flash.orig/stm32.h stm32flash/stm32.h |
| --- stm32flash.orig/stm32.h 2014-10-02 00:20:26.000000000 -0700 |
| +++ stm32flash/stm32.h 2015-02-02 17:25:20.752854394 -0800 |
| @@ -68,8 +68,8 @@ |
| const uint8_t data[], unsigned int len); |
| stm32_err_t stm32_wunprot_memory(const stm32_t *stm); |
| stm32_err_t stm32_wprot_memory(const stm32_t *stm); |
| -stm32_err_t stm32_erase_memory(const stm32_t *stm, uint8_t spage, |
| - uint8_t pages); |
| +stm32_err_t stm32_erase_memory(const stm32_t *stm, uint16_t spage, |
| + uint16_t pages); |
| stm32_err_t stm32_go(const stm32_t *stm, uint32_t address); |
| stm32_err_t stm32_reset_device(const stm32_t *stm); |
| stm32_err_t stm32_readprot_memory(const stm32_t *stm); |