diff packages/redboot/current/src/flash.c @ 143:6b5f480c6929 ecos-sw-2000-12-08

Merge from eCos master repository on 2000-12-08-02:09:36-GMT
author jlarmour
date Fri, 08 Dec 2000 03:30:06 +0000
parents 289bf90c6a9b
children 2e9a636d9de9
line wrap: on
line diff
--- a/packages/redboot/current/src/flash.c
+++ b/packages/redboot/current/src/flash.c
@@ -114,7 +114,8 @@ local_cmd_entry("load",
     );
 local_cmd_entry("create",
                 "Create an image",
-                "-b <mem_base> -l <image_length> [-s <data_length>] [-f <flash_addr>] [-e <entry_point>] [-r <ram_addr>] <name>",
+                "-b <mem_base> -l <image_length> [-s <data_length>] 
+                [-f <flash_addr>] [-e <entry_point>] [-r <ram_addr>] [-n] <name>",
                 fis_create,
                 FIS_cmds
     );
@@ -197,7 +198,7 @@ fis_init(int argc, char *argv[])
     if (full_init) {
         if ((stat = flash_erase((void *)((unsigned long)flash_start+(2*block_size)), 
                                 (blocks-4)*block_size, (void **)&err_addr)) != 0) {
-            printf("   initialization failed %p: %x(%s)\n", err_addr, stat, flash_errmsg(stat));
+            printf("   initialization failed %p: 0x%x(%s)\n", err_addr, stat, flash_errmsg(stat));
         }
     } else {
         printf("    Warning: device contents not erased, some blocks may not be usable\n");
@@ -242,11 +243,11 @@ fis_init(int argc, char *argv[])
     flash_unlock((void *)fis_base, block_size, (void **)&err_addr);
 #endif
     if ((stat = flash_erase(fis_base, block_size, (void **)&err_addr)) != 0) {
-            printf("   initialization failed %p: %x(%s)\n", err_addr, stat, flash_errmsg(stat));
+            printf("   initialization failed %p: 0x%x(%s)\n", err_addr, stat, flash_errmsg(stat));
     } else {
         if ((stat = flash_program(fis_base, fis_work_block, 
                                   img_count*sizeof(*img), (void **)&err_addr)) != 0) {
-            printf("Error writing image descriptors at %p: %x(%s)\n", 
+            printf("Error writing image descriptors at %p: 0x%x(%s)\n", 
                    err_addr, stat, flash_errmsg(stat));
         }
     }
@@ -373,10 +374,11 @@ fis_create(int argc, char *argv[])
     bool flash_addr_set = false;
     bool length_set = false;
     bool img_size_set = false;
+    bool no_copy = false;
     void *fis_addr, *err_addr;
     struct fis_image_desc *img;
     bool slot_found;
-    struct option_info opts[6];
+    struct option_info opts[7];
     bool prog_ok;
 
     init_opts(&opts[0], 'b', true, OPTION_ARG_TYPE_NUM, 
@@ -391,13 +393,16 @@ fis_create(int argc, char *argv[])
               (void **)&length, (bool *)&length_set, "image length [in FLASH]");
     init_opts(&opts[5], 's', true, OPTION_ARG_TYPE_NUM, 
               (void **)&img_size, (bool *)&img_size_set, "image size [actual data]");
-    if (!scan_opts(argc, argv, 2, opts, 6, (void *)&name, OPTION_ARG_TYPE_STR, "file name"))
+    init_opts(&opts[6], 'n', false, OPTION_ARG_TYPE_FLG, 
+              (void **)&no_copy, (bool *)0, "don't copy from RAM to FLASH, just update directory");
+    if (!scan_opts(argc, argv, 2, opts, 7, (void *)&name, OPTION_ARG_TYPE_STR, "file name"))
     {
         fis_usage("invalid arguments");
         return;
     }
 
-    if (!mem_addr_set || !length_set || !name) {
+    if ((!no_copy && !mem_addr_set) || (no_copy && !flash_addr_set) ||
+        !length_set || !name) {
         fis_usage("required parameter missing");
         return;
     }
@@ -406,11 +411,13 @@ fis_create(int argc, char *argv[])
     }
     // 'length' is size of FLASH image, 'img_size' is actual data size
     // Round up length to FLASH block size
+#ifndef CYGPKG_HAL_MIPS // FIXME: compiler is b0rken
     length = ((length + block_size - 1) / block_size) * block_size;
     if (length < img_size) {
-        printf("Invalid FLASH image size/length combination");
+        printf("Invalid FLASH image size/length combination\n");
         return;
     }
+#endif
     if (flash_addr_set &&
         ((stat = flash_verify_addr((void *)flash_addr)) ||
          (stat = flash_verify_addr((void *)(flash_addr+img_size-1))))) {
@@ -418,18 +425,20 @@ fis_create(int argc, char *argv[])
         printf("   valid range is %p-%p\n", (void *)flash_start, (void *)flash_end);
         return;
     }
-    if ((mem_addr < (unsigned long)ram_start) ||
-        ((mem_addr+img_size) >= (unsigned long)ram_end)) {
-        printf("** WARNING: RAM address: %p may be invalid\n", (void *)mem_addr);
-        printf("   valid range is %p-%p\n", (void *)ram_start, (void *)ram_end);
-    }
     if (strlen(name) >= sizeof(img->name)) {
         printf("Name is too long, must be less than %d chars\n", (int)sizeof(img->name));
         return;
     }
-    if (!flash_addr_set && !fis_find_free(&flash_addr, length)) {
-        printf("Can't locate %ld bytes free in FLASH\n", length);
-        return;
+    if (!no_copy) {
+        if ((mem_addr < (unsigned long)ram_start) ||
+            ((mem_addr+img_size) >= (unsigned long)ram_end)) {
+            printf("** WARNING: RAM address: %p may be invalid\n", (void *)mem_addr);
+            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);
+            return;
+        }
     }
     // Find a slot in the directory for this entry
     // First, see if an image by this name is already present
@@ -444,7 +453,7 @@ fis_create(int argc, char *argv[])
                 return;
             }
             if (img->size != length) {
-                printf("Image found, but LENGTH is incorrect (0x%x != 0x%x)\n", img->size, length);
+                printf("Image found, but LENGTH is incorrect (0x%lx != 0x%lx)\n", img->size, length);
                 return;
             }
             if (!verify_action("An image named '%s' exists", name)) {
@@ -465,24 +474,26 @@ fis_create(int argc, char *argv[])
             }
         }
     }
