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

📄 fmd.cpp

📁 此压缩包为杰得开发得z228的BSP的源代码,可以实现很多功能,尤其是视频解码有很好的效果.
💻 CPP
📖 第 1 页 / 共 3 页
字号:

//  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 + -