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

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

?? nand.cpp

?? 6410BSP3
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
		//		dwImageStart += dwLaunchAddr;
		//		dwImageLength = dwImageLength; //step loader can support 4k bytes only. NO SuperIPL case is 16K....... 3 Block
	}

	RETAILMSG(1,(TEXT("Erase Block from 0x%x, to 0x%x \n"), dwBlock, SPECIAL_AREA_START + SPECIAL_AREA_SIZE - 1));
	for (nBlockNum = dwBlock ; nBlockNum < SPECIAL_AREA_START + SPECIAL_AREA_SIZE; nBlockNum++)
	{
		if (!FMD_EraseBlock(nBlockNum))
		{
			return(FALSE);
		}
	}

	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 );
		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);
				OALMSG(OAL_INFO, (TEXT("INFO: OEMLaunch: Found chain extenstion: '%s' @ 0x%x\r\n"), 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));
					OALMSG(OAL_INFO, (TEXT("INFO: OEMLaunch: Found 'chain information' (pChainInfo=0x%x  Extensions=0x%x).\r\n"), (DWORD)pChainInfo, dwNumExts));
					break;
				}

				pExt = (EXTENSION *)pExt->pNextExt;
			}
		}
		else
		{
			//  Search for Chain region. Chain region doesn't have the ROMSIGNATURE set
			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));
			}
		}
	}

	// 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\r\n")));

		for (nCount = 0, dwBINFSPartLength = 0 ; nCount < dwNumExts ; nCount++)
		{
			dwBINFSPartLength += (pChainInfo + nCount)->dwMaxLength;
			OALMSG(OAL_ERROR, (TEXT("BINFSPartMaxLength[%u]: 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));
	}

	OALMSG(TRUE, (TEXT("dwBlock = %d \n"), dwBlock));
	// 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( (dwBlock)*(PAGES_PER_SUBLK)*(SECTORS_PER_SUPAGE),
							//SECTOR_TO_BLOCK_SIZE(FILE_TO_SECTOR_SIZE(dwBINFSPartLength))*PAGES_PER_BLOCK, // align to block
							//(dwBINFSPartLength/SECTOR_SIZE)+1,
							SECTOR_TO_BLOCK_SIZE(FILE_TO_SECTOR_SIZE(dwBINFSPartLength))*SECTORS_PER_SUBLK + (IMAGE_START_BLOCK+1)*SECTORS_PER_SUBLK, // hmseo for whimory... +1 is for MBR
							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);
	}

	for (nCount = 0, dwStoreOffset = 0; nCount < g_BINRegionInfo.dwNumRegions ; nCount++)
	{
		DWORD dwRegionStart  = (DWORD)OEMMapMemAddr(0, g_BINRegionInfo.Region[nCount].dwRegionStart);
		DWORD dwRegionLength = g_BINRegionInfo.Region[nCount].dwRegionLength;

		// No concern about Multiple XIP
//		nCount = 0;
		OALMSG(TRUE, (TEXT("nCount = %d \n"), nCount));

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


		// Set the file pointer (byte indexing) to the correct offset for this particular region.
		//
		if ( !BP_SetDataPointer(hPart, dwStoreOffset + (dwBlock+1)*BYTES_PER_SECTOR*SECTORS_PER_SUBLK) )
		{
			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);
		}

		// update our TOC?
		//
		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("Updateded TOC!\r\n")));
		} 
		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));
			OALMSG(TRUE, (TEXT(" memcpy : g_pTOC->chainInfo.dwLoadAddress = 0x%X; dwRegionStart = 0x%X; dwRegionLength = 0x%X\n"), 
						g_pTOC->chainInfo.dwLoadAddress, 
						dwRegionStart,
						dwRegionLength));
			// Now copy it to the SDRAM
			// by hmseo.... ???? 061125
			//memcpy((void *)g_pTOC->chainInfo.dwLoadAddress, (void *)dwRegionStart, dwRegionLength);
		}
	}

    OALMSG(TRUE, (TEXT("-WriteOSImageToBootMedia\r\n")));

    return(TRUE);
}


