📄 mx29lv320t.c
字号:
#include "MX29LV320T.h"
/* local function */
#define OK 0x00
#define WORD_MODE
#undef WORD_MODE
#define SDR_MASK 0x003FF000
#define SDR_SHIFT_BIT 12
#define ROM_MASK_HI 0x0000E00
#define ROM_SHIFT_BIT_HI 1
#define ROM_MASK_LO 0x000001FF
#define ROM_SHIFT_BIT_LO 13
#define ROM_LINE_SIZE_MASK 0x0003FFFFF
#define CPU_SDR_MASK 0x000003FF
#define CPU_ROM_MASK_HI 0x00001C00
#define CPU_ROM_MASK_LO 0x003FE000
void FlashIOSync(void)
{
}
void FlashDelayUs()
{
}
/******************************************************************************
* FlashDelay - delay delayTime Ms
*
* RETURNS: NULL
*/
void FlashDelayMs(unsigned long delayTime)
{
register unsigned long i;
for(i=0; i<delayTime; i++)
{
FlashDelayUs(200);
}
return;
}
/******************************************************************************
* FlashReset - reset the flash device
*
* RETURNS: NULL
*/
void FlashReset(void)
{
unsigned char *ptr, status;
unsigned long addr;
addr = AdjustAddrToCpu(FlashBaseAddr);
ptr = (unsigned char *)addr;
*ptr = 0xF0; /* reset FLASH*/
FlashDelayUs(80);
}
/**********************************************************
Function: Translate CPU address to Flash address.
Only used for D8701 ASIC board --- EVI.
Parameters:
Return value:
**********************************************************/
/* unsigned long AdjustAddr(unsigned long addr)
{
unsigned long temp;
temp = ((addr & SDR_MASK) >> SDR_SHIFT_BIT);
temp = temp | ((addr & ROM_MASK_HI) << ROM_SHIFT_BIT_HI);
temp = temp | ((addr & ROM_MASK_LO) << ROM_SHIFT_BIT_LO);
temp = temp | (addr & ( ~ ROM_LINE_SIZE_MASK));
return temp;
}*/
/**********************************************************
Function: Translate Flash address to CPU address.
Only used for D8701 ASIC board --- EVI.
Parameters:
Return value:
**********************************************************/
unsigned long AdjustAddrToCpu(unsigned long addr)
{
return addr;
}
/**********************************************************
Function: Read flash chip manufacturer ID.
Parameters:
Return value:
**********************************************************/
unsigned long ReadChipMID(void)
{
unsigned char *ptr, status;
unsigned long addr;
#ifdef WORD_MODE
addr = (FlashBaseAddr + 0x555);
#else
addr = (FlashBaseAddr + 0xAAA);
#endif
addr = AdjustAddrToCpu(addr);
ptr = (unsigned char *)addr;
*ptr = 0xAA;
FlashIOSync();
#ifdef WORD_MODE
addr = (FlashBaseAddr + 0x2aa);
#else
addr = (FlashBaseAddr + 0x555);
#endif
addr = AdjustAddrToCpu(addr);
ptr = (unsigned char *)addr;
*ptr = 0x55;
FlashIOSync();
#ifdef WORD_MODE
addr = (FlashBaseAddr + 0x555);
#else
addr = (FlashBaseAddr + 0xAAA);
#endif
addr = AdjustAddrToCpu(addr);
ptr = (unsigned char *)addr;
*ptr = 0x90;
FlashIOSync();
addr = FlashBaseAddr;
addr = AdjustAddrToCpu(addr);
ptr = (unsigned char *)addr;
status = *ptr;
return (unsigned long)status;
}
/**********************************************************
Function: Read flash chip device ID.
Parameters:
Return value:
**********************************************************/
unsigned long ReadChipDeviceID(void)
{
unsigned char *ptr;
unsigned char status;
unsigned long addr;
#ifdef WORD_MODE
addr = (FlashBaseAddr + 0x555);
#else
addr = (FlashBaseAddr + 0xAAA);
#endif
addr = AdjustAddrToCpu(addr);
ptr = (unsigned char *)addr;
*ptr = 0xAA;
FlashIOSync();
#ifdef WORD_MODE
addr = (FlashBaseAddr + 0x2AA);
#else
addr = (FlashBaseAddr + 0x555);
#endif
addr = AdjustAddrToCpu(addr);
ptr = (unsigned char *)addr;
*ptr = 0x55;
FlashIOSync();
#ifdef WORD_MODE
addr = (FlashBaseAddr + 0x555);
#else
addr = (FlashBaseAddr + 0xAAA);
#endif
addr = AdjustAddrToCpu(addr);
ptr = (unsigned char *)addr;
*ptr = 0x90;
FlashIOSync();
#ifdef WORD_MODE
addr = (FlashBaseAddr + 0x01);
#else
addr = (FlashBaseAddr + 0x02);
#endif
addr = AdjustAddrToCpu(addr);
FlashIOSync();
status = *ptr;
return (unsigned long)status;
}
/**********************************************************
Function: Erase the total flash chip.
Parameters:
Return value: OK--success, other value error.
**********************************************************/
int FlashChipErase(void)
{
unsigned char *ptr, status;
unsigned long addr;
int timeout = 10000;
#ifdef WORD_MODE
addr = (FlashBaseAddr + 0x555);
#else
addr = (FlashBaseAddr + 0xAAA);
#endif
addr = AdjustAddrToCpu(addr);
ptr = (unsigned char *)addr;
*ptr = 0xAA;
FlashIOSync();
#ifdef WORD_MODE
addr = (FlashBaseAddr + 0x2AA);
#else
addr = (FlashBaseAddr + 0x555);
#endif
addr = AdjustAddrToCpu(addr);
ptr = (unsigned char *)addr;
*ptr = 0x55;
FlashIOSync();
#ifdef WORD_MODE
addr = (FlashBaseAddr + 0x555);
#else
addr = (FlashBaseAddr + 0xAAA);
#endif
addr = AdjustAddrToCpu(addr);
ptr = (unsigned char *)addr;
*ptr = 0x80;
FlashIOSync();
#ifdef WORD_MODE
addr = (FlashBaseAddr + 0x555);
#else
addr = (FlashBaseAddr + 0xAAA);
#endif
addr = AdjustAddrToCpu(addr);
ptr = (unsigned char *)addr;
*ptr = 0xAA;
FlashIOSync();
#ifdef WORD_MODE
addr = (FlashBaseAddr + 0x2AA);
#else
addr = (FlashBaseAddr + 0x555);
#endif
addr = AdjustAddrToCpu(addr);
ptr = (unsigned char *)addr;
*ptr = 0x55;
FlashIOSync();
#ifdef WORD_MODE
addr = (FlashBaseAddr + 0x555);
#else
addr = (FlashBaseAddr + 0xAAA);
#endif
addr = AdjustAddrToCpu(addr);
ptr = (unsigned char *)addr;
*ptr = 0x10;
FlashIOSync();
/* Wait command finish */
addr = (FlashBaseAddr);
addr = AdjustAddrToCpu(addr);
ptr = (unsigned char *)addr;
while(1)
{
status = *ptr;
if((status & 0x80) == 0x80)
{
return OK;
}
if((status & 0x20) == 0x20) /* if Q5==1,erase time out */
{
FlashReset();
return -1;
}
if(--timeout < 0)
{
FlashReset();
return -2;
}
FlashDelayMs(500);/* 0.9s<sector erase time < 15s */
}
}
/**********************************************************
Function: Erase the assigned sector number of the flash chip .
Parameters:
Return value: OK--success, other value error.
**********************************************************/
int FlashSectorErase(unsigned long sectornum)
{
unsigned char *ptr, status;
unsigned long addr;
int timeout = 1000;
addr = (FlashBaseAddr + 0xAAA);
addr = AdjustAddrToCpu(addr);
ptr = (unsigned char *)addr;
*ptr = 0xAA;
FlashIOSync();
addr = (FlashBaseAddr + 0x555);
addr = AdjustAddrToCpu(addr);
ptr = (unsigned char *)addr;
*ptr = 0x55;
FlashIOSync();
addr = (FlashBaseAddr + 0xAAA);
addr = AdjustAddrToCpu(addr);
ptr = (unsigned char *)addr;
*ptr = 0x80;
FlashIOSync();
addr = (FlashBaseAddr + 0xAAA);
addr = AdjustAddrToCpu(addr);
ptr = (unsigned char *)addr;
*ptr = 0xAA;
FlashIOSync();
addr = (FlashBaseAddr + 0x555);
addr = AdjustAddrToCpu(addr);
ptr = (unsigned char *)addr;
*ptr = 0x55;
FlashIOSync();
#if FLASH_BOTTOM_TYPE
if(sectornum > MAX_SECTOR_NUMBER)
return -1;
if(sectornum <= 7)
addr = FlashBaseAddr + sectornum * 0x2000;
else
addr = FlashBaseAddr + 0x10000 + (sectornum - 8) * 0x10000);
#else
if(sectornum > MAX_SECTOR_NUMBER)
return -1;
if(sectornum <= 62)
addr = FlashBaseAddr + sectornum * 0x10000;
else
addr = FlashBaseAddr + 0x3F0000 + (sectornum - 63) * 0x2000;
#endif
addr = AdjustAddrToCpu(addr);
ptr = (unsigned char *)addr;
*ptr = 0x30;
FlashIOSync();
/* Wait command finish */
while(1)
{
status = *ptr;
if(status == 0xff)
{
return OK;
}
if((status & 0x20) == 0x20) /* if Q5==1,erase time out */
{
FlashReset();
return -1;
}
if(--timeout < 0)
{
FlashReset();
return -2;
}
FlashDelayMs(100);/* 0.9s<sector erase time < 15s */
}
}
/**********************************************************
Function: Write one byte to the flash chip .
Parameters:
Return value: 1 success, other value error.
**********************************************************/
int FlashWriteByte(unsigned long offset, unsigned char data)
{
unsigned char *ptr, status;
unsigned long addr;
int timeout = 1000;
#ifdef WORD_MODE
addr = (FlashBaseAddr + 0x555);
#else
addr = (FlashBaseAddr + 0xAAA);
#endif
addr = AdjustAddrToCpu(addr);
ptr = (unsigned char *)addr;
*ptr = 0xAA;
FlashIOSync();
#ifdef WORD_MODE
addr = (FlashBaseAddr + 0x2AA);
#else
addr = (FlashBaseAddr + 0x555);
#endif
addr = AdjustAddrToCpu(addr);
ptr = (unsigned char *)addr;
*ptr = 0x55;
FlashIOSync();
#ifdef WORD_MODE
addr = (FlashBaseAddr + 0x555);
#else
addr = (FlashBaseAddr + 0xAAA);
#endif
addr = AdjustAddrToCpu(addr);
ptr = (unsigned char *)addr;
*ptr = 0xA0;
FlashIOSync();
addr = (FlashBaseAddr + offset);
/* addr = AdjustAddr(addr); */
ptr = (unsigned char *)addr;
*ptr = data;
FlashIOSync();
/* Wait command finish */
while(1)
{
status = *ptr;
if(status == data)
{
return OK;
}
if((status & 0x20) == 0x20) /* if Q5==1,erase time out */
{
FlashReset();
return -1;
}
if(--timeout < 0)
{
FlashReset();
return -2;
}
FlashDelayMs(1);/* 9us<byte write time < 300us */
}
}
/**********************************************************
Function: Write memory to the flash chip .
Parameters:
Return value: 1 success, other value error.
**********************************************************/
int FlashWrite(unsigned long offset, unsigned char *pData, unsigned long num)
{
unsigned long i;
int retval, timeout;
for(i = 0; i < num; i ++, offset ++, pData ++)
{
timeout=10;
do
{
retval = FlashWriteByte(offset, *pData);
}
while((retval != OK)&&(--timeout > 0));
if(timeout <=0 ) break;
}
return retval;
}
/*****************************************************************************
* sysNvRamGet - get the contents of non-volatile RAM
*
* RETURNS: OK or ERROR
*/
int sysNvRamGet
(
char *string, /* where to copy flash memory */
int strLen, /* maximum number of bytes to copy */
int offset /* byte offset into flash memory */
)
{
return -1;
}
/******************************************************************************
* sysNvRamSet - write data to non-volatile RAM
*
* RETURNS: OK or ERROR
*/
int sysNvRamSet(
char *string, /* string to be copied into flash memory */
int strLen, /* maximum number of bytes to copy */
int offset /* byte offset into flash memory */
)
{
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -