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

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

?? fmd.cpp.svn-base

?? 這是三星的2443的wince的bootloader
?? SVN-BASE
?? 第 1 頁 / 共 3 頁
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
#include <fmd.h>
#include <s3c2443_nand.h>
#include <args.h>
#include <ethdbg.h>
#include "Cfnand.h"
#define IO_INDICATE 0
#if IO_INDICATE==1
#include <s3c2443_ioport.h>	//DonGo
#endif //IO_INDICATE 

#define NAND_BASE 0xB1400000	// PA:0x4e00_0000
#if IO_INDICATE==1
#define IOPORT_BASE	0xB2100000	// PA:0x56000000 //DonGo
#endif //IO_INDICATE 
BOOL NEED_EXT_ADDR = TRUE;

static volatile S3C2443_NAND_REG *s2443NAND = (S3C2443_NAND_REG *)NAND_BASE;
#if IO_INDICATE==1
static volatile S3C2443_IOPORT_REG *s2443IOPORT = (S3C2443_IOPORT_REG *)IOPORT_BASE; //DonGo
#endif //IO_INDICATE 

#if MAGNETO
BSP_ARGS *pBSPArgs;
#endif

extern "C" void RdPage512(unsigned char *bufPt);
extern "C" void RdPage512Unalign(unsigned char *bufPt);
extern "C" void WrPage512(unsigned char *bufPt); 
extern "C" void WrPage512Unalign(unsigned char *bufPt); 
extern "C" void WrPageInfo(PBYTE pBuff);
extern "C" void RdPageInfo(PBYTE pBuff);

/*
	@func   DWORD | ReadFlashID | Reads the flash manufacturer and device codes.
	@rdesc  Manufacturer and device codes.
	@comm	
	@xref   
*/
static DWORD ReadFlashID(void)
{
	BYTE Mfg, Dev;

	NF_nFCE_L();						// Deselect the flash chip.
	NF_CMD(CMD_READID);					// Send flash ID read command.

	NF_ADDR(0);							//

	Mfg	= NF_RDDATA_BYTE();				// 
	Dev	= NF_RDDATA_BYTE();				// 
	
	NF_nFCE_H();						// Deselect the flash chip.
	
	return ((DWORD)(Mfg<<8)+Dev);
}

/*
	@func   PVOID | FMD_Init | Initializes the Smart Media NAND flash controller.
	@rdesc  Pointer to S3C2443 NAND controller registers.
	@comm	
	@xref   
*/
PVOID FMD_Init(LPCTSTR lpActiveReg, PPCI_REG_INFO pRegIn, PPCI_REG_INFO pRegOut)
{

	// Caller should have specified NAND controller address.
	//

	BOOL bLastMode = SetKMode(TRUE);
	volatile DWORD rdid;

	RETAILMSG(1,(TEXT("#### FMD_DRIVER:::FMD_INIT \r\n")));

#if MAGNETO
	pBSPArgs = ((BSP_ARGS *) IMAGE_SHARE_ARGS_UA_START);
#endif

	if (pRegIn && pRegIn->MemBase.Num && pRegIn->MemBase.Reg[0])
		s2443NAND = (S3C2443_NAND_REG *)(pRegIn->MemBase.Reg[0]);
	else
		s2443NAND = (S3C2443_NAND_REG *)NAND_BASE;

#if IO_INDICATE==1
s2443IOPORT = (S3C2443_IOPORT_REG *)IOPORT_BASE;	//DonGo
s2443IOPORT->GPGCON = (s2443IOPORT->GPGCON & ~(0x3<<2)) | (0x1<<2); // GPG1 //DonGo
//s2443IOPORT->DSC1 = (s2443IOPORT->DSC1 & ~(0x3<<10)) | (0x3<<10); // Drive strength
#endif 
	// Set up initial flash controller configuration.
	//
	s2443NAND->NFCONF =  (TACLS  <<  12) | /* CLE & ALE = HCLK * (TACLS  + 1)   */
							(TWRPH0 <<  8) | /* TWRPH0	= HCLK * (TWRPH0 + 1)   */
							(TWRPH1 <<  4);
	s2443NAND->NFCONT = (0<<17)|(0<<16)|(0<<10)|(0<<9)|(0<<8)|(1<<7)|(1<<6)|(1<<5)|(1<<4)|(0x3<<1)|(1<<0);
	s2443NAND->NFSTAT = (1<<4);

	RETAILMSG(1, (TEXT("NAND Read ID...")));
/*	
	NF_CLEAR_RB();
	NF_nFCE_L();						// Select the flash chip.
	NF_CLEAR_RB();
	NF_CMD(CMD_RESET);					// Send reset command.
	//for(volatile int i=0; i<30; i++);
	NF_DETECT_RB();						// Wait for flash to complete command.
	NF_nFCE_H();						// Deselect the flash chip.
*/
	// Get manufacturer and device codes.
	rdid = ReadFlashID();
	if (rdid != 0xEC76 && rdid!= 0x9876 && rdid!=0x9879 && rdid!=0xecda && rdid!=0x987e )	
	// 0xec76: SOP, 0x9876:64MB XD, 0x9879:64MB XD, 0x987e:64MB XD, 0xecda:256MB SOP
	{
		RETAILMSG(1, (TEXT("Error!!!(%x)\n"), rdid));
		//NF_nFCE_H();					// Deselect the flash chip.
		SetKMode (bLastMode);
		return(NULL);
	}
	else
	{
		RETAILMSG(1, (TEXT("OK(%x).\n"), rdid));
	}

	SetKMode (bLastMode);

	return((PVOID)s2443NAND);
}