/*
    @func   BOOL | ReadKernelRegionFromBootMedia |
            BinFS support. Reads the kernel region from Boot Media into RAM.  The kernel region is fixed up
            to run from RAM and this is done just before jumping to the kernel entry point.
    @rdesc  TRUE = Success, FALSE = Failure.
    @comm
    @xref
*/
BOOL ReadOSImageFromBootMedia()
{
    OALMSG(OAL_FUNC, (TEXT("+ReadOSImageFromBootMedia\r\n")));

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

    if ( !VALID_TOC(g_pTOC) )
    {
	    OALMSG(OAL_ERROR, (TEXT("ERROR: ReadOSImageFromBootMedia: INVALID_TOC\r\n")));
        return(FALSE);
    }

    if ( !VALID_IMAGE_DESCRIPTOR(&g_pTOC->id[g_dwTocEntry]) )
    {
        OALMSG(OAL_ERROR, (TEXT("ReadOSImageFromBootMedia: ERROR_INVALID_IMAGE_DESCRIPTOR: 0x%x\r\n"),
            g_pTOC->id[g_dwTocEntry].dwSignature));
        return FALSE;
    }

    if ( !OEMVerifyMemory(g_pTOC->id[g_dwTocEntry].dwLoadAddress, sizeof(DWORD)) ||
         !OEMVerifyMemory(g_pTOC->id[g_dwTocEntry].dwJumpAddress, sizeof(DWORD)) ||
         !g_pTOC->id[g_dwTocEntry].dwTtlSectors )
    {
        OALMSG(OAL_ERROR, (TEXT("ReadOSImageFromBootMedia: ERROR_INVALID_ADDRESS: (address=0x%x, sectors=0x%x, launch address=0x%x)...\r\n"),
            g_pTOC->id[g_dwTocEntry].dwLoadAddress, g_pTOC->id[g_dwTocEntry].dwTtlSectors, g_pTOC->id[g_dwTocEntry].dwJumpAddress));
        return FALSE;
    }

	{
		DWORD dwStartPage, dwNumPage, dwPage;
		Buffer InBuf;
		DWORD dwRegionStart = (DWORD)((g_pTOC->id[g_dwTocEntry].dwLoadAddress) | CACHED_TO_UNCACHED_OFFSET);
		DWORD dwRegionLength = SECTOR_TO_FILE_SIZE(g_pTOC->id[g_dwTocEntry].dwTtlSectors);

 		dwStartPage = (IMAGE_START_BLOCK+1)*(PAGES_PER_SUBLK);
		dwNumPage = (dwRegionLength-1)/BYTES_PER_MAIN_SUPAGE+1;

		OALMSG(TRUE, (TEXT("Read OS image to BootMedia \r\n")));
		OALMSG(TRUE, (TEXT("ImageLength = %d Byte \r\n"), dwRegionLength));
		OALMSG(TRUE, (TEXT("Start Page = %d, End Page = %d, Page Count = %d\r\n"), dwStartPage, dwStartPage+dwNumPage-1, dwNumPage));

		InBuf.pData = (unsigned char *)dwRegionStart;
		InBuf.pSpare = NULL;
		InBuf.nBank = 0;
		if ( TWO_PLANE_PROGRAM == TRUE32 )
		{
 			InBuf.nBitmap = FULL_SECTOR_BITMAP_PAGE; 
 		}
		else
		{
 			InBuf.nBitmap = LEFT_SECTOR_BITMAP_PAGE; 
 		}
		InBuf.eStatus = BUF_AUX;	// No need to sync

		for (dwPage = dwStartPage; dwPage < dwStartPage+dwNumPage; dwPage++)
		{
			if (VFL_Read(dwPage, &InBuf, FALSE32) != FIL_SUCCESS)
			{
				OALMSG(TRUE, (TEXT("[ERR] VFL Read Error @ %d page\r\n"), dwPage));
				OALMSG(TRUE, (TEXT("Read OS image to BootMedia Failed !!!\r\n")));
				while(1);
			}
//		OALMSG(TRUE, (TEXT("dwPage = %d, End Page = %d, Buf = 0x%x\r\n"), dwPage, dwStartPage+dwNumPage, *((UINT32 *)InBuf.pData)));  // ksk dbg

			InBuf.pData += BYTES_PER_MAIN_SUPAGE;
			
			if (dwPage%PAGES_PER_BLOCK == (PAGES_PER_BLOCK-1)) OALMSG(TRUE, (TEXT(".")));
		}

		OALMSG(TRUE, (TEXT("\r\nRead OS image to BootMedia Success \r\n")));
	}

    OALMSG(OAL_FUNC, (TEXT("_ReadOSImageFromBootMedia\r\n")));
    return(TRUE);
}

