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