[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