diff packages/redboot/current/src/flash.c @ 307:906a5d289c6d

Better memory use vis FIS & ZLIB - from Thomas Koeller
author gthomas
date Sat, 24 Aug 2002 11:34:49 +0000
parents 3e80ecaaa3f8
children 113a540ea6db
line wrap: on
line diff
--- a/packages/redboot/current/src/flash.c
+++ b/packages/redboot/current/src/flash.c
@@ -41,7 +41,7 @@
 //#####DESCRIPTIONBEGIN####
 //
 // Author(s):    gthomas
-// Contributors: gthomas
+// Contributors: gthomas, tkoeller
 // Date:         2000-07-28
 // Purpose:      
 // Description:  
@@ -477,7 +477,7 @@ fis_list(int argc, char *argv[])
     {
         return;
     }
-    img = (struct fis_image_desc *)fis_work_block;
+    img = (struct fis_image_desc *) fis_addr;
     // Let diag_printf do the formatting in both cases, rather than counting
     // cols by hand....
     diag_printf("%-16s  %-10s  %-10s  %-10s  %-s\n",
@@ -619,6 +619,7 @@ fis_create(int argc, char *argv[])
         return;
     }
 
+    memcpy(fis_work_block, fis_addr, fisdir_size);
     defaults_assumed = false;
     if (name) {
         // Search existing files to acquire defaults for params not specified:
@@ -819,6 +820,7 @@ fis_delete(int argc, char *argv[])
     num_reserved++;
 #endif
 
+    memcpy(fis_work_block, fis_addr, fisdir_size);
     img = fis_lookup(name, &i);
     if (img) {
         if (i < num_reserved) {
@@ -874,6 +876,7 @@ fis_load(int argc, char *argv[])
         fis_usage("invalid arguments");
         return;
     }
+    memcpy(fis_work_block, fis_addr, fisdir_size);
     if ((img = fis_lookup(name, NULL)) == (struct fis_image_desc *)0) {
         diag_printf("No image '%s' found\n", name);
         return;
@@ -915,6 +918,9 @@ fis_load(int argc, char *argv[])
         // Set load address/top
         load_address = mem_addr;
         load_address_end = (unsigned long)p->out_buf;
+
+    	// Reload fis directory
+	memcpy(fis_work_block, fis_addr, fisdir_size);
     } else // dangling block
 #endif
     {
@@ -1092,6 +1098,7 @@ fis_lock(int argc, char *argv[])
     /* Get parameters from image if specified */
     if (name) {
         struct fis_image_desc *img;
+	memcpy(fis_work_block, fis_addr, fisdir_size);
         if ((img = fis_lookup(name, NULL)) == (struct fis_image_desc *)0) {
             diag_printf("No image '%s' found\n", name);
             return;
@@ -1138,6 +1145,7 @@ fis_unlock(int argc, char *argv[])
 
     if (name) {
         struct fis_image_desc *img;
+	memcpy(fis_work_block, fis_addr, fisdir_size);
         if ((img = fis_lookup(name, NULL)) == (struct fis_image_desc *)0) {
             diag_printf("No image '%s' found\n", name);
             return;
@@ -1190,8 +1198,17 @@ do_flash_init(void)
         flash_get_block_info(&flash_block_size, &flash_num_blocks);
         workspace_end = (unsigned char *)(workspace_end-FLASH_MIN_WORKSPACE);
 #ifdef CYGOPT_REDBOOT_FIS
+# ifdef CYGOPT_REDBOOT_FIS_ZLIB_COMMON_BUFFER
+	fis_work_block = fis_zlib_common_buffer;
+	if(CYGNUM_REDBOOT_FIS_ZLIB_COMMON_BUFFER_SIZE < flash_block_size) {
+            diag_printf("FLASH: common buffer too small\n");
+	    workspace_end += FLASH_MIN_WORKSPACE;
+            return false;
+	}
+# else
         workspace_end = (unsigned char *)(workspace_end-flash_block_size);
         fis_work_block = workspace_end;
+# endif
         fisdir_size = flash_block_size;
         if (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK < 0) {
             fis_addr = (void *)((CYG_ADDRESS)flash_end + 1 +
@@ -1230,9 +1247,6 @@ do_fis(int argc, char *argv[])
         diag_printf("Sorry, no FLASH memory is available\n");
         return;
     }
-#ifdef CYGOPT_REDBOOT_FIS
-    memcpy(fis_work_block, fis_addr, flash_block_size);
-#endif
     if ((cmd = cmd_search(__FIS_cmds_TAB__, &__FIS_cmds_TAB_END__, 
                           argv[1])) != (struct cmd *)0) {
         (cmd->fun)(argc, argv);