BOOL ReadBlock(DWORD dwBlock, LPBYTE pbBlock, PSectorInfo pSectorInfoTable)
{
#if 0
    for (int iSector = 0; iSector < g_FlashInfo.wSectorsPerBlock; iSector++) {
        if (!FMD_ReadSector(dwBlock * g_FlashInfo.wSectorsPerBlock + iSector, pbBlock, pSectorInfoTable, 1))
            return FALSE;
        if (pbBlock)
            pbBlock += g_FlashInfo.wDataBytesPerSector;
        if (pSectorInfoTable)
            pSectorInfoTable++;
    }
#else
    if (!FMD_ReadSector(dwBlock * g_FlashInfo.wSectorsPerBlock, pbBlock, /*pSectorInfoTable*/NULL, g_FlashInfo.wSectorsPerBlock))		// hmseo-061028
        return FALSE;
#endif
    return TRUE;
}

BOOL WriteBlock(DWORD dwBlock, LPBYTE pbBlock, PSectorInfo pSectorInfoTable)
{
#if 0
	for (int iSector = 0; iSector < g_FlashInfo.wSectorsPerBlock; iSector++) {
		if (!FMD_WriteSector(dwBlock * g_FlashInfo.wSectorsPerBlock + iSector, pbBlock, /*pSectorInfoTable*/NULL, 1))		// hmseo-061028
			return FALSE;
		if (pbBlock)
			pbBlock += g_FlashInfo.wDataBytesPerSector;
		if (pSectorInfoTable)
			pSectorInfoTable++;
	}
#else
	if (!FMD_WriteSector(dwBlock * g_FlashInfo.wSectorsPerBlock, pbBlock, /*pSectorInfoTable*/NULL, g_FlashInfo.wSectorsPerBlock))		// hmseo-061028
		return FALSE;
#endif
	return TRUE;
}

static UCHAR WMRBuf[WMRBUFSIZE];
static UCHAR BadInfoBuf[(4096+256)*2];

