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

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

?? flash.c

?? WinCE5.0BSP for Renesas SH7770
?? C
?? 第 1 頁 / 共 3 頁
字號:
    // Indicate status

    EdbgOutputDebugString( "-OEMStartEraseFlash(rc=1)\r\n" );
    return TRUE;
}

//------------------------------------------------------------------------------
//  Function:  OEMFinishEraseFlash
//
//  Desc...
//

BOOL OEMFinishEraseFlash( void )
{
BOOL	rc;

	EdbgOutputDebugString( "+OEMFinishEraseFlash\r\n" );

    if( !gnBlocks )
    {
		EdbgOutputDebugString( "ERROR: OEMFinishEraseFlash: not initialized\r\n" );

        return( FALSE );
    }

    // Continue erasing flash until all blocks are erased

    while( (gnRetries < MAX_RETRIES) && (gnBlocks != gnErased) )
    {
        OEMContinueEraseFlash();
    }

	// Indicate status

    rc = (gnBlocks == gnErased);
	EdbgOutputDebugString( "-OEMFinishEraseFlash(rc=%d)\r\n", rc );
    return( rc );
}

//------------------------------------------------------------------------------
//  Function:  name( args )
//
//  Desc...
//

void OEMContinueEraseFlash (void)
{
    volatile DWORD *pdwSR;
    char *pszErrorMsg;
    BOOL bByteMode = dwFlashPageSize == 32 ? TRUE : FALSE; // See FlashPageWrite_IntelStrata().

//	EdbgOutputDebugString( "+OEMContinueEraseFlash\r\n" );

    pdwSR= (DWORD *)(gdwFlashAreaBase + dwBlockIndex * dwFlashBlockSize);

	// TBD - the following 2 tests don't appear necessary looking at
	// TBD - above function.

    if( !gnBlocks || (gnBlocks == gnErased) )
    {
		EdbgOutputDebugString( "ERROR: OEMCcontinueEraseFlash: done or not initialized\r\n" );
        return;				
    }

    if( gnRetries >= MAX_RETRIES )
    {
		EdbgOutputDebugString( "ERROR: OEMCcontinueEraseFlash: exceeded retries\r\n" );
        return;		        
    }

    // Now fill the command queue with erase block commands
    // Converting Block to address 

    switch( gStatus[dwBlockIndex] )
    {
    case eDIRTY:

        // Initialize reading of ESRs
		FlashWriteCommand(pdwSR, bByteMode ? 0x70707070 : 0x00700070);

        // If the block is busy, come back to it later
		if ( FlashSR1(pdwSR, bByteMode ? 0x80808080 : 0x00800080) )
        {
            // Tell it to erase the next block
            FlashWriteCommand(pdwSR, bByteMode ? 0x20202020 : 0x00200020);
            FlashWriteCommand(pdwSR, bByteMode ? 0xD0D0D0D0 : 0x00D000D0);
            gStatus[dwBlockIndex]=ePENDING;
        }
        break;

    case ePENDING:

        // Initialize reading of ESRs
		FlashWriteCommand(pdwSR, bByteMode ? 0x70707070 : 0x00700070);

        // If the block is busy, come back to it later
        if( FlashSR1(pdwSR, bByteMode ? 0x80808080 : 0x00800080) )
        {
            // Check for operation errors

            if( FlashError( pdwSR, &pszErrorMsg ) )
            {
                // This will make the routine loop back and try to erase the block again.

                gStatus[dwBlockIndex] = eDIRTY;
                EdbgOutputDebugString( "ERROR: Attempting To Erase Block %u: %s\r\n", dwBlockIndex, pszErrorMsg );
                gnRetries++;
            }
            else
            {      
                // Success. advance to next block
                // EdbgOutputDebugString( "eERASED:%u\r\n", dwBlock );

                EdbgOutputDebugString( "INFO: eERASED:%u (%X)\r\n", dwBlockIndex, pdwSR );

                gStatus[dwBlockIndex] = eERASED;
                gnErased ++;
                dwBlockIndex++;
            };
        }
        break;

    case eERASED:

        break;				// already erased

    default:

        // Erasing a written block!! should never happen

        EdbgOutputDebugString ("ERROR: Flash block %u written and erased again!!!\r\n", dwBlockIndex);
        return;
    }
}

//------------------------------------------------------------------------------
//  Function:  name( args )
//
//  Desc...
//

void DumpDwords(PDWORD pdw, int len)
{
    int lc;

    lc = 0;
    EdbgOutputDebugString("Dumpping %d dwords", len);

    for( lc = 0 ; len ; ++pdw, ++lc, --len )
    {
        if( !(lc & 3) )
            EdbgOutputDebugString("\r\n%X -", pdw);
        EdbgOutputDebugString(" %X", *pdw);
    }

    EdbgOutputDebugString("\r\n");
}

