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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? nand.cpp

?? 6410BSP3
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
        return FALSE;
    }

    // is it a valid image descriptor?
    if ( !VALID_IMAGE_DESCRIPTOR(&g_pTOC->id[g_dwTocEntry]) ) {
        EdbgOutputDebugString("TOC_Write ERROR: INVALID_IMAGE[%u] Signature: 0x%x\r\n",
            g_dwTocEntry, g_pTOC->id[g_dwTocEntry].dwSignature);
        return FALSE;
    }

    // in order to write a sector we must erase the entire block first
    // !! BUGBUG: must cache the TOC first so we don't trash other image descriptors !!
    if ( !FMD_EraseBlock(TOC_BLOCK) ) {
        RETAILMSG(1, (TEXT("TOC_Write ERROR: EraseBlock[%d] \r\n"), TOC_BLOCK));
        return FALSE;
    }

    // setup our metadata so filesys won't stomp us
    si.dwReserved1 = 0;
    si.bOEMReserved = ~(OEM_BLOCK_RESERVED | OEM_BLOCK_READONLY);   // NAND cannot set bit 0->1
    si.bBadBlock = BADBLOCKMARK;
    si.wReserved2 = 0xffff;

    // write the sector & metadata
    if ( !FMD_WriteSector(TOC_SECTOR, (PUCHAR)&g_TOC, &si, 1) ) {
        EdbgOutputDebugString("TOC_Write ERROR: Unable to save TOC\r\n");
        return FALSE;
    }

    // read it back & verify both data & metadata
    if ( !FMD_ReadSector(TOC_SECTOR, (PUCHAR)&toc, &si2, 1) ) {
        EdbgOutputDebugString("TOC_Write ERROR: Unable to read/verify TOC\r\n");
        return FALSE;
    }

    if ( 0 != memcmp(&g_TOC, &toc, SECTOR_SIZE) ) {
        EdbgOutputDebugString("TOC_Write ERROR: TOC verify failed\r\n");
        return FALSE;
    }

    if ( 0 != memcmp(&si, &si2, sizeof(si)) ) {
        EdbgOutputDebugString("TOC_Write ERROR: SectorInfo verify failed: %x %x %x %x\r\n",
            si.dwReserved1, si.bOEMReserved, si.bBadBlock, si.wReserved2);
        return FALSE;
    }

    EdbgOutputDebugString("-TOC_Write\r\n");
    return TRUE;
}

/*
    @func   void | DumpXIPChainSummary | Dump XIPCHAIN_SUMMARY structure
    @rdesc  none
    @comm
    @xref
*/
void DumpXIPChainSummary(PXIPCHAIN_SUMMARY pChainInfo)
{    
    EdbgOutputDebugString("[Dump XIP Chain Summary]\r\n");
    EdbgOutputDebugString(" - pvAddr: 0x%x\r\n", pChainInfo->pvAddr);
    EdbgOutputDebugString(" - dwMaxLength : %d\r\n", pChainInfo->dwMaxLength);
    EdbgOutputDebugString(" - usOrder : 0x%x\r\n", pChainInfo->usOrder);
    EdbgOutputDebugString(" - usFlags : 0x%x\r\n", pChainInfo->usFlags);
    EdbgOutputDebugString(" - reserved : 0x%x\r\n", pChainInfo->reserved);    
}