-    // 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))) {
-        printf("Can't program this region - contains code in use!\n");
-        return;
-    }
-    prog_ok = true;
-    if (prog_ok) {
-        // Erase area to be programmed
-        if ((stat = flash_erase((void *)flash_addr, length, (void **)&err_addr)) != 0) {
-            printf("Can't erase region at %p: %x(%s)\n", err_addr, stat, flash_errmsg(stat));
-            prog_ok = false;
+    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))) {
+            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, (void **)&err_addr)) != 0) {
-            printf("Can't program region at %p: %x(%s)\n", err_addr, stat, flash_errmsg(stat));
-            prog_ok = false;
+        prog_ok = true;
+        if (prog_ok) {
+            // Erase area to be programmed
+            if ((stat = flash_erase((void *)flash_addr, length, (void **)&err_addr)) != 0) {
+                printf("Can't erase region at %p: 0x%x(%s)\n", err_addr, stat, flash_errmsg(stat));
+                prog_ok = false;
+            }
+        }
+        if (prog_ok) {
+            // Now program it
+            if ((stat = flash_program((void *)flash_addr, (void *)mem_addr, img_size, (void **)&err_addr)) != 0) {
+                printf("Can't program region at %p: 0x%x(%s)\n", err_addr, stat, flash_errmsg(stat));
+                prog_ok = false;
+            }
         }
     }
     // Update directory
@@ -493,18 +504,18 @@ fis_create(int argc, char *argv[])
     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;
-    img->file_cksum = _cksum((unsigned long *)mem_addr, img_size);
+    img->file_cksum = _cksum((unsigned long *)flash_addr, img_size);
 #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);
 #endif
     if ((stat = flash_erase((void *)fis_addr, block_size, (void **)&err_addr)) != 0) {
-        printf("Error erasing at %p: %x(%s)\n", err_addr, stat, flash_errmsg(stat));
+        printf("Error erasing at %p: 0x%x(%s)\n", err_addr, stat, 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: %x(%s)\n", err_addr, stat, flash_errmsg(stat));
+            printf("Error programming at %p: 0x%x(%s)\n", err_addr, stat, flash_errmsg(stat));
         }
     }
 #ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL
@@ -550,7 +561,7 @@ fis_erase(int argc, char *argv[])
         return;
     }
     if ((stat = flash_erase((void *)flash_addr, length, (void **)&err_addr)) != 0) {
-        printf("Error erasing at %p: %x(%s)\n", err_addr, stat, flash_errmsg(stat));
+        printf("Error erasing at %p: 0x%x(%s)\n", err_addr, stat, flash_errmsg(stat));
     }
 }
 