/*
	@func   BOOL | FMD_ReadSector | Reads the specified sector(s) from NAND flash.
	@rdesc  TRUE = Success, FALSE = Failure.
	@comm	
	@xref   
*/
BOOL FMD_ReadSector(SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff, PSectorInfo pSectorInfoBuff, DWORD dwNumSectors)
{
	BOOL bRet;

//	RETAILMSG(1, (TEXT("FMD::FMD_ReadSector 0x%x \r\n"), startSectorAddr));

	if ( startSectorAddr < (unsigned)wPRIMARY_NAND_BLOCKS*NAND_PAGE_CNT )
	{
		if ( astNandSpec[dwPrimaryNandDevice].nSctsPerPg == 4 )
			bRet = FMD_LB_ReadSector(startSectorAddr, pSectorBuff, pSectorInfoBuff, dwNumSectors, USE_NFCE);
		else
			bRet = FMD_SB_ReadSector(startSectorAddr, pSectorBuff, pSectorInfoBuff, dwNumSectors, USE_NFCE);
	}
	else
	{
		if ( astNandSpec[dwSecondaryNandDevice].nSctsPerPg == 4 )
			bRet = FMD_LB_ReadSector(startSectorAddr-wPRIMARY_NAND_BLOCKS*NAND_PAGE_CNT, pSectorBuff, pSectorInfoBuff, dwNumSectors, USE_GPIO);
		else
			bRet = FMD_SB_ReadSector(startSectorAddr-wPRIMARY_NAND_BLOCKS*NAND_PAGE_CNT, pSectorBuff, pSectorInfoBuff, dwNumSectors, USE_GPIO);
	}

//	RETAILMSG(1, (TEXT("FMD::FMD_ReadSector -- \r\n")));

	return bRet;
}


BOOL FMD_WriteSector(SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff, PSectorInfo pSectorInfoBuff,
                        DWORD dwNumSectors)
{
    BOOL    bRet = TRUE;

//	RETAILMSG(1, (TEXT("FMD::FMD_WriteSector 0x%x \r\n"), startSectorAddr));

	if ( startSectorAddr < (unsigned)wPRIMARY_NAND_BLOCKS*NAND_PAGE_CNT )
	{
		if ( astNandSpec[dwPrimaryNandDevice].nSctsPerPg == 4 )
			bRet = FMD_LB_WriteSector(startSectorAddr, pSectorBuff, pSectorInfoBuff, dwNumSectors, USE_NFCE);
		else
			bRet = FMD_SB_WriteSector(startSectorAddr, pSectorBuff, pSectorInfoBuff, dwNumSectors, USE_NFCE);
	}
	else	// if ( PRIMARY_NAND == SMALL_BLOCK_NAND )
	{
		if ( astNandSpec[dwSecondaryNandDevice].nSctsPerPg == 4 )
			bRet = FMD_LB_WriteSector(startSectorAddr-wPRIMARY_NAND_BLOCKS*NAND_PAGE_CNT, pSectorBuff, pSectorInfoBuff, dwNumSectors, USE_GPIO);
		else
			bRet = FMD_SB_WriteSector(startSectorAddr-wPRIMARY_NAND_BLOCKS*NAND_PAGE_CNT, pSectorBuff, pSectorInfoBuff, dwNumSectors, USE_GPIO);
	}

    return bRet;
}

/*
	@func   BOOL | FMD_EraseBlock | Erases the specified flash block.
	@rdesc  TRUE = Success, FALSE = Failure.
	@comm	
	@xref   
*/
BOOL FMD_EraseBlock(BLOCK_ID blockID)
{

//	RETAILMSG(1, (TEXT("FMD::FMD_EraseBlock 0x%x \r\n")));
	BOOL    bRet = TRUE;
	int i;

	if ( blockID < wPRIMARY_NAND_BLOCKS )
	{
		if ( astNandSpec[dwPrimaryNandDevice].nSctsPerPg == 4 )
		{
			for ( i = 0; i < LB_BLOCK_LOOP; i++ )
			{
				bRet = FMD_LB_EraseBlock(blockID*(LB_BLOCK_LOOP) + i, USE_NFCE);
				if ( bRet == FALSE ) break;
			}
		}
		else
		{
			for ( i = 0; i < SB_BLOCK_LOOP; i++ )
			{
				bRet = FMD_SB_EraseBlock(blockID*(SB_BLOCK_LOOP) + i, USE_NFCE);
				if ( bRet == FALSE ) break;
			}
		}
	}
	else
	{
		if ( astNandSpec[dwSecondaryNandDevice].nSctsPerPg == 4 )
		{
			for ( i = 0; i < LB_BLOCK_LOOP; i++ )
			{
				bRet = FMD_LB_EraseBlock((blockID-wPRIMARY_NAND_BLOCKS)*(LB_BLOCK_LOOP) + i, USE_GPIO);
				if ( bRet == FALSE ) break;
			}
		}
		else
		{
			for ( i = 0; i < SB_BLOCK_LOOP; i++ )
			{
				bRet = FMD_SB_EraseBlock(blockID*(SB_BLOCK_LOOP) + i, USE_GPIO);
				if ( bRet == FALSE ) break;
			}
		}
	}

    return bRet;
}



VOID FMD_PowerUp(VOID)
{
	// Set up initial flash controller configuration.
	//
	s2443NAND->NFCONF =  (TACLS  <<  12) | /* CLE & ALE = HCLK * (TACLS  + 1)   */
						 (TWRPH0 <<  8) | /* TWRPH0	= HCLK * (TWRPH0 + 1)   */
						 (TWRPH1 <<  4);

	s2443NAND->NFCONT = (0<<17)|(0<<16)|(0<<10)|(0<<9)|(0<<8)|(1<<7)|(1<<6)|(1<<5)|(1<<4)|(0x3<<1)|(1<<0);
	s2443NAND->NFSTAT = (1<<4);
}


VOID FMD_PowerDown(VOID)
{
}

BOOL FMD_OEMIoControl(DWORD dwIoControlCode, PBYTE pInBuf, DWORD nInBufSize, PBYTE pOutBuf, DWORD nOutBufSize, PDWORD pBytesReturned)
{
	return(TRUE);
}

BOOL FMD_Deinit(PVOID hFMD)
{
	return(TRUE);
}


/*
	@func   BOOL | FMD_GetInfo | Provides information on the NAND flash.
	@rdesc  TRUE = Success, FALSE = Failure.
	@comm	
	@xref   
*/
BOOL FMD_GetInfo(PFlashInfo pFlashInfo)
{
   UINT32  nCnt;
   UINT32 nNandID;
    UINT8 nMID, nDID;

    if (!pFlashInfo)
        return(FALSE);
	BOOL bLastMode = SetKMode(TRUE); // for READFlashID();

    pFlashInfo->flashType = NAND;

	nNandID = ReadFlashID();

	nMID = nNandID >> 8;
	nDID = nNandID & 0xff;
	
    for (nCnt = 0; astNandSpec[nCnt].nMID != 0; nCnt++)
    {
        if (nDID == astNandSpec[nCnt].nDID)
        {
            break;
        }
    }

	dwPrimaryNandDevice = nCnt;
	wPRIMARY_REAL_NAND_BLOCKS = astNandSpec[dwPrimaryNandDevice].nNumOfBlks;
	wSECONDARY_NAND_BLOCKS = 0;
	wSECONDARY_REAL_NAND_BLOCKS = 0;

//	RETAILMSG(1, (TEXT("dwPrimaryNandDevice : %d(0x%x) \r\n"), dwPrimaryNandDevice, dwPrimaryNandDevice));
//	RETAILMSG(1, (TEXT("astNandSpec[dwPrimaryNandDevice].nSctsPerPg: %d(0x%x) \r\n"), astNandSpec[dwPrimaryNandDevice].nSctsPerPg, astNandSpec[dwPrimaryNandDevice].nSctsPerPg));
//	RETAILMSG(1, (TEXT("wPRIMARY_REAL_NAND_BLOCKS : %d(0x%x) \r\n"), wPRIMARY_REAL_NAND_BLOCKS, wPRIMARY_REAL_NAND_BLOCKS));

	if ( astNandSpec[dwPrimaryNandDevice].nSctsPerPg == 4 )	// Primary NAND is Large Block...
	{
		wPRIMARY_NAND_BLOCKS = wPRIMARY_REAL_NAND_BLOCKS;
	}
	else
	{
		wPRIMARY_NAND_BLOCKS = wPRIMARY_REAL_NAND_BLOCKS / 8;
	}
	wNUM_BLOCKS = wPRIMARY_NAND_BLOCKS + wSECONDARY_NAND_BLOCKS;

    //  OK, instead of reading it from the chip, we use the hardcoded
    //  numbers here.

	pFlashInfo->dwNumBlocks			= wNUM_BLOCKS;
	pFlashInfo->wSectorsPerBlock	= NAND_PAGE_CNT;
	pFlashInfo->wDataBytesPerSector = NAND_PAGE_SIZE;
	pFlashInfo->dwBytesPerBlock     = (pFlashInfo->wSectorsPerBlock * pFlashInfo->wDataBytesPerSector);

	RETAILMSG(1, (TEXT("NUMBLOCKS : %d(0x%x), SECTORSPERBLOCK = %d(0x%x), BYTESPERSECTOR = %d(0x%x) \r\n"), pFlashInfo->dwNumBlocks, pFlashInfo->dwNumBlocks, pFlashInfo->wSectorsPerBlock, pFlashInfo->wSectorsPerBlock, pFlashInfo->wDataBytesPerSector, pFlashInfo->wDataBytesPerSector));

	SetKMode(bLastMode);
    return TRUE;



}

#define VALIDADDR	0x05	// S3C2443NAND

static BOOL IsBlockBad(BLOCK_ID blockID)
{
	BOOL bRet = FALSE;
	int i;

	if ( blockID < wPRIMARY_NAND_BLOCKS )
	{
		if ( astNandSpec[dwPrimaryNandDevice].nSctsPerPg == 4 )
		{
			for ( i = 0; i < LB_BLOCK_LOOP; i++ )
			{
				bRet = LB_IsBlockBad(blockID*(LB_BLOCK_LOOP) + i, USE_NFCE);
				if ( bRet == TRUE ) break;
			}
		}
		else
		{
			for ( i = 0; i < SB_BLOCK_LOOP; i++ )
			{
				bRet = SB_IsBlockBad(blockID*(SB_BLOCK_LOOP) + i, USE_NFCE);
				if ( bRet == TRUE ) break;
			}
		}
	}
	else
	{
		if ( astNandSpec[dwSecondaryNandDevice].nSctsPerPg == 4 )
		{
			for ( i = 0; i < LB_BLOCK_LOOP; i++ )
			{
				bRet = LB_IsBlockBad((blockID-wPRIMARY_NAND_BLOCKS)*(LB_BLOCK_LOOP) + i, USE_GPIO);
				if ( bRet == TRUE ) break;
			}
		}
		else
		{
			for ( i = 0; i < SB_BLOCK_LOOP; i++ )
			{
				bRet = SB_IsBlockBad((blockID-wPRIMARY_NAND_BLOCKS)*(SB_BLOCK_LOOP) + i, USE_GPIO);
				if ( bRet == TRUE ) break;
			}
		}
	}

	return bRet;
}


