X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fflash%2Fstr9xpec.c;h=4a24d85d1117ff82ec39bdf4c043ce12d72e818b;hp=f26a7632dcaef0b6523b378dbb9005dfe165413a;hb=e66f9aaba94e232f87c725f2fce98cfb3f92679f;hpb=4b97f3cbb9603c13f69f8d3b5371c12045593126 diff --git a/src/flash/str9xpec.c b/src/flash/str9xpec.c index f26a7632dc..4a24d85d11 100644 --- a/src/flash/str9xpec.c +++ b/src/flash/str9xpec.c @@ -87,6 +87,7 @@ flash_driver_t str9xpec_flash = .protect = str9xpec_protect, .write = str9xpec_write, .probe = str9xpec_probe, + .auto_probe = str9xpec_probe, .erase_check = str9xpec_erase_check, .protect_check = str9xpec_protect_check, .info = str9xpec_info @@ -125,6 +126,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) { @@ -141,7 +148,7 @@ int str9xpec_set_instr(int chain_pos, u32 new_instr, enum tap_state end_state) field.in_handler = NULL; field.in_handler_priv = NULL; - jtag_add_ir_scan(1, &field, end_state, NULL); + jtag_add_ir_scan(1, &field, end_state); free(field.out_value); } @@ -154,7 +161,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; @@ -166,7 +174,7 @@ u8 str9xpec_isc_status(int chain_pos) field.in_handler = NULL; field.in_handler_priv = NULL; - jtag_add_dr_scan(1, &field, TAP_RTI, NULL); + jtag_add_dr_scan(1, &field, TAP_RTI); jtag_execute_queue(); DEBUG("status: 0x%2.2x", status); @@ -189,7 +197,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 +223,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); @@ -256,7 +266,7 @@ int str9xpec_read_config(struct flash_bank_s *bank) field.in_handler = NULL; field.in_handler_priv = NULL; - jtag_add_dr_scan(1, &field, TAP_RTI, NULL); + jtag_add_dr_scan(1, &field, TAP_RTI); jtag_execute_queue(); status = str9xpec_isc_status(chain_pos); @@ -273,10 +283,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 +294,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 +348,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; @@ -404,7 +409,7 @@ int str9xpec_blank_check(struct flash_bank_s *bank, int first, int last) field.in_handler = NULL; field.in_handler_priv = NULL; - jtag_add_dr_scan(1, &field, TAP_RTI, NULL); + jtag_add_dr_scan(1, &field, TAP_RTI); jtag_add_sleep(40000); /* read blank check result */ @@ -418,7 +423,7 @@ int str9xpec_blank_check(struct flash_bank_s *bank, int first, int last) field.in_handler = NULL; field.in_handler_priv = NULL; - jtag_add_dr_scan(1, &field, TAP_PI, NULL); + jtag_add_dr_scan(1, &field, TAP_PI); jtag_execute_queue(); status = str9xpec_isc_status(chain_pos); @@ -520,7 +525,7 @@ int str9xpec_erase_area(struct flash_bank_s *bank, int first, int last) field.in_handler = NULL; field.in_handler_priv = NULL; - jtag_add_dr_scan(1, &field, TAP_RTI, NULL); + jtag_add_dr_scan(1, &field, TAP_RTI); jtag_execute_queue(); jtag_add_sleep(10); @@ -586,7 +591,7 @@ int str9xpec_lock_device(struct flash_bank_s *bank) field.in_handler = NULL; field.in_handler_priv = NULL; - jtag_add_dr_scan(1, &field, -1, NULL); + jtag_add_dr_scan(1, &field, -1); jtag_execute_queue(); } while(!(status & ISC_STATUS_BUSY)); @@ -599,37 +604,9 @@ int str9xpec_lock_device(struct flash_bank_s *bank) int str9xpec_unlock_device(struct flash_bank_s *bank) { u8 status; - //u32 chain_pos; - //jtag_device_t* dev0; - //jtag_device_t* dev1; - //jtag_device_t* dev2; - - //str9xpec_flash_controller_t *str9xpec_info = bank->driver_priv; - - //chain_pos = str9xpec_info->chain_pos; - - /* remove arm core from chain - enter turbo mode */ - - //str9xpec_set_instr(chain_pos+2, 0xD, TAP_RTI); - //jtag_execute_queue(); - - /* modify scan chain - arm9 has been removed */ - //dev0 = jtag_get_device(chain_pos); - //dev1 = jtag_get_device(chain_pos+1); - //dev2 = jtag_get_device(chain_pos+2); - //dev0->next = dev2; - //jtag_num_devices--; status = str9xpec_erase_area(bank, 0, 255); - /* exit turbo mode via TLR */ - //str9xpec_set_instr(chain_pos, ISC_NOOP, TAP_TLR); - //jtag_execute_queue(); - - /* restore previous scan chain */ - //dev0->next = dev1; - //jtag_num_devices++; - return status; } @@ -700,7 +677,7 @@ int str9xpec_set_address(struct flash_bank_s *bank, u8 sector) field.in_handler = NULL; field.in_handler_priv = NULL; - jtag_add_dr_scan(1, &field, -1, NULL); + jtag_add_dr_scan(1, &field, -1); return ERROR_OK; } @@ -789,7 +766,7 @@ int str9xpec_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) field.in_handler = NULL; field.in_handler_priv = NULL; - jtag_add_dr_scan(1, &field, TAP_RTI, NULL); + jtag_add_dr_scan(1, &field, TAP_RTI); /* small delay before polling */ jtag_add_sleep(50); @@ -807,7 +784,7 @@ int str9xpec_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) field.in_handler = NULL; field.in_handler_priv = NULL; - jtag_add_dr_scan(1, &field, -1, NULL); + jtag_add_dr_scan(1, &field, -1); jtag_execute_queue(); status = buf_get_u32(scanbuf, 0, 8); @@ -815,10 +792,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; + /* if ((status & ISC_STATUS_INT_ERROR) != STR9XPEC_ISC_INTFAIL) + return ERROR_FLASH_OPERATION_FAILED; */ dwords_remaining--; bytes_written += 8; @@ -849,7 +826,7 @@ int str9xpec_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) field.in_handler = NULL; field.in_handler_priv = NULL; - jtag_add_dr_scan(1, &field, TAP_RTI, NULL); + jtag_add_dr_scan(1, &field, TAP_RTI); /* small delay before polling */ jtag_add_sleep(50); @@ -867,7 +844,7 @@ int str9xpec_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) field.in_handler = NULL; field.in_handler_priv = NULL; - jtag_add_dr_scan(1, &field, -1, NULL); + jtag_add_dr_scan(1, &field, -1); jtag_execute_queue(); status = buf_get_u32(scanbuf, 0, 8); @@ -877,8 +854,8 @@ int str9xpec_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) if ((status & ISC_STATUS_ERROR) != STR9XPEC_ISC_SUCCESS) return ERROR_FLASH_OPERATION_FAILED; - //if ((status & ISC_STATUS_INT_ERROR) != STR9XPEC_ISC_INTFAIL) - // return ERROR_FLASH_OPERATION_FAILED; + /* if ((status & ISC_STATUS_INT_ERROR) != STR9XPEC_ISC_INTFAIL) + return ERROR_FLASH_OPERATION_FAILED; */ } free(scanbuf); @@ -904,8 +881,7 @@ int str9xpec_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd if (argc < 1) { - command_print(cmd_ctx, "usage: str9xpec part_id "); - return ERROR_OK; + return ERROR_COMMAND_SYNTAX_ERROR; } bank = get_flash_bank_by_num(strtoul(args[0], NULL, 0)); @@ -932,7 +908,7 @@ int str9xpec_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd field.in_handler = NULL; field.in_handler_priv = NULL; - jtag_add_dr_scan(1, &field, TAP_RTI, NULL); + jtag_add_dr_scan(1, &field, TAP_RTI); jtag_execute_queue(); idcode = buf_get_u32(buffer, 0, 32); @@ -1025,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 ); @@ -1054,7 +1033,7 @@ int str9xpec_write_options(struct flash_bank_s *bank) field.in_handler = NULL; field.in_handler_priv = NULL; - jtag_add_dr_scan(1, &field, TAP_RTI, NULL); + jtag_add_dr_scan(1, &field, TAP_RTI); /* small delay before polling */ jtag_add_sleep(50); @@ -1072,7 +1051,7 @@ int str9xpec_write_options(struct flash_bank_s *bank) field.in_handler = NULL; field.in_handler_priv = NULL; - jtag_add_dr_scan(1, &field, -1, NULL); + jtag_add_dr_scan(1, &field, -1); jtag_execute_queue(); } while(!(status & ISC_STATUS_BUSY)); @@ -1128,7 +1107,7 @@ int str9xpec_handle_flash_options_cmap_command(struct command_context_s *cmd_ctx str9xpec_info = bank->driver_priv; - if (stricmp(args[1], "bank1") == 0) + if (strcmp(args[1], "bank1") == 0) { buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_CSMAPBIT, 1, 1); } @@ -1160,7 +1139,7 @@ int str9xpec_handle_flash_options_lvdthd_command(struct command_context_s *cmd_c str9xpec_info = bank->driver_priv; - if (stricmp(args[1], "2.7v") == 0) + if (strcmp(args[1], "2.7v") == 0) { buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_LVDTHRESBIT, 1, 1); } @@ -1192,7 +1171,7 @@ int str9xpec_handle_flash_options_lvdsel_command(struct command_context_s *cmd_c str9xpec_info = bank->driver_priv; - if (stricmp(args[1], "vdd_vddq") == 0) + if (strcmp(args[1], "vdd_vddq") == 0) { buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_LVDSELBIT, 1, 1); } @@ -1224,7 +1203,7 @@ int str9xpec_handle_flash_options_lvdwarn_command(struct command_context_s *cmd_ str9xpec_info = bank->driver_priv; - if (stricmp(args[1], "vdd_vddq") == 0) + if (strcmp(args[1], "vdd_vddq") == 0) { buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_LVDWARNBIT, 1, 1); } @@ -1362,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;