Mercurial > flash_v2
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; }
