flash: nor: lpc2000: handle lpc11xx parts with more than 96k memory

Known big flash parts such as LPC11u68/e68 have a non-uniform memory
organisation, the first 24 sectors are 4k, the rest are 32k.

Change-Id: Icf515152dfc54ec0ca187561d2d63088b9640f14
Signed-off-by: Paul Fertser <fercerpav@gmail.com>
Reviewed-on: http://openocd.zylin.com/3802
Tested-by: jenkins
Reviewed-by: akaWolf
Reviewed-by: Freddie Chopin <freddie.chopin@gmail.com>
This commit is contained in:
Paul Fertser 2016-10-05 19:12:12 +03:00 committed by Andreas Fritiofson
parent eaacb900dd
commit 4b50872ffe
1 changed files with 12 additions and 3 deletions

View File

@ -259,6 +259,8 @@
#define IAP_CODE_LEN 0x34 #define IAP_CODE_LEN 0x34
#define LPC11xx_REG_SECTORS 24
typedef enum { typedef enum {
lpc2000_v1, lpc2000_v1,
lpc2000_v2, lpc2000_v2,
@ -554,14 +556,21 @@ static int lpc2000_build_sector_list(struct flash_bank *bank)
exit(-1); exit(-1);
} }
lpc2000_info->cmd51_max_buffer = 512; /* smallest MCU in the series, LPC1110, has 1 kB of SRAM */ lpc2000_info->cmd51_max_buffer = 512; /* smallest MCU in the series, LPC1110, has 1 kB of SRAM */
bank->num_sectors = bank->size / 4096; unsigned int large_sectors = 0;
unsigned int normal_sectors = bank->size / 4096;
if (normal_sectors > LPC11xx_REG_SECTORS) {
large_sectors = (normal_sectors - LPC11xx_REG_SECTORS) / 8;
normal_sectors = LPC11xx_REG_SECTORS;
}
bank->num_sectors = normal_sectors + large_sectors;
bank->sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors); bank->sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors);
for (int i = 0; i < bank->num_sectors; i++) { for (int i = 0; i < bank->num_sectors; i++) {
bank->sectors[i].offset = offset; bank->sectors[i].offset = offset;
/* all sectors are 4kB-sized */ bank->sectors[i].size = (i < LPC11xx_REG_SECTORS ? 4 : 32) * 1024;
bank->sectors[i].size = 4 * 1024;
offset += bank->sectors[i].size; offset += bank->sectors[i].size;
bank->sectors[i].is_erased = -1; bank->sectors[i].is_erased = -1;
bank->sectors[i].is_protected = 1; bank->sectors[i].is_protected = 1;