/*
	@func   DWORD | FMD_GetBlockStatus | Returns the status of the specified block.
	@rdesc  Block status (see fmd.h).
	@comm	
	@xref   
*/
DWORD FMD_GetBlockStatus(BLOCK_ID blockID)
{
    DWORD dwResult = 0;
	int i;


	if ( blockID < wPRIMARY_NAND_BLOCKS )
	{
		if ( astNandSpec[dwPrimaryNandDevice].nSctsPerPg == 4 )
		{
			for ( i = 0; i < LB_BLOCK_LOOP; i++ )
			{
				dwResult |= FMD_LB_GetBlockStatus(blockID*(LB_BLOCK_LOOP) + i, USE_NFCE);
			}
		}
		else
		{
			for ( i = 0; i < SB_BLOCK_LOOP; i++ )
			{
				dwResult |= FMD_SB_GetBlockStatus(blockID*(SB_BLOCK_LOOP) + i, USE_NFCE);
			}
		}
	}
	else
	{
		if ( astNandSpec[dwSecondaryNandDevice].nSctsPerPg == 4 )
		{
			for ( i = 0; i < LB_BLOCK_LOOP; i++ )
			{
				dwResult |= FMD_LB_GetBlockStatus((blockID-wPRIMARY_NAND_BLOCKS)*(LB_BLOCK_LOOP) + i, USE_GPIO);
			}
		}
		else
		{
			for ( i = 0; i < SB_BLOCK_LOOP; i++ )
			{
				dwResult |= FMD_SB_GetBlockStatus((blockID-wPRIMARY_NAND_BLOCKS)*(SB_BLOCK_LOOP) + i, USE_GPIO);
			}
		}
	}

    return dwResult;
}


/*
	@func   BOOL | MarkBlockBad | Marks the specified block as bad.
	@rdesc  TRUE = Success, FALSE = Failure.
	@comm	
	@xref   
*/
static BOOL MarkBlockBad(BLOCK_ID blockID)
{
    BOOL    bRet = TRUE;
	int i;

	if ( blockID < wPRIMARY_NAND_BLOCKS )
	{
		if ( astNandSpec[dwPrimaryNandDevice].nSctsPerPg == 4 )
		{
			for ( i = 0; i < LB_BLOCK_LOOP; i++ )
			{
				bRet = LB_MarkBlockBad(blockID*(LB_BLOCK_LOOP) + i, USE_NFCE);
				if ( bRet == FALSE ) break;
			}
		}
		else
		{
			for ( i = 0; i < SB_BLOCK_LOOP; i++ )
			{
				bRet = SB_MarkBlockBad(blockID*(SB_BLOCK_LOOP) + i, USE_NFCE);
				if ( bRet == FALSE ) break;
			}
		}
	}
	else	// if ( PRIMARY_NAND == SMALL_BLOCK_NAND )
	{
		if ( astNandSpec[dwSecondaryNandDevice].nSctsPerPg == 4 )
		{
			for ( i = 0; i < LB_BLOCK_LOOP; i++ )
			{
				bRet = LB_MarkBlockBad((blockID-wPRIMARY_NAND_BLOCKS)*(LB_BLOCK_LOOP) + i, USE_GPIO);
				if ( bRet == FALSE ) break;
			}
		}
		else
		{
			for ( i = 0; i < SB_BLOCK_LOOP; i++ )
			{
				bRet = SB_MarkBlockBad((blockID-wPRIMARY_NAND_BLOCKS)*(SB_BLOCK_LOOP) + i, USE_GPIO);
				if ( bRet == FALSE ) break;
			}
		}
	}

    return bRet;
}

