[ECOS] Patch for flash

Paul Fine pfine@delcomsys.com
Mon Jan 21 05:50:00 GMT 2002


Attached is my patch to fix the problems I had with the flash io package 
and my flash which is at the high end of memory.  See message

http://sources.redhat.com/ml/ecos-discuss/2002-01/msg00195.html

for the discussion of the problem.


Paul Fine
Delphi Communication Systems, Inc.
-------------- next part --------------
? mypatch.txt
Index: ChangeLog
===================================================================
RCS file: /cvs/ecos/ecos/packages/io/flash/current/ChangeLog,v
retrieving revision 1.21
diff -u -r1.21 ChangeLog
--- ChangeLog	2001/11/02 16:12:34	1.21
+++ ChangeLog	2002/01/18 16:10:03
@@ -1,3 +1,10 @@
+2002-01-18  Paul Fine  <pfine@delcomsys.com>
+
+	* src/flash.c : Modified flash_verify_addr, flash_erase,
+	flash_lock and flash_unlock to to work properly when the location
+	of the flash in the memory map is at the very top of the address
+	space.  We check and handle values that may overflow.
+
 2001-10-28  Gary Thomas  <gthomas@redhat.com>
 
 	* src/flash.c (flash_erase): Don't call hardware layer if block
Index: src/flash.c
===================================================================
RCS file: /cvs/ecos/ecos/packages/io/flash/current/src/flash.c,v
retrieving revision 1.18
diff -u -r1.18 flash.c
--- flash.c	2001/11/02 16:12:34	1.18
+++ flash.c	2002/01/18 16:10:03
@@ -129,7 +129,7 @@
         return FLASH_ERR_NOT_INIT;
     }
     if (((CYG_ADDRESS)target >= (CYG_ADDRESS)flash_info.start) &&
-        ((CYG_ADDRESS)target < (CYG_ADDRESS)flash_info.end)) {
+        ((CYG_ADDRESS)target <= ( ((CYG_ADDRESS)flash_info.end) - 1) )) {
         return FLASH_ERR_OK;
     } else {
         return FLASH_ERR_INVALID;
@@ -196,6 +196,11 @@
     block = (unsigned short *)((CYG_ADDRESS)addr & flash_info.block_mask);
     end_addr = (unsigned short *)((CYG_ADDRESS)addr+len);
 
+    /* Check to see if end_addr overflowed */
+    if( (end_addr < block) && (len > 0) ){
+        end_addr = (unsigned short *) ((CYG_ADDRESS) flash_info.end - 1);
+    }
+
     (*flash_info.pf)("... Erase from %p-%p: ", (void*)block, (void*)end_addr);
 
     HAL_FLASH_CACHES_OFF(d_cache, i_cache);
@@ -205,6 +210,7 @@
         int i;
         unsigned char *dp;
         bool erased = true;
+        unsigned short *tmp_block;
 
         dp = (unsigned char *)block;
         for (i = 0;  i < flash_info.block_size;  i++) {
@@ -220,8 +226,17 @@
         if (stat) {
             *err_addr = (void *)block;
             break;
+        }
+
+        // Check to see if block will overflow
+        tmp_block = block + flash_info.block_size / sizeof(*block);
+        if(tmp_block < block){
+            // If block address overflows, set block value to end on this loop
+            block = end_addr;
         }
-        block += flash_info.block_size / sizeof(*block);
+        else{
+            block = tmp_block;
+        }
         (*flash_info.pf)(".");
     }
     FLASH_Disable(block, end_addr);
@@ -347,18 +362,33 @@
     block = (unsigned short *)((CYG_ADDRESS)addr & flash_info.block_mask);
     end_addr = (unsigned short *)((CYG_ADDRESS)addr+len);
 
+    /* Check to see if end_addr overflowed */
+    if( (end_addr < block) && (len > 0) ){
+        end_addr = (unsigned short *) ((CYG_ADDRESS) flash_info.end - 1);
+    }
+
     (*flash_info.pf)("... Lock from %p-%p: ", block, end_addr);
 
     HAL_FLASH_CACHES_OFF(d_cache, i_cache);
     FLASH_Enable(block, end_addr);
     while (block < end_addr) {
+        unsigned short *tmp_block;
         stat = (*_flash_lock_block)(block);
         stat = flash_hwr_map_error(stat);
         if (stat) {
             *err_addr = (void *)block;
             break;
         }
-        block += flash_info.block_size / sizeof(*block);
+
+        // Check to see if block will overflow
+        tmp_block = block + flash_info.block_size / sizeof(*block);
+        if(tmp_block < block){
+            // If block address overflows, set block value to end on this loop
+            block = end_addr;
+        }
+        else{
+            block = tmp_block;
+        }
         (*flash_info.pf)(".");
     }
     FLASH_Disable(block, end_addr);
@@ -404,18 +434,32 @@
     block = (unsigned short *)((CYG_ADDRESS)addr & flash_info.block_mask);
     end_addr = (unsigned short *)((CYG_ADDRESS)addr+len);
 
+    /* Check to see if end_addr overflowed */
+    if( (end_addr < block) && (len > 0) ){
+        end_addr = (unsigned short *) ((CYG_ADDRESS) flash_info.end - 1);
+    }
+
     (*flash_info.pf)("... Unlock from %p-%p: ", block, end_addr);
 
     HAL_FLASH_CACHES_OFF(d_cache, i_cache);
     FLASH_Enable(block, end_addr);
     while (block < end_addr) {
+        unsigned short *tmp_block;
         stat = (*_flash_unlock_block)(block, flash_info.block_size, flash_info.blocks);
         stat = flash_hwr_map_error(stat);
         if (stat) {
             *err_addr = (void *)block;
             break;
+        }
+
+        tmp_block = block + flash_info.block_size / sizeof(*block);
+        if(tmp_block < block){
+            // If block address overflows, set block value to end on this loop
+            block = end_addr;
+        }
+        else{
+            block = tmp_block;
         }
-        block += flash_info.block_size / sizeof(*block);
         (*flash_info.pf)(".");
     }
     FLASH_Disable(block, end_addr);


More information about the Ecos-discuss mailing list