cmd: add missing usage var
[fw/openocd] / src / flash / nor / lpc2900.c
index 9cbb9e4bd21fbea6c465bf2ed113355aeacb0e92..5a80b323d97f25f622361d742717e20f021d16a0 100644 (file)
 #endif
 
 
-#include "image.h"
-#include "flash.h"
+#include "imp.h"
 #include <helper/binarybuffer.h>
-#include "armv4_5.h"
 #include <target/algorithm.h>
+#include <target/arm.h>
+#include <target/image.h>
 
 
 /* 1024 bytes */
  */
 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
 };
@@ -998,6 +1004,7 @@ static const struct command_registration lpc2900_command_handlers[] = {
                .name = "lpc2900",
                .mode = COMMAND_ANY,
                .help = "LPC2900 flash command group",
+               .usage = "",
                .chain = lpc2900_exec_command_handlers,
        },
        COMMAND_REGISTRATION_DONE
@@ -1010,8 +1017,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 +1052,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 +1291,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 +1309,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 +1368,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? */
@@ -1423,9 +1430,9 @@ static int lpc2900_write(struct flash_bank *bank, uint8_t *buffer,
                        buf_set_u32(reg_params[4].value, 0, 32, FPTR_EN_T | prog_time);
 
                        /* Execute algorithm, assume breakpoint for last instruction */
-                       armv4_5_info.common_magic = ARMV4_5_COMMON_MAGIC;
-                       armv4_5_info.core_mode = ARMV4_5_MODE_SVC;
-                       armv4_5_info.core_state = ARMV4_5_STATE_ARM;
+                       armv4_5_info.common_magic = ARM_COMMON_MAGIC;
+                       armv4_5_info.core_mode = ARM_MODE_SVC;
+                       armv4_5_info.core_state = ARM_STATE_ARM;
 
                        retval = target_run_algorithm(target, 0, NULL, 5, reg_params,
                                (warea->address) + buffer_size,
@@ -1550,10 +1557,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 +1637,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 +1675,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 +1732,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 +1841,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,