flash/nor/stm32f2x: Support value line chips with trimmed flash
[fw/openocd] / src / flash / nor / tms470.c
index 7aebed739ee4a38d2d025a3484b5788399f18973..90557b8f166473c2d7ff294f72ebe5679d6f0eee 100644 (file)
@@ -13,9 +13,7 @@
  *   GNU General Public License for more details.                          *
  *                                                                         *
  *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
@@ -153,6 +151,7 @@ static int tms470_read_part_info(struct flash_bank *bank)
        if (bank->sectors) {
                free(bank->sectors);
                bank->sectors = NULL;
+               bank->num_sectors = 0;
        }
 
        /*
@@ -166,7 +165,8 @@ static int tms470_read_part_info(struct flash_bank *bank)
                        part_name = "TMS470R1A256";
 
                        if (bank->base >= 0x00040000) {
-                               LOG_ERROR("No %s flash bank contains base address 0x%08" PRIx32 ".",
+                               LOG_ERROR("No %s flash bank contains base address "
+                                               TARGET_ADDR_FMT ".",
                                                part_name,
                                                bank->base);
                                return ERROR_FLASH_OPERATION_FAILED;
@@ -205,7 +205,7 @@ static int tms470_read_part_info(struct flash_bank *bank)
                                (void)memcpy(bank->sectors, TMS470R1A288_BANK1_SECTORS,
                                                sizeof(TMS470R1A288_BANK1_SECTORS));
                        } else {
-                               LOG_ERROR("No %s flash bank contains base address 0x%08" PRIx32 ".",
+                               LOG_ERROR("No %s flash bank contains base address " TARGET_ADDR_FMT ".",
                                                part_name, bank->base);
                                return ERROR_FLASH_OPERATION_FAILED;
                        }
@@ -245,7 +245,7 @@ static int tms470_read_part_info(struct flash_bank *bank)
                                (void)memcpy(bank->sectors, TMS470R1A384_BANK2_SECTORS,
                                                sizeof(TMS470R1A384_BANK2_SECTORS));
                        } else {
-                               LOG_ERROR("No %s flash bank contains base address 0x%08" PRIx32 ".",
+                               LOG_ERROR("No %s flash bank contains base address " TARGET_ADDR_FMT ".",
                                                part_name, bank->base);
                                return ERROR_FLASH_OPERATION_FAILED;
                        }
@@ -301,7 +301,7 @@ COMMAND_HANDLER(tms470_handle_flash_keyset_command)
                        int start = (0 == strncmp(CMD_ARGV[i], "0x", 2)) ? 2 : 0;
 
                        if (1 != sscanf(&CMD_ARGV[i][start], "%" SCNx32 "", &flashKeys[i])) {
-                               command_print(CMD_CTX, "could not process flash key %s",
+                               command_print(CMD, "could not process flash key %s",
                                        CMD_ARGV[i]);
                                LOG_ERROR("could not process flash key %s", CMD_ARGV[i]);
                                return ERROR_COMMAND_SYNTAX_ERROR;
@@ -310,19 +310,19 @@ COMMAND_HANDLER(tms470_handle_flash_keyset_command)
 
                keysSet = 1;
        } else if (CMD_ARGC != 0) {
-               command_print(CMD_CTX, "tms470 flash_keyset <key0> <key1> <key2> <key3>");
+               command_print(CMD, "tms470 flash_keyset <key0> <key1> <key2> <key3>");
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
        if (keysSet) {
-               command_print(CMD_CTX,
+               command_print(CMD,
                        "using flash keys 0x%08" PRIx32 ", 0x%08" PRIx32 ", 0x%08" PRIx32 ", 0x%08" PRIx32 "",
                        flashKeys[0],
                        flashKeys[1],
                        flashKeys[2],
                        flashKeys[3]);
        } else
-               command_print(CMD_CTX, "flash keys not set");
+               command_print(CMD, "flash keys not set");
 
        return ERROR_OK;
 }
@@ -352,12 +352,12 @@ COMMAND_HANDLER(tms470_handle_osc_megahertz_command)
 
        if (oscMHz <= 0) {
                LOG_ERROR("osc_megahertz must be positive and non-zero!");
-               command_print(CMD_CTX, "osc_megahertz must be positive and non-zero!");
+               command_print(CMD, "osc_megahertz must be positive and non-zero!");
                oscMHz = 12;
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
-       command_print(CMD_CTX, "osc_megahertz=%d", oscMHz);
+       command_print(CMD, "osc_megahertz=%d", oscMHz);
 
        return ERROR_OK;
 }
@@ -375,7 +375,7 @@ COMMAND_HANDLER(tms470_handle_plldis_command)
                plldis = plldis ? 1 : 0;
        }
 
-       command_print(CMD_CTX, "plldis=%d", plldis);
+       command_print(CMD, "plldis=%d", plldis);
 
        return ERROR_OK;
 }
@@ -756,9 +756,6 @@ static int tms470_erase_sector(struct flash_bank *bank, int sector)
        target_write_u32(target, 0xFFFFFFDC, glbctrl);
        LOG_DEBUG("set glbctrl = 0x%08" PRIx32 "", glbctrl);
 
-       if (result == ERROR_OK)
-               bank->sectors[sector].is_erased = 1;
-
        return result;
 }
 
@@ -890,7 +887,7 @@ static int tms470_protect(struct flash_bank *bank, int set, int first, int last)
 
 /* ---------------------------------------------------------------------- */
 
