#endif
#ifdef CYGHWR_IO_FLASH_BLOCK_LOCKING
if (do_autolock)
- flash_unlock((void *)fis_addr, blk_size, &err_addr);
+ flash_unlock((void *)fis_addr, blk_size, &err_addr);
#endif
if ((stat = flash_erase(fis_addr, flash_block_size, &err_addr)) != 0) {
diag_printf("Error erasing FIS directory at %p: %s\n", err_addr, flash_errmsg(stat));
unsigned long *area_start;
void *err_addr;
+ FLASH_Enable(flash_start, flash_end);
// Do not search the area reserved for pre-RedBoot systems:
fis_ptr = (unsigned long *)((CYG_ADDRESS)flash_start +
CYGNUM_REDBOOT_FLASH_RESERVED_BASE);
diag_printf(" 0x%08x .. 0x%08x\n",
(CYG_ADDRESS)area_start, (CYG_ADDRESS)fis_ptr);
}
+ FLASH_Disable(flash_start, flash_end);
#else
struct free_chunk chunks[CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS];
int idx, num_chunks;
fis_ptr = (unsigned long *)((CYG_ADDRESS)flash_start +
CYGNUM_REDBOOT_FLASH_RESERVED_BASE);
fis_end = (unsigned long *)(CYG_ADDRESS)flash_end;
+ FLASH_Enable(fis_ptr, fis_end);
area_start = fis_ptr;
while (fis_ptr < fis_end) {
flash_read(fis_ptr, &flash_data, sizeof(unsigned long), &err_addr);
if (flash_data != 0xFFFFFFFF) {
if (area_start != fis_ptr) {
// Assume that this is something
- if ((fis_ptr - area_start) >= (length/sizeof(unsigned))) {
+ if ((fis_ptr - area_start) >= (length / sizeof(unsigned))) {
*addr = (CYG_ADDRESS)area_start;
return true;
}
fis_ptr += flash_block_size / sizeof(CYG_ADDRESS);
}
}
+ FLASH_Disable((void *)((CYG_ADDRESS)flash_start +
+ CYGNUM_REDBOOT_FLASH_RESERVED_BASE), fis_end);
if (area_start != fis_ptr) {
if (fis_ptr - area_start >= length / sizeof(unsigned)) {
*addr = (CYG_ADDRESS)area_start;
return;
}
if (strlen(name) >= sizeof(img->u.name)) {
- diag_printf("Name is too long, must be less than %d chars\n", sizeof(img->u.name));
- return;
+ diag_printf("Name is too long, must be less than %d chars\n",
+ sizeof(img->u.name));
+ return;
}
if (!no_copy) {
if ((mem_addr < (CYG_ADDRESS)ram_start) ||
if (defaults_assumed) {
if (no_copy &&
!verify_action("* CAUTION * about to program '%s'\n at %p..%p from %p",
- name, (void *)flash_addr, (void *)(flash_addr+img_size-1),
+ name, (void *)flash_addr,
+ (void *)(flash_addr + img_size - 1),
(void *)mem_addr)) {
return; // The guy gave up
}
}
} else {
#ifdef CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS
- // Make sure that any FLASH address specified directly is truly free
- if (flash_addr_set && !no_copy) {
- struct free_chunk chunks[CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS];
- int idx, num_chunks;
- bool is_free = false;
-
- num_chunks = find_free(chunks);
- for (idx = 0; idx < num_chunks; idx++) {
- if ((flash_addr >= chunks[idx].start) &&
- ((flash_addr+length-1) <= chunks[idx].end)) {
- is_free = true;
+ // Make sure that any FLASH address specified directly is truly free
+ if (flash_addr_set && !no_copy) {
+ struct free_chunk chunks[CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS];
+ int idx, num_chunks;
+ bool is_free = false;
+
+ num_chunks = find_free(chunks);
+ for (idx = 0; idx < num_chunks; idx++) {
+ if ((flash_addr >= chunks[idx].start) &&
+ ((flash_addr + length - 1) <= chunks[idx].end)) {
+ is_free = true;
+ }
+ }
+ if (!is_free) {
+ diag_printf("Invalid FLASH address - not free!\n");
+ return;
+ }
}
- }
- if (!is_free) {
- diag_printf("Invalid FLASH address - not free!\n");
- return;
- }
- }
#endif
- // If not image by that name, try and find an empty slot
- img = fis_work_block;
- for (i = 0; i < fisdir_size/sizeof(*img); i++, img++) {
- if (img->u.name[0] == 0xFF) {
- break;
- }
- }
- if (i >= fisdir_size/sizeof(*img)) {
+ // If not image by that name, try and find an empty slot
+ img = fis_work_block;
+ for (i = 0; i < fisdir_size / sizeof(*img); i++, img++) {
+ if (img->u.name[0] == 0xFF) {
+ break;
+ }
+ }
+ if (i >= fisdir_size / sizeof(*img)) {
diag_printf("Can't find an empty slot in FIS directory!\n");
return;
}
}
if (!no_copy) {
// Safety check - make sure the address range is not within the code we're running
- if (flash_code_overlaps((void *)flash_addr, (void *)(flash_addr+img_size-1))) {
+ if (flash_code_overlaps((void *)flash_addr,
+ (void *)(flash_addr + img_size - 1))) {
diag_printf("Can't program this region - contains code in use!\n");
return;
}
}
if (prog_ok) {
// Now program it
- if ((stat = FLASH_PROGRAM((void *)flash_addr, (void *)mem_addr, img_size, &err_addr)) != 0) {
+ FLASH_Enable((void *)flash_addr, (void *)(flash_addr + length));
+ stat = FLASH_PROGRAM((void *)flash_addr, (void *)mem_addr,
+ img_size, &err_addr);
+ FLASH_Disable((void *)flash_addr, (void *)(flash_addr + length));
+ if (stat != 0) {
diag_printf("Can't program region at %p: %s\n", err_addr, flash_errmsg(stat));
prog_ok = false;
}
}
}
if (prog_ok) {
- // Update directory
- memset(img, 0, sizeof(*img));
- strcpy(img->u.name, name);
- img->flash_base = flash_addr;
- img->mem_base = exec_addr_set ? exec_addr : (mem_addr_set ? mem_addr : flash_addr);
- img->entry_point = entry_addr_set ? entry_addr : (CYG_ADDRESS)entry_address; // Hope it's been set
- img->size = length;
- img->data_length = img_size;
+ // Update directory
+ memset(img, 0, sizeof(*img));
+ strcpy(img->u.name, name);
+ img->flash_base = flash_addr;
+ img->mem_base = exec_addr_set ? exec_addr : (mem_addr_set ? mem_addr : flash_addr);
+ img->entry_point = entry_addr_set ? entry_addr : (CYG_ADDRESS)entry_address; // Hope it's been set
+ img->size = length;
+ img->data_length = img_size;
#ifdef CYGSEM_REDBOOT_FIS_CRC_CHECK
if (!no_copy) {
img->file_cksum = cyg_crc32((unsigned char *)mem_addr, img_size);
img->file_cksum = 0;
}
#endif
- fis_start_update_directory(0);
- fis_update_directory(0, 0);
+ fis_start_update_directory(0);
+ fis_update_directory(0, 0);
}
}
} else // dangling block
#endif
{
- if (flash_read((void *)img->flash_base, (void *)mem_addr,
- img->data_length, &err_addr) != FLASH_ERR_OK) {
+ int err;
+
+ FLASH_Enable((void *)img->flash_base, (void *)(img->flash_base + img->size));
+ err = flash_read((void *)img->flash_base, (void *)mem_addr,
+ img->data_length, &err_addr);
+ FLASH_Disable((void *)img->flash_base, (void *)(img->flash_base + img->size));
+ if (err != FLASH_ERR_OK) {
diag_printf("** Error: Failed to load image from flash\n");
return;
}
return;
}
if ((mem_addr < (CYG_ADDRESS)ram_start) ||
- ((mem_addr+length) >= (CYG_ADDRESS)ram_end)) {
+ ((mem_addr + length) >= (CYG_ADDRESS)ram_end)) {
diag_printf("** WARNING: RAM address: %p may be invalid\n", (void *)mem_addr);
diag_printf(" valid range is %p-%p\n", (void *)ram_start, (void *)ram_end);
}
}
if (prog_ok) {
// Now program it
- if ((stat = FLASH_PROGRAM((void *)flash_addr, (void *)mem_addr, length, &err_addr)) != 0) {
+ stat = FLASH_PROGRAM((void *)flash_addr, (void *)mem_addr, length, &err_addr);
+ if (stat != 0) {
diag_printf("Can't program region at %p: %s\n", err_addr, flash_errmsg(stat));
prog_ok = false;
}
&flash_addr, &flash_addr_set, "FLASH memory base address");
init_opts(&opts[1], 'l', true, OPTION_ARG_TYPE_NUM,
&length, &length_set, "length");
- if (!scan_opts(argc, argv, 2, opts, 2, &name, OPTION_ARG_TYPE_STR, "image name"))
- {
- fis_usage("invalid arguments");
- return;
- }
+ if (!scan_opts(argc, argv, 2, opts, 2, &name, OPTION_ARG_TYPE_STR, "image name")) {
+ fis_usage("invalid arguments");
+ return;
+ }
#ifdef CYGOPT_REDBOOT_FIS
/* Get parameters from image if specified */
if (name) {
return;
}
- flash_addr = img->flash_base;
- length = img->size;
+ flash_addr = img->flash_base;
+ length = img->size;
} else
#endif
if (!flash_addr_set || !length_set) {
&flash_addr, &flash_addr_set, "FLASH memory base address");
init_opts(&opts[1], 'l', true, OPTION_ARG_TYPE_NUM,
&length, &length_set, "length");
- if (!scan_opts(argc, argv, 2, opts, 2, &name, OPTION_ARG_TYPE_STR, "image name"))
- {
- fis_usage("invalid arguments");
- return;
- }
+ if (!scan_opts(argc, argv, 2, opts, 2, &name, OPTION_ARG_TYPE_STR, "image name")) {
+ fis_usage("invalid arguments");
+ return;
+ }
#ifdef CYGOPT_REDBOOT_FIS
if (name) {
struct fis_image_desc *img;
return;
}
- flash_addr = img->flash_base;
- length = img->size;
+ flash_addr = img->flash_base;
+ length = img->size;
} else
#endif
if (!flash_addr_set || !length_set) {