kinetis flash: use longword write when writing into pflash
[openocd.git] / src / flash / nor / lpc2900.c
index d39b2ddf72fc2e12839905c2351155414fcb0231..7bb9f141b28a9310b327b180ae13ca5b0a72753a 100644 (file)
  */
 struct lpc2900_flash_bank
 {
+       /**
+        * This flag is set when the device has been successfully probed.
+        */
+       bool is_probed;
+
        /**
         * Holds the value read from CHIPID register.
         * The driver will not load if the chipid doesn't match the expected
@@ -179,7 +184,7 @@ static uint32_t lpc2900_run_bist128(struct flash_bank *bank,
                                     uint32_t addr_from, uint32_t addr_to,
                                     uint32_t (*signature)[4] );
 static uint32_t lpc2900_address2sector(struct flash_bank *bank, uint32_t offset);
-static uint32_t lpc2900_calc_tr( uint32_t clock, uint32_t time );
+static uint32_t lpc2900_calc_tr(uint32_t clock_var, uint32_t time_var);
 
 
 /***********************  Helper functions  **************************/
@@ -255,7 +260,7 @@ static uint32_t lpc2900_is_ready( struct flash_bank *bank )
 {
        struct lpc2900_flash_bank *lpc2900_info = bank->driver_priv;
 
-       if( lpc2900_info->chipid != EXPECTED_CHIPID )
+       if( !lpc2900_info->is_probed )
        {
                return ERROR_FLASH_BANK_NOT_PROBED;
        }
@@ -306,39 +311,39 @@ static uint32_t lpc2900_read_security_status( struct flash_bank *bank )
         * a protected sector!
         */
        int sector;
-       int index;
+       int index_t;
        for( sector = 0; sector < bank->num_sectors; sector++ )
        {
                /* Convert logical sector number to physical sector number */
                if( sector <= 4 )
                {
-                       index = sector + 11;
+                       index_t = sector + 11;
                }
                else if( sector <= 7 )
                {
-                       index = sector + 27;
+                       index_t = sector + 27;
                }
                else
                {
-                       index = sector - 8;
+                       index_t = sector - 8;
                }
 
                bank->sectors[sector].is_protected = -1;
 
                if (
-                   (iss_secured_field[index][0] == 0x00000000) &&
-                   (iss_secured_field[index][1] == 0x00000000) &&
-                   (iss_secured_field[index][2] == 0x00000000) &&
-                   (iss_secured_field[index][3] == 0x00000000) )
+                   (iss_secured_field[index_t][0] == 0x00000000) &&
+                   (iss_secured_field[index_t][1] == 0x00000000) &&
+                   (iss_secured_field[index_t][2] == 0x00000000) &&
+                   (iss_secured_field[index_t][3] == 0x00000000) )
                {
                        bank->sectors[sector].is_protected = 1;
                }
 
                if (
-                   (iss_secured_field[index][0] == 0xFFFFFFFF) &&
-                   (iss_secured_field[index][1] == 0xFFFFFFFF) &&
-                   (iss_secured_field[index][2] == 0xFFFFFFFF) &&
-                   (iss_secured_field[index][3] == 0xFFFFFFFF) )
+                   (iss_secured_field[index_t][0] == 0xFFFFFFFF) &&
+                   (iss_secured_field[index_t][1] == 0xFFFFFFFF) &&
+                   (iss_secured_field[index_t][2] == 0xFFFFFFFF) &&
+                   (iss_secured_field[index_t][3] == 0xFFFFFFFF) )
                {
                        bank->sectors[sector].is_protected = 0;
                }
@@ -507,16 +512,14 @@ static int lpc2900_write_index_page( struct flash_bank *bank,
  * @param clock System clock in Hz
  * @param time Program/erase time in µs
  */
-static uint32_t lpc2900_calc_tr( uint32_t clock, uint32_t time )
+static uint32_t lpc2900_calc_tr( uint32_t clock_var, uint32_t time_var )
 {
        /*           ((time[µs]/1e6) * f[Hz]) + 511
         * FPTR.TR = -------------------------------
         *                         512
-        *
-        * The result is the
         */
 
-       uint32_t tr_val = (uint32_t)((((time / 1e6) * clock) + 511.0) / 512.0);
+       uint32_t tr_val = (uint32_t)((((time_var / 1e6) * clock_var) + 511.0) / 512.0);
 
        return tr_val;
 }
@@ -951,14 +954,14 @@ COMMAND_HANDLER(lpc2900_handle_secure_jtag_command)
 static const struct command_registration lpc2900_exec_command_handlers[] = {
        {
                .name = "signature",
-               .handler = &lpc2900_handle_signature_command,
+               .handler = lpc2900_handle_signature_command,
                .mode = COMMAND_EXEC,
                .usage = "bank_id",
                .help = "Calculate and display signature of flash bank.",
        },
        {
                .name = "read_custom",
-               .handler = &lpc2900_handle_read_custom_command,
+               .handler = lpc2900_handle_read_custom_command,
                .mode = COMMAND_EXEC,
                .usage = "bank_id filename",
                .help = "Copies 912 bytes of customer information "
@@ -966,14 +969,14 @@ static const struct command_registration lpc2900_exec_command_handlers[] = {
        },
        {
                .name = "password",
-               .handler = &lpc2900_handle_password_command,
+               .handler = lpc2900_handle_password_command,
                .mode = COMMAND_EXEC,
                .usage = "bank_id password",
                .help = "Enter fixed password to enable 'dangerous' options.",
        },
        {
                .name = "write_custom",
-               .handler = &lpc2900_handle_write_custom_command,
+               .handler = lpc2900_handle_write_custom_command,
                .mode = COMMAND_EXEC,
                .usage = "bank_id filename ('bin'|'ihex'|'elf'|'s19')",
                .help = "Copies 912 bytes of customer info from file "
@@ -981,7 +984,7 @@ static const struct command_registration lpc2900_exec_command_handlers[] = {
        },
        {
                .name = "secure_sector",
-               .handler = &lpc2900_handle_secure_sector_command,
+               .handler = lpc2900_handle_secure_sector_command,
                .mode = COMMAND_EXEC,
                .usage = "bank_id first_sector last_sector",
                .help = "Activate sector security for a range of sectors.  "
@@ -989,7 +992,7 @@ static const struct command_registration lpc2900_exec_command_handlers[] = {
        },
        {
                .name = "secure_jtag",
-               .handler = &lpc2900_handle_secure_jtag_command,
+               .handler = lpc2900_handle_secure_jtag_command,
                .mode = COMMAND_EXEC,
                .usage = "bank_id",
                .help = "Disable the JTAG port.  "
@@ -1050,6 +1053,7 @@ FLASH_BANK_COMMAND_HANDLER(lpc2900_flash_bank_command)
 
        /* Chip ID will be obtained by probing the device later */
        lpc2900_info->chipid = 0;
+       lpc2900_info->is_probed = false;
 
        return ERROR_OK;
 }
@@ -1288,7 +1292,7 @@ static int lpc2900_write(struct flash_bank *bank, uint8_t *buffer,
           reduced size if that fails. */
        struct working_area *warea;
        uint32_t buffer_size = lpc2900_info->max_ram_block - 1 * KiB;
-       while( (retval = target_alloc_working_area(target,
+       while( (retval = target_alloc_working_area_try(target,
                                                   buffer_size + target_code_size,
                                                   &warea)) != ERROR_OK )
        {
@@ -1365,7 +1369,7 @@ static int lpc2900_write(struct flash_bank *bank, uint8_t *buffer,
                                this_buffer = buffer;
 
                                /* Make sure we stop at the next secured sector */
-                               int sector = start_sector + 1;
+                               sector = start_sector + 1;
                                while( sector < bank->num_sectors )
                                {
                                        /* Secured? */
@@ -1554,10 +1558,8 @@ static int lpc2900_probe(struct flash_bank *bank)
                return ERROR_TARGET_NOT_HALTED;
        }
 
-       /* We want to do this only once. Check if we already have a valid CHIPID,
-        * because then we will have already successfully probed the device.
-        */
-       if (lpc2900_info->chipid == EXPECTED_CHIPID)
+       /* We want to do this only once. */
+       if (lpc2900_info->is_probed)
        {
                return ERROR_OK;
        }
@@ -1636,7 +1638,11 @@ static int lpc2900_probe(struct flash_bank *bank)
                else if ( package_code == 4 )
                {
                        /* 144-pin package */
-                       if ( (bank->size == 512*KiB) && (feat3 == 0xFFFFFCF0) )
+                       if ( (bank->size == 256*KiB) && (feat3 == 0xFFFFFFE9) )
+                       {
+                               lpc2900_info->target_name = "LPC2926";
+                       }
+                       else if ( (bank->size == 512*KiB) && (feat3 == 0xFFFFFCF0) )
                        {
                                lpc2900_info->target_name = "LPC2917/01";
                        }
@@ -1670,7 +1676,11 @@ static int lpc2900_probe(struct flash_bank *bank)
 
        if ( !found )
        {
-               LOG_WARNING("Unknown LPC29xx derivative");
+               LOG_WARNING("Unknown LPC29xx derivative"
+                           " (FEATx="
+                           "%08" PRIx32 ":%08" PRIx32 ":%08" PRIx32 ":%08" PRIx32 ")",
+                                       feat0, feat1, feat2, feat3
+                                       );
                return ERROR_FLASH_OPERATION_FAILED;
        }
 
@@ -1723,6 +1733,8 @@ static int lpc2900_probe(struct flash_bank *bank)
                offset += bank->sectors[i].size;
        }
 
+       lpc2900_info->is_probed = true;
+
        /* Read sector security status */
        if ( lpc2900_read_security_status(bank) != ERROR_OK )
        {
@@ -1830,6 +1842,7 @@ struct flash_driver lpc2900_flash =
        .erase              = lpc2900_erase,
        .protect            = lpc2900_protect,
        .write              = lpc2900_write,
+       .read               = default_flash_read,
        .probe              = lpc2900_probe,
        .auto_probe         = lpc2900_probe,
        .erase_check        = lpc2900_erase_check,

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)