⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fidsflash.c

📁 INTEL IXP425的VXWORKS BSP
💻 C
字号:
/* flashMem.c - Flash memory device driver */

/* Copyright 1984-2000 Wind River Systems, Inc. */
#include "copyright_wrs.h"
#include "VxWorks.h"
#include <stdio.h>

/* defines */
#define FLAH_NVRAM                  0x507e0000   /*8200000 Flash Start at 8*16MBytes*/
#define FLASH_WIDTH                 2
#define FLASH_SIZE                  0x01000000    /* 16MByte */

#define FLASH28_CMD_READ_MEM        0x0000
#define FLASH28_CMD_READ_ID         0x0090
#define FLASH28_CMD_ERASE_SETUP     0x0020
#define FLASH28_CMD_ERASE           0x0020
#define FLASH28_CMD_ERASE_CONFIRM   0x00d0
#define FLASH28_CMD_ERASE_VERIFY    0x00a0
#define FLASH28_CMD_PROG_SETUP      0x0040
#define FLASH28_CMD_PROG_VERIFY     0x00c0
#define FLASH28_CMD_RESET           0x00ff

#define FLASH28_CMD_CLEAR_STATUS    (FLASH_DEF) 0x0050
#define FLASH28_CMD_READ_STATUS	    (FLASH_DEF) 0x0070



#define FLASH28_STAT_WSMS	    (FLASH_DEF) 0x0080
#define FLASH28_STAT_BWS	    (FLASH_DEF) 0x0010
#define FLASH28_STAT_EWS	    (FLASH_DEF) 0x0020


/* Establish default values for DELAY parameters */


#if     (FLASH_WIDTH == 1)
#define FLASH_DEF       UINT8
#define FLASH_CAST      (UINT8 *)
#endif  /* FLASH_WIDTH */

#if     (FLASH_WIDTH == 2)
#define FLASH_DEF       UINT16
#define FLASH_CAST      (UINT16 *)
#endif  /* FLASH_WIDTH */

#if     (FLASH_WIDTH == 4)
#define FLASH_DEF       UINT32
#define FLASH_CAST      (UINT32 *)
#endif  /* FLASH_WIDTH */

#define BIT(i) (1 << (i))

#ifndef SYS_FLASH_DELAY_SHIFT
#   define  SYS_FLASH_DELAY_SHIFT 0
#endif /*SYS_FLASH_DELAY_SHIFT*/

#ifndef SYS_FLASH_DELAY_ADJ
#   define  SYS_FLASH_DELAY_ADJ 0
#endif  /* SYS_FLASH_DELAY_ADJ */

#ifndef SYS_FLASH_DELAY_INCR
#   define  SYS_FLASH_DELAY_INCR 1
#endif  /* SYS_FLASH_DELAY_INCR */

/* Names of routines, or null values */

#ifdef  SYS_FLASH_WRITE
#   define SYS_FLASH_WRITE_ENABLE_RTN() sysFlashWriteEnable ()
#   define SYS_FLASH_WRITE_DISABLE_RTN() sysFlashWriteDisable ()
#else
#   define SYS_FLASH_WRITE_ENABLE_RTN()
#   define SYS_FLASH_WRITE_DISABLE_RTN()
#endif  /* SYS_FLASH_WRITE */

#ifdef  SYS_FLASH_BOARD_DELAY
#   define SYS_FLASH_BOARD_DELAY_RTN()  sysFlashBoardDelay ()
#else
#   define SYS_FLASH_BOARD_DELAY_RTN()
#endif  /* SYS_FLASH_BOARD_DELAY */

#ifdef SYS_FLASH_TYPE
#   define FLASH_MEM_TYPE       SYS_FLASH_TYPE
#else
#   define FLASH_MEM_TYPE       0
#endif  /* SYS_FLASH_TYPE */

#ifdef FLASH_SIZE_WRITEABLE
#   define FLASH_MEM_SIZE       FLASH_SIZE_WRITEABLE
#else
#   define FLASH_MEM_SIZE       FLASH_SIZE
#endif  /* FLASH_SIZE_WRITEABLE */

/* Operation status bits for Flash 29Fxxx devices */

#define Q7(ix)      ((ix & 0x80) >> 7)  /* DQ7 bit */
#define Q5(ix)      ((ix & 0x20) >> 5)  /* DQ5 bit */

/* globals */

IMPORT  void sysFlashWriteEnable (void);
IMPORT  void sysFlashWriteDisable (void);
IMPORT  void sysFlashBoardDelay (void);

int flashDelayShiftg = SYS_FLASH_DELAY_SHIFT;
int flashDelayAdjg   = SYS_FLASH_DELAY_ADJ;
int flashDelayIncrg  = SYS_FLASH_DELAY_INCR;

/* forward declarations */

#ifdef  __STDC__

void    sysFlashDelay (int delayCount);

STATUS  sysFlashErase ();
STATUS  sysFlashWrite (FLASH_DEF * pFB, int size, int offset,FLASH_DEF value);
#else   /* __STDC__ */

void    sysFlashDelay ();
STATUS  sysFlashDataPoll ();
STATUS  sysFlashErase ();
STATUS  sysFlashWrite ();

#endif  /* __STDC__ */