/*
	@func   BOOL | FMD_SetBlockStatus | Marks the block with the specified block status.
	@rdesc  TRUE = Success, FALSE = Failure.
	@comm	
	@xref   
*/
BOOL FMD_SetBlockStatus(BLOCK_ID blockID, DWORD dwStatus)
{
    BOOL    bRet = TRUE;
	int i;

	if ( blockID < wPRIMARY_NAND_BLOCKS )
	{
		if ( astNandSpec[dwPrimaryNandDevice].nSctsPerPg == 4 )
		{
			for ( i = 0; i < LB_BLOCK_LOOP; i++ )
			{
				bRet = FMD_LB_SetBlockStatus(blockID*(LB_BLOCK_LOOP) + i, dwStatus, USE_NFCE);
				if ( bRet == FALSE ) break;
			}
		}
		else
		{
			for ( i = 0; i < SB_BLOCK_LOOP; i++ )
			{
				bRet = FMD_SB_SetBlockStatus(blockID*(SB_BLOCK_LOOP) + i, dwStatus, USE_NFCE);
				if ( bRet == FALSE ) break;
			}
		}
	}
	else	// if ( PRIMARY_NAND == SMALL_BLOCK_NAND )
	{
		if ( astNandSpec[dwSecondaryNandDevice].nSctsPerPg == 4 )
		{
			for ( i = 0; i < LB_BLOCK_LOOP; i++ )
			{
				bRet = FMD_LB_SetBlockStatus((blockID-wPRIMARY_NAND_BLOCKS)*(LB_BLOCK_LOOP) + i, dwStatus, USE_GPIO);
				if ( bRet == FALSE ) break;
			}
		}
		else
		{
			for ( i = 0; i < SB_BLOCK_LOOP; i++ )
			{
				bRet = FMD_SB_SetBlockStatus((blockID-wPRIMARY_NAND_BLOCKS)*(SB_BLOCK_LOOP) + i, dwStatus, USE_GPIO);
				if ( bRet == FALSE ) break;
			}
		}
	}

    return bRet;
}

BOOL FMD_LB_ReadSector(SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff, PSectorInfo pSectorInfoBuff, DWORD dwNumSectors,int mode)
{
	ULONG SectorAddr = (ULONG)startSectorAddr;
//	ULONG MECC;
	DWORD       i;
	BYTE        eccBuf[8];	
	volatile DWORD		rddata;	
	int NewSpareAddr = 2048 + 16*(startSectorAddr%4);
	int NewDataAddr = 512*(startSectorAddr%4);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
www久久久久| 波多野结衣中文字幕一区二区三区 | 综合久久久久久| 不卡一区在线观看| 一区二区三区四区中文字幕| 91精品办公室少妇高潮对白| 一区二区三区鲁丝不卡| 欧美日韩国产一二三| 日韩高清在线一区| 久久天天做天天爱综合色| 国产在线看一区| 国产女同互慰高潮91漫画| 97精品国产露脸对白| 一区二区欧美国产| 日韩三级视频中文字幕| 久久精品国产精品亚洲精品| 2024国产精品| 丁香婷婷综合色啪| 亚洲一区成人在线| 精品国产亚洲在线| aaa欧美大片| 亚洲va韩国va欧美va精品 | 91美女视频网站| 首页亚洲欧美制服丝腿| 久久综合国产精品| 91麻豆福利精品推荐| 豆国产96在线|亚洲| 亚洲女人的天堂| 精品免费日韩av| 在线免费av一区| 国产精品综合一区二区| 一区二区在线观看av| 欧美videofree性高清杂交| 色婷婷av一区二区| 国产乱码精品一区二区三区忘忧草| 中文字幕一区av| 日韩免费看网站| 色综合中文综合网| 久久99久久久欧美国产| 亚洲欧美综合在线精品| 日韩欧美在线观看一区二区三区| av在线不卡免费看| 热久久一区二区| 亚洲视频一区二区免费在线观看| 欧美一区二区视频在线观看2022| 成人app下载| 黄页网站大全一区二区| 亚洲高清三级视频| 国产精品午夜电影| 2023国产精品| 在线电影院国产精品| 91香蕉视频污在线| 国产成人亚洲综合a∨猫咪| 日韩精品久久久久久| 亚洲精品视频自拍| 国产精品久久久久精k8| 2023国产一二三区日本精品2022| 欧美剧情电影在线观看完整版免费励志电影| 粉嫩在线一区二区三区视频| 精品一区精品二区高清| 日韩精品五月天| 亚洲在线视频一区| 亚洲日本在线天堂| 中文字幕一区日韩精品欧美| 久久免费的精品国产v∧| 欧美一区二区三区思思人| 色狠狠av一区二区三区| 91在线小视频| av动漫一区二区| a级精品国产片在线观看| 国产精品18久久久| 国产精品正在播放| 国产成人无遮挡在线视频| 狠狠色狠狠色合久久伊人| 欧美aaa在线| 久久精品国产99国产精品| 久久精品国产第一区二区三区| 日本成人在线看| 麻豆精品一二三| 国内一区二区在线| 韩国在线一区二区| 老司机午夜精品99久久| 精品在线播放免费| 国产一区二区久久| 国产精品18久久久久久久网站| 国产麻豆精品久久一二三| 国产精品亚洲第一| 波多野结衣在线aⅴ中文字幕不卡| 成人精品高清在线| 91在线小视频| 88在线观看91蜜桃国自产| 777xxx欧美| 久久综合99re88久久爱| 久久久99精品久久| 亚洲女同一区二区| 亚洲一区在线看| 午夜精品一区二区三区免费视频| 免费人成精品欧美精品| 精品一区二区三区视频| 福利一区二区在线| 91一区一区三区| 欧美福利一区二区| 久久精品男人的天堂| 国产精品五月天| 午夜激情一区二区三区| 美女一区二区视频| 99久久精品国产精品久久| 欧美天堂亚洲电影院在线播放| 日韩一级二级三级| 国产精品萝li| 日韩电影在线观看网站| 国产精品一区二区在线播放 | 一级精品视频在线观看宜春院 | 国产综合色产在线精品| 成人美女视频在线看| 色域天天综合网| 精品免费视频.| 亚洲午夜在线视频| 色屁屁一区二区| 亚洲欧洲在线观看av| 国产一区二区在线电影| 成人免费va视频| 日韩一区和二区| 中文字幕永久在线不卡| 亚洲免费毛片网站| 亚洲国产视频直播| 亚洲精品一线二线三线| 国产欧美综合色| 亚洲制服欧美中文字幕中文字幕| 激情都市一区二区| 成人午夜在线视频| 欧美韩国一区二区| 蜜桃传媒麻豆第一区在线观看| 日本久久一区二区| 日韩电影一区二区三区| 欧洲av在线精品| 午夜精品成人在线| 亚洲精品一区二区三区四区高清| 国产福利精品导航| 伊人色综合久久天天| 91精品免费在线| 国产老妇另类xxxxx| 国产精品第13页| 久久综合精品国产一区二区三区| 国产成人精品在线看| 日韩精品免费专区| 最新不卡av在线| 欧美在线视频日韩| 成人黄色软件下载| 亚洲不卡av一区二区三区| 亚洲桃色在线一区| 色婷婷综合久久| 国产精品一区二区黑丝| 亚洲综合男人的天堂| 精品欧美一区二区在线观看| 91麻豆文化传媒在线观看| 精品一区二区三区在线观看| 国产午夜精品美女毛片视频| 99久久国产综合精品女不卡| 国产成人在线看| 九九国产精品视频| 国内精品伊人久久久久av一坑 | 久久99久久99小草精品免视看| 五月激情综合色| 亚洲丰满少妇videoshd| 国产精品国产三级国产专播品爱网| 91精品国产91久久久久久最新毛片 | 日日夜夜免费精品视频| 国产精品久久久久久妇女6080| 亚洲伦理在线免费看| 中文字幕电影一区| 国产精品麻豆网站| 一区二区国产盗摄色噜噜| 一区二区三区四区精品在线视频| 成人欧美一区二区三区黑人麻豆| 国产精品久久久久久久久免费桃花 | 欧美精品欧美精品系列| 久久久91精品国产一区二区三区| 亚洲伦在线观看| 国产成人综合在线| 99r精品视频| 56国语精品自产拍在线观看| 日韩午夜电影在线观看| 国产目拍亚洲精品99久久精品| 亚洲成人手机在线| 韩国av一区二区三区四区| 91精品福利在线| 欧美成人精品3d动漫h| 国产日产欧美一区二区视频| 久久精品视频一区二区三区| 国产精品蜜臀av| 日韩和欧美一区二区三区| 黄色小说综合网站| 色噜噜久久综合| 欧美一级日韩免费不卡| 国产日韩欧美综合一区| 亚洲精品欧美激情| 国产精品中文字幕欧美| 精品视频1区2区3区| 国产精品网站在线观看|