亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? amd.cpp

?? Ep93XX TionProV2 BSP
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
				m_offset=ulBlockAddress-g_FMDInfo.ChipBaseAddress;
				// Issue erase and confirm command.
				// Note: eventually this should be changed to issue mass block erases, then loop to
				// verify each completes.
				pusDest32= (volatile ULONG *)g_FMDInfo.ChipBaseAddress;

				WRITE_COMMAND(pusDest32+AMD_SETUP_ADDR1, AMD_SETUP_CODE1);
				WRITE_COMMAND(pusDest32+AMD_SETUP_ADDR2, AMD_SETUP_CODE2);
				WRITE_COMMAND(pusDest32+AMD_SETUP_ADDR1, AMD_SETUP_ERASE);
				WRITE_COMMAND(pusDest32+AMD_SETUP_ADDR1, AMD_SETUP_CODE1);
				WRITE_COMMAND(pusDest32+AMD_SETUP_ADDR2, AMD_SETUP_CODE2);

				*(pusDest32+(m_offset>>2))= (AMD_BLOCK_ERASE<<16)|AMD_BLOCK_ERASE;
				ulCount = 0;

				while ((*(pusDest32+(m_offset>>2)) &AMD_SECTOR_ERASE_TIMER)!=AMD_SECTOR_ERASE_TIMER)
				{
					DelayInuSec(1);
					if ( ulCount++ == 10000 )
					{
					RETAILMSG(ZONE_TEST, (TEXT("erase: Timed out writing buffered data 1\r\n")));
					return 0;
					}
				}
			}
			else
			{	
				pusDest16=(PUSHORT)g_FMDInfo.ChipBaseAddress;
				// Issue erase and confirm command.
				// Note: eventually this should be changed to issue mass block erases, then loop to
				// verify each completes.
				*(pusDest16+ AMD_SETUP_ADDR1)= AMD_SETUP_CODE1;	
				*(pusDest16+ AMD_SETUP_ADDR2)= AMD_SETUP_CODE2;	
				*(pusDest16+ AMD_SETUP_ADDR1)= AMD_SETUP_ERASE;		
				*(pusDest16+ AMD_SETUP_ADDR1)= AMD_SETUP_CODE1;	
				*(pusDest16+ AMD_SETUP_ADDR2)=AMD_SETUP_CODE2;	

				DelayInuSec(100);

				pusDest16=(PUSHORT)ulBlockAddress;
				*pusDest16 = AMD_BLOCK_ERASE;
				
				ulCount = 0;
				DelayInuSec(100);

				while (!CHECK_STATUS(ulBlockAddress, AMD_SECTOR_ERASE_TIMER))
				{
			    	DelayInuSec(1);
			    	if ( ulCount++ == 1000 )
			    	{
			        	RETAILMSG(ZONE_TEST, (TEXT("erase: Timed out writing buffered data 1\r\n")));
			        	return 0;
			    	}
				}
			}
			DelayInuSec(100);
		    ulBlockAddress = ulBlockAddress +g_FlashRegion[g_FMDInfo.gdwCurEraseRegion].block_size;
   		}
	}
   	SetKMode(bLastMode);

	return(TRUE);
}


/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function:       FMD_OEMIoControl()

Description:    Implements user-defined (a.k.a. application specific) commands 
                for the Flash memory device

