📄 fmd.cpp
字号:
// nandflash_test();
// nandflash_eraseall();
#if 1
//2007-6-5 qzsu
unsigned char buff[2048];
nand_readpage(MANU_FLASH_BLOCK_START*pChipInfo->pageperblock,buff);
if(strncmp((char*)buff,"ManuFlash",9) != 0)
{
#if 0
FILE* fp;
fp = fopen("\\test.txt","w+b");
if(fp)
{
fwrite(buff,1,9,fp);
}
#endif
strncpy((char*)buff,"ManuFlash",9);
nand_wp(FALSE);
nandflash_eraseall();
nand_writepage(MANU_FLASH_BLOCK_START*pChipInfo->pageperblock,buff);
nand_wp(TRUE);
#if 0
if(fp)
{
fwrite(buff,1,9,fp);
fclose(fp);
}
#endif
}
#endif
return (PVOID)0xc8000000;
//return 0x0;
}
BOOL FMD_Deinit(PVOID hFMD)
{
return TRUE;
}
VOID FMD_PowerUp(VOID)
{
}
VOID FMD_PowerDown(VOID)
{
}
BOOL FMD_EraseBlock(BLOCK_ID blockID)
{
UINT32 blkpage;
if(pChipInfo == NULL)
return FALSE;
blkpage = blockID * pChipInfo->pageperblock;
nand_wp(FALSE);
if(nand_erase(blkpage) == -1)
{
RETAILMSG(1, (TEXT("Fail to erase(block id:%d)!\r\n"),blockID));
nand_wp(TRUE);
return FALSE;
}
nand_wp(TRUE);
return TRUE;
}
BOOL FMD_ReadSector(SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff,PSectorInfo pSectorInfoBuff, DWORD dwNumSectors)
{
// RETAILMSG(0, (TEXT("FMD_ReadSector\r\n")));
if(pChipInfo == NULL)
return FALSE;
if (!pSectorBuff && !pSectorInfoBuff || dwNumSectors > 1)
return FALSE;
if(pSectorBuff)
{
// unsigned int index;
// DWORD checksum = 0,checksumcmp;
if(nand_readpage(startSectorAddr,pSectorBuff) == -1)
{
RETAILMSG(1, (TEXT("Fail to read page(sector addr:%d)!\r\n"),startSectorAddr));
return FALSE;
}
#if 0//NF_DG
for(index = 0; index < pChipInfo->pagesize;index++)
checksum += pSectorBuff[index];
nand_readoob(startSectorAddr,12,(UINT8 *)&checksumcmp,4);
if(checksum != checksumcmp)
{
RETAILMSG(1, (TEXT("Fail to read sector(sector addr:%d) CHKSUM1:%x CHKSUM2:%x!\r\n"),startSectorAddr,checksum,checksumcmp));
return FALSE;
}
#endif
}
if(pSectorInfoBuff)
{
UINT8 oobbuf[64];
nand_readoob(startSectorAddr,0,oobbuf,pChipInfo->oobsize);
memcpy(pSectorInfoBuff,oobbuf,sizeof(SectorInfo));
}
return TRUE;
}
BOOL FMD_WriteSector(SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff, PSectorInfo pSectorInfoBuff,DWORD dwNumSectors)
{
// RETAILMSG(0, (TEXT("FMD_WriteSector\r\n")));
if(pChipInfo == NULL)
return FALSE;
if (!pSectorBuff && !pSectorInfoBuff || dwNumSectors > 1)
{
if(dwNumSectors > 1)
{
RETAILMSG(1, (TEXT("dwNumSectors:%d\r\n"),dwNumSectors));
}
return FALSE;
}
nand_wp(FALSE);
if(pSectorBuff)
{
if(nand_writepage(startSectorAddr,pSectorBuff) == -1)
{
RETAILMSG(1, (TEXT("Fail to write page(sector addr:%d)!\r\n"),startSectorAddr));
nand_wp(TRUE);
return FALSE;
}
}
if(pSectorInfoBuff)
{
UINT8 oobbuf[64];
memset(oobbuf,0xFF,sizeof(oobbuf));
memcpy(oobbuf,pSectorInfoBuff,sizeof(SectorInfo));
if(nand_writeoob(startSectorAddr,0,oobbuf,pChipInfo->oobsize) == -1)
{
RETAILMSG(1, (TEXT("Fail to write oob(sector addr:%d)!\r\n"),startSectorAddr));
nand_wp(TRUE);
return FALSE;
}
}
#if 0//NF_DG
//Test Code
if(pSectorBuff)
{
unsigned int index;
DWORD checksum = 0;
for(index = 0; index < pChipInfo->pagesize;index++)
checksum += pSectorBuff[index];
if(nand_writeoob(startSectorAddr,12,(UINT8 *)&checksum,4) == -1)
{
RETAILMSG(1, (TEXT("Fail to write sector(sector addr:%d)!\r\n"),startSectorAddr));
return FALSE;
}
}
#endif
nand_wp(TRUE);
return TRUE;
}
BOOL FMD_GetInfo(PFlashInfo pFlashInfo)
{
//RETAILMSG(1, (TEXT("FMD_GetInfo()\r\n")));
if(pChipInfo)
{
pFlashInfo->flashType = NAND;
//yz_add
pFlashInfo->dwNumBlocks = (DWORD)pChipInfo->blocknum;
//pFlashInfo->dwNumBlocks = 8192;
pFlashInfo->dwBytesPerBlock = (DWORD)(pChipInfo->pageperblock * pChipInfo->pagesize);
pFlashInfo->wSectorsPerBlock = (WORD)pChipInfo->pageperblock;
pFlashInfo->wDataBytesPerSector = (WORD)pChipInfo->pagesize;
RETAILMSG(1, (TEXT("FMD_GetInfo::Type:%x Blocks:%x BlockSize:%x SectorPerBlock:%x SectorSize:%x !\r\n"),
pFlashInfo->flashType,
pFlashInfo->dwNumBlocks,
pFlashInfo->dwBytesPerBlock,
pFlashInfo->wSectorsPerBlock,
pFlashInfo->wDataBytesPerSector));
return TRUE;
}
else
return FALSE;
}
#define SCREEN_WIDTH 480
#define SCREEN_HEIGHT 272
//unsigned short* CLCD_FRAMEBUF = NULL;
unsigned char* CLCD_FRAMEBUF = NULL;
//yz_add
void setpixel(int x, int y, unsigned char r, unsigned char g, unsigned char b )
{
unsigned int value = 0;
//qzsu add for startbmp in 2006-11-29
if(!CLCD_FRAMEBUF)
{
PHYSICAL_ADDRESS PhysicalAddress;
PhysicalAddress.HighPart = 0;
PhysicalAddress.LowPart = PHYS_CLCD_BUFF_BASE;
//CLCD_FRAMEBUF = (unsigned short*)MmMapIoSpace( PhysicalAddress, 480*272*2, FALSE);
CLCD_FRAMEBUF = (unsigned char*)MmMapIoSpace( PhysicalAddress, SCREEN_WIDTH*SCREEN_HEIGHT*4, FALSE);
RETAILMSG(1, (TEXT("CLCD_FRAMEBUF:%x\r\n"),CLCD_FRAMEBUF));
}
//value = value|(((unsigned short)(b>>3))<<11);
//value = value|(((unsigned short)(g>>2))<<5);
//value = value|((unsigned short)(r>>3));
value = value|(unsigned int)(b<<16);
value = value|(unsigned int)(g<<8);
value = value|(unsigned int)(r);
*((unsigned int*)(CLCD_FRAMEBUF + 4*(y*SCREEN_WIDTH + x))) = value;
}
#define PIXEL_OFFSET 8
//#define PIXEL_OFFSET 17
//yz_end
DWORD FMD_GetBlockStatus(BLOCK_ID blockID)
{
#if 0
DWORD dwResult = 0;
nand_readoob(blockID * pChipInfo->pageperblock, 5, (UINT8 *)&dwResult,1);
return dwResult;
#else
SectorInfo SI;
UINT32 blkpage;
DWORD dwResult = 0;
UINT8 oobbuf[64];
UINT8 temp;
int x = 0, y = 0;
static unsigned char startup = 1;
if(pChipInfo == NULL)
return BLOCK_STATUS_UNKNOWN;
#if 0
//yz_add
if(startup == 1)
{
if((blockID / (pChipInfo->blocknum/SCREEN_WIDTH)) == SCREEN_WIDTH || (blockID == (pChipInfo->blocknum -1)))
{
startup = 2;
RETAILMSG(1, (TEXT("Nand read Complete %d\r\n"),blockID));
//qzsu add for startbmp in 2006-11-29
if(CLCD_FRAMEBUF)
{
MmUnmapIoSpace(CLCD_FRAMEBUF,SCREEN_WIDTH*SCREEN_HEIGHT*4);
CLCD_FRAMEBUF = NULL;
}
}
//else if((blockID % PIXEL_OFFSET== 0)&&(blockID / PIXEL_OFFSET < SCREEN_WIDTH))
else if((blockID % (pChipInfo->blocknum/SCREEN_WIDTH)== 0)&&(blockID / (pChipInfo->blocknum/SCREEN_WIDTH) < SCREEN_WIDTH))
{
y = SCREEN_HEIGHT-20;
//x = blockID / PIXEL_OFFSET;
x = blockID / (pChipInfo->blocknum/SCREEN_WIDTH);
//setpixel(x,y,0xFF,170,80);
//setpixel(x,y+1,0xFF,170,80);
//setpixel(x,y+2,0xFF,170,80);
setpixel(x,y,0,0,0xFF);
setpixel(x,y+1,0,0,0xFF);
setpixel(x,y+2,0,0,0xFF);
}
}
#endif
#if 1
//if(blockID < 768 || blockID > 1550)
//if(blockID < (768 + 34) )
//if(blockID < 870)
//if(blockID < MANU_FLASH_BLOCK_START+MANU_FLASH_BLOCK_NUM)
if(blockID < MANU_FLASH_BLOCK_START+1 || blockID >= MANU_FLASH_BLOCK_START+MANU_FLASH_BLOCK_NUM)
//if(blockID < (pChipInfo->blocknum - 1 ))
//if(blockID > 255 )
{
dwResult |= BLOCK_STATUS_RESERVED;
return dwResult;
}
/*
else
{
RETAILMSG(1, (TEXT("NOT reserve (blockID:%d)\r\n"),blockID));
}
*/
#endif
blkpage = blockID * pChipInfo->pageperblock;
nand_readoob(blkpage,0,oobbuf,pChipInfo->oobsize);
memcpy(&SI, oobbuf, sizeof(SectorInfo));
//yz_change
/*
#if 0
if(!(SI.bOEMReserved & OEM_BLOCK_READONLY))
{
dwResult |= BLOCK_STATUS_READONLY;
}
#else
if(!(SI.bOEMReserved & BLOCK_STATUS_READONLY))
{
dwResult |= BLOCK_STATUS_READONLY;
}
#endif
*/
//yz_add
//if(SI.bBadBlock != 0xFF)
if(SI.bOEMReserved != 0xFF)
{
RETAILMSG(1, (TEXT("Is bad block(?):: blockID:%d, 1:%x, 2:%x, 3:%x, 4:%x, result: %x\r\n"),blockID, SI.dwReserved1, SI.bOEMReserved, SI.bBadBlock, SI.wReserved2, dwResult));
temp = 0xFF;
nand_wp(FALSE);
if((nand_writeoob(blockID * pChipInfo->pageperblock, 4, &temp,1) == -1)&&(nand_writeoob(blockID * pChipInfo->pageperblock, 5, &temp,1) == -1))
RETAILMSG(1, (TEXT("FMD_GetInfo::Fail to set block status(blockID:%d)!\r\n"),blockID));
nand_wp(TRUE);
nand_readoob(blkpage,0,oobbuf,pChipInfo->oobsize);
memcpy(&SI, oobbuf, sizeof(SectorInfo));
if(SI.bOEMReserved == 0x00 && SI.bBadBlock == 0x00)
{
dwResult |= BLOCK_STATUS_BAD;
RETAILMSG(1, (TEXT("bad block:: blockID:%d, 1:%x, 2:%x, 3:%x, 4:%x, result: %x\r\n"),blockID, SI.dwReserved1, SI.bOEMReserved, SI.bBadBlock, SI.wReserved2, dwResult));
}
else if(SI.bOEMReserved != 0xFF || SI.bBadBlock != 0xFF)
{
RETAILMSG(1, (TEXT("Is bad block2(?):: blockID:%d, 1:%x, 2:%x, 3:%x, 4:%x, result: %x\r\n"),blockID, SI.dwReserved1, SI.bOEMReserved, SI.bBadBlock, SI.wReserved2, dwResult));
}
//yz_add
/*
if(nand_erase(blkpage) == -1)
{
RETAILMSG(1, (TEXT("Fail to erase(block: %d)!\r\n"),blockID));
}
*/
}
if(blockID%200 == 0)
RETAILMSG(1, (TEXT("FMD_GetBlockStatus:: blockID:%d, 1:%x, 2:%x, 3:%x, 4:%x, result: %x\r\n"),blockID, SI.dwReserved1, SI.bOEMReserved, SI.bBadBlock, SI.wReserved2, dwResult));
#endif
return dwResult;
}
BOOL FMD_SetBlockStatus(BLOCK_ID blockID, DWORD dwStatus)
{
if(pChipInfo == NULL)
return FALSE;
//if(nand_writeoob(blockID * pChipInfo->pageperblock, 5, (UINT8 *)&dwStatus,1) == -1)
//yz_add
//dwStatus = 0xFF;
RETAILMSG(1, (TEXT("FMD_SetBlockStatus:: blockID:%d, dwStatus: %x\r\n"),blockID,dwStatus));
nand_wp(FALSE);
if(nand_writeoob(blockID * pChipInfo->pageperblock, 4, (UINT8 *)&dwStatus,1) == -1)
{
RETAILMSG(1, (TEXT("Fail to set block status(blockID:%d)!\r\n"),blockID));
nand_wp(TRUE);
return FALSE;
}
nand_wp(TRUE);
return TRUE;
}
/*
BOOL GetFolderName(
PDISK pDisk,
LPWSTR FolderName,
DWORD cBytes,
DWORD * pcBytes
)
{
HKEY DriverKey;
DWORD ValType;
DWORD status;
DriverKey = OpenDriverKey(pDisk->d_ActivePath);
if (DriverKey) {
*pcBytes = cBytes;
status = RegQueryValueEx(
DriverKey,
TEXT("Folder"),
NULL,
&ValType,
(PUCHAR)FolderName,
pcBytes);
if (status != ERROR_SUCCESS) {
DEBUGMSG(ZONE_INIT|ZONE_ERROR,
(TEXT("RAM:GetFolderName - RegQueryValueEx(Folder) returned %d\r\n"),
status));
RETAILMSG(1,
(TEXT("RAM:GetFolderName - RegQueryValueEx(Folder) returned %d\r\n"),
status));
*pcBytes = 0;
} else {
DEBUGMSG(ZONE_INIT|ZONE_ERROR,
(TEXT("RAM:GetFolderName - FolderName = %s, length = %d\r\n"),
FolderName, *pcBytes));
RETAILMSG(1,
(TEXT("RAM:GetFolderName - FolderName = %s, length = %d\r\n"),
FolderName, *pcBytes));
*pcBytes += sizeof(WCHAR); // account for terminating 0.
}
RegCloseKey(DriverKey);
if (status || (*pcBytes == 0)) {
// Use default
return FALSE;
}
return TRUE;
}
return FALSE;
}
*/
BOOL FMD_OEMIoControl(DWORD dwIoControlCode,PBYTE pInBuf,DWORD nInBufSize,PBYTE pOutBuf,DWORD nOutBufSize, PDWORD pBytesReturned)
{
//BSP_ARGS *pBSPArgs = ((BSP_ARGS *) IMAGE_SHARE_ARGS_UA_START);
//PDISK pDisk = (PDISK) Handle;
RETAILMSG(1, (TEXT("FMD_OEMIoControl: IOCTL (0x%x).\r\n"), dwIoControlCode));
switch(dwIoControlCode)
{
case IOCTL_FMD_GET_INTERFACE:
{
if (!pOutBuf || nOutBufSize < sizeof(FMDInterface))
{
DEBUGMSG(1, (TEXT("FMD_OEMIoControl: IOCTL_FMD_GET_INTERFACE bad parameter(s).\r\n")));
return(FALSE);
}
PFMDInterface pInterface = (PFMDInterface)pOutBuf;
pInterface->cbSize = sizeof(FMDInterface);
pInterface->pInit = FMD_Init;
pInterface->pDeInit = FMD_Deinit;
pInterface->pGetInfo = FMD_GetInfo;
pInterface->pGetBlockStatus = FMD_GetBlockStatus;
pInterface->pSetBlockStatus = FMD_SetBlockStatus;
pInterface->pReadSector = FMD_ReadSector;
pInterface->pWriteSector = FMD_WriteSector;
pInterface->pEraseBlock = FMD_EraseBlock;
pInterface->pPowerUp = FMD_PowerUp;
pInterface->pPowerDown = FMD_PowerDown;
pInterface->pGetPhysSectorAddr = NULL;
}
break;
case DISK_IOCTL_GETNAME:
case IOCTL_DISK_GETNAME:
//DEBUGMSG(ZONE_FUNCTION, (TEXT("-DSK_IOControl (name) \r\n")));
RETAILMSG(1, (TEXT("-DSK_IOControl (name) \r\n")));
//return GetFolderName(pDisk, (LPWSTR)pOutBuf, nOutBufSize, pBytesReturned);
pOutBuf = (PBYTE)"NandFlash";
*pBytesReturned = 10;
break;
default:
RETAILMSG(1, (TEXT("FMD_OEMIoControl: unrecognized IOCTL (0x%x).\r\n"), dwIoControlCode));
return(FALSE);
}
return TRUE;
}
void nand_wp(BOOL flag)
{
#if 1
if(flag)
{
*(volatile unsigned int*)(RegBaseAddr + (4<<WP_GP_pin) ) &= (~(1<<WP_GP_pin)); //WP low to active
}
else
{
*(volatile unsigned int*)(RegBaseAddr + (4<<WP_GP_pin) ) |= (1<<WP_GP_pin); //WP high to inactive
}
#endif
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -