X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fflash%2Fnor%2Flpc2900.c;h=7bb9f141b28a9310b327b180ae13ca5b0a72753a;hp=d39b2ddf72fc2e12839905c2351155414fcb0231;hb=a17907d1067be45bd2aa4cc9bd108eccaf2e4df2;hpb=1c5c57ec8e3f285cc81d4ad101edccb82b721beb diff --git a/src/flash/nor/lpc2900.c b/src/flash/nor/lpc2900.c index d39b2ddf72..7bb9f141b2 100644 --- a/src/flash/nor/lpc2900.c +++ b/src/flash/nor/lpc2900.c @@ -131,6 +131,11 @@ */ 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,