X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fflash%2Fstr9xpec.c;h=eb08eb244eeefdbb7705e7ed5f3ba68fced25804;hb=4a070eb914717ead2c485c1a05be33d0dcd1aef4;hp=e88303140df34fdeb05b7651ec18e759c42f45a6;hpb=ee01d049089d5be099b84f8974f00f389eaea49b;p=openocd diff --git a/src/flash/str9xpec.c b/src/flash/str9xpec.c index e8830314..eb08eb24 100644 --- a/src/flash/str9xpec.c +++ b/src/flash/str9xpec.c @@ -125,6 +125,12 @@ int str9xpec_register_commands(struct command_context_s *cmd_ctx) int str9xpec_set_instr(int chain_pos, u32 new_instr, enum tap_state end_state) { jtag_device_t *device = jtag_get_device(chain_pos); + + if (device == NULL) + { + DEBUG("Invalid Target"); + return ERROR_TARGET_INVALID; + } if (buf_get_u32(device->cur_instr, 0, device->ir_length) != new_instr) { @@ -154,7 +160,8 @@ u8 str9xpec_isc_status(int chain_pos) scan_field_t field; u8 status; - str9xpec_set_instr(chain_pos, ISC_NOOP, TAP_PI); + if (str9xpec_set_instr(chain_pos, ISC_NOOP, TAP_PI) != ERROR_OK) + return ISC_STATUS_ERROR; field.device = chain_pos; field.num_bits = 8; @@ -189,7 +196,8 @@ int str9xpec_isc_enable(struct flash_bank_s *bank) return ERROR_OK; /* enter isc mode */ - str9xpec_set_instr(chain_pos, ISC_ENABLE, TAP_RTI); + if (str9xpec_set_instr(chain_pos, ISC_ENABLE, TAP_RTI) != ERROR_OK) + return ERROR_TARGET_INVALID; /* check ISC status */ status = str9xpec_isc_status(chain_pos); @@ -214,7 +222,8 @@ int str9xpec_isc_disable(struct flash_bank_s *bank) if (!str9xpec_info->isc_enable) return ERROR_OK; - str9xpec_set_instr(chain_pos, ISC_DISABLE, TAP_RTI); + if (str9xpec_set_instr(chain_pos, ISC_DISABLE, TAP_RTI) != ERROR_OK) + return ERROR_TARGET_INVALID; /* delay to handle aborts */ jtag_add_sleep(50); @@ -273,10 +282,10 @@ int str9xpec_build_block_list(struct flash_bank_s *bank) switch (bank->size) { - case 256 * 1024: + case (256 * 1024): b0_sectors = 4; break; - case 512 * 1024: + case (512 * 1024): b0_sectors = 8; break; default: @@ -284,7 +293,9 @@ int str9xpec_build_block_list(struct flash_bank_s *bank) exit(-1); } + /* include bank 1 sectors */ num_sectors = b0_sectors + 4; + bank->size += (32 * 1024); bank->num_sectors = num_sectors; bank->sectors = malloc(sizeof(flash_sector_t) * num_sectors); @@ -336,18 +347,11 @@ int str9xpec_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, ch WARNING("overriding flash base address for STR91x device with 0x00000000"); bank->base = 0x00000000; } - - str9xpec_info->target = get_target_by_num(strtoul(args[5], NULL, 0)); - if (!str9xpec_info->target) - { - ERROR("no target '%s' configured", args[5]); - exit(-1); - } /* find out jtag position of flash controller * it is always after the arm966 core */ - armv4_5 = str9xpec_info->target->arch_info; + armv4_5 = bank->target->arch_info; arm7_9 = armv4_5->arch_info; jtag_info = &arm7_9->jtag_info; @@ -787,10 +791,10 @@ int str9xpec_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) } while(!(status & ISC_STATUS_BUSY)); if ((status & ISC_STATUS_ERROR) != STR9XPEC_ISC_SUCCESS) - return ERROR_FLASH_OPERATION_FAILED; + return ERROR_FLASH_OPERATION_FAILED; //if ((status & ISC_STATUS_INT_ERROR) != STR9XPEC_ISC_INTFAIL) - // return ERROR_FLASH_OPERATION_FAILED; + // return ERROR_FLASH_OPERATION_FAILED; dwords_remaining--; bytes_written += 8; @@ -850,7 +854,7 @@ int str9xpec_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) return ERROR_FLASH_OPERATION_FAILED; //if ((status & ISC_STATUS_INT_ERROR) != STR9XPEC_ISC_INTFAIL) - // return ERROR_FLASH_OPERATION_FAILED; + // return ERROR_FLASH_OPERATION_FAILED; } free(scanbuf); @@ -997,7 +1001,10 @@ int str9xpec_write_options(struct flash_bank_s *bank) chain_pos = str9xpec_info->chain_pos; /* erase config options first */ - str9xpec_erase_area( bank, 0xFE, 0xFE ); + status = str9xpec_erase_area( bank, 0xFE, 0xFE ); + + if ((status & ISC_STATUS_ERROR) != STR9XPEC_ISC_SUCCESS) + return status; if (!str9xpec_info->isc_enable) { str9xpec_isc_enable( bank ); @@ -1334,6 +1341,7 @@ int str9xpec_handle_flash_disable_turbo_command(struct command_context_s *cmd_ct if( str9xpec_info->devarm ) { dev0->next = str9xpec_info->devarm; jtag_num_devices++; + str9xpec_info->devarm = NULL; } return ERROR_OK;