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

📄 mx29lv320t.c

📁 潜入是烧写flash的程序
💻 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 + -