www.pudn.com > vxworks0108.rar > flash.c
#include "type.h"
#include "vg4.h"
/*
modification history
--------------------
2003-4-14,deng xindong dxd-2000@163.net
*/
/*
DESCRIPTION
This library contains routines to manipulate Intel 28F640J5A Flash memory.
write routines are included.
*/
#define FLASH_DATA_READ_ARRAY 0xFFFFFFFF
#define FLASH_DATA_READ_ID 0x90909090
#define FLASH_DATA_READ_QUEREY 0x98989898
#define FLASH_DATA_READ_STATUS 0x70707070
#define FLASH_DATA_CLEAR_STATUS 0x50505050
#define FLASH_DATA_WRITE_2_BUFFER 0xE8E8E8E8
#define FLASH_DATA_PROGRAM 0x40404040
#define FLASH_DATA_BLOCK_ERASE_1 0x20202020
#define FLASH_DATA_BLOCK_ERASE_2 0xD0D0D0D0
#define FLASH_DATA_BLK_ERASE_SUSP 0xB0B0B0B0
#define FLASH_DATA_BLK_ERASE_RSM 0xD0D0D0D0
#define FLASH_DATA_CONFIGURATION_1 0xB8B8B8B8
#define FLASH_DATA_CONFIGURATION_2 0xCCCCCCCC
#define FLASH_DATA_CONFIG_READ_1 0x60606060
#define FLASH_DATA_CONFIG_READ_2 0x03030303
#define FLASH_DATA_SET_BLK_LOCK_1 0x60606060
#define FLASH_DATA_SET_BLK_LOCK_2 0xF1F1F1F1
#define FLASH_DATA_CLR_BLK_LOCK_1 0x60606060
#define FLASH_DATA_CLR_BLK_LOCK_2 0xD0D0D0D0
#define FLASH_DATA_PROTECT_PGM 0xC0C0C0C0
#define FLASH_BUFFER_COUNT 0x0F0F0F0F
#define FLASH_READY_BITS 0x00800080
#define FLASH_DATA_ERASE_CHIP 0x30303030
#define INTEL_ID_28F640J5 0x15
#define INTEL_MANUFACT 0x89
#define FLASH_ADDR_FACTOR 8
#define EXT_FLASH_BASE_ADRS 0x78000000
#define EXT_FLASH_SECTOR_SIZE 0x80000
/* Flash memory structure */
typedef union {
double fDouble;
UINT fInts[2];
USHORT fShorts[4];
UCHAR fChars[8];
} FLASH_TYPE, *P_FLASH_TYPE;
/******************************************************************************
*
* FlashWrite - write data to the Intel 28F640J5A
*
* RETURNS: Number of byte writen
*
*/
void IntelFlashInit()
{
char flag=0;
pciConfigInByte(0,PCI_DEV_NO_M1543C_PMU,0,M1543C_PMU_DOGPOII,&flag);
pciConfigOutByte(0,PCI_DEV_NO_M1543C_PMU,0,M1543C_PMU_DOGPOII,flag|6);
}
int flashEraseSector(int sector)
{
volatile UINT32 *pBlock = (UINT32 *)(EXT_FLASH_BASE_ADRS + sector * EXT_FLASH_SECTOR_SIZE);
*(volatile UINT32 *)pBlock = FLASH_DATA_CLEAR_STATUS;
*(volatile UINT32 *)pBlock = FLASH_DATA_BLOCK_ERASE_1;
*(volatile UINT32 *)pBlock = FLASH_DATA_BLOCK_ERASE_2;
while ((((P_FLASH_TYPE)pBlock)->fInts[1]&FLASH_READY_BITS) != FLASH_READY_BITS||(((P_FLASH_TYPE)pBlock)->fInts[2]&FLASH_READY_BITS) != FLASH_READY_BITS);
*(volatile UINT32 *)pBlock = FLASH_DATA_READ_ARRAY;
return 0;
}
int flashEraseChip()
{
volatile UINT32 *pBlock = (UINT32 *)(EXT_FLASH_BASE_ADRS);
*(volatile UINT32 *)pBlock = FLASH_DATA_CLEAR_STATUS;
*(volatile UINT32 *)pBlock = FLASH_DATA_ERASE_CHIP;
*(volatile UINT32 *)pBlock = FLASH_DATA_BLOCK_ERASE_2;
while ((((P_FLASH_TYPE)pBlock)->fInts[1]&FLASH_READY_BITS) != FLASH_READY_BITS||(((P_FLASH_TYPE)pBlock)->fInts[2]&FLASH_READY_BITS) != FLASH_READY_BITS);
*(volatile UINT32 *)pBlock = FLASH_DATA_READ_ARRAY;
return 0;
}
UINT32 FlashWriteString(int sector, unsigned int offset, UINT8 *pSource, UINT32 Length)
{
unsigned int AlignLength = (Length + FLASH_ADDR_FACTOR - 1) & ~(FLASH_ADDR_FACTOR - 1);
unsigned int n;
volatile UINT32 *pBlock = (UINT32 *)(EXT_FLASH_BASE_ADRS + sector * EXT_FLASH_SECTOR_SIZE);
volatile UINT8 *pDest = (UINT8 *)pBlock + offset;
Length = AlignLength;
while(Length)
{
*(volatile UINT32 *)pDest = FLASH_DATA_READ_ARRAY;
if((((UINT32)pDest & 0x7F) == 0) && (Length >= 0x80))
{
/*issue Write to buffer Command*/
*(volatile UINT32*)pBlock = FLASH_DATA_WRITE_2_BUFFER;
/*Read Status Register*/
if (((P_FLASH_TYPE)pDest)->fInts[1] == FLASH_READY_BITS&&((P_FLASH_TYPE)pDest)->fInts[2] == FLASH_READY_BITS)
{
/*Write Word Count*/
*(volatile UINT32*)pBlock = FLASH_BUFFER_COUNT;
/*Write Buffer Data*/
for (n = 0; n <16; n++)
{
((volatile double *)pDest)[n] = ((volatile double *)pSource)[n];
}
/*Program Buffer to Flash Command*/
*(volatile UINT32*)pBlock = FLASH_DATA_CLR_BLK_LOCK_2;
/*Read Status Register*/
while ((((P_FLASH_TYPE)pDest)->fInts[1]&FLASH_READY_BITS) != FLASH_READY_BITS || (((P_FLASH_TYPE)pDest)->fInts[2]&FLASH_READY_BITS) != FLASH_READY_BITS)
;
Length -= 0x80;
pDest += 0x80;
pSource += 0x80;
continue;
}
/*Reset the device to read array mode*/
*(volatile UINT32 *)pDest = FLASH_DATA_READ_ARRAY;
}
/*Clear Status Register*/
*(volatile UINT32 *)pDest = FLASH_DATA_CLEAR_STATUS;
/*Location to be Programmed*/
*(volatile UINT32 *)pDest = FLASH_DATA_PROGRAM;
/*Write Data*/
*(volatile double *)pDest = *(volatile double *)pSource;
while ((((P_FLASH_TYPE)pDest)->fInts[1]&FLASH_READY_BITS) != FLASH_READY_BITS||(((P_FLASH_TYPE)pDest)->fInts[2]&FLASH_READY_BITS) != FLASH_READY_BITS)
;
pSource += FLASH_ADDR_FACTOR;
pDest += FLASH_ADDR_FACTOR;
Length -= FLASH_ADDR_FACTOR;
}
/*Reset the device to read array mode*/
*(volatile UINT32 *)pDest = FLASH_DATA_READ_ARRAY;
return AlignLength - Length;
}