📄 fidsflash.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 + -