X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fflash%2Flpc2900.c;h=b80079df00e5d8c180399ff991e5cca9ce530ccf;hp=e15d93b25f13dfc9db04f709a1774705bd3fbb0b;hb=e84849f5ed7416c758914bea88a31827259c4f5b;hpb=7b2d8d93e6b132048f951106480b4e6a6f0b885a diff --git a/src/flash/lpc2900.c b/src/flash/lpc2900.c index e15d93b25f..b80079df00 100644 --- a/src/flash/lpc2900.c +++ b/src/flash/lpc2900.c @@ -24,10 +24,10 @@ #include "image.h" - -#include "lpc2900.h" +#include "flash.h" #include "binarybuffer.h" #include "armv4_5.h" +#include "algorithm.h" /* 1024 bytes */ @@ -129,7 +129,7 @@ /** * Private data for \c lpc2900 flash driver. */ -typedef struct lpc2900_flash_bank_s +struct lpc2900_flash_bank { /** * Holds the value read from CHIPID register. @@ -168,32 +168,17 @@ typedef struct lpc2900_flash_bank_s */ uint32_t max_ram_block; -} lpc2900_flash_bank_t; - - - +}; -static int lpc2900_register_commands(struct command_context_s *cmd_ctx); -static int lpc2900_flash_bank_command(struct command_context_s *cmd_ctx, - char *cmd, char **args, int argc, - struct flash_bank_s *bank); -static int lpc2900_erase(struct flash_bank_s *bank, int first, int last); -static int lpc2900_protect(struct flash_bank_s *bank, int set, int first, int last); -static int lpc2900_write(struct flash_bank_s *bank, - uint8_t *buffer, uint32_t offset, uint32_t count); -static int lpc2900_probe(struct flash_bank_s *bank); -static int lpc2900_erase_check(struct flash_bank_s *bank); -static int lpc2900_protect_check(struct flash_bank_s *bank); -static int lpc2900_info(struct flash_bank_s *bank, char *buf, int buf_size); -static uint32_t lpc2900_wait_status(flash_bank_t *bank, uint32_t mask, int timeout); -static void lpc2900_setup(struct flash_bank_s *bank); -static uint32_t lpc2900_is_ready(struct flash_bank_s *bank); -static uint32_t lpc2900_read_security_status(struct flash_bank_s *bank); -static uint32_t lpc2900_run_bist128(struct flash_bank_s *bank, +static uint32_t lpc2900_wait_status(struct flash_bank *bank, uint32_t mask, int timeout); +static void lpc2900_setup(struct flash_bank *bank); +static uint32_t lpc2900_is_ready(struct flash_bank *bank); +static uint32_t lpc2900_read_security_status(struct flash_bank *bank); +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_s *bank, uint32_t offset); +static uint32_t lpc2900_address2sector(struct flash_bank *bank, uint32_t offset); static uint32_t lpc2900_calc_tr( uint32_t clock, uint32_t time ); @@ -209,12 +194,12 @@ static uint32_t lpc2900_calc_tr( uint32_t clock, uint32_t time ); * @param[in] mask Mask to be used for INT_STATUS * @param[in] timeout Timeout in ms */ -static uint32_t lpc2900_wait_status( flash_bank_t *bank, +static uint32_t lpc2900_wait_status( struct flash_bank *bank, uint32_t mask, int timeout ) { uint32_t int_status; - target_t *target = bank->target; + struct target *target = bank->target; do @@ -243,10 +228,10 @@ static uint32_t lpc2900_wait_status( flash_bank_t *bank, * * @param bank Pointer to the flash bank descriptor */ -static void lpc2900_setup( struct flash_bank_s *bank ) +static void lpc2900_setup( struct flash_bank *bank ) { uint32_t fcra; - lpc2900_flash_bank_t *lpc2900_info = bank->driver_priv; + struct lpc2900_flash_bank *lpc2900_info = bank->driver_priv; /* Power up the flash block */ @@ -266,9 +251,9 @@ static void lpc2900_setup( struct flash_bank_s *bank ) * Must have been successfully probed. * Must be halted. */ -static uint32_t lpc2900_is_ready( struct flash_bank_s *bank ) +static uint32_t lpc2900_is_ready( struct flash_bank *bank ) { - lpc2900_flash_bank_t *lpc2900_info = bank->driver_priv; + struct lpc2900_flash_bank *lpc2900_info = bank->driver_priv; if( lpc2900_info->chipid != EXPECTED_CHIPID ) { @@ -290,7 +275,7 @@ static uint32_t lpc2900_is_ready( struct flash_bank_s *bank ) * * @param bank Pointer to the flash bank descriptor */ -static uint32_t lpc2900_read_security_status( struct flash_bank_s *bank ) +static uint32_t lpc2900_read_security_status( struct flash_bank *bank ) { uint32_t status; if( (status = lpc2900_is_ready( bank )) != ERROR_OK ) @@ -298,7 +283,7 @@ static uint32_t lpc2900_read_security_status( struct flash_bank_s *bank ) return status; } - target_t *target = bank->target; + struct target *target = bank->target; /* Enable ISS access */ target_write_u32(target, FCTR, FCTR_FS_CS | FCTR_FS_WEB | FCTR_FS_ISS); @@ -371,12 +356,12 @@ static uint32_t lpc2900_read_security_status( struct flash_bank_s *bank ) * @param addr_to * @param signature */ -static uint32_t lpc2900_run_bist128(struct flash_bank_s *bank, +static uint32_t lpc2900_run_bist128(struct flash_bank *bank, uint32_t addr_from, uint32_t addr_to, uint32_t (*signature)[4] ) { - target_t *target = bank->target; + struct target *target = bank->target; /* Clear END_OF_MISR interrupt status */ target_write_u32( target, INT_CLR_STATUS, INTSRC_END_OF_MISR ); @@ -408,7 +393,7 @@ static uint32_t lpc2900_run_bist128(struct flash_bank_s *bank, * @param bank Pointer to the flash bank descriptor * @param offset Offset address relative to bank start */ -static uint32_t lpc2900_address2sector( struct flash_bank_s *bank, +static uint32_t lpc2900_address2sector( struct flash_bank *bank, uint32_t offset ) { uint32_t address = bank->base + offset; @@ -439,7 +424,7 @@ static uint32_t lpc2900_address2sector( struct flash_bank_s *bank, * @param pagenum Page number (0...7) * @param page Page array (FLASH_PAGE_SIZE bytes) */ -static int lpc2900_write_index_page( struct flash_bank_s *bank, +static int lpc2900_write_index_page( struct flash_bank *bank, int pagenum, uint8_t (*page)[FLASH_PAGE_SIZE] ) { @@ -451,7 +436,7 @@ static int lpc2900_write_index_page( struct flash_bank_s *bank, } /* Get target, and check if it's halted */ - target_t *target = bank->target; + struct target *target = bank->target; if( target->state != TARGET_HALTED ) { LOG_ERROR( "Target not halted" ); @@ -459,7 +444,7 @@ static int lpc2900_write_index_page( struct flash_bank_s *bank, } /* Private info */ - lpc2900_flash_bank_t *lpc2900_info = bank->driver_priv; + struct lpc2900_flash_bank *lpc2900_info = bank->driver_priv; /* Enable flash block and set the correct CRA clock of 66 kHz */ lpc2900_setup( bank ); @@ -545,14 +530,8 @@ static uint32_t lpc2900_calc_tr( uint32_t clock, uint32_t time ) * * Uses the Built-In-Self-Test (BIST) to generate a 128-bit hash value * of the flash content. - * - * @param cmd_ctx - * @param cmd - * @param args - * @param argc */ -static int lpc2900_handle_signature_command( struct command_context_s *cmd_ctx, - char *cmd, char **args, int argc ) +COMMAND_HANDLER(lpc2900_handle_signature_command) { uint32_t status; uint32_t signature[4]; @@ -564,8 +543,8 @@ static int lpc2900_handle_signature_command( struct command_context_s *cmd_ctx, return ERROR_FLASH_BANK_INVALID; } - flash_bank_t *bank; - int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &bank); + struct flash_bank *bank; + int retval = CALL_COMMAND_HANDLER(flash_command_get_bank_by_num, 0, &bank); if (ERROR_OK != retval) return retval; @@ -601,30 +580,24 @@ static int lpc2900_handle_signature_command( struct command_context_s *cmd_ctx, * * Read customer info from index sector, and store that block of data into * a disk file. The format is binary. - * - * @param cmd_ctx - * @param cmd - * @param args - * @param argc */ -static int lpc2900_handle_read_custom_command( struct command_context_s *cmd_ctx, - char *cmd, char **args, int argc ) +COMMAND_HANDLER(lpc2900_handle_read_custom_command) { if( argc < 2 ) { return ERROR_COMMAND_SYNTAX_ERROR; } - flash_bank_t *bank; - int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &bank); + struct flash_bank *bank; + int retval = CALL_COMMAND_HANDLER(flash_command_get_bank_by_num, 0, &bank); if (ERROR_OK != retval) return retval; - lpc2900_flash_bank_t *lpc2900_info = bank->driver_priv; + struct lpc2900_flash_bank *lpc2900_info = bank->driver_priv; lpc2900_info->risky = 0; /* Get target, and check if it's halted */ - target_t *target = bank->target; + struct target *target = bank->target; if( target->state != TARGET_HALTED ) { LOG_ERROR( "Target not halted" ); @@ -649,8 +622,8 @@ static int lpc2900_handle_read_custom_command( struct command_context_s *cmd_ctx target_write_u32( target, FCTR, FCTR_FS_CS | FCTR_FS_WEB ); /* Try and open the file */ - fileio_t fileio; - char *filename = args[1]; + struct fileio fileio; + const char *filename = args[1]; int ret = fileio_open( &fileio, filename, FILEIO_WRITE, FILEIO_BINARY ); if( ret != ERROR_OK ) { @@ -678,26 +651,20 @@ static int lpc2900_handle_read_custom_command( struct command_context_s *cmd_ctx /** * Enter password to enable potentially dangerous options. - * - * @param cmd_ctx - * @param cmd - * @param args - * @param argc */ -static int lpc2900_handle_password_command(struct command_context_s *cmd_ctx, - char *cmd, char **args, int argc) +COMMAND_HANDLER(lpc2900_handle_password_command) { if (argc < 2) { return ERROR_COMMAND_SYNTAX_ERROR; } - flash_bank_t *bank; - int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &bank); + struct flash_bank *bank; + int retval = CALL_COMMAND_HANDLER(flash_command_get_bank_by_num, 0, &bank); if (ERROR_OK != retval) return retval; - lpc2900_flash_bank_t *lpc2900_info = bank->driver_priv; + struct lpc2900_flash_bank *lpc2900_info = bank->driver_priv; #define ISS_PASSWORD "I_know_what_I_am_doing" @@ -719,26 +686,20 @@ static int lpc2900_handle_password_command(struct command_context_s *cmd_ctx, /** * Write customer info from file to the index sector. - * - * @param cmd_ctx - * @param cmd - * @param args - * @param argc */ -static int lpc2900_handle_write_custom_command( struct command_context_s *cmd_ctx, - char *cmd, char **args, int argc ) +COMMAND_HANDLER(lpc2900_handle_write_custom_command) { if (argc < 2) { return ERROR_COMMAND_SYNTAX_ERROR; } - flash_bank_t *bank; - int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &bank); + struct flash_bank *bank; + int retval = CALL_COMMAND_HANDLER(flash_command_get_bank_by_num, 0, &bank); if (ERROR_OK != retval) return retval; - lpc2900_flash_bank_t *lpc2900_info = bank->driver_priv; + struct lpc2900_flash_bank *lpc2900_info = bank->driver_priv; /* Check if command execution is allowed. */ if( !lpc2900_info->risky ) @@ -749,7 +710,7 @@ static int lpc2900_handle_write_custom_command( struct command_context_s *cmd_ct lpc2900_info->risky = 0; /* Get target, and check if it's halted */ - target_t *target = bank->target; + struct target *target = bank->target; if (target->state != TARGET_HALTED) { LOG_ERROR("Target not halted"); @@ -757,13 +718,13 @@ static int lpc2900_handle_write_custom_command( struct command_context_s *cmd_ct } /* The image will always start at offset 0 */ - image_t image; + struct image image; image.base_address_set = 1; image.base_address = 0; image.start_address_set = 0; - char *filename = args[1]; - char *type = (argc >= 3) ? args[2] : NULL; + const char *filename = args[1]; + const char *type = (argc >= 3) ? args[2] : NULL; retval = image_open(&image, filename, type); if (retval != ERROR_OK) { @@ -835,14 +796,8 @@ static int lpc2900_handle_write_custom_command( struct command_context_s *cmd_ct /** * Activate 'sector security' for a range of sectors. - * - * @param cmd_ctx - * @param cmd - * @param args - * @param argc */ -static int lpc2900_handle_secure_sector_command(struct command_context_s *cmd_ctx, - char *cmd, char **args, int argc) +COMMAND_HANDLER(lpc2900_handle_secure_sector_command) { if (argc < 3) { @@ -850,12 +805,12 @@ static int lpc2900_handle_secure_sector_command(struct command_context_s *cmd_ct } /* Get the bank descriptor */ - flash_bank_t *bank; - int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &bank); + struct flash_bank *bank; + int retval = CALL_COMMAND_HANDLER(flash_command_get_bank_by_num, 0, &bank); if (ERROR_OK != retval) return retval; - lpc2900_flash_bank_t *lpc2900_info = bank->driver_priv; + struct lpc2900_flash_bank *lpc2900_info = bank->driver_priv; /* Check if command execution is allowed. */ if( !lpc2900_info->risky ) @@ -940,14 +895,8 @@ static int lpc2900_handle_secure_sector_command(struct command_context_s *cmd_ct /** * Activate JTAG protection. - * - * @param cmd_ctx - * @param cmd - * @param args - * @param argc */ -static int lpc2900_handle_secure_jtag_command(struct command_context_s *cmd_ctx, - char *cmd, char **args, int argc) +COMMAND_HANDLER(lpc2900_handle_secure_jtag_command) { if (argc < 1) { @@ -955,12 +904,12 @@ static int lpc2900_handle_secure_jtag_command(struct command_context_s *cmd_ctx, } /* Get the bank descriptor */ - flash_bank_t *bank; - int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &bank); + struct flash_bank *bank; + int retval = CALL_COMMAND_HANDLER(flash_command_get_bank_by_num, 0, &bank); if (ERROR_OK != retval) return retval; - lpc2900_flash_bank_t *lpc2900_info = bank->driver_priv; + struct lpc2900_flash_bank *lpc2900_info = bank->driver_priv; /* Check if command execution is allowed. */ if( !lpc2900_info->risky ) @@ -1002,12 +951,10 @@ static int lpc2900_handle_secure_jtag_command(struct command_context_s *cmd_ctx, /** * Register private command handlers. - * - * @param cmd_ctx */ -static int lpc2900_register_commands(struct command_context_s *cmd_ctx) +static int lpc2900_register_commands(struct command_context *cmd_ctx) { - command_t *lpc2900_cmd = register_command(cmd_ctx, NULL, "lpc2900", + struct command *lpc2900_cmd = register_command(cmd_ctx, NULL, "lpc2900", NULL, COMMAND_ANY, NULL); register_command( @@ -1068,22 +1015,10 @@ static int lpc2900_register_commands(struct command_context_s *cmd_ctx) } -/** - * Evaluate flash bank command. - * - * Syntax: flash bank lpc2900 0 0 0 0 target# system_base_clock - * - * @param cmd_ctx - * @param cmd - * @param args - * @param argc - * @param bank Pointer to the flash bank descriptor - */ -static int lpc2900_flash_bank_command(struct command_context_s *cmd_ctx, - char *cmd, char **args, int argc, - struct flash_bank_s *bank) +/// Evaluate flash bank command. +FLASH_BANK_COMMAND_HANDLER(lpc2900_flash_bank_command) { - lpc2900_flash_bank_t *lpc2900_info; + struct lpc2900_flash_bank *lpc2900_info; if (argc < 6) { @@ -1091,7 +1026,7 @@ static int lpc2900_flash_bank_command(struct command_context_s *cmd_ctx, return ERROR_FLASH_BANK_INVALID; } - lpc2900_info = malloc(sizeof(lpc2900_flash_bank_t)); + lpc2900_info = malloc(sizeof(struct lpc2900_flash_bank)); bank->driver_priv = lpc2900_info; /* Get flash clock. @@ -1135,13 +1070,13 @@ static int lpc2900_flash_bank_command(struct command_context_s *cmd_ctx, * @param first First sector to be erased * @param last Last sector (including) to be erased */ -static int lpc2900_erase(struct flash_bank_s *bank, int first, int last) +static int lpc2900_erase(struct flash_bank *bank, int first, int last) { uint32_t status; int sector; int last_unsecured_sector; - target_t *target = bank->target; - lpc2900_flash_bank_t *lpc2900_info = bank->driver_priv; + struct target *target = bank->target; + struct lpc2900_flash_bank *lpc2900_info = bank->driver_priv; status = lpc2900_is_ready(bank); @@ -1242,7 +1177,7 @@ static int lpc2900_erase(struct flash_bank_s *bank, int first, int last) -static int lpc2900_protect(struct flash_bank_s *bank, int set, int first, int last) +static int lpc2900_protect(struct flash_bank *bank, int set, int first, int last) { /* This command is not supported. * "Protection" in LPC2900 terms is handled transparently. Sectors will @@ -1264,14 +1199,14 @@ static int lpc2900_protect(struct flash_bank_s *bank, int set, int first, int la * @param offset Start address (relative to bank start) * @param count Number of bytes to be programmed */ -static int lpc2900_write(struct flash_bank_s *bank, uint8_t *buffer, +static int lpc2900_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count) { uint8_t page[FLASH_PAGE_SIZE]; uint32_t status; uint32_t num_bytes; - target_t *target = bank->target; - lpc2900_flash_bank_t *lpc2900_info = bank->driver_priv; + struct target *target = bank->target; + struct lpc2900_flash_bank *lpc2900_info = bank->driver_priv; int sector; int retval; @@ -1359,7 +1294,7 @@ static int lpc2900_write(struct flash_bank_s *bank, uint8_t *buffer, /* Try working area allocation. Start with a large buffer, and try with reduced size if that fails. */ - working_area_t *warea; + struct working_area *warea; uint32_t buffer_size = lpc2900_info->max_ram_block - 1 * KiB; while( (retval = target_alloc_working_area(target, buffer_size + target_code_size, @@ -1378,8 +1313,8 @@ static int lpc2900_write(struct flash_bank_s *bank, uint8_t *buffer, if( warea ) { - reg_param_t reg_params[5]; - armv4_5_algorithm_t armv4_5_info; + struct reg_param reg_params[5]; + struct armv4_5_algorithm armv4_5_info; /* We can use target mode. Download the algorithm. */ retval = target_write_buffer( target, @@ -1613,10 +1548,10 @@ static int lpc2900_write(struct flash_bank_s *bank, uint8_t *buffer, * * @param bank Pointer to the flash bank descriptor */ -static int lpc2900_probe(struct flash_bank_s *bank) +static int lpc2900_probe(struct flash_bank *bank) { - lpc2900_flash_bank_t *lpc2900_info = bank->driver_priv; - target_t *target = bank->target; + struct lpc2900_flash_bank *lpc2900_info = bank->driver_priv; + struct target *target = bank->target; int i = 0; uint32_t offset; @@ -1767,7 +1702,7 @@ static int lpc2900_probe(struct flash_bank_s *bank) * the logical flash number are translated into the physical flash numbers * of the device. */ - bank->sectors = malloc(sizeof(flash_sector_t) * bank->num_sectors); + bank->sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors); offset = 0; for (i = 0; i < bank->num_sectors; i++) @@ -1816,7 +1751,7 @@ static int lpc2900_probe(struct flash_bank_s *bank) * * @param bank Pointer to the flash bank descriptor */ -static int lpc2900_erase_check(struct flash_bank_s *bank) +static int lpc2900_erase_check(struct flash_bank *bank) { uint32_t status = lpc2900_is_ready(bank); if (status != ERROR_OK) @@ -1874,7 +1809,7 @@ static int lpc2900_erase_check(struct flash_bank_s *bank) * * @param bank Pointer to the flash bank descriptor */ -static int lpc2900_protect_check(struct flash_bank_s *bank) +static int lpc2900_protect_check(struct flash_bank *bank) { return lpc2900_read_security_status(bank); } @@ -1887,7 +1822,7 @@ static int lpc2900_protect_check(struct flash_bank_s *bank) * @param buf Buffer to take the string * @param buf_size Maximum number of characters that the buffer can take */ -static int lpc2900_info(struct flash_bank_s *bank, char *buf, int buf_size) +static int lpc2900_info(struct flash_bank *bank, char *buf, int buf_size) { snprintf(buf, buf_size, "lpc2900 flash driver"); @@ -1895,7 +1830,7 @@ static int lpc2900_info(struct flash_bank_s *bank, char *buf, int buf_size) } -flash_driver_t lpc2900_flash = +struct flash_driver lpc2900_flash = { .name = "lpc2900", .register_commands = lpc2900_register_commands,