📄 mbm29dl640flash.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 + -