BOOL WriteRawImageToBootMedia(DWORD dwImageStart, DWORD dwImageLength, DWORD dwLaunchAddr)
{
	LowFuncTbl *pLowFuncTbl;

	UINT32 dwStartPage, dwNumPage, dwPage;
	UINT32 dwStartBlock, dwNumBlock, dwBlock;
	UINT32 dwPageOffset;
	INT32 nRet;
	BOOL32 bIsBadBlock = FALSE32;
	UINT32 nSyncRet;

	LPBYTE pbBuffer;

	OALMSG(OAL_FUNC, (TEXT("+WriteRawImageToBootMedia\r\n")));

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

	if (g_ImageType == IMAGE_TYPE_LOADER)
	{
		UINT8 *pMBuf;
		UINT8 *pSBuf;

		pbBuffer = OEMMapMemAddr(dwImageStart, dwImageStart);

		dwStartBlock = EBOOT_BLOCK;
		dwNumBlock = (dwImageLength-1)/(BYTES_PER_MAIN_SUPAGE*PAGES_PER_BLOCK)+1;

		if ( !VALID_TOC(g_pTOC) )
		{
			OALMSG(OAL_WARN, (TEXT("WARN: WriteRawImageToBootMedia: 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);
			}
		}

		OALMSG(TRUE, (TEXT("Write Eboot image to BootMedia \r\n")));
		OALMSG(TRUE, (TEXT("ImageLength = %d Byte \r\n"), dwImageLength));
		OALMSG(TRUE, (TEXT("Start Block = %d, End Block = %d, Block Count = %d\r\n"), dwStartBlock, dwStartBlock+dwNumBlock-1, dwNumBlock));

		pLowFuncTbl = FIL_GetFuncTbl();

		pMBuf = WMRBuf;
		pSBuf = WMRBuf+BYTES_PER_MAIN_SUPAGE;

		dwBlock = dwStartBlock;

		while(dwNumBlock > 0)
		{
			if (dwBlock == (EBOOT_BLOCK+EBOOT_BLOCK_SIZE+EBOOT_BLOCK_RESERVED))
			{
				OALMSG(TRUE, (TEXT("Write RAW image to BootMedia Failed !!!\r\n")));
				OALMSG(TRUE, (TEXT("Too many Bad Block\r\n")));
				return(FALSE);
			}

			IS_CHECK_SPARE_ECC = FALSE32;
			pLowFuncTbl->Read(0, dwBlock*PAGES_PER_BLOCK+PAGES_PER_BLOCK-1, 0x0, enuBOTH_PLANE_BITMAP, NULL, pSBuf, TRUE32, FALSE32);
			IS_CHECK_SPARE_ECC = TRUE32;

			if (TWO_PLANE_PROGRAM == TRUE32)
			{
				if (pSBuf[0] == 0xff && pSBuf[BYTES_PER_SPARE_PAGE] == 0xff)
					bIsBadBlock = TRUE32;
			}
			else
			{
				if (pSBuf[0] == 0xff)
					bIsBadBlock = TRUE32;
			}

			if (bIsBadBlock)
			{
				pLowFuncTbl->Erase(0, dwBlock, enuBOTH_PLANE_BITMAP);
				nRet = pLowFuncTbl->Sync(0, &nSyncRet);
				if ( nRet != FIL_SUCCESS)
				{
					OALMSG(TRUE, (TEXT("[ERR] FIL Erase Error @ %d block, Skipped\r\n"), dwBlock));
					goto MarkAndSkipBadBlock;
				}

				for (dwPageOffset=0; dwPageOffset<PAGES_PER_BLOCK; dwPageOffset++)
				{
					pLowFuncTbl->Write(0, dwBlock*PAGES_PER_BLOCK+dwPageOffset, FULL_SECTOR_BITMAP_PAGE, enuBOTH_PLANE_BITMAP, pbBuffer+BYTES_PER_MAIN_SUPAGE*dwPageOffset, NULL);
					nRet = pLowFuncTbl->Sync(0, &nSyncRet);
					if (nRet != FIL_SUCCESS)
					{
						OALMSG(TRUE, (TEXT("[ERR] FIL Write Error @ %d Block %d Page, Skipped\r\n"), dwBlock, dwPageOffset));
						goto MarkAndSkipBadBlock;
					}

					nRet = pLowFuncTbl->Read(0, dwBlock*PAGES_PER_BLOCK+dwPageOffset, FULL_SECTOR_BITMAP_PAGE, enuBOTH_PLANE_BITMAP, pMBuf, NULL, FALSE32, FALSE32);
					if (nRet != FIL_SUCCESS)
					{
						OALMSG(TRUE, (TEXT("[ERR] FIL Read Error @ %d Block %d Page, Skipped\r\n"), dwBlock, dwPageOffset));
						goto MarkAndSkipBadBlock;
					}

					if (0 != memcmp(pbBuffer+BYTES_PER_MAIN_SUPAGE*dwPageOffset, pMBuf, BYTES_PER_MAIN_SUPAGE))
					{
						OALMSG(TRUE, (TEXT("[ERR] Verify Error @ %d Block %d Page, Skipped\r\n"), dwBlock, dwPageOffset));
						goto MarkAndSkipBadBlock;
					}
				}

				OALMSG(TRUE, (TEXT("[OK] Write %d th Block Success\r\n"), dwBlock));
				dwBlock++;
				dwNumBlock--;
				pbBuffer += BYTES_PER_MAIN_SUPAGE*PAGES_PER_BLOCK;
				continue;

MarkAndSkipBadBlock:

				pLowFuncTbl->Erase(0, dwBlock, enuBOTH_PLANE_BITMAP);
				memset(pSBuf, 0x0, BYTES_PER_SPARE_SUPAGE);
				IS_CHECK_SPARE_ECC = FALSE32;
				pLowFuncTbl->Write(0, dwBlock*PAGES_PER_BLOCK+PAGES_PER_BLOCK-1, 0x0, enuBOTH_PLANE_BITMAP, NULL, pSBuf);
				IS_CHECK_SPARE_ECC = TRUE32;
				dwBlock++;
				continue;
			}
			else
			{
				OALMSG(TRUE, (TEXT("Bad Block %d Skipped\r\n"), dwBlock));
				dwBlock++;
				continue;
			}
		}

		OALMSG(TRUE, (TEXT("Write Eboot image to BootMedia Success\r\n")));
	}
	else if (g_ImageType == IMAGE_TYPE_STEPLDR)
	{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美激情中文字幕一区二区| 日韩欧美中文字幕公布| 综合色中文字幕| 岛国一区二区三区| 亚洲欧洲精品一区二区三区不卡| 成人av在线资源| 亚洲黄一区二区三区| 777精品伊人久久久久大香线蕉| 轻轻草成人在线| 精品国产免费久久| 成人在线视频一区| 亚洲一区二区三区激情| 91精品国产综合久久精品麻豆| 美女网站色91| 中文字幕精品综合| 欧美性受xxxx| 精品在线一区二区三区| 国产精品毛片a∨一区二区三区| 91视频观看视频| 日韩主播视频在线| 久久久久久99精品| 91久久国产综合久久| 青青草原综合久久大伊人精品| 久久久综合九色合综国产精品| 成人h动漫精品一区二区| 亚洲大型综合色站| 欧美精品一区二区久久婷婷| av成人老司机| 免费亚洲电影在线| 亚洲人成精品久久久久| 91精品国产综合久久久久久久| 国产白丝精品91爽爽久久| 亚洲乱码日产精品bd| 欧美mv日韩mv国产网站app| 99久久精品一区二区| 男女男精品视频网| 亚洲人成小说网站色在线| 欧美一激情一区二区三区| 91麻豆.com| 国产.欧美.日韩| 日韩精品免费视频人成| 国产精品乱人伦中文| 日韩欧美成人一区| 欧美亚州韩日在线看免费版国语版 | 久草中文综合在线| 亚洲品质自拍视频| 久久精品日韩一区二区三区| 欧美三级日本三级少妇99| 成人精品视频一区二区三区 | 免费xxxx性欧美18vr| 亚洲视频中文字幕| 国产欧美日本一区二区三区| 69久久99精品久久久久婷婷| 一本到不卡免费一区二区| 国产乱码精品一区二区三区忘忧草| 亚洲一区二区综合| 自拍偷自拍亚洲精品播放| 精品国产一区a| 日韩欧美一区二区久久婷婷| 欧美日韩一区三区| 色偷偷久久人人79超碰人人澡| 国产精品亚洲成人| 国产美女一区二区| 美女视频一区在线观看| 三级成人在线视频| 亚洲永久免费视频| 亚洲精品水蜜桃| 亚洲天堂久久久久久久| 中文字幕一区二区三中文字幕| 久久久不卡网国产精品二区| 精品久久久久一区二区国产| 日韩欧美一二区| 精品少妇一区二区三区免费观看 | 欧美一级黄色片| 欧美一区二区私人影院日本| 欧美日韩激情一区二区| 欧美日韩国产免费一区二区| 欧美疯狂做受xxxx富婆| 欧美日本在线看| 欧美一区二区网站| 日韩欧美一区二区免费| 亚洲精品在线观| 精品福利一二区| 久久久久久9999| 国产精品视频一二三| 亚洲视频一二区| 亚洲伦理在线精品| 香蕉久久一区二区不卡无毒影院| 婷婷中文字幕综合| 激情伊人五月天久久综合| 国产一区二区影院| 成a人片亚洲日本久久| a级精品国产片在线观看| 色哟哟在线观看一区二区三区| 欧美伊人久久大香线蕉综合69| 欧美综合天天夜夜久久| 欧美肥妇bbw| 精品国产欧美一区二区| 国产精品网站在线播放| 亚洲美女视频在线观看| 婷婷中文字幕综合| 国产精品一区二区你懂的| av午夜一区麻豆| 欧美吻胸吃奶大尺度电影 | 在线成人小视频| 久久综合五月天婷婷伊人| 欧美国产激情一区二区三区蜜月| 亚洲色图视频免费播放| 日本成人在线不卡视频| 国产精品一区二区男女羞羞无遮挡| 99re热这里只有精品免费视频| 欧美日韩免费观看一区三区| 精品日本一线二线三线不卡| 中文字幕日韩欧美一区二区三区| 五月婷婷激情综合网| 国产麻豆精品一区二区| 91成人网在线| 久久毛片高清国产| 亚洲成人免费观看| 成人av资源站| 欧美精品tushy高清| 国产精品国产成人国产三级 | 欧美在线啊v一区| 2023国产一二三区日本精品2022| 亚洲精品国产一区二区精华液 | 91网上在线视频| 精品国一区二区三区| 依依成人精品视频| 国产在线精品一区二区不卡了 | 欧洲精品在线观看| 精品日韩一区二区三区| 亚洲一区在线观看网站| 国产福利一区在线| 7777女厕盗摄久久久| 亚洲免费三区一区二区| 国产精品一二三四五| 91麻豆精品国产自产在线 | 成人永久看片免费视频天堂| 国产欧美精品一区二区色综合| 日本中文一区二区三区| 97国产一区二区| 国产免费久久精品| 美女视频黄a大片欧美| 日本高清无吗v一区| 中文字幕成人av| 激情综合网激情| 91精品国产aⅴ一区二区| 亚洲激情av在线| 91影院在线观看| 国产精品久久毛片av大全日韩| 国产真实乱偷精品视频免| 制服丝袜亚洲播放| 曰韩精品一区二区| 91麻豆高清视频| 亚洲四区在线观看| 99精品视频在线观看| 国产精品久久免费看| 国产91富婆露脸刺激对白| 2020国产精品久久精品美国| 久草在线在线精品观看| 日韩三级在线观看| 日日夜夜免费精品| 欧美一区二区三区公司| 日韩成人精品在线观看| 91精品国产综合久久精品app| 日韩电影在线观看网站| 91精品蜜臀在线一区尤物| 视频一区视频二区中文字幕| 在线播放中文一区| 石原莉奈在线亚洲三区| 欧美老肥妇做.爰bbww| 午夜影视日本亚洲欧洲精品| 欧美日韩国产大片| 婷婷综合五月天| 日韩免费高清视频| 国产成人免费在线| 亚洲三级在线免费| 在线免费观看成人短视频| 午夜激情一区二区三区| 欧美一区二区三区视频| 精品一区二区免费| 久久综合网色—综合色88| 精品无人码麻豆乱码1区2区 | 欧美日韩一卡二卡三卡| 亚洲一区二区美女| 日韩欧美中文字幕一区| 免费高清成人在线| 91精品国产综合久久久久久漫画 | 亚洲一区二区三区在线看| 欧美日韩免费电影| 亚洲一区在线观看网站| 欧美性欧美巨大黑白大战| 日本人妖一区二区| 日韩西西人体444www| 久久机这里只有精品| 91麻豆精品国产91久久久久久久久| 久久超碰97中文字幕| 26uuu欧美日本| 懂色av一区二区三区蜜臀| 亚洲日本在线看|