@@ -588,7 +599,7 @@ fis_lock(int argc, char *argv[])
         return;
     }
     if ((stat = flash_lock((void *)flash_addr, length, (void **)&err_addr)) != 0) {
-        printf("Error locking at %p: %x(%s)\n", err_addr, stat, flash_errmsg(stat));
+        printf("Error locking at %p: 0x%x(%s)\n", err_addr, stat, flash_errmsg(stat));
     }
 }
 
@@ -624,7 +635,7 @@ fis_unlock(int argc, char *argv[])
         return;
     }
     if ((stat = flash_unlock((void *)flash_addr, length, (void **)&err_addr)) != 0) {
-        printf("Error unlocking at %p: %x(%s)\n", err_addr, stat, flash_errmsg(stat));
+        printf("Error unlocking at %p: 0x%x(%s)\n", err_addr, stat, flash_errmsg(stat));
     }
 }
 #endif
@@ -665,7 +676,7 @@ 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: %x(%s)\n", err_addr, stat, flash_errmsg(stat));
+        printf("Error erasing at %p: 0x%x(%s)\n", err_addr, stat, flash_errmsg(stat));
     }
 #ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL
     // Insure [quietly] that the directory is unlocked before trying to update
@@ -674,12 +685,12 @@ fis_delete(int argc, char *argv[])
     // 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: %x(%s)\n", err_addr, stat, flash_errmsg(stat));
+        printf("Error erasing at %p: 0x%x(%s)\n", err_addr, stat, 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: %x(%s)\n", err_addr, stat, flash_errmsg(stat));
+            printf("Error programming at %p: 0x%x(%s)\n", err_addr, stat, flash_errmsg(stat));
         }
     }
 #ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL
@@ -697,6 +708,7 @@ fis_load(int argc, char *argv[])
     bool mem_addr_set = false;
     bool show_cksum = false;
     struct option_info opts[2];
+    unsigned long cksum;
 
     init_opts(&opts[0], 'b', true, OPTION_ARG_TYPE_NUM, 
               (void **)&mem_addr, (bool *)&mem_addr_set, "memory [load] base address");
@@ -722,15 +734,15 @@ fis_load(int argc, char *argv[])
     }
     memcpy((void *)mem_addr, (void *)img->flash_base, img->size);
     entry_address = (unsigned long *)img->entry_point;
+    cksum = _cksum((unsigned long *)mem_addr, img->data_length);
+    if (show_cksum) {
+        printf("Checksum: 0x%08lx\n", cksum);
+    }
     if (img->file_cksum) {
-        unsigned long cksum = _cksum((unsigned long *)mem_addr, img->data_length);
         if (cksum != img->file_cksum) {
-            printf("** Warning - checksum failure.  stored: %08lx, computed: %08lx\n",
+            printf("** Warning - checksum failure.  stored: 0x%08lx, computed: 0x%08lx\n",
                    img->file_cksum, cksum);
         }
-        if (show_cksum) {
-            printf("Checksum: %08lx\n", cksum);
-        }
     }
 }
 
@@ -744,7 +756,7 @@ do_flash_init(void)
         init = 1;
         if ((stat = flash_init((void *)(ram_end-FLASH_MIN_WORKSPACE), 
                                FLASH_MIN_WORKSPACE)) != 0) {
-            printf("FLASH: driver init failed!, status: %x\n", stat);
+            printf("FLASH: driver init failed!, status: 0x%x\n", stat);
             return false;
         }
         flash_get_limits((void *)0, (void **)&flash_start, (void **)&flash_end);
@@ -1078,11 +1090,11 @@ do_flash_config(int argc, char *argv[])
         flash_unlock((void *)cfg_base, block_size, (void **)&err_addr);
 #endif
         if ((stat = flash_erase(cfg_base, block_size, (void **)&err_addr)) != 0) {
-            printf("   initialization failed %p: %x(%s)\n", err_addr, stat, flash_errmsg(stat));
+            printf("   initialization failed %p: 0x%x(%s)\n", err_addr, stat, flash_errmsg(stat));
         } else {
             if ((stat = flash_program(cfg_base, (void *)&config, 
                                       sizeof(config), (void **)&err_addr)) != 0) {
-                printf("Error writing config data at %p: %x(%s)\n", 
+                printf("Error writing config data at %p: 0x%x(%s)\n", 
                        err_addr, stat, flash_errmsg(stat));
             }
         }