-static int tms470_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
+static int tms470_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
 {
        struct target *target = bank->target;
        uint32_t glbctrl, fmbac2, orig_fmregopt, fmbsea, fmbseb, fmmaxpp, fmmstat;
@@ -904,8 +901,8 @@ static int tms470_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offse
 
        tms470_read_part_info(bank);
 
-       LOG_INFO("Writing %" PRId32 " bytes starting at 0x%08" PRIx32 "", count, bank->base +
-               offset);
+       LOG_INFO("Writing %" PRId32 " bytes starting at " TARGET_ADDR_FMT,
+                       count, bank->base + offset);
 
        /* set GLBCTRL.4  */
        target_read_u32(target, 0xFFFFFFDC, &glbctrl);
@@ -1046,27 +1043,17 @@ static int tms470_erase_check(struct flash_bank *bank)
         * an attempt to reduce the JTAG overhead.
         */
        for (sector = 0; sector < bank->num_sectors; sector++) {
-               if (bank->sectors[sector].is_erased != 1) {
-                       uint32_t i, addr = bank->base + bank->sectors[sector].offset;
-
-                       LOG_INFO("checking flash bank %d sector %d", tms470_info->ordinal, sector);
-
-                       target_read_buffer(target, addr, bank->sectors[sector].size, buffer);
-
-                       bank->sectors[sector].is_erased = 1;
-                       for (i = 0; i < bank->sectors[sector].size; i++) {
-                               if (buffer[i] != 0xff) {
-                                       LOG_WARNING("tms470 bank %d, sector %d, not erased.",
-                                               tms470_info->ordinal,
-                                               sector);
-                                       LOG_WARNING(
-                                               "at location 0x%08" PRIx32 ": flash data is 0x%02x.",
-                                               addr + i,
-                                               buffer[i]);
-
-                                       bank->sectors[sector].is_erased = 0;
-                                       break;
-                               }
+               uint32_t i, addr = bank->base + bank->sectors[sector].offset;
+
+               LOG_INFO("checking flash bank %d sector %d", tms470_info->ordinal, sector);
+
+               target_read_buffer(target, addr, bank->sectors[sector].size, buffer);
+
+               bank->sectors[sector].is_erased = 1;
+               for (i = 0; i < bank->sectors[sector].size; i++) {
+                       if (buffer[i] != 0xff) {
+                               bank->sectors[sector].is_erased = 0;
+                               break;
                        }
                }
                if (bank->sectors[sector].is_erased != 1) {
@@ -1175,7 +1162,7 @@ FLASH_BANK_COMMAND_HANDLER(tms470_flash_bank_command)
        return ERROR_OK;
 }
 
-struct flash_driver tms470_flash = {
+const struct flash_driver tms470_flash = {
        .name = "tms470",
        .commands = tms470_command_handlers,
        .flash_bank_command = tms470_flash_bank_command,
@@ -1188,4 +1175,5 @@ struct flash_driver tms470_flash = {
        .erase_check = tms470_erase_check,
        .protect_check = tms470_protect_check,
        .info = get_tms470_info,
+       .free_driver_priv = default_flash_free_driver_priv,
 };