changeset 1213:2ad59a585529

Improvements from Jani Monoses
author gthomas
date Thu, 11 Sep 2003 13:21:39 +0000
parents 4530b1bd4c45
children 349e2eadf98d
files packages/devs/flash/intel/strata/current/ChangeLog packages/devs/flash/intel/strata/current/src/flash_erase_block.c packages/devs/flash/intel/strata/current/src/flash_program_buf.c
diffstat 3 files changed, 20 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/packages/devs/flash/intel/strata/current/ChangeLog
+++ b/packages/devs/flash/intel/strata/current/ChangeLog
@@ -1,3 +1,11 @@
+2003-09-11  Jani Monoses <jani@iv.ro>
+
+	* src/flash_erase_block.c (flash_erase_block): 
+	* src/flash_program_buf.c (flash_program_buf): Fix bootblock handling
+	in erase. Fix erase and word-program for Synchronous Strata and later
+	chips where block address and word address are required in the first
+	cycle of the operation while for earlier parts any address was good.
+	
 2003-09-10  Jani Monoses <jani@iv.ro>
 	
 	* cdl/flash_strata.cdl:
--- a/packages/devs/flash/intel/strata/current/src/flash_erase_block.c
+++ b/packages/devs/flash/intel/strata/current/src/flash_erase_block.c
@@ -55,7 +55,7 @@
 #include <pkgconf/hal.h>
 #include <cyg/hal/hal_arch.h>
 
-int flash_erase_block(volatile flash_t *block, unsigned int block_size) 
+int flash_erase_block(volatile flash_t *block, unsigned int block_size)
 	__attribute__ ((section (".2ram.flash_erase_block")));
 int flash_erase_block(volatile flash_t *block, unsigned int block_size)
 {
@@ -73,8 +73,7 @@ int flash_erase_block(volatile flash_t *
 #ifdef CYGOPT_FLASH_IS_BOOTBLOCK
 #define BLOCKSIZE (0x10000*CYGNUM_FLASH_DEVICES)
 #define ERASE_BLOCKSIZE (0x2000*CYGNUM_FLASH_DEVICES)
-    if ((eb - ROM) < BLOCKSIZE) {
-// FIXME - Handle 'boot' blocks
+    if ((eb - ROM) < BLOCKSIZE/(sizeof eb[0])) {
         erase_block_size = ERASE_BLOCKSIZE;
     } else {
         erase_block_size = block_size;
@@ -88,12 +87,14 @@ int flash_erase_block(volatile flash_t *
 
     // Erase block
     while (block_len > 0) {
-        ROM[0] = FLASH_Block_Erase;
-        *eb = FLASH_Confirm;
+        eb[0] = FLASH_Block_Erase;
+        eb[0] = FLASH_Confirm;
+	
         timeout = 5000000;
-        while(((stat = ROM[0]) & FLASH_Status_Ready) != FLASH_Status_Ready) {
+        while(((stat = eb[0]) & FLASH_Status_Ready) != FLASH_Status_Ready) {
             if (--timeout == 0) break;
         }
+
         block_len -= erase_block_size;
         eb = FLASH_P2V((unsigned int)eb + erase_block_size);
     }
--- a/packages/devs/flash/intel/strata/current/src/flash_program_buf.c
+++ b/packages/devs/flash/intel/strata/current/src/flash_program_buf.c
@@ -73,8 +73,7 @@ flash_program_buf(volatile flash_t *addr
 
     // Get base address and map addresses to virtual addresses
     ROM = FLASH_P2V( CYGNUM_FLASH_BASE_MASK & (unsigned int)addr );
-    BA = FLASH_P2V( block_mask & (unsigned int)addr );
-    addr = FLASH_P2V(addr);
+    BA = addr = FLASH_P2V(addr);
 
     // Clear any error conditions
     ROM[0] = FLASH_Clear_Status;
@@ -128,14 +127,14 @@ flash_program_buf(volatile flash_t *addr
 #endif
 
     while (len > 0) {
-        ROM[0] = FLASH_Program;
+        BA[0] = FLASH_Program;
 #ifdef CYGHWR_FLASH_WRITE_ELEM
         CYGHWR_FLASH_WRITE_ELEM(addr, data);
 #else
         *addr = *data;
 #endif
         timeout = 5000000;
-        while(((stat = ROM[0]) & FLASH_Status_Ready) != FLASH_Status_Ready) {
+        while(((stat = BA[0]) & FLASH_Status_Ready) != FLASH_Status_Ready) {
             if (--timeout == 0) {
                 goto bad;
             }
@@ -143,7 +142,7 @@ flash_program_buf(volatile flash_t *addr
         if (stat & FLASH_ErrorMask) {
             break;
         }
-        ROM[0] = FLASH_Reset;            
+        BA[0] = FLASH_Reset;            
         if (*addr++ != *data++) {
             stat = FLASH_ErrorNotVerified;
             break;
@@ -153,7 +152,7 @@ flash_program_buf(volatile flash_t *addr
 
     // Restore ROM to "normal" mode
  bad:
-    ROM[0] = FLASH_Reset;            
+    BA[0] = FLASH_Reset;            
 
     return stat;
 }