Change return value on error.
[openocd.git] / src / flash / nor / lpc2900.c
index 1ef759e2b05bc5f7659f2831719e93c800a3e93b..4960e9c6be7ab8992c1133d7eb6f0a90098a777f 100644 (file)
@@ -26,7 +26,7 @@
 #include "imp.h"
 #include <helper/binarybuffer.h>
 #include <target/algorithm.h>
-#include <target/armv4_5.h>
+#include <target/arm.h>
 #include <target/image.h>
 
 
  */
 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;
 }
@@ -539,8 +542,7 @@ COMMAND_HANDLER(lpc2900_handle_signature_command)
 
        if( CMD_ARGC < 1 )
        {
-               LOG_WARNING( "Too few arguments. Call: lpc2900 signature <bank#>" );
-               return ERROR_FLASH_BANK_INVALID;
+               return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
        struct flash_bank *bank;
@@ -951,45 +953,49 @@ COMMAND_HANDLER(lpc2900_handle_secure_jtag_command)
 static const struct command_registration lpc2900_exec_command_handlers[] = {
        {
                .name = "signature",
-               .handler = &lpc2900_handle_signature_command,
-               .mode = COMMAND_EXEC,
                .usage = "<bank>",
-               .help = "print device signature of flash bank",
+               .handler = lpc2900_handle_signature_command,
+               .mode = COMMAND_EXEC,
+               .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> <filename>",
-               .help = "read customer information from index sector to file",
+               .usage = "bank_id filename",
+               .help = "Copies 912 bytes of customer information "
+                       "from index sector into file.",
        },
        {
                .name = "password",
-               .handler = &lpc2900_handle_password_command,
+               .handler = lpc2900_handle_password_command,
                .mode = COMMAND_EXEC,
-               .usage = "<bank> <password>",
-               .help = "enter password to enable 'dangerous' options",
+               .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> <filename> [<type>]",
-               .help = "write customer info from file to index sector",
+               .usage = "bank_id filename ('bin'|'ihex'|'elf'|'s19')",
+               .help = "Copies 912 bytes of customer info from file "
+                       "to index sector.",
        },
        {
                .name = "secure_sector",
-               .handler = &lpc2900_handle_secure_sector_command,
+               .handler = lpc2900_handle_secure_sector_command,
                .mode = COMMAND_EXEC,
-               .usage = "<bank> <first> <last>",
-               .help = "activate sector security for a range of sectors",
+               .usage = "bank_id first_sector last_sector",
+               .help = "Activate sector security for a range of sectors.  "
+                       "It will be effective after a power cycle.",
        },
        {
                .name = "secure_jtag",
-               .handler = &lpc2900_handle_secure_jtag_command,
+               .handler = lpc2900_handle_secure_jtag_command,
                .mode = COMMAND_EXEC,
-               .usage = "<bank> <level>",
-               .help = "activate JTAG security",
+               .usage = "bank_id",
+               .help = "Disable the JTAG port.  "
+                       "It will be effective after a power cycle.",
        },
        COMMAND_REGISTRATION_DONE
 };
@@ -1010,8 +1016,7 @@ FLASH_BANK_COMMAND_HANDLER(lpc2900_flash_bank_command)
 
        if (CMD_ARGC < 6)
        {
-               LOG_WARNING("incomplete flash_bank LPC2900 configuration");
-               return ERROR_FLASH_BANK_INVALID;
+               return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
        lpc2900_info = malloc(sizeof(struct lpc2900_flash_bank));
@@ -1046,6 +1051,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;
 }
@@ -1284,7 +1290,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 )
        {
@@ -1302,7 +1308,7 @@ static int lpc2900_write(struct flash_bank *bank, uint8_t *buffer,
        if( warea )
        {
                struct reg_param reg_params[5];
-               struct armv4_5_algorithm armv4_5_info;
+               struct arm_algorithm armv4_5_info;
 
                /* We can use target mode. Download the algorithm. */
                retval = target_write_buffer( target,
@@ -1361,7 +1367,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? */
@@ -1550,10 +1556,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;
        }
@@ -1632,7 +1636,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";
                        }
@@ -1666,7 +1674,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;
        }
 
@@ -1719,6 +1731,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 )
        {
@@ -1826,6 +1840,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)