UINT16 FlashError_IntelStrata( volatile DWORD *pdwSR, char **ppszErrorMsg )
{

    BOOL bByteMode = dwFlashPageSize == 32 ? TRUE : FALSE; // See FlashPageWrite_IntelStrata().
    BOOL bError = FALSE;
    int reason = 0;

    // Read Status Register command
    FlashWriteCommand(pdwSR, bByteMode ? 0x70707070UL : 0x00700070);

    // Check DEVICE PROTECT STATUS
    if (!FlashSR0(pdwSR, bByteMode ? 0x02020202 : 0x00020002)) reason += 1;
    // Check PROGRAMMING VOLTAGE STATUS
    if (!FlashSR0(pdwSR, bByteMode ? 0x08080808 : 0x00080008)) reason += 2;
    // Check PROGRAMMING AND SET LOCK-BIT STATUS
    if (!FlashSR0(pdwSR, bByteMode ? 0x10101010 : 0x00100010)) reason += 4;
    // Check ERASE AND CLEAR LOCK-BITS STATUS
    if (!FlashSR0(pdwSR, bByteMode ? 0x20202020 : 0x00200020)) reason += 8;

    switch (reason) {

    case 0: // no error
        return 0;

    case 4: // simple programming error
        *ppszErrorMsg = "Device programming error.";
        break;

    case 8: // simple erasing error
        *ppszErrorMsg = "Device erasing error.";
        break;

    case 5: // write failed by block protection
    case 9: // erase failed by block protection
        *ppszErrorMsg = "This block is protected.";
        break;

    case 6: // write failed by low Vpen
    case 10:// erase failed by low Vpen
        *ppszErrorMsg = "Vpen is low, cannot erase/program device.";
        break;

    case 12: // command sequence error
        *ppszErrorMsg = "Bad command sequence.";
        break;

    case 13:
             // I don't know why, but actually Intel 28F128J3A device returns
             // 0xAA error status in lock bit clear when Vpen is low.
        *ppszErrorMsg = "Vpen is low, cannot erase/program device";
        break;

    default: // unexpected state
        *ppszErrorMsg = "Unexpected device state.";
        break;

    }

    FlashWriteCommand(pdwSR, 0x50505050UL); // Clear Status Register command

    // If the error is simple erase or write error, allows retry.
    if (reason == 4 || reason == 8) return 1;
    else return 2; // fatal error

}

UINT16 FlashWrite_IntelStrata( DWORD dwPhysStart, DWORD dwPhysLen, char **ppszErrorMsg )
{
    DWORD *pdwFlashCache;
    volatile DWORD *pdwFlash;
    DWORD dwStartBlock, dwEndBlock, dwBlocksLeft, dwFirstBlockOffset, dwDWORDsLeft;
    DWORD dwFlashAreaBase;
    DWORD i;

    BOOL bErasing=TRUE;
    DWORD dwStart;

    if (CheckFlashWriteProtect()) {
        *ppszErrorMsg = "Error : write protected.";
        return 1;
    }

    dwFlashAreaBase = (dwPhysStart & 0x1C000000) | UNCACHED_BASE; // top of each area
    dwStartBlock = (dwPhysStart & (0x04000000 - dwFlashBlockSize)) / dwFlashBlockSize;
    dwEndBlock = ((dwPhysStart + dwPhysLen) & (0x04000000 - dwFlashBlockSize)) / dwFlashBlockSize;
    dwBlocksLeft = dwEndBlock - dwStartBlock + 1;

    // Calculate how far from the beginning of the first block the starting address falls
    dwFirstBlockOffset = dwPhysStart & (dwFlashBlockSize - 1);

    EdbgOutputDebugString("FlashWrite: dwStartBlock %d dwEndBlock %d dwBlocksLeft %d dwFirstBlockOffset %Xh\r\n",
		dwStartBlock, dwEndBlock, dwBlocksLeft, dwFirstBlockOffset);

    // protect BLOCK 0 (ethernet bootloader block)
    if (dwStartBlock == 0 && dwFlashAreaBase == (AREA_0 + UNCACHED_BASE)) {
        *ppszErrorMsg = "Error : Block 0 is the bootloader block. Check the image start address.";
        return 1;
    }

    while (bErasing) {
        bErasing=FALSE;
        for (i = dwStartBlock; i <= dwEndBlock; i++) {
            if (gStatus[i] != eERASED) {
                bErasing=TRUE;
				OEMContinueEraseFlash();
            }
        }
    }

    dwStart= OEMEthGetSecs();
    while (OEMEthGetSecs() - dwStart < 3) ;

    while (dwBlocksLeft) {

        for (i = dwStartBlock; i <= dwEndBlock; i++) {
            EdbgOutputDebugString( "FlashWrite: Block %d\r\n", i );
            // Attempt to flash all erased blocks
            if (gStatus[i] == eERASED) {
                // Set up the FlashCache pointer and number of words to write
                // If this is the first block, we need to start further along
				if (i == dwStartBlock) {
                    pdwFlash = (DWORD *)(dwPhysStart | UNCACHED_BASE);
                    pdwFlashCache = (DWORD*)FLASH_CACHE;
                    dwDWORDsLeft = (dwFlashBlockSize - dwFirstBlockOffset) / 4;
                    // If the whole image is less than one block long
                    if (dwDWORDsLeft > dwPhysLen / 4)
                        dwDWORDsLeft = dwPhysLen / 4;
                }
                else {
                    pdwFlash = (DWORD *)(dwFlashAreaBase + i * dwFlashBlockSize);
                    pdwFlashCache = (DWORD*)(FLASH_CACHE
                        + (i - dwStartBlock) * dwFlashBlockSize - dwFirstBlockOffset);
                    // If this is the last block we need to cut short the number of DWORDs written
                    if (i == dwEndBlock) dwDWORDsLeft = (dwPhysLen % dwFlashBlockSize) / 4;
                    else dwDWORDsLeft = dwFlashBlockSize / 4;
                }

                if (FlashPageWrite_IntelStrata(pdwFlash, pdwFlashCache, dwDWORDsLeft, ppszErrorMsg))
                    return 1;

                dwBlocksLeft--;
                gStatus[i] = eFLASHED;
            } // If the block was successfully erased
        }
    } // while there are still blocks left to program

    // Close out all the pages.  Wait until they have finished programming and then compare them against
    //  the cache image for consistency.
    if (FlashClose_IntelStrata((dwPhysStart | UNCACHED_BASE), dwPhysLen, ppszErrorMsg)) return 1;
    else return 0;

}

