flash Kinetis: fix probe for FlexNVM partitioned as EEPROM backup

If a MCU has FlexNVM partitioned as EEPROM backup only
(no data flash), kinetis_probe_chip() detects zero fcfg2_maxaddr1
and adjusts flash banks count to 1, what is obviously wrong.

The change limits the test to devices without FlexNVM.

Computation of program flash/FlexNVM blocks is now more robust.

Missing case 0x07 is added to switch (fcfg1_depart)

Change-Id: I0bd6030a0fe1ab62aeb0223bbdf2aee1505bf6a0
Reported-by: simon.haines@scalardata.com
Signed-off-by: Tomas Vanek <vanekt@fbl.cz>
Reviewed-on: http://openocd.zylin.com/4180
Tested-by: jenkins
Reviewed-by: Simon Haines <simon.haines@scalardata.com>
Reviewed-by: Paul Fertser <fercerpav@gmail.com>
This commit is contained in:
Tomas Vanek 2017-07-13 21:35:22 +02:00 committed by Paul Fertser
parent dbd0d90af9
commit 02bc718d1a
1 changed files with 11 additions and 3 deletions

View File

@ -2387,7 +2387,9 @@ static int kinetis_probe_chip(struct kinetis_chip *k_chip)
if (num_blocks == 0) if (num_blocks == 0)
num_blocks = k_chip->fcfg2_maxaddr1_shifted ? 2 : 1; num_blocks = k_chip->fcfg2_maxaddr1_shifted ? 2 : 1;
else if (k_chip->fcfg2_maxaddr1_shifted == 0 && num_blocks >= 2) { else if (k_chip->fcfg2_maxaddr1_shifted == 0 && num_blocks >= 2 && fcfg2_pflsh) {
/* fcfg2_maxaddr1 may be zero due to partitioning whole NVM as EEPROM backup
* Do not adjust block count in this case! */
num_blocks = 1; num_blocks = 1;
LOG_WARNING("MAXADDR1 is zero, number of flash banks adjusted to 1"); LOG_WARNING("MAXADDR1 is zero, number of flash banks adjusted to 1");
} else if (k_chip->fcfg2_maxaddr1_shifted != 0 && num_blocks == 1) { } else if (k_chip->fcfg2_maxaddr1_shifted != 0 && num_blocks == 1) {
@ -2444,6 +2446,7 @@ static int kinetis_probe_chip(struct kinetis_chip *k_chip)
case 0x06: case 0x06:
k_chip->dflash_size = k_chip->nvm_size - (4096 << fcfg1_depart); k_chip->dflash_size = k_chip->nvm_size - (4096 << fcfg1_depart);
break; break;
case 0x07:
case 0x08: case 0x08:
k_chip->dflash_size = 0; k_chip->dflash_size = 0;
break; break;
@ -2502,8 +2505,13 @@ static int kinetis_probe_chip(struct kinetis_chip *k_chip)
/* Program section size is equal to sector size by default */ /* Program section size is equal to sector size by default */
} }
k_chip->num_pflash_blocks = num_blocks / (2 - fcfg2_pflsh); if (fcfg2_pflsh) {
k_chip->num_nvm_blocks = num_blocks - k_chip->num_pflash_blocks; k_chip->num_pflash_blocks = num_blocks;
k_chip->num_nvm_blocks = 0;
} else {
k_chip->num_pflash_blocks = (num_blocks + 1) / 2;
k_chip->num_nvm_blocks = num_blocks - k_chip->num_pflash_blocks;
}
if (use_nvm_marking) { if (use_nvm_marking) {
nvm_marking[0] = k_chip->num_nvm_blocks ? 'X' : 'N'; nvm_marking[0] = k_chip->num_nvm_blocks ? 'X' : 'N';