www.pudn.com > H265+_C64X_2008.8.rar > evmdm642_flash_erase.c


/* 
 *  Copyright 2003 by Spectrum Digital Incorporated. 
 *  All rights reserved. Property of Spectrum Digital Incorporated. 
 */ 
 
/* 
 *  ======== evmdm642_flash_erase.c ======== 
 *  EVMDM642_FLASH_erase() implementation 
 */ 
  
#include  
#include  
 
#include  
#include  
 
/* Constant table containing end address of each sector */ 
static Uint32 sector_end[EVMDM642_FLASH_SECTORS] = { 
    EVMDM642_FLASH_BASE + 0x00ffff, /* Sector  0 */ 
    EVMDM642_FLASH_BASE + 0x01ffff, /* Sector  1 */ 
    EVMDM642_FLASH_BASE + 0x02ffff, /* Sector  2 */ 
    EVMDM642_FLASH_BASE + 0x03ffff, /* Sector  3 */ 
    EVMDM642_FLASH_BASE + 0x04ffff, /* Sector  4 */ 
    EVMDM642_FLASH_BASE + 0x05ffff, /* Sector  5 */ 
    EVMDM642_FLASH_BASE + 0x06ffff, /* Sector  6 */ 
    EVMDM642_FLASH_BASE + 0x07ffff  /* Sector  7 */ 
}; 
 
 
/* Erase a segment of Flash memory */ 
void EVMDM642_FLASH_erase(Uint32 start, Uint32 length) 
{ 
    Int16 i; 
    Uint8 *pdata; 
    Uint32 sector_base, end; 
     
    /* Calculate extents of range to erase */ 
    end = start + length - 1; 
     
    /* Walk through each sector, erase any sectors within range */ 
    sector_base = EVMDM642_FLASH_BASE; 
    for (i = 0; i < EVMDM642_FLASH_SECTORS; i++) 
    { 
        if ((start <= sector_base) && (sector_end[i] <= end)) 
        { 
            /* Start sector erase sequence */ 
            *((Uint8 *)EVMDM642_FLASH_BASE) = 0xaa; 
            *((Uint8 *)EVMDM642_FLASH_BASE) = 0x55; 
            *((Uint8 *)EVMDM642_FLASH_BASE) = 0x80; 
            *((Uint8 *)EVMDM642_FLASH_BASE) = 0xaa; 
            *((Uint8 *)EVMDM642_FLASH_BASE) = 0x55; 
             
            /* Start erase at sector address */ 
            pdata = (Uint8 *)sector_base; 
            *pdata = 0x30; 
             
            /* Wait for erase to complete */ 
            while (1) 
                if (*pdata & 0x80) 
                    break; 
                     
            /* Put back in read mode */ 
            *((Uint8 *)EVMDM642_FLASH_BASE) = 0xf0;                     
        } 
         
        /* Advance to next sector */ 
        sector_base = sector_end[i] + 1; 
    } 
}