Mercurial > flash_v2
diff packages/redboot/current/src/flash.c @ 179:391299f9e541
Merge from eCos master repository on 2001-08-17-16:31:54-BST
| author | jlarmour |
|---|---|
| date | Fri, 17 Aug 2001 16:37:36 +0000 |
| parents | 4c750ce71ae3 |
| children | f62680ef1804 |
line wrap: on
line diff
--- a/packages/redboot/current/src/flash.c +++ b/packages/redboot/current/src/flash.c @@ -418,7 +418,7 @@ fis_find_free(unsigned long *addr, unsig if (*fis_ptr != (unsigned long)0xFFFFFFFF) { if (area_start != fis_ptr) { // Assume that this is something - if ((fis_ptr-area_start) >= length) { + if ((fis_ptr-area_start) >= (length/sizeof(unsigned))) { *addr = (unsigned long)area_start; return true; } @@ -437,7 +437,7 @@ fis_find_free(unsigned long *addr, unsig } } if (area_start != fis_ptr) { - if ((fis_ptr-area_start) >= length) { + if ((fis_ptr-area_start) >= (length/sizeof(unsigned))) { *addr = (unsigned long)area_start; return true; } @@ -462,7 +462,7 @@ fis_create(int argc, char *argv[]) struct fis_image_desc *img; bool slot_found, defaults_assumed; struct option_info opts[7]; - bool prog_ok; + bool prog_ok = false; init_opts(&opts[0], 'b', true, OPTION_ARG_TYPE_NUM, (void **)&mem_addr, (bool *)&mem_addr_set, "memory base address"); @@ -553,7 +553,7 @@ fis_create(int argc, char *argv[]) printf(" valid range is %p-%p\n", (void *)ram_start, (void *)ram_end); } if (!flash_addr_set && !fis_find_free(&flash_addr, length)) { - printf("Can't locate %ld bytes free in FLASH\n", length); + printf("Can't locate %lx(%ld) bytes free in FLASH\n", length, length); return; } } @@ -620,34 +620,36 @@ fis_create(int argc, char *argv[]) } } } - // Update directory - memset(img, 0, sizeof(*img)); - strcpy(img->name, name); - img->flash_base = flash_addr; - img->mem_base = exec_addr_set ? exec_addr : (flash_addr_set ? flash_addr : mem_addr); - img->entry_point = entry_addr_set ? entry_addr : (unsigned long)entry_address; // Hope it's been set - img->size = length; - img->data_length = img_size; + if (prog_ok) { + // Update directory + memset(img, 0, sizeof(*img)); + strcpy(img->name, name); + img->flash_base = flash_addr; + img->mem_base = exec_addr_set ? exec_addr : (flash_addr_set ? flash_addr : mem_addr); + img->entry_point = entry_addr_set ? entry_addr : (unsigned long)entry_address; // Hope it's been set + img->size = length; + img->data_length = img_size; #ifdef CYGSEM_REDBOOT_FIS_CRC_CHECK - img->file_cksum = crc32((unsigned char *)flash_addr, img_size); + img->file_cksum = crc32((unsigned char *)flash_addr, img_size); #endif #ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL - // Insure [quietly] that the directory is unlocked before trying to update - flash_unlock((void *)fis_addr, block_size, (void **)&err_addr); + // Insure [quietly] that the directory is unlocked before trying to update + flash_unlock((void *)fis_addr, block_size, (void **)&err_addr); #endif - if ((stat = flash_erase((void *)fis_addr, block_size, (void **)&err_addr)) != 0) { - printf("Error erasing at %p: %s\n", err_addr, flash_errmsg(stat)); - // Don't try to program if the erase failed - } else { - // Now program it - if ((stat = flash_program((void *)fis_addr, (void *)fis_work_block, block_size, (void **)&err_addr)) != 0) { - printf("Error programming at %p: %s\n", err_addr, flash_errmsg(stat)); + if ((stat = flash_erase((void *)fis_addr, block_size, (void **)&err_addr)) != 0) { + printf("Error erasing at %p: %s\n", err_addr, flash_errmsg(stat)); + // Don't try to program if the erase failed + } else { + // Now program it + if ((stat = flash_program((void *)fis_addr, (void *)fis_work_block, block_size, (void **)&err_addr)) != 0) { + printf("Error programming at %p: %s\n", err_addr, flash_errmsg(stat)); + } } +#ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL + // Insure [quietly] that the directory is locked after the update + flash_lock((void *)fis_addr, block_size, (void **)&err_addr); +#endif } -#ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL - // Insure [quietly] that the directory is locked after the update - flash_lock((void *)fis_addr, block_size, (void **)&err_addr); -#endif } static void @@ -707,26 +709,27 @@ fis_delete(int argc, char *argv[]) // Erase Data blocks (free space) if ((stat = flash_erase((void *)img->flash_base, img->size, (void **)&err_addr)) != 0) { printf("Error erasing at %p: %s\n", err_addr, flash_errmsg(stat)); - } + } else { #ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL - // Insure [quietly] that the directory is unlocked before trying to update - flash_unlock((void *)fis_addr, block_size, (void **)&err_addr); + // Insure [quietly] that the directory is unlocked before trying to update + flash_unlock((void *)fis_addr, block_size, (void **)&err_addr); #endif - // Update directory - memset(img, 0xFF, sizeof(*img)); - if ((stat = flash_erase((void *)fis_addr, block_size, (void **)&err_addr)) != 0) { - printf("Error erasing at %p: %s\n", err_addr, flash_errmsg(stat)); - // Don't try to program if the erase failed - } else { - // Now program it - if ((stat = flash_program((void *)fis_addr, (void *)fis_work_block, block_size, (void **)&err_addr)) != 0) { - printf("Error programming at %p: %s\n", err_addr, flash_errmsg(stat)); + // Update directory + memset(img, 0xFF, sizeof(*img)); + if ((stat = flash_erase((void *)fis_addr, block_size, (void **)&err_addr)) != 0) { + printf("Error erasing at %p: %s\n", err_addr, flash_errmsg(stat)); + // Don't try to program if the erase failed + } else { + // Now program it + if ((stat = flash_program((void *)fis_addr, (void *)fis_work_block, block_size, (void **)&err_addr)) != 0) { + printf("Error programming at %p: %s\n", err_addr, flash_errmsg(stat)); + } } +#ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL + // Insure [quietly] that the directory is locked after the update + flash_lock((void *)fis_addr, block_size, (void **)&err_addr); +#endif } -#ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL - // Insure [quietly] that the directory is locked after the update - flash_lock((void *)fis_addr, block_size, (void **)&err_addr); -#endif } static void @@ -752,7 +755,7 @@ fis_load(int argc, char *argv[]) (void **)&show_cksum, (bool *)0, "display checksum"); num_options = 2; #ifdef CYGPKG_COMPRESS_ZLIB - init_opts(&opts[2], 'd', false, OPTION_ARG_TYPE_FLG, + init_opts(&opts[num_options], 'd', false, OPTION_ARG_TYPE_FLG, (void **)&decompress, 0, "decompress"); num_options++; #endif @@ -877,7 +880,7 @@ fis_write(int argc, char *argv[]) printf("Can't program this region - contains code in use!\n"); return; } - if (!verify_action("* CAUTION * about to program FLASH at %p..%p from %p", + if (!verify_action("* CAUTION * about to program FLASH\n at %p..%p from %p", (void *)flash_addr, (void *)(flash_addr+length-1), (void *)mem_addr)) { return; // The guy gave up @@ -1851,7 +1854,7 @@ load_flash_config(void) #define _roundup(n,s) ((((n)+(s-1))/s)*s) cfg_size = (block_size > sizeof(config)) ? sizeof(config) : _roundup(sizeof(config), block_size); - cfg_base = (void *)((unsigned long)flash_end - (cfg_size+fisdir_size)); + cfg_base = (void *)((unsigned long)flash_end - _roundup(cfg_size+fisdir_size, block_size)); memcpy(&config, cfg_base, sizeof(config)); if ((crc32((unsigned char *)&config, sizeof(config)-sizeof(config.cksum)) != config.cksum) || (config.key1 != CONFIG_KEY1)|| (config.key2 != CONFIG_KEY2)) {
