flash Kinetis: fix probe for FlexNVM partitioned as EEPROM backup 80/4180/3
authorTomas Vanek <vanekt@fbl.cz>
Thu, 13 Jul 2017 19:35:22 +0000 (21:35 +0200)
committerPaul Fertser <fercerpav@gmail.com>
Mon, 24 Jul 2017 12:11:06 +0000 (13:11 +0100)
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>
src/flash/nor/kinetis.c

index f57579d..4ef4385 100644 (file)
@@ -2387,7 +2387,9 @@ static int kinetis_probe_chip(struct kinetis_chip *k_chip)
 
        if (num_blocks == 0)
                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;
                LOG_WARNING("MAXADDR1 is zero, number of flash banks adjusted to 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:
                        k_chip->dflash_size = k_chip->nvm_size - (4096 << fcfg1_depart);
                        break;
+               case 0x07:
                case 0x08:
                        k_chip->dflash_size = 0;
                        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 */
        }
 
-       k_chip->num_pflash_blocks = num_blocks / (2 - fcfg2_pflsh);
-       k_chip->num_nvm_blocks = num_blocks - k_chip->num_pflash_blocks;
+       if (fcfg2_pflsh) {
+               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) {
                nvm_marking[0] = k_chip->num_nvm_blocks ? 'X' : 'N';