/*
    @func   BOOL | WriteOSImageToBootMedia | Stores the image cached in RAM to the Boot Media.
    The image may be comprised of one or more BIN regions.
    @rdesc  TRUE = Success, FALSE = Failure.
    @comm
    @xref
*/
BOOL WriteOSImageToBootMedia(DWORD dwImageStart, DWORD dwImageLength, DWORD dwLaunchAddr)
{
    BYTE nCount;
    DWORD dwNumExts;
    PXIPCHAIN_SUMMARY pChainInfo = NULL;
    EXTENSION *pExt = NULL;
    DWORD dwBINFSPartLength = 0;
    HANDLE hPart, hPartEx;
    DWORD dwStoreOffset;
    DWORD dwMaxRegionLength[BL_MAX_BIN_REGIONS] = {0};
    DWORD dwChainStart, dwChainLength;
    DWORD dwBlock;

    //  Initialize the variables
    dwChainStart = dwChainLength = 0;

    OALMSG(OAL_FUNC, (TEXT("+WriteOSImageToBootMedia\r\n")));
    OALMSG(OAL_INFO, (TEXT("+WriteOSImageToBootMedia: g_dwTocEntry =%d, ImageStart: 0x%x, ImageLength: 0x%x, LaunchAddr:0x%x\r\n"),
                            g_dwTocEntry, dwImageStart, dwImageLength, dwLaunchAddr));

    if ( !g_bBootMediaExist )
    {
        OALMSG(OAL_ERROR, (TEXT("ERROR: WriteOSImageToBootMedia: device doesn't exist.\r\n")));
        return(FALSE);
    }

    if (g_ImageType == IMAGE_TYPE_RAMIMAGE)
    {
        dwBlock = IMAGE_START_BLOCK + 1;
//      dwImageStart += dwLaunchAddr;
//      dwImageLength = dwImageLength; //step loader can support 4k bytes only. NO SuperIPL case is 16K....... 3 Block
    }

    if ( !VALID_TOC(g_pTOC) )
    {
        OALMSG(OAL_WARN, (TEXT("WARN: WriteOSImageToBootMedia: INVALID_TOC\r\n")));
        if ( !TOC_Init(g_dwTocEntry, g_ImageType, dwImageStart, dwImageLength, dwLaunchAddr) )
        {
            OALMSG(OAL_ERROR, (TEXT("ERROR: INVALID_TOC\r\n")));
            return(FALSE);
        }
    }

    // Look in the kernel region's extension area for a multi-BIN extension descriptor.
    // This region, if found, details the number, start, and size of each BIN region.
    //
    for (nCount = 0, dwNumExts = 0 ; (nCount < g_BINRegionInfo.dwNumRegions); nCount++)
    {
        // Does this region contain nk.exe and an extension pointer?
        //
        pExt = (EXTENSION *)GetKernelExtPointer(g_BINRegionInfo.Region[nCount].dwRegionStart,
                                                g_BINRegionInfo.Region[nCount].dwRegionLength );
        EdbgOutputDebugString("INFO: %s: [%d] RegionStart:0x%x, RegionLength:0x%x, pExt:0x%x\r\n",
                                                __FUNCTION__, nCount,
                                                g_BINRegionInfo.Region[nCount].dwRegionStart,
                                                g_BINRegionInfo.Region[nCount].dwRegionLength,
                                                pExt);
        if ( pExt != NULL)
        {
            // If there is an extension pointer region, walk it until the end.
            //
            while (pExt)
            {
                DWORD dwBaseAddr = g_BINRegionInfo.Region[nCount].dwRegionStart;
                pExt = (EXTENSION *)OEMMapMemAddr(dwBaseAddr, (DWORD)pExt);
                EdbgOutputDebugString("INFO: %s: [%d] Found chain extension: '%s' @ 0x%x\r\n", __FUNCTION__, nCount, pExt->name, dwBaseAddr);
                if ((pExt->type == 0) && !strcmp(pExt->name, "chain information"))
                {
                    pChainInfo = (PXIPCHAIN_SUMMARY) OEMMapMemAddr(dwBaseAddr, (DWORD)pExt->pdata);
                    dwNumExts = (pExt->length / sizeof(XIPCHAIN_SUMMARY));
                    EdbgOutputDebugString("INFO: %s: [%d] Found 'chain information' (pChainInfo=0x%x  Extensions=0x%x).\r\n", __FUNCTION__, nCount, (DWORD)pChainInfo, dwNumExts);
                    DumpXIPChainSummary(pChainInfo);
                    dwChainStart = (DWORD)pChainInfo->pvAddr;
                    dwChainLength = pChainInfo->dwMaxLength;
                    goto FoundChainAddress;
                }
                pExt = (EXTENSION *)pExt->pNextExt;
            }
        }
        else {
            //  Search for Chain region. Chain region doesn't have the ROMSIGNATURE set        
            EdbgOutputDebugString("Not Found pExtPointer, Check if this is Chain region.\n");        

            DWORD   dwRegionStart = g_BINRegionInfo.Region[nCount].dwRegionStart;
            DWORD   dwSig = *(LPDWORD) OEMMapMemAddr(dwRegionStart, dwRegionStart + ROM_SIGNATURE_OFFSET);

            if ( dwSig != ROM_SIGNATURE) {
                //  It is the chain
                dwChainStart = dwRegionStart;
                dwChainLength = g_BINRegionInfo.Region[nCount].dwRegionLength;
                OALMSG(TRUE, (TEXT("Found the Chain region: StartAddress: 0x%X; Length: 0x%X\n"), dwChainStart, dwChainLength));
            }
        }
    }
FoundChainAddress:    

    // Determine how big the Total BINFS partition needs to be to store all of this.
    //
    if (pChainInfo && dwNumExts == g_BINRegionInfo.dwNumRegions)    // We're downloading all the regions in a multi-region image...
    {
        DWORD i;
        OALMSG(TRUE, (TEXT("Writing multi-regions : Total %d regions\r\n"), dwNumExts));

        for (nCount = 0, dwBINFSPartLength = 0 ; nCount < dwNumExts ; nCount++)
        {
            dwBINFSPartLength += (pChainInfo + nCount)->dwMaxLength;
            OALMSG(OAL_ERROR, (TEXT("[%u] BINFSPartMaxLength: 0x%x, TtlBINFSPartLength: 0x%x \r\n"),
                nCount, (pChainInfo + nCount)->dwMaxLength, dwBINFSPartLength));

            // MultiBINInfo does not store each Regions MAX length, and pChainInfo is not in any particular order.
            // So, walk our MultiBINInfo matching up pChainInfo to find each regions MAX Length
            for (i = 0; i < dwNumExts; i++) {
                if ( g_BINRegionInfo.Region[i].dwRegionStart == (DWORD)((pChainInfo + nCount)->pvAddr) ) {
                    dwMaxRegionLength[i] = (pChainInfo + nCount)->dwMaxLength;
                    OALMSG(TRUE, (TEXT("dwMaxRegionLength[%u]: 0x%x \r\n"), i, dwMaxRegionLength[i]));
                    break;
                }
            }
        }

    }
    else    // A single BIN file or potentially a multi-region update (but the partition's already been created in this latter case).
    {
        dwBINFSPartLength = g_BINRegionInfo.Region[0].dwRegionLength;
        OALMSG(TRUE, (TEXT("Writing single region/multi-region update, dwBINFSPartLength: %u \r\n"), dwBINFSPartLength));
    }

    // Open/Create the BINFS partition where images are stored.  This partition starts immediately after the MBR on the Boot Media and its length is
    // determined by the maximum image size (or sum of all maximum sizes in a multi-region design).
    // Parameters are LOGICAL sectors.
    //
    hPart = BP_OpenPartition( (IMAGE_START_BLOCK+1)*PAGES_PER_BLOCK,    // next block of MBR
                              SECTOR_TO_BLOCK_SIZE(FILE_TO_SECTOR_SIZE(dwBINFSPartLength))*PAGES_PER_BLOCK, // align to block
                              PART_BINFS,
                              TRUE,
                              PART_OPEN_ALWAYS);

    if (hPart == INVALID_HANDLE_VALUE )
    {
        OALMSG(OAL_ERROR, (TEXT("ERROR: WriteOSImageToBootMedia: Failed to open/create partition.\r\n")));
        return(FALSE);
    }

    // Are there multiple BIN files in RAM (we may just be updating one in a multi-BIN solution)?
    //
    for (nCount = 0, dwStoreOffset = 0; nCount < g_BINRegionInfo.dwNumRegions ; nCount++)
    {
        EdbgOutputDebugString("BIN Region Number : %d\r\n", nCount);
        DWORD dwRegionStart  = (DWORD)OEMMapMemAddr(0, g_BINRegionInfo.Region[nCount].dwRegionStart);
        DWORD dwRegionLength = g_BINRegionInfo.Region[nCount].dwRegionLength;

        // Media byte offset where image region is stored.
        dwStoreOffset += nCount ? dwMaxRegionLength[nCount-1] : 0;

        // Set the file pointer (byte indexing) to the correct offset for this particular region.
        //
        if ( !BP_SetDataPointer(hPart, dwStoreOffset) )
        {
            OALMSG(OAL_ERROR, (TEXT("ERROR: StoreImageToBootMedia: Failed to set data pointer in partition (offset=0x%x).\r\n"), dwStoreOffset));
            return(FALSE);
        }

        // Write the region to the BINFS partition.
        if ( !BP_WriteData(hPart, (LPBYTE)dwRegionStart, dwRegionLength) )
        {
            EdbgOutputDebugString("ERROR: StoreImageToBootMedia: Failed to write region to BINFS partition (start=0x%x, length=0x%x).\r\n", dwRegionStart, dwRegionLength);
            return(FALSE);
        }
        if(nCount > 1)  // We will skip Region 0 -> for bootloader
        {
            
        }
        // update TOC, when we reach to last TOC entry.
        if ((g_pTOC->id[g_dwTocEntry].dwLoadAddress == g_BINRegionInfo.Region[nCount].dwRegionStart) &&
             g_pTOC->id[g_dwTocEntry].dwTtlSectors == FILE_TO_SECTOR_SIZE(dwRegionLength) )
        {
            g_pTOC->id[g_dwTocEntry].dwStoreOffset = dwStoreOffset;
            g_pTOC->id[g_dwTocEntry].dwJumpAddress = 0; // Filled upon return to OEMLaunch

            g_pTOC->id[g_dwTocEntry].dwImageType = g_ImageType;

            g_pTOC->id[g_dwTocEntry].sgList[0].dwSector = FILE_TO_SECTOR_SIZE(g_dwLastWrittenLoc);
            g_pTOC->id[g_dwTocEntry].sgList[0].dwLength = g_pTOC->id[g_dwTocEntry].dwTtlSectors;

            // copy Kernel Region to SDRAM for jump
            memcpy((void*)g_pTOC->id[g_dwTocEntry].dwLoadAddress, (void*)dwRegionStart, dwRegionLength);

            OALMSG(TRUE, (TEXT("Update Last TOC[%d] Entry to TOC cache in memory!\r\n"), g_pTOC->id[g_dwTocEntry]));
        }
        
    /* needed only if RAMIMAGE type of multiple-XIP is used
            
        else if( (dwChainStart == g_BINRegionInfo.Region[nCount].dwRegionStart) &&
                 (dwChainLength == g_BINRegionInfo.Region[nCount].dwRegionLength))
        {
            //  Update our TOC for Chain region
            g_pTOC->chainInfo.dwLoadAddress = dwChainStart;
            g_pTOC->chainInfo.dwFlashAddress = FILE_TO_SECTOR_SIZE(g_dwLastWrittenLoc);
            g_pTOC->chainInfo.dwLength = FILE_TO_SECTOR_SIZE(dwMaxRegionLength[nCount]);

            OALMSG(TRUE, (TEXT("Written Chain Region to the Flash\n")));
            OALMSG(TRUE, (TEXT("LoadAddress = 0x%X; FlashAddress = 0x%X; Length = 0x%X\n"),
                                  g_pTOC->chainInfo.dwLoadAddress,
                                  g_pTOC->chainInfo.dwFlashAddress,
                                  g_pTOC->chainInfo.dwLength));
            // Now copy it to the SDRAM
            memcpy((void *)g_pTOC->chainInfo.dwLoadAddress, (void *)dwRegionStart, dwRegionLength);
        }
        else    // Other TOC Type Just fill it. 
        {
            g_pTOC->id[nCount].dwStoreOffset = dwStoreOffset;
            g_pTOC->id[nCount].dwJumpAddress = 0; // Filled upon return to OEMLaunch

            g_pTOC->id[nCount].dwImageType = g_ImageType;

            g_pTOC->id[nCount].sgList[0].dwSector = FILE_TO_SECTOR_SIZE(g_dwLastWrittenLoc);
            g_pTOC->id[nCount].sgList[0].dwLength = g_pTOC->id[nCount].dwTtlSectors;

            // copy Kernel Region to SDRAM for jump (only if RAMIMAGE multiple-XIP is used)
            //memcpy((void*)g_pTOC->id[nCount].dwLoadAddress, (void*)dwRegionStart, dwRegionLength);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美午夜精品电影| 91传媒视频在线播放| 欧美一级理论片| 蜜桃视频一区二区三区在线观看| 欧美日韩国产欧美日美国产精品| 亚洲bdsm女犯bdsm网站| 欧美日韩美女一区二区| 免费在线欧美视频| 国产亚洲一区二区三区四区 | 久久久久九九视频| 成人午夜精品在线| 亚洲乱码精品一二三四区日韩在线| 日本高清不卡aⅴ免费网站| 天天综合天天做天天综合| 欧美一级黄色录像| 成人午夜电影小说| 亚洲国产综合在线| 精品成a人在线观看| 99久久精品免费观看| 日本亚洲一区二区| 日本一区二区综合亚洲| 日本丰满少妇一区二区三区| 午夜久久久久久| 久久亚洲精品国产精品紫薇| 99精品国产99久久久久久白柏| 亚洲成人av电影在线| 精品久久久久久亚洲综合网| 色综合久久久久| 九一九一国产精品| 亚洲人妖av一区二区| 91精品国产色综合久久久蜜香臀| 国产伦精一区二区三区| 一区二区三区毛片| 精品国产免费一区二区三区四区| 99精品热视频| 久久99国产精品久久99 | 亚洲sss视频在线视频| 久久久久久久电影| 欧美精品丝袜中出| 成人性色生活片| 日本午夜一区二区| 亚洲免费观看高清完整| 久久你懂得1024| 欧美日韩午夜影院| 91一区二区三区在线观看| 蜜臀a∨国产成人精品| 日韩毛片一二三区| 精品av久久707| 欧美精品色一区二区三区| 99精品视频一区二区| 国产一区二区三区av电影| 五月激情综合婷婷| 一区二区免费在线| 中文字幕一区二区三| 精品久久一区二区| 91精品一区二区三区久久久久久| 色婷婷综合在线| 成人午夜精品一区二区三区| 狠狠色丁香久久婷婷综合丁香| 日本中文在线一区| 午夜精品福利一区二区三区av| 亚洲欧美视频在线观看| 亚洲国产精品精华液ab| 久久精品人人爽人人爽| 精品久久久久香蕉网| 日韩一区二区三区四区| 777a∨成人精品桃花网| 欧美在线观看你懂的| 亚洲一区二区欧美日韩 | 国产成人啪免费观看软件| 日韩精品一区二区在线| 欧美日韩精品三区| 在线亚洲欧美专区二区| 色偷偷88欧美精品久久久| 99re8在线精品视频免费播放| 国产·精品毛片| 国产999精品久久久久久| 国内精品免费**视频| 美国三级日本三级久久99| 热久久免费视频| 精彩视频一区二区| 国产精品一区二区黑丝| 成人午夜私人影院| 91麻豆蜜桃一区二区三区| 色欧美88888久久久久久影院| 日本黄色一区二区| 欧美午夜精品久久久| 欧美疯狂性受xxxxx喷水图片| 5月丁香婷婷综合| 精品国产一区a| 精品国产91九色蝌蚪| 精品久久久久久无| 精品电影一区二区三区| 久久综合五月天婷婷伊人| 久久久99精品免费观看| 国产精品理论在线观看| 亚洲三级电影全部在线观看高清| 一区二区三区四区在线播放| 亚洲一区二区在线免费观看视频| 日韩国产欧美在线播放| 国内精品在线播放| 97久久超碰国产精品| 欧美三日本三级三级在线播放| 日韩三级av在线播放| 国产日韩欧美精品电影三级在线 | 最新中文字幕一区二区三区| 伊人婷婷欧美激情| 日本欧美一区二区在线观看| 国产盗摄一区二区三区| 91在线免费看| 欧美不卡激情三级在线观看| 国产精品私人自拍| 午夜一区二区三区在线观看| 国产一区在线不卡| 色狠狠一区二区| 精品欧美一区二区在线观看| 一区二区中文字幕在线| 亚洲成人你懂的| 国产成人aaa| 欧美人体做爰大胆视频| 欧美国产欧美亚州国产日韩mv天天看完整| 亚洲自拍偷拍图区| 国产精品99久久久久久久女警 | 色综合欧美在线视频区| 日韩三级视频中文字幕| 亚洲少妇中出一区| 老司机精品视频一区二区三区| 北条麻妃国产九九精品视频| 日韩欧美专区在线| 亚洲中国最大av网站| 国产不卡视频一区二区三区| 欧美一级精品大片| 亚洲国产综合91精品麻豆| 国产激情一区二区三区| 6080国产精品一区二区| 一区二区三区美女| www.视频一区| www久久精品| 日韩国产一二三区| 欧美少妇xxx| 亚洲丝袜自拍清纯另类| 国产呦精品一区二区三区网站| 欧美精品丝袜久久久中文字幕| 亚洲色图丝袜美腿| 国产精品99久久久久| 精品日韩在线一区| 午夜精品成人在线| 91在线小视频| 国产精品电影院| 国产91富婆露脸刺激对白| 精品日韩一区二区三区免费视频| 午夜欧美2019年伦理| 欧美唯美清纯偷拍| 亚洲欧洲国产日韩| 成人h动漫精品一区二| 久久综合久久综合久久| 日本不卡的三区四区五区| 欧美网站大全在线观看| 一区二区三区国产精华| 一本大道久久a久久综合 | 亚洲一区二区三区小说| 91在线精品一区二区三区| 国产欧美日韩在线| 国产夫妻精品视频| 亚洲美女免费在线| 色天天综合色天天久久| 亚洲欧美日韩国产另类专区| 91蜜桃在线观看| 一区2区3区在线看| 欧美亚洲国产bt| 亚洲午夜免费电影| 91麻豆精品91久久久久久清纯| 亚洲超碰精品一区二区| 欧美精品视频www在线观看 | 久久久国产一区二区三区四区小说 | 久久精品夜夜夜夜久久| 国产综合色精品一区二区三区| 久久久综合激的五月天| 国产成人精品一区二区三区四区 | 欧美丰满嫩嫩电影| 青青青爽久久午夜综合久久午夜| 欧美一二三区在线| 国产在线播放一区| 1000精品久久久久久久久| 色8久久精品久久久久久蜜| 亚洲一区二区三区小说| 日韩一级高清毛片| 国产一区二区三区蝌蚪| 国产精品理论在线观看| 精品视频在线免费看| 免费成人你懂的| 久久久综合视频| 91国偷自产一区二区三区成为亚洲经典 | 久久久99久久| 色播五月激情综合网| 日韩中文字幕av电影| 国产亚洲人成网站| 色综合久久99| 国产综合久久久久久鬼色| 中文字幕一区二区三区精华液|