X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fflash%2Flpc2000.c;h=5d9781accf47cdf8f0c74c6c1dd470e629e331b7;hp=e3c7e742bb2cd6e9ac84593e334ae90b97cbdcd0;hb=e66f9aaba94e232f87c725f2fce98cfb3f92679f;hpb=78ecef2aed5fcdc25ec669d6cc28b1bc495b0ff6 diff --git a/src/flash/lpc2000.c b/src/flash/lpc2000.c index e3c7e742bb..5d9781accf 100644 --- a/src/flash/lpc2000.c +++ b/src/flash/lpc2000.c @@ -72,6 +72,7 @@ flash_driver_t lpc2000_flash = .protect = lpc2000_protect, .write = lpc2000_write, .probe = lpc2000_probe, + .auto_probe = lpc2000_probe, .erase_check = lpc2000_erase_check, .protect_check = lpc2000_protect_check, .info = lpc2000_info @@ -90,7 +91,10 @@ int lpc2000_register_commands(struct command_context_s *cmd_ctx) int lpc2000_build_sector_list(struct flash_bank_s *bank) { lpc2000_flash_bank_t *lpc2000_info = bank->driver_priv; - + + /* default to a 4096 write buffer */ + lpc2000_info->cmd51_max_buffer = 4096; + if (lpc2000_info->variant == 1) { int i = 0; @@ -155,7 +159,12 @@ int lpc2000_build_sector_list(struct flash_bank_s *bank) /* variant 2 has a uniform layout, only number of sectors differs */ switch (bank->size) { + case 4 * 1024: + lpc2000_info->cmd51_max_buffer = 1024; + num_sectors = 1; + break; case 8 * 1024: + lpc2000_info->cmd51_max_buffer = 1024; num_sectors = 2; break; case 16 * 1024: @@ -185,7 +194,7 @@ int lpc2000_build_sector_list(struct flash_bank_s *bank) bank->num_sectors = num_sectors; bank->sectors = malloc(sizeof(flash_sector_t) * num_sectors); - + for (i = 0; i < num_sectors; i++) { if ((i >= 0) && (i < 8)) @@ -233,7 +242,7 @@ int lpc2000_build_sector_list(struct flash_bank_s *bank) int lpc2000_iap_call(flash_bank_t *bank, int code, u32 param_table[5], u32 result_table[2]) { lpc2000_flash_bank_t *lpc2000_info = bank->driver_priv; - target_t *target = lpc2000_info->target; + target_t *target = bank->target; mem_param_t mem_params[2]; reg_param_t reg_params[5]; armv4_5_algorithm_t armv4_5_info; @@ -350,7 +359,7 @@ int lpc2000_iap_blank_check(struct flash_bank_s *bank, int first, int last) return ERROR_OK; } -/* flash bank lpc2000 0 0 [calc_checksum] +/* flash bank lpc2000 0 0 [calc_checksum] */ int lpc2000_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank) { @@ -365,14 +374,14 @@ int lpc2000_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, cha lpc2000_info = malloc(sizeof(lpc2000_flash_bank_t)); bank->driver_priv = lpc2000_info; - if (strcmp(args[5], "lpc2000_v1") == 0) + if (strcmp(args[6], "lpc2000_v1") == 0) { lpc2000_info->variant = 1; lpc2000_info->cmd51_dst_boundary = 512; lpc2000_info->cmd51_can_256b = 0; lpc2000_info->cmd51_can_8192b = 1; } - else if (strcmp(args[5], "lpc2000_v2") == 0) + else if (strcmp(args[6], "lpc2000_v2") == 0) { lpc2000_info->variant = 2; lpc2000_info->cmd51_dst_boundary = 256; @@ -386,18 +395,11 @@ int lpc2000_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, cha return ERROR_FLASH_BANK_INVALID; } - lpc2000_info->target = get_target_by_num(strtoul(args[6], NULL, 0)); - if (!lpc2000_info->target) - { - ERROR("no target '%s' configured", args[6]); - exit(-1); - } lpc2000_info->iap_working_area = NULL; lpc2000_info->cclk = strtoul(args[7], NULL, 0); lpc2000_info->calc_checksum = 0; lpc2000_build_sector_list(bank); - - + if (argc >= 9) { if (strcmp(args[8], "calc_checksum") == 0) @@ -414,16 +416,11 @@ int lpc2000_erase(struct flash_bank_s *bank, int first, int last) u32 result_table[2]; int status_code; - if (lpc2000_info->target->state != TARGET_HALTED) + if (bank->target->state != TARGET_HALTED) { return ERROR_TARGET_NOT_HALTED; } - - if ((first < 0) || (last < first) || (last >= bank->num_sectors)) - { - return ERROR_FLASH_SECTOR_INVALID; - } - + param_table[0] = first; param_table[1] = last; param_table[2] = lpc2000_info->cclk; @@ -472,7 +469,7 @@ int lpc2000_protect(struct flash_bank_s *bank, int set, int first, int last) int lpc2000_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) { lpc2000_flash_bank_t *lpc2000_info = bank->driver_priv; - target_t *target = lpc2000_info->target; + target_t *target = bank->target; u32 dst_min_alignment; u32 bytes_remaining = count; u32 bytes_written = 0; @@ -484,13 +481,13 @@ int lpc2000_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) int i; working_area_t *download_area; - if (lpc2000_info->target->state != TARGET_HALTED) + if (bank->target->state != TARGET_HALTED) { return ERROR_TARGET_NOT_HALTED; } - + /* allocate a working area */ - if (target_alloc_working_area(target, 4096, &download_area) != ERROR_OK) + if (target_alloc_working_area(target, lpc2000_info->cmd51_max_buffer, &download_area) != ERROR_OK) { ERROR("no working area specified, can't write LPC2000 internal flash"); return ERROR_FLASH_OPERATION_FAILED; @@ -539,8 +536,8 @@ int lpc2000_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) while (bytes_remaining > 0) { u32 thisrun_bytes; - if (bytes_remaining >= 4096) - thisrun_bytes = 4096; + if (bytes_remaining >= lpc2000_info->cmd51_max_buffer) + thisrun_bytes = lpc2000_info->cmd51_max_buffer; else if (bytes_remaining >= 1024) thisrun_bytes = 1024; else if ((bytes_remaining >= 512) || (!lpc2000_info->cmd51_can_256b)) @@ -568,7 +565,7 @@ int lpc2000_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) if (bytes_remaining >= thisrun_bytes) { - if (target_write_buffer(lpc2000_info->target, download_area->address, thisrun_bytes, buffer + bytes_written) != ERROR_OK) + if (target_write_buffer(bank->target, download_area->address, thisrun_bytes, buffer + bytes_written) != ERROR_OK) { target_free_working_area(target, download_area); return ERROR_FLASH_OPERATION_FAILED; @@ -581,7 +578,7 @@ int lpc2000_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) memcpy(last_buffer, buffer + bytes_written, bytes_remaining); for (i = bytes_remaining; i < thisrun_bytes; i++) last_buffer[i] = 0xff; - target_write_buffer(lpc2000_info->target, download_area->address, thisrun_bytes, last_buffer); + target_write_buffer(bank->target, download_area->address, thisrun_bytes, last_buffer); free(last_buffer); } @@ -629,9 +626,7 @@ int lpc2000_probe(struct flash_bank_s *bank) int lpc2000_erase_check(struct flash_bank_s *bank) { - lpc2000_flash_bank_t *lpc2000_info = bank->driver_priv; - - if (lpc2000_info->target->state != TARGET_HALTED) + if (bank->target->state != TARGET_HALTED) { return ERROR_TARGET_NOT_HALTED; } @@ -660,12 +655,10 @@ int lpc2000_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd, u32 param_table[5]; u32 result_table[2]; int status_code; - lpc2000_flash_bank_t *lpc2000_info; if (argc < 1) { - command_print(cmd_ctx, "usage: lpc2000 part_id "); - return ERROR_OK; + return ERROR_COMMAND_SYNTAX_ERROR; } bank = get_flash_bank_by_num(strtoul(args[0], NULL, 0)); @@ -675,8 +668,7 @@ int lpc2000_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd, return ERROR_OK; } - lpc2000_info = bank->driver_priv; - if (lpc2000_info->target->state != TARGET_HALTED) + if (bank->target->state != TARGET_HALTED) { return ERROR_TARGET_NOT_HALTED; }