UINT16 FlashPageWrite_IntelStrata(
    volatile DWORD *pdwFlash,
    DWORD *pdwFlashCache,
    DWORD dwDWORDsLeft,
    char **ppszErrorMsg )
{

    volatile DWORD *pdwSR;
    DWORD i, dwCount;
    BOOL bByteMode = dwFlashPageSize == 32 ? TRUE : FALSE;
    // Strata series has 4 word or 8 byte page buffer for programming (J5/J3) and
    // reading (J3 only). In byte mode (4 devices in 32-bit bus), page size is set
    // to 32 bytes, and in word mode (2 devices in 32-bit bus), it is set to 16.

    if (CheckFlashWriteProtect()) {
        *ppszErrorMsg = "Error : write protected.";
        return 1;
    }

    pdwSR = (DWORD*)( ((DWORD)pdwFlash) & (~(dwFlashBlockSize - 1)) ); // 32bit
    EdbgOutputDebugString( "FlashPageWrite: From %Xh to %Xh Length %Xh\r\n",
        pdwFlashCache, pdwFlash, dwDWORDsLeft*4);

    // Loop until we've written the entire page
    while ( (long)dwDWORDsLeft > 0 ) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
麻豆一区二区三| 久久精品二区亚洲w码| 亚洲色图视频网| 亚洲黄色录像片| 日本免费在线视频不卡一不卡二| 日韩精品一二三| 99re热视频这里只精品| 日韩欧美亚洲国产另类| 成人欧美一区二区三区| 亚洲高清不卡在线观看| 国产成人av影院| 欧美日韩视频在线一区二区| 久久美女高清视频| 香蕉影视欧美成人| 成人av在线观| 国产亚洲欧美色| 青青青伊人色综合久久| 一本高清dvd不卡在线观看 | 日韩久久久久久| 亚洲欧美日韩在线不卡| 男男视频亚洲欧美| 欧美日韩国产综合视频在线观看| 中日韩免费视频中文字幕| 国精产品一区一区三区mba桃花 | 国产精品911| 日韩精品综合一本久道在线视频| 亚洲一区二区三区四区的| 成人动漫中文字幕| 中文av字幕一区| 国内精品国产成人国产三级粉色| 欧美人与z0zoxxxx视频| 亚洲一区二区欧美| 色香色香欲天天天影视综合网 | 精品一区在线看| 欧美va天堂va视频va在线| 久久电影网电视剧免费观看| 91精品国产91热久久久做人人 | 欧美高清精品3d| 日韩黄色在线观看| 久久夜色精品国产欧美乱极品| 奇米色一区二区| 国产亚洲视频系列| 日本精品免费观看高清观看| 久久国产精品区| 亚洲欧洲三级电影| 欧美日韩一区三区四区| 免费亚洲电影在线| 国产精品久线观看视频| 欧洲精品在线观看| 国产在线视频一区二区| 中文字幕的久久| 欧美亚洲一区二区三区四区| 激情五月激情综合网| 亚洲视频一区二区在线观看| 欧美一级久久久| 在线中文字幕一区二区| 天堂资源在线中文精品| 国产精品视频在线看| 91精品国产综合久久精品性色| 成人激情av网| 国产成人亚洲综合色影视| 美女视频黄免费的久久 | 欧美性三三影院| 粉嫩aⅴ一区二区三区四区五区 | 欧美视频一区二区三区| 国产成人av一区| 精品无人码麻豆乱码1区2区| 亚洲精品亚洲人成人网在线播放| 日韩精品一区二区三区中文精品 | 亚洲国产精品精华液ab| 精品毛片乱码1区2区3区| 欧美精品三级日韩久久| 91国偷自产一区二区三区观看| 成人丝袜高跟foot| 丰满白嫩尤物一区二区| 国产精品影视网| 国内精品视频666| 国产一区二区视频在线播放| 日本va欧美va欧美va精品| 日韩av成人高清| 麻豆成人免费电影| 黄一区二区三区| 国产成人精品免费| 欧美一区二区免费观在线| 日韩一二三四区| 亚洲视频资源在线| 亚洲成人福利片| 久久99久国产精品黄毛片色诱| 久久精品国产精品亚洲综合| 国产一区二区三区美女| 一本色道a无线码一区v| 在线观看91av| 中文字幕日韩精品一区| 午夜视频久久久久久| 精品亚洲欧美一区| 99久久精品免费| 精品国产免费一区二区三区四区| 国产精品天干天干在线综合| 丝袜亚洲另类丝袜在线| 国产成人高清在线| 欧美一区二区高清| 亚洲欧洲精品一区二区精品久久久 | 亚洲精品成人精品456| 久久精品免费观看| 欧美亚洲免费在线一区| 亚洲国产激情av| 久久国产成人午夜av影院| 色婷婷av一区二区三区gif| 精品91自产拍在线观看一区| 亚洲国产一区二区在线播放| 国产成a人亚洲| 日韩欧美在线不卡| 亚洲不卡一区二区三区| 色婷婷综合久久久| 国产精品久久网站| 高清成人在线观看| 日本一区二区视频在线观看| 蜜臀av亚洲一区中文字幕| 欧美午夜在线一二页| 亚洲色图丝袜美腿| 91偷拍与自偷拍精品| 日本午夜精品一区二区三区电影 | 午夜伦欧美伦电影理论片| 在线免费观看不卡av| 亚洲一区二区三区在线| 91成人在线免费观看| 亚洲午夜久久久久久久久久久 | 天天av天天翘天天综合网色鬼国产| 欧美一级视频精品观看| 精品亚洲porn| 中文字幕乱码一区二区免费| 国产精品99久| 午夜伊人狠狠久久| 久久久不卡影院| 91在线播放网址| 欧美aaa在线| 国产精品免费视频网站| 欧美在线播放高清精品| 日本91福利区| 久久久99久久精品欧美| 99精品在线观看视频| 亚洲第一福利一区| 国产日韩欧美精品电影三级在线| 国产一区二三区| 亚洲国产精品综合小说图片区| 在线播放中文字幕一区| 国产精品一级在线| 天堂在线亚洲视频| 中文字幕在线观看一区| 欧美一级理论片| 欧美三级电影一区| 大陆成人av片| 激情小说亚洲一区| 偷拍一区二区三区| 亚洲欧美另类综合偷拍| 久久综合久久久久88| 欧美久久久久久久久久| 色婷婷激情综合| av欧美精品.com| 久久er99精品| 九色综合国产一区二区三区| 五月婷婷另类国产| 亚洲欧美一区二区三区极速播放 | 欧美午夜不卡视频| 91一区二区在线观看| 成人av午夜电影| av一区二区三区在线| 一本一本大道香蕉久在线精品| 99九九99九九九视频精品| 不卡一卡二卡三乱码免费网站| 高清国产一区二区| 波多野结衣在线aⅴ中文字幕不卡| 久久不见久久见免费视频7 | 26uuu亚洲综合色| 国产精品亲子伦对白| 亚洲美女免费在线| 丝瓜av网站精品一区二区| 美女视频黄频大全不卡视频在线播放 | 国产在线精品视频| 风流少妇一区二区| 欧美性欧美巨大黑白大战| 欧美区视频在线观看| 精品国内二区三区| 1000部国产精品成人观看| 亚洲第一主播视频| 国产精品一区免费视频| 日本高清无吗v一区| 678五月天丁香亚洲综合网| 国产人成亚洲第一网站在线播放| 1024成人网色www| 久久www免费人成看片高清| 成人精品小蝌蚪| 欧美一区二区视频网站| 国产精品白丝在线| 精品一区二区综合| 欧美日韩日日骚| 欧美激情一区二区| 精品一区二区在线观看| 色婷婷亚洲一区二区三区| 国产亚洲va综合人人澡精品|