Returns:        None.
------------------------------------------------------------------------------*/
BOOL  FMD_OEMIoControl(DWORD dwIoControlCode, PBYTE pInBuf, DWORD nInBufSize, 
                       PBYTE pOutBuf, DWORD nOutBufSize, PDWORD pBytesReturned)
{
    switch(dwIoControlCode)
    {
    case IOCTL_FMD_SET_XIPMODE:
        // Select between XIP mode or non-XIP mode.  The difference from the FMD's standpoint is whether or not
        // sector information is stored along with each sector.
        if (!pInBuf || nInBufSize < sizeof(BOOLEAN))
        {
            RETAILMSG(ZONE_TEST, (TEXT("FMD_OEMIoControl: IOCTL_FMD_SET_XIPMODE bad parameter(s).\r\n")));
            return(FALSE);
        }
        g_bXIPMode = *(PBOOLEAN)pInBuf;
        if (!g_bXIPMode)    // Not XIP mode.
        {
			RETAILMSG(ZONE_TEST, (TEXT("FMD_OEMIoControl: IOCTL_FMD_SET_XIPMODE NON XIP.\r\n")));

            g_FMDInfo.UnusedBytesPerBlock = (USHORT)(g_FMDInfo.BlockSize % (SECTOR_SIZE + sizeof(SectorInfo)));
            g_FMDInfo.SectorsPerBlock     = (USHORT)(g_FMDInfo.BlockSize / (SECTOR_SIZE + sizeof(SectorInfo)));
        }
        else                // XIP mode.
        {
			RETAILMSG(ZONE_TEST, (TEXT("FMD_OEMIoControl: IOCTL_FMD_SET_XIPMODE XIP.\r\n")));
            g_FMDInfo.UnusedBytesPerBlock = (USHORT)(g_FMDInfo.BlockSize % SECTOR_SIZE);
            g_FMDInfo.SectorsPerBlock     = (USHORT)(g_FMDInfo.BlockSize / SECTOR_SIZE);
        }
        break;
    case IOCTL_FMD_LOCK_BLOCKS:
        //break;
    case IOCTL_FMD_UNLOCK_BLOCKS:
        //break;
    default:
//        RETAILMSG(ZONE_TEST, (TEXT("FMD_OEMIoControl: unrecognized IOCTL (0x%x).\r\n"), dwIoControlCode));
        return(FALSE);
    }

    return(TRUE);
}


BOOLEAN InitializeFlash(volatile ULONG * pChipPhyBaseAddress, ULONG ChipFlashLength,
						volatile ULONG * pPhyBaseAddress, ULONG FlashLength)
{
    UCHAR nCount = 0;
	
	volatile ULONG * pChipBaseAddress;
	volatile ULONG * pBaseAddress;
//    LARGE_INTEGER    liBasePhyAddr ;
	ULONG nLong;
    int iIdex;
//    USHORT nShort[4];

	InitializeFlashSMC( );


    ASSERT(pPhyBaseAddress);
    ASSERT(FlashLength);
    ASSERT(pChipPhyBaseAddress);
    ASSERT(ChipFlashLength);

    if ( !FlashLength||  !ChipFlashLength)
	    return(FALSE);
	
	RETAILMSG(ZONE_TEST, (TEXT("INFO: InitializeFlash:phy length=%x, file system length=%x.\r\n"),ChipFlashLength,FlashLength));

	pChipBaseAddress=pChipPhyBaseAddress;
	pBaseAddress	=pPhyBaseAddress;

	RETAILMSG(ZONE_TEST, (TEXT("INFO: phy add=%x file add=%x,mmap base add=%x %x.\r\n"),pChipPhyBaseAddress,pPhyBaseAddress,pChipBaseAddress,pBaseAddress));

	#if( EP93XX_FLASH_WIDTH ==32 )
		g_bPairedFlash = TRUE;
	#else
		g_bPairedFlash = FALSE;

    #endif

	RETAILMSG(1, (TEXT("INFO: InitializeFlash. AMD like Flash defined\r\n")));
    //
#if 0
    g_bPairedFlash = TRUE;    // Assume flash is paired.

	WRITE_COMMAND(pChipBaseAddress+AMD_SETUP_ADDR1, AMD_SETUP_CODE1);
	WRITE_COMMAND(pChipBaseAddress+AMD_SETUP_ADDR2, AMD_SETUP_CODE2);
	WRITE_COMMAND(pChipBaseAddress+AMD_SETUP_ADDR1, AMD_READ_ID);

	nShort[0] = READ_USHORT((volatile USHORT *)pChipBaseAddress + AMD_VENDORID_ADDR);
	nShort[1] = READ_USHORT((volatile USHORT *)pChipBaseAddress + AMD_VENDORID_ADDR+1);

	RETAILMSG(1, (TEXT("INFO: Flash id %x %x 1111\r\n"),nShort[0],nShort[1]));

	g_bPairedFlash = TRUE;
	
	if( nShort[0] != MFGCODE_AMD ){

		g_bPairedFlash = FALSE;
	  //this is for 16 bits only braden?????????????????
		*((volatile USHORT *)pChipBaseAddress+AMD_SETUP_ADDR1) =AMD_SETUP_CODE1;
		*((volatile USHORT *)pChipBaseAddress+AMD_SETUP_ADDR2) =AMD_SETUP_CODE2;
		*((volatile USHORT *)pChipBaseAddress+AMD_SETUP_ADDR1) =AMD_READ_ID;

		nShort[0] = READ_USHORT((volatile USHORT *)pChipBaseAddress + AMD_VENDORID_ADDR) ;
		nShort[1] = READ_USHORT((volatile USHORT *)pChipBaseAddress + AMD_VENDORID_ADDR+1) ;

		RETAILMSG(1, (TEXT("INFO: Flash id %x %x \r\n"),nShort[0],nShort[1]));

		if( nShort[0] != MFGCODE_AMD ){
			RETAILMSG(1, (TEXT("ERROR: InitializeFlash: invalid manufacturing code. %08x %04x\r\n"),nShort[0],nShort[1]));
			return(FALSE);
		}
		RETAILMSG(1, (TEXT("INFO: Found single AMD flash.\r\n")));
	}else{
        RETAILMSG(1, (TEXT("INFO: Found paired AMD flash.\r\n")));
	}

#endif
    //
    //
    // Look for a Common Flash Interface (CFI).
    //

   //this is for 16 bits only  braden?????????????????
	if( !g_bPairedFlash ) {

		WRITE_COMMAND(pChipBaseAddress+AMD_SETUP_ADDR1, AMD_SETUP_CODE1);
		WRITE_COMMAND(pChipBaseAddress+AMD_SETUP_ADDR2, AMD_SETUP_CODE2);
	}

    WRITE_COMMAND(pChipBaseAddress+AMD_QUERY_ADDR, AMD_READ_QUERY );

    // We're pretty sure this is an Intel Strataflash part at this point - use the CFI to
    // collect information on it (we're still in query mode).  Also, we'll assume that both
    // high and low word flash parts are the same from here on out (if paired).
    //
    for (nCount = 0 ; nCount < sizeof(FLASH_SYSINTERFACE_INFO) ; nCount++)
    {
        *((PUCHAR)&g_FMDInfo.SysInt + nCount) = (UCHAR)(READ_FLASH_INDEXED(pChipBaseAddress, QS_SYSINTF_OFFSET + nCount) & 0xFF);
    }
    for (nCount = 0 ; nCount < sizeof(FLASH_GEOMETRY_INFO) ; nCount++)
    {
        *((PUCHAR)&g_FMDInfo.Geometry + nCount) = (UCHAR)(READ_FLASH_INDEXED(pChipBaseAddress, QS_DEVGEOM_OFFSET + nCount) & 0xFF);
    }
    //
    //for C3 no buffer write
    //
	if(g_FMDInfo.Geometry.WriteBuffSize==0)
		g_FMDInfo.Geometry.WriteBuffSize=5;

	RETAILMSG(ZONE_TEST, (TEXT("INFO: CFI query write buffer %x\r\n"), g_FMDInfo.Geometry.WriteBuffSize));
	
//    nLong = (ULONG)pow(2,g_FMDInfo.Geometry.DevSize);
	nLong=1<<g_FMDInfo.Geometry.DevSize;
    if (g_bPairedFlash)
    {
		nLong<<=1;
//		nLong*= 2;
    }
    if(ChipFlashLength!=nLong)
    {
 		RETAILMSG(1,(TEXT("INFO: CFI query error:Device size= %x,file=%x,device size %x\r\n")
			,ChipFlashLength,FlashLength,nLong));
	}

    if((FlashLength>nLong)||((ULONG)(pBaseAddress+FlashLength-pChipBaseAddress)>nLong))
    {
		RETAILMSG(ZONE_TEST, (TEXT("INFO: file system need length is too long:Device add %x size= %x,register chipfile=add %x %x\r\n"),
		pChipBaseAddress,ChipFlashLength,pBaseAddress,FlashLength));
    }
	
	g_FMDInfo.ChipBaseAddress	= (ULONG)pChipBaseAddress;
	g_FMDInfo.ChipFlashLength	= (ULONG)ChipFlashLength;
	g_FMDInfo.BaseAddress 		= (ULONG)pBaseAddress;
	g_FMDInfo.FlashLength 		= (ULONG)FlashLength;

    //
    // The block erase code assumes a single block per erase region - check for that here...
    //
    for(iIdex=0;iIdex<g_FMDInfo.Geometry.NumEraseBlocks;iIdex++)
    {
		g_FlashRegion[iIdex].blocks     =  g_FMDInfo.Geometry.FlashRegionInfo[iIdex].blocks +1 ;
		g_FlashRegion[iIdex].block_size=  g_FMDInfo.Geometry.FlashRegionInfo[iIdex].block_size*REGION_SIZE_MULT;
    }
	//
	//find the chip is or not  top or bottom
	//
    if(g_FMDInfo.Geometry.NumEraseBlocks != 1)
    {
    	if(g_FlashRegion[0].block_size<g_FlashRegion[1].block_size)
       {
           g_FMDInfo.bIsTop=TRUE;
       }
		else
			g_FMDInfo.bIsTop = FALSE;
    }
    else
    {
		g_FMDInfo.bIsTop = FALSE;
    }
    // Compute block size and the total number of blocks here.  Since we know an erase region contains
    // only one block, the erase region size is equal to the block size.

    // Note that the flash block size is 128KB, if paired, we have two of the 16-bit parts and the block size is effectively 256KB.
    if(g_FMDInfo.bIsTop==TRUE)
    {
    	//g_FMDInfo.BlockSize           = (g_FMDInfo.Geometry.EraseRegionSize * REGION_SIZE_MULT);
		g_FMDInfo.BlockSize           = (g_FMDInfo.Geometry.FlashRegionInfo[1].block_size* REGION_SIZE_MULT);
    }
    else
    {
		g_FMDInfo.BlockSize           = (g_FMDInfo.Geometry.FlashRegionInfo[0].block_size* REGION_SIZE_MULT);
     }
	
    if (g_bPairedFlash) 
    {
        g_FMDInfo.BlockSize *= 2;
	    for(iIdex=0;iIdex<g_FMDInfo.Geometry.NumEraseBlocks;iIdex++)
		{
			g_FlashRegion[iIdex].block_size *=2;
		}
    }

    // In order for all the math to work out later, we require that the flash base address be block-aligned and that the flash length be 
    // an integral number of blocks.
    if (!GetEraseFlashSectorIndex(pBaseAddress-pChipBaseAddress) || 
		!GetEraseFlashSectorIndex(pBaseAddress-pChipBaseAddress+FlashLength))
    {
        RETAILMSG(1, (TEXT("ERROR: InitializeFlash: base address and length must be block-aligned (Base=0x%x, Length=0x%x).\r\n"), (ULONG)pBaseAddress, FlashLength));
    }
	
	RETAILMSG(ZONE_TEST, (TEXT("current region %x,block id=%x).\r\n"), g_FMDInfo.gdwCurEraseRegion, g_FMDInfo.gdwCurEraseBlock));

    // Note that we need to adjust the total available blocks if the caller specified a non-zero flash offset value.
    g_FMDInfo.TotalFlashBlocks    = (FlashLength / g_FMDInfo.BlockSize);

    // By default, we start out in *non-XIP* mode.
    g_bXIPMode = FALSE;

    // Default to NAND sector layout.  If the caller wants to use this FMD for XIP-able code, they'll call the FMD_OEMIoControl
    // and we'll change the number of UnusedBytesPerBlock.
    g_FMDInfo.UnusedBytesPerBlock = (USHORT)(g_FMDInfo.BlockSize % (SECTOR_SIZE + sizeof(SectorInfo)));
    g_FMDInfo.SectorsPerBlock     = (USHORT)(g_FMDInfo.BlockSize / (SECTOR_SIZE + sizeof(SectorInfo)));

    // Put the Flash into a known state (READ_ARRAY mode with WRITE-ENABLE disabled).
    //
	RETAILMSG(ZONE_TEST, (TEXT(" BlockSize=%x,TotalFlashBlocks=%x,UnusedBytesPerBlock=%x,SectorsPerBlock=%x).\r\n"), 
						g_FMDInfo.BlockSize, g_FMDInfo.TotalFlashBlocks,
						g_FMDInfo.UnusedBytesPerBlock,g_FMDInfo.SectorsPerBlock));
    return(TRUE);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美激情插| 99久久精品免费| 菠萝蜜视频在线观看一区| 欧美视频在线观看一区二区| 欧美精品一区二区三区四区| 一区二区三区在线观看欧美| 国产成人精品网址| 日韩三级免费观看| 亚洲午夜成aⅴ人片| 国产乱码一区二区三区| 在线一区二区三区做爰视频网站| 国产亚洲欧美日韩在线一区| 午夜激情一区二区三区| 91国偷自产一区二区使用方法| 国产欧美一区二区三区在线看蜜臀 | 精品亚洲porn| 欧美精品乱码久久久久久按摩| 国产精品久线观看视频| 韩国一区二区三区| 欧美成人女星排名| 午夜视频在线观看一区| 91香蕉视频污| 国产精品乱码一区二三区小蝌蚪| 久久99国产精品免费网站| 欧美日韩一本到| 亚洲国产欧美另类丝袜| 91视频国产观看| 亚洲精品一二三四区| 色综合天天做天天爱| 亚洲女人的天堂| 色噜噜狠狠成人中文综合| 综合亚洲深深色噜噜狠狠网站| 国产91高潮流白浆在线麻豆| 国产欧美一区二区精品性色超碰| 黄页视频在线91| 精品国产一二三区| 国产又黄又大久久| 久久久午夜电影| 北岛玲一区二区三区四区| 国产精品久久久久婷婷二区次| aaa亚洲精品一二三区| 亚洲人快播电影网| 在线观看亚洲a| 亚洲国产美女搞黄色| 欧美顶级少妇做爰| 国内精品免费**视频| 国产精品福利一区二区| 一本大道综合伊人精品热热| 一区二区三区在线视频观看| 欧美日韩高清一区| 激情欧美一区二区三区在线观看| 国产日产亚洲精品系列| 99在线热播精品免费| 午夜影院久久久| 欧美变态tickling挠脚心| 国产福利精品导航| 一区二区三区毛片| 欧美不卡一区二区三区四区| 盗摄精品av一区二区三区| 亚洲精品国产视频| 精品日本一线二线三线不卡| 国产很黄免费观看久久| 一区二区三区在线不卡| 日韩欧美在线123| 不卡一区二区三区四区| 午夜久久福利影院| 日本一区二区三区四区| 欧美日韩国产成人在线免费| 国产精品一二三| 亚洲国产乱码最新视频| 久久久久久久综合狠狠综合| 欧美亚洲一区二区在线| 国产乱码精品1区2区3区| 亚洲欧美日韩国产综合在线| 欧美大黄免费观看| 91久久奴性调教| 国产精品一区二区三区网站| 亚洲一区二区视频| 国产欧美日韩另类视频免费观看| 欧美日韩在线直播| 成人h动漫精品一区二| 麻豆精品一区二区| 亚洲国产va精品久久久不卡综合 | 欧美福利视频导航| 播五月开心婷婷综合| 美国十次了思思久久精品导航| **网站欧美大片在线观看| 精品欧美乱码久久久久久1区2区| 91久久一区二区| 国产69精品久久久久毛片| 免费不卡在线视频| 亚洲国产精品精华液网站| 国产精品全国免费观看高清 | 欧美在线观看禁18| 色诱视频网站一区| 国产福利一区二区三区视频在线| 日韩中文字幕91| 亚洲美女在线一区| 亚洲欧美在线另类| 中文一区一区三区高中清不卡| 日韩一区二区中文字幕| 欧美日韩久久一区| 欧美日韩视频在线第一区| 91在线播放网址| 99久久国产综合色|国产精品| 国产一区二区三区久久久| 蜜桃免费网站一区二区三区 | 亚洲欧洲性图库| 国产婷婷精品av在线| 久久这里只精品最新地址| 欧美成人性战久久| 精品久久久网站| 精品国一区二区三区| 日韩午夜在线播放| 精品久久久久久久久久久院品网| 91精品在线免费| 欧美一三区三区四区免费在线看| 欧美日韩精品系列| 制服丝袜av成人在线看| 日韩欧美三级在线| 久久先锋影音av| 国产精品丝袜91| 亚洲视频图片小说| 亚洲综合免费观看高清完整版在线| 亚洲美女一区二区三区| 亚洲成av人在线观看| 日欧美一区二区| 国内精品嫩模私拍在线| 成人黄色电影在线 | 亚洲主播在线观看| 五月激情综合婷婷| 久久99国产精品久久99| 国产福利精品导航| 一本色道a无线码一区v| 欧美日韩视频在线一区二区| 欧美一区二区三区免费视频| 久久综合九色综合97_久久久| 久久久91精品国产一区二区精品| 国产精品久久久久天堂| 亚洲午夜精品在线| 精油按摩中文字幕久久| 成人免费视频视频| 欧美日韩视频第一区| 国产午夜久久久久| 亚洲狼人国产精品| 激情图区综合网| 91丨九色丨黑人外教| 日韩一区二区三区免费看 | av电影天堂一区二区在线观看| 色综合久久中文字幕综合网| 欧美一区二区视频免费观看| 国产亚洲综合色| 亚洲丰满少妇videoshd| 国产高清亚洲一区| 欧美日韩在线一区二区| 日本一区二区成人在线| 日韩和欧美一区二区三区| 国产aⅴ精品一区二区三区色成熟| 在线免费观看日本一区| 久久久久久99精品| 天天做天天摸天天爽国产一区| 国产高清无密码一区二区三区| 欧美日韩在线观看一区二区| 久久综合久久久久88| 亚洲一区二区三区国产| 成人国产电影网| 欧美一区日韩一区| 一区二区三区欧美在线观看| 国产一区高清在线| 欧美日韩第一区日日骚| 亚洲色图欧美激情| 成人在线视频一区| 久久久久久久久97黄色工厂| 日韩高清一区在线| 欧美视频一区二区三区在线观看| 欧美激情综合五月色丁香 | 99re成人精品视频| 欧美精品一区二区三区四区| 日韩电影免费在线看| 在线中文字幕一区二区| 亚洲日穴在线视频| jizzjizzjizz欧美| 亚洲国产成人自拍| 国产91精品精华液一区二区三区| 欧美精品一区二区三区久久久| 亚洲国产精品天堂| 欧美性色黄大片| 亚洲成a人在线观看| 欧美偷拍一区二区| 亚洲国产日韩a在线播放| 欧洲人成人精品| 亚洲精品少妇30p| zzijzzij亚洲日本少妇熟睡| 久久久美女艺术照精彩视频福利播放| 一区二区三区欧美激情| 色综合久久综合| 中文字幕在线不卡一区二区三区| 99re这里只有精品6| 久久―日本道色综合久久| 免费观看成人av|