/******************************************************************************
*
* sysFlashDelay - create a delay for a specified number of microseconds
*
* This routine implements a busy wait for a specified number of microseconds.
* The timing loop can be adjusted on a board-dependent basis by
* defining values for the following macros:
* .iP
* SYS_FLASH_DELAY_SHIFT
* .iP
* SYS_FLASH_DELAY_ADJ
* .iP
* SYS_FLASH_DELAY_INCR
* .LP
* The values SYS_FLASH_DELAY_SHIFT and SYS_FLASH_DELAY_ADJ
* convert microseconds into a board-dependent tick-count.
* This routine can call a user-defined hook, sysFlashBoardDelay(),
* which creates a delay for a number of board-dependent ticks as
* specified by SYS_FLASH_DELAY_INCR.  To use sysFlashBoardDelay(), define
* SYS_FLASH_BOARD_DELAY in config.h.
*
* RETURNS: N/A
*
* SEE ALSO: sysFlashErase(), sysFlashWrite()
*/

void sysFlashDelayg
(
    int delayCount  /* number of uSec to delay */
)
{
    int ix;

    delayCount <<= flashDelayShiftg; /* board-dependent shift */
    delayCount += flashDelayAdjg;        /* board-dependent addition */

    for (ix = 0; ix < delayCount; ix += flashDelayIncrg)
    {
        SYS_FLASH_BOARD_DELAY_RTN ();
    }
}


/******************************************************************************
*
* sysSectorErase - erase the contents of a sector
*
* This routine clears the contents of one sector in the flash memory.
*
* Flash 29F\f2xxx\f1 devices are erased by writing the six-byte erase code
* into specific address locations, which sets all byte locations to a high
* value (0xFF).
*
* RETURNS: OK, or ERROR if the contents of sector cannot be erased.
*/

STATUS sysSectorEraseg(FLASH_DEF * pFA )
{
    STATUS retVal = OK;

    SYS_FLASH_WRITE_ENABLE_RTN ();      /* raise Vpp */

    *pFA = FLASH28_CMD_ERASE_SETUP;     /* setup */

    *pFA = FLASH28_CMD_ERASE_CONFIRM;   /* erase according to the manual */

        /* Check Write State Machine Status */
    
    do
    {
    } while ((*pFA & FLASH28_STAT_WSMS) != FLASH28_STAT_WSMS);
    
    
    /* Check Erase Error Status */

    if ((*pFA & FLASH28_STAT_EWS) != 0)
    {
        *pFA = FLASH28_CMD_CLEAR_STATUS;
        retVal = ERROR;
    }

/*    pFA  = FLASH_CAST (FLAH_NVRAM);*/
    *pFA = FLASH28_CMD_RESET;

    SYS_FLASH_WRITE_DISABLE_RTN ();     /* lower Vpp */

    return (retVal);
}

/******************************************************************************
*
* sysFlashWrite - write data to flash memory
*
* This routine copies specified data of a specified length, <size>, into a
* specified offset, <offset>, in the flash memory.  Data is passed as a string,
* <pFB>, if not NULL.  If NULL, data is taken as a repeated sequence of
* <value>.
* The parameter <flashType> should be set to the flash device code.
* The parameter <offset> must be appropriately aligned for the width of
* the Flash devices in use.
*
* Flash 28F\f2xxx\f1 devices are programmed by a sequence of operations:
* .iP
* set up device to write
* .iP
* perform write
* .iP
* verify the write
* .LP
*
* Flash 29F\f2xxx\f1 devices are programmed by a sequence of operations:
* .iP
* set up device to write
* .iP
* perform write
* .iP
* wait for the write to complete
* .LP
*
* RETURNS: OK, or ERROR if the write operation fails.
*
* SEE ALSO: sysFlashSet()
*/

STATUS sysFlashWriteg
(
    FLASH_DEF 	*pFB,        /* string to be copied; use <value> if NULL */
    int     	size,        /* size to program in bytes */
    int     	offset,      /* byte offset into flash memory */
    FLASH_DEF   value        /* value to program */
)
{
    volatile FLASH_DEF * pFA;		/* flash address */
    STATUS retVal = OK;
   
    SYS_FLASH_WRITE_ENABLE_RTN ();     /* raise Vpp */
   
    for ( pFA = FLASH_CAST (FLAH_NVRAM + offset);
        (pFA <FLASH_CAST (FLAH_NVRAM + size + offset)) && (retVal == OK); pFA++)
    {
       
	 if (pFB != NULL)
            value = *pFB++;

        /*printf("Addr %08X : %08X \n", pFA, value); */

        *pFA = FLASH28_CMD_PROG_SETUP;   /* write setup */
        *pFA = value;                /* data to write */

        /* Check Write State Machine Status */
         
         do
         {
             int i;

             i++;
             /* *pFA = FLASH28_CMD_READ_STATUS;  according to the manual, there is no read action*/
         }
         while ((*pFA & FLASH28_STAT_WSMS) != FLASH28_STAT_WSMS);
         
       /* Check Byte Write Error Status */
       
        if ((*pFA & FLASH28_STAT_BWS) != 0) /*SR4 be checked*/
        {
            *pFA = FLASH28_CMD_CLEAR_STATUS;
            retVal = ERROR;
        }

        *pFA = FLASH28_CMD_RESET;
    }

    SYS_FLASH_WRITE_DISABLE_RTN ();        /* lower Vpp */

    return (retVal);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -