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

📄 mbm29dl640flash.c

📁 其中包括88796网卡驱动、mbmflash驱动、i2c接口的eeprom驱动、oki的ml9620can网卡驱动、扩展的串口驱动源代码。适用于moto的ppc8××系列在vxworks环境下。
💻 C
字号:
#include "vxWorks.h"
#include "stdio.h"

/* define debug flag */
#undef MBM_MTD_DEBUG

/* define */

#define MBM29DL640_MTD_SECTOR_SIZE	0x10000		/* 64k Bytes */
#define MBM29DL640_MTD_CHIP_SIZE	0x800000	/* 7M Bytes */
#define MBM29DL640_MTD_LAST_SECTOR	(MBM29DL640_MTD_CHIP_SIZE/MBM29DL640_MTD_SECTOR_SIZE)	/* the number of last sector */

/* global function */

STATUS flashWrite(UINT32 flashBaseAddr, UINT32 offset, UINT8 *buffer, int length);
STATUS flashEarse(UINT32 flashBaseAddr, int sectorNum, int sectorCount);

/* LOCAL function */

LOCAL STATUS mbm29dl640SectorEarse(UINT32 flashBaseAddr, int sectorNum);
LOCAL void flashRegWrite8Bits(UINT8 *addr,UINT8 data);

/*----------------------------------------------------------------------*/
/*                     mbm29dl640Write		 	*/
/*									*/
/* Write a block of bytes to Flash					*/
/*									*/
/* This routine will be registered as the MTD flash.write routine	*/
/*									*/
/* Parameters:                                                          */
/*	vol		: Pointer identifying drive			*/
/*      address		: Card address to write to			*/
/*      buffer		: Address of data to write			*/
/*	length		: Number of bytes to write			*/
/*	overwrite	: TRUE if overwriting old Flash contents	*/
/*			  FALSE if old contents are known to be erased	*/
/*                                                                      */
/* Returns:                                                             */
/*	FLStatus	: 0 on success, failed otherwise		*/
/*----------------------------------------------------------------------*/	

STATUS flashWrite(UINT32 flashBaseAddr, UINT32 offset, UINT8 *buffer, int length)
{
	UINT8	DQ6Value1=0;
	UINT8	DQ6Value2=0;
	UINT8   *ProgAddr;
	UINT32  progAddr1;
	UINT32  progAddr2;
	
	progAddr1 = flashBaseAddr+0xaaa;
	progAddr2 = flashBaseAddr+0x555;
	
#ifdef MBM_MTD_DEBUG  
	/*
	printf("start writing data,length:%d form: %x\n",length,buffer);
	*/
#endif /* MBM_MTD_DEBUG */
	
	while(length)	
	{
	/*	
		#ifdef MBM_MTD_DEBUG  
		printf("write data: %x to address: %x \n",(*(UINT16 *)buffer),address);
		#endif
	*/	
		if(*(UINT8 *)buffer!=0xff)
		{
			flashRegWrite8Bits((UINT8 *)progAddr1,(UINT8)(0xaa));
			flashRegWrite8Bits((UINT8 *)progAddr2,(UINT8)(0x55));
			flashRegWrite8Bits((UINT8 *)progAddr1,(UINT8)(0xa0)); 	
					
			ProgAddr=(UINT8 *)(flashBaseAddr + offset);
			*ProgAddr=*((UINT8 *)buffer);
			
			while(1)
			{
				DQ6Value1=(*ProgAddr)&0x40;
				DQ6Value2=(*ProgAddr)&0x40;
				if(DQ6Value1==DQ6Value2)
				break;	
			}
			
			if((*ProgAddr)!=(*((UINT8 *)buffer)))
			{
				#ifdef MBM_MTD_DEBUG 
				printf(" error in writing data to address:%x \n",address);	
				#endif 
				return(ERROR);
			}
		}
		offset = offset+1;
		buffer=(UINT8 *)buffer+1;
		length=length-1;	
	}
	return(OK);
}


/******************************************************************************
*
* MBM29DL640SectorErase - Erase a sector (see TrueFFS Programmer's Guide)
*
* RETURNS: FLStatus
*
*/

LOCAL STATUS mbm29dl640SectorEarse(UINT32 flashBaseAddr, int sectorNum)
{
	UINT8 *sectorBaseAddr;	/* the first address of sector */
	UINT8 DQ6Value1=0;
	UINT8 DQ6Value2=0;
	int timeDelay=0;
	int i;
	UINT32  progAddr1;
	UINT32  progAddr2;
	
	progAddr1=flashBaseAddr+0xaaa;
	progAddr2=flashBaseAddr+0x555;
	
	if(sectorNum==0)
	{
		for(i=0;i<8;i++)
		{
			/* write earse sector command */
			flashRegWrite8Bits((UINT8 *)progAddr1,(UINT8)(0xaa));
			flashRegWrite8Bits((UINT8 *)progAddr2,(UINT8)(0x55));
			flashRegWrite8Bits((UINT8 *)progAddr1,(UINT8)(0x80));
			flashRegWrite8Bits((UINT8 *)progAddr1,(UINT8)(0xaa));
			flashRegWrite8Bits((UINT8 *)progAddr2,(UINT8)(0x55));
			sectorBaseAddr=(UINT8 *)(flashBaseAddr+(i*MBM29DL640_MTD_SECTOR_SIZE/8));
			*sectorBaseAddr=(UINT8)0x30;
		}
		
	}
	else if(sectorNum==127)
	{
		for(i=0;i<8;i++)
		{
			/* write earse sector command */
			flashRegWrite8Bits((UINT8 *)progAddr1,(UINT8)(0xaa));
			flashRegWrite8Bits((UINT8 *)progAddr2,(UINT8)(0x55));
			flashRegWrite8Bits((UINT8 *)progAddr1,(UINT8)(0x80));
			flashRegWrite8Bits((UINT8 *)progAddr1,(UINT8)(0xaa));
			flashRegWrite8Bits((UINT8 *)progAddr2,(UINT8)(0x55));
			sectorBaseAddr=(UINT8 *)(flashBaseAddr+(127*MBM29DL640_MTD_SECTOR_SIZE)+(i*MBM29DL640_MTD_SECTOR_SIZE/8));
			*sectorBaseAddr=(UINT8)0x30;
		}
	}
	else
	{
		flashRegWrite8Bits((UINT8 *)progAddr1,(UINT8)(0xaa));
		flashRegWrite8Bits((UINT8 *)progAddr2,(UINT8)(0x55));
		flashRegWrite8Bits((UINT8 *)progAddr1,(UINT8)(0x80));
		flashRegWrite8Bits((UINT8 *)progAddr1,(UINT8)(0xaa));
		flashRegWrite8Bits((UINT8 *)progAddr2,(UINT8)(0x55));
		sectorBaseAddr=(UINT8 *)(flashBaseAddr+(sectorNum*MBM29DL640_MTD_SECTOR_SIZE));
		*sectorBaseAddr=(UINT8)0x30;
	}
	
	while(1)
	{
		DQ6Value1=(*sectorBaseAddr)&0x40;
		DQ6Value2=(*sectorBaseAddr)&0x40;
		if(DQ6Value1==DQ6Value2)
			break;
	}
	
	while(timeDelay<5000)
	{
		timeDelay++;
	}	
	return(OK);
}



/******************************************************************************
*
* flashRegWrite8Bits - Write 32 bits to 4 byte aligned address.
*
* RETURNS: N/A
*
*/
LOCAL void flashRegWrite8Bits(UINT8 *addr,UINT8 data)
{
	*addr=data;
}


/******************************************************************************
*
* MBM29DL640Erase - MTD erase routine (see TrueFFS Programmer's Guide)
*
* RETURNS: FLStatus
*
*/

STATUS flashEarse(UINT32 flashBaseAddr, int sectorNum, int sectorCount)
{
	STATUS EarseResult;
	int i;
	
	#ifdef 	MBM_MTD_DEBUG
	logMsg("Earse sector form sector: %d to sector %d \n",sectorNum,(sectorNum+sectorCount),3,4,5,6);
	#endif /* MBM_MTD_DEBUG */
/*	
	sectorNum=sectorNum>>16;
	sectorCount=sectorCount>>16;
*/	
	if((sectorNum+sectorCount)>MBM29DL640_MTD_LAST_SECTOR)
	{
		#ifdef 	MBM_MTD_DEBUG
		printf("earsing sector range overflow!\n");
		#endif /* MBM_MTD_DEBUG */
		return(ERROR);
	}
	
	for(i=0;i<sectorCount;i++)
	{
		EarseResult=mbm29dl640SectorEarse(flashBaseAddr, sectorNum+i);
		if(EarseResult!=OK)
			return(ERROR);
	}
	return(OK);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -