X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fflash%2Fstr9xpec.c;h=f508e0bf8d96006a69385b573b9296b895176913;hb=be00c7d0c4e85fd44d8c2d71521a5181688feeb8;hp=4959df9ff8d99ab39aaba99556bff6d98f5550d6;hpb=bcb0124b1501fb42659cdc2a343dec173aaa196a;p=openocd.git diff --git a/src/flash/str9xpec.c b/src/flash/str9xpec.c index 4959df9ff8..f508e0bf8d 100644 --- a/src/flash/str9xpec.c +++ b/src/flash/str9xpec.c @@ -2,6 +2,9 @@ * Copyright (C) 2005 by Dominic Rath * * Dominic.Rath@gmx.de * * * + * Copyright (C) 2008 by Spencer Oliver * + * spen@spen-soft.co.uk * + * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * @@ -37,21 +40,6 @@ #include #include -str9xpec_mem_layout_t mem_layout_str9pec[] = { - {0x00000000, 0x10000, 0}, - {0x00010000, 0x10000, 1}, - {0x00020000, 0x10000, 2}, - {0x00030000, 0x10000, 3}, - {0x00040000, 0x10000, 4}, - {0x00050000, 0x10000, 5}, - {0x00060000, 0x10000, 6}, - {0x00070000, 0x10000, 7}, - {0x00080000, 0x02000, 32}, - {0x00082000, 0x02000, 33}, - {0x00084000, 0x02000, 34}, - {0x00086000, 0x02000, 35} -}; - int str9xpec_register_commands(struct command_context_s *cmd_ctx); int str9xpec_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank); int str9xpec_erase(struct flash_bank_s *bank, int first, int last); @@ -129,7 +117,7 @@ int str9xpec_set_instr(int chain_pos, u32 new_instr, enum tap_state end_state) if (device == NULL) { - DEBUG("Invalid Target"); + LOG_DEBUG("Invalid Target"); return ERROR_TARGET_INVALID; } @@ -148,7 +136,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); } @@ -174,13 +162,13 @@ 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); + LOG_DEBUG("status: 0x%2.2x", status); if (status & ISC_STATUS_SECURITY) - INFO("Device Security Bit Set"); + LOG_INFO("Device Security Bit Set"); return status; } @@ -206,7 +194,7 @@ int str9xpec_isc_enable(struct flash_bank_s *bank) { /* we have entered isc mode */ str9xpec_info->isc_enable = 1; - DEBUG("ISC_MODE Enabled"); + LOG_DEBUG("ISC_MODE Enabled"); } return ERROR_OK; @@ -235,7 +223,7 @@ int str9xpec_isc_disable(struct flash_bank_s *bank) { /* we have left isc mode */ str9xpec_info->isc_enable = 0; - DEBUG("ISC_MODE Disabled"); + LOG_DEBUG("ISC_MODE Disabled"); } return ERROR_OK; @@ -251,7 +239,7 @@ int str9xpec_read_config(struct flash_bank_s *bank) chain_pos = str9xpec_info->chain_pos; - DEBUG("ISC_CONFIGURATION"); + LOG_DEBUG("ISC_CONFIGURATION"); /* execute ISC_CONFIGURATION command */ str9xpec_set_instr(chain_pos, ISC_CONFIGURATION, TAP_PI); @@ -266,7 +254,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); @@ -279,8 +267,11 @@ int str9xpec_build_block_list(struct flash_bank_s *bank) str9xpec_flash_controller_t *str9xpec_info = bank->driver_priv; int i; - int num_sectors = 0, b0_sectors = 0; - + int num_sectors; + int b0_sectors = 0, b1_sectors = 0; + u32 offset = 0; + int b1_size = 0x2000; + switch (bank->size) { case (256 * 1024): @@ -289,14 +280,25 @@ int str9xpec_build_block_list(struct flash_bank_s *bank) case (512 * 1024): b0_sectors = 8; break; + case (1024 * 1024): + b0_sectors = 16; + break; + case (2048 * 1024): + b0_sectors = 32; + break; + case (128 * 1024): + b1_size = 0x4000; + b1_sectors = 8; + break; + case (32 * 1024): + b1_sectors = 4; + break; default: - ERROR("BUG: unknown bank->size encountered"); + LOG_ERROR("BUG: unknown bank->size encountered"); exit(-1); } - /* include bank 1 sectors */ - num_sectors = b0_sectors + 4; - bank->size += (32 * 1024); + num_sectors = b0_sectors + b1_sectors; bank->num_sectors = num_sectors; bank->sectors = malloc(sizeof(flash_sector_t) * num_sectors); @@ -306,22 +308,24 @@ int str9xpec_build_block_list(struct flash_bank_s *bank) for (i = 0; i < b0_sectors; i++) { - bank->sectors[num_sectors].offset = mem_layout_str9pec[i].sector_start; - bank->sectors[num_sectors].size = mem_layout_str9pec[i].sector_size; + bank->sectors[num_sectors].offset = offset; + bank->sectors[num_sectors].size = 0x10000; + offset += bank->sectors[i].size; bank->sectors[num_sectors].is_erased = -1; bank->sectors[num_sectors].is_protected = 1; - str9xpec_info->sector_bits[num_sectors++] = mem_layout_str9pec[i].sector_bit; + str9xpec_info->sector_bits[num_sectors++] = i; } - - for (i = 8; i < 12; i++) + + for (i = 0; i < b1_sectors; i++) { - bank->sectors[num_sectors].offset = mem_layout_str9pec[i].sector_start; - bank->sectors[num_sectors].size = mem_layout_str9pec[i].sector_size; + bank->sectors[num_sectors].offset = offset; + bank->sectors[num_sectors].size = b1_size; + offset += bank->sectors[i].size; bank->sectors[num_sectors].is_erased = -1; bank->sectors[num_sectors].is_protected = 1; - str9xpec_info->sector_bits[num_sectors++] = mem_layout_str9pec[i].sector_bit; + str9xpec_info->sector_bits[num_sectors++] = i + 32; } - + return ERROR_OK; } @@ -336,19 +340,13 @@ int str9xpec_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, ch if (argc < 6) { - WARNING("incomplete flash_bank str9x configuration"); + LOG_WARNING("incomplete flash_bank str9x configuration"); return ERROR_FLASH_BANK_INVALID; } str9xpec_info = malloc(sizeof(str9xpec_flash_controller_t)); bank->driver_priv = str9xpec_info; - if (bank->base != 0x00000000) - { - WARNING("overriding flash base address for STR91x device with 0x00000000"); - bank->base = 0x00000000; - } - /* find out jtag position of flash controller * it is always after the arm966 core */ @@ -390,7 +388,7 @@ int str9xpec_blank_check(struct flash_bank_s *bank, int first, int last) buffer = calloc(CEIL(64, 8), 1); - DEBUG("blank check: first_bank: %i, last_bank: %i", first, last); + LOG_DEBUG("blank check: first_bank: %i, last_bank: %i", first, last); for (i = first; i <= last; i++) { buf_set_u32(buffer, str9xpec_info->sector_bits[i], 1, 1); @@ -409,7 +407,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 */ @@ -423,7 +421,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); @@ -489,7 +487,7 @@ int str9xpec_erase_area(struct flash_bank_s *bank, int first, int last) buffer = calloc(CEIL(64, 8), 1); - DEBUG("erase: first_bank: %i, last_bank: %i", first, last); + LOG_DEBUG("erase: first_bank: %i, last_bank: %i", first, last); /* last bank: 0xFF signals a full erase (unlock complete device) */ /* last bank: 0xFE signals a option byte erase */ @@ -510,7 +508,7 @@ int str9xpec_erase_area(struct flash_bank_s *bank, int first, int last) } } - DEBUG("ISC_ERASE"); + LOG_DEBUG("ISC_ERASE"); /* execute ISC_ERASE command */ str9xpec_set_instr(chain_pos, ISC_ERASE, TAP_PI); @@ -525,7 +523,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); @@ -591,7 +589,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)); @@ -622,7 +620,7 @@ int str9xpec_protect(struct flash_bank_s *bank, int set, int first, int last) if ((status & ISC_STATUS_ERROR) != STR9XPEC_ISC_SUCCESS) return ERROR_FLASH_OPERATION_FAILED; - DEBUG("protect: first_bank: %i, last_bank: %i", first, last); + LOG_DEBUG("protect: first_bank: %i, last_bank: %i", first, last); /* last bank: 0xFF signals a full device protect */ if (last == 0xFF) @@ -677,7 +675,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; } @@ -709,7 +707,7 @@ int str9xpec_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) if (offset & 0x7) { - WARNING("offset 0x%x breaks required 8-byte alignment", offset); + LOG_WARNING("offset 0x%x breaks required 8-byte alignment", offset); return ERROR_FLASH_DST_BREAKS_ALIGNMENT; } @@ -740,11 +738,11 @@ int str9xpec_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) if (check_address != offset + count) return ERROR_FLASH_DST_OUT_OF_BANK; - DEBUG("first_sector: %i, last_sector: %i", first_sector, last_sector); + LOG_DEBUG("first_sector: %i, last_sector: %i", first_sector, last_sector); scanbuf = calloc(CEIL(64, 8), 1); - DEBUG("ISC_PROGRAM"); + LOG_DEBUG("ISC_PROGRAM"); for (i = first_sector; i <= last_sector; i++) { @@ -766,7 +764,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); @@ -784,7 +782,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); @@ -794,8 +792,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; */ dwords_remaining--; bytes_written += 8; @@ -826,7 +824,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); @@ -844,7 +842,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); @@ -854,8 +852,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); @@ -908,7 +906,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); @@ -1033,7 +1031,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); @@ -1051,7 +1049,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));