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

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

?? fmd.cpp

?? 2440 CE500BSP包, EBOOT可用DEBUG版調試
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE. 
Copyright (c) 2002  Microsoft Corporation

Module Name:	FMD.CPP

Abstract:		FLASH Media Driver Interface Samsung K9F2808UOB NAND Flash Chip
                on AT-Rise development board.

Notes:			Currently, *only* the CE 3.0 (and earlier) power management logic
				is implemented (i.e. the PowerUp() and PowerDown() APIs).

Environment:	As noted, this media driver works on behalf of the FAL to directly
				access the underlying FLASH hardware.  Consquently, this module
				needs to be linked with FAL.LIB to produce the device driver
				named FLASHDRV.DLL.

-----------------------------------------------------------------------------*/
#include <fmd.h>

//#ifdef CEDAR_ONLY
	#ifndef NOSYSCALL
//		#include "utldrv.h"
		#include <nkintr.h>
		#include "oalintr.h"
	#endif
//#endif // CEDAR_ONLY

#ifdef NOBINFS
	#include "utldrv.h"			// Still needed for driver->driver fast method calling in 4.x
#endif

#include <s2440.h>
#include "cfnand.h"
#include "loader.h"

#ifndef NOSYSCALL
	#ifndef BOOT_LOADER
//		#define USENANDDMA	1
//		#define USESETKMODE 1
//		#define NAND_BUFFER_LENG	512
	#endif
#endif

#ifdef NOBINFS
//#ifdef CEDAR_ONLY			// Still needed in 4.x
//  Globals
HANDLE          g_hUTLObject = NULL;
UTL_FASTCALL    g_tblFastCall;
//#endif // CEDAR_ONLY
#endif 

// Globals needed for updatexip
HANDLE g_hMutex = NULL;

// BUGBUG: For now, we always will take the mutex
BOOL g_bTakeMutex = TRUE;

void GRABMUTEX();
void RELEASEMUTEX();

#ifdef NOSYSCALL
#ifndef BOOT_LOADER
// function prototypes for kernel functions
extern "C"
{
HANDLE SC_CreateMutex(LPSECURITY_ATTRIBUTES lpsa, BOOL bInitialOwner, LPCTSTR lpName);
DWORD SC_WaitForMultiple(DWORD cObjects, CONST HANDLE *lphObjects, BOOL fWaitAll, DWORD dwTimeout);
BOOL SC_ReleaseMutex(HANDLE hMutex);
BOOL SC_CloseHandle(HANDLE hObj);
}
#endif
#endif


//  Use Macros here to avoid extra over head for c function calls
#define READ_REGISTER_BYTE(p) (*(volatile PBYTE) (p))
#define WRITE_REGISTER_BYTE(p, v) (*(volatile PBYTE)(p)) = (v)
#define READ_REGISTER_USHORT(p) (*(volatile PUSHORT) (p))
#define WRITE_REGISTER_USHORT(p, v) (*(volatile PUSHORT)(p)) = (v)
#define READ_REGISTER_ULONG(p)  (*(volatile PULONG) (p))
#define WRITE_REGISTER_ULONG(p, v) (*(volatile PULONG)(p)) = (v)

//  Registers
volatile PUSHORT pNFReg;
volatile PUSHORT pNFCONF;
volatile PUSHORT pNFCONT;
volatile PUSHORT pNFCMD;
volatile PUSHORT pNFADDR;
volatile PULONG  pNFDATA;
volatile PUSHORT pNFSTAT;
volatile PULONG  pNFECC;
volatile CLKPWRreg *v_s2440CLKPWR;
volatile DMAreg *v_pDMAregs;
volatile INTreg *v_pINTregs;    

#define NFDATA 0x4E000010

// Event
HANDLE	gDMA3IntrEvent;
PBYTE	pDMABuffer;

//  Status bit pattern
#define STATUS_READY                0x40
#define STATUS_ERROR                0x01

// HCLK=133Mhz
#define TACLS		0
#define TWRPH0		6
#define TWRPH1		2

//  MACROS
#define NF_CE_L()			WRITE_REGISTER_USHORT(pNFCONT, (USHORT) (READ_REGISTER_USHORT(pNFCONT) & ~(1<<1)))
#define NF_CE_H()			WRITE_REGISTER_USHORT(pNFCONT, (USHORT) (READ_REGISTER_USHORT(pNFCONT) | (1<<1)))
#define NF_CMD(cmd)			WRITE_REGISTER_USHORT(pNFCMD, (USHORT) (cmd))
#define NF_ADDR(addr)		WRITE_REGISTER_USHORT(pNFADDR, (USHORT) (addr))
#define NF_DATA_R()			READ_REGISTER_BYTE(pNFDATA)
#define NF_DATA_W(val)		WRITE_REGISTER_BYTE(pNFDATA, (BYTE) (val))
#define NF_DATA_R4()		READ_REGISTER_ULONG(pNFDATA)
#define NF_DATA_W4(val)		WRITE_REGISTER_ULONG(pNFDATA, (ULONG) (val))
#define NF_STAT()			READ_REGISTER_USHORT(pNFSTAT)
#define NF_MECC_UnLock()	WRITE_REGISTER_USHORT(pNFCONT, (USHORT) (READ_REGISTER_USHORT(pNFCONT) & ~(1<<5)))
#define NF_MECC_Lock()		WRITE_REGISTER_USHORT(pNFCONT, (USHORT) (READ_REGISTER_USHORT(pNFCONT) | (1<<5)))
#define NF_RSTECC()			WRITE_REGISTER_USHORT(pNFCONT, (USHORT) (READ_REGISTER_USHORT(pNFCONT) | (1<<4)))
#define NF_WAITRB()			{while(!(NF_STAT() & (1<<1))) ;}
#define NF_CLEAR_RB()		WRITE_REGISTER_USHORT(pNFSTAT, (USHORT) (READ_REGISTER_USHORT(pNFSTAT) | (1<<2)))
#define NF_DETECT_RB()		{while(!(NF_STAT() & (1<<2)));}
#define NF_ECC()			READ_REGISTER_ULONG(pNFECC)

//  External function
extern "C" {
BOOL ECC_CorrectData(LPBYTE pData, LPBYTE pExistingECC, LPBYTE pNewECC);
}

//  Flags and pointers
#define BADBLOCKMARK                0x00
//  VALIDADDR is 5 << 8
//
//  Explain:    5 means the 6th byte in spare area (517 byte in the sector)
//              Shift 8 bit to the left to form the correct address for 16bit port
//
#define VALIDADDR   0x05

#define OEMADDR		0x04					// 5th byte in spare area

#ifdef CEDAR_ONLY
void PowerOnCallback()
{
    DEBUGMSG(1, (TEXT("FlashDrv::FMD:: Come back form Power Off!\r\n")));
}
#endif // CEDAR_ONLY

//  Reset the chip
//
void NF_Reset()
{
	int i;
    GRABMUTEX();
    NF_CE_L();

	NF_CLEAR_RB();
    NF_CMD(CMD_RESET);
	for(i=0;i<10;i++);  //tWB = 100ns. //??????

    NF_CE_H();
    RELEASEMUTEX();
}

/*
 Here is the statement from SamSung's K9F2808U0B datasheet:

 All device locations are erased (FFh) except location where the invalid block(s)
 information is written prior to shipping. The invalid block(s) status is defined
 by the 6th byte in the spare area. Samsung makes sure that either the 1st or 2nd
 page of every invalid block has non-FFh data at the column address of 517. Since
 the invalid block information is also erasable in most cases, it is impossible to
 recover the information once it has been erased.

 Here is the logic we are taking:

 If the block is invalid, non-FFh value in column address of 517, we don't use that
 block anyway. Otherwise, the whole spare area is subject to use by our program. If
 we found additional bad block later on, we don't necessary have to use column 517
 to represent invalid block. We could use any of the 16 byte spare area.

 But for simplicity, in our current implementation, we avoid to touch column 517. So
 the we allocate SectorInfo as following:

  - - - - - - - - - - - - - - - -
 |R|R|R|R|O|V|R|R|E|E|E|E|E|E|E|E|
  - - - - - - - - - - - - - - - -

 Where  Rs are reserved bytes used by the FAL
        O is a byte for use by the OEM
        V is a byte indicating if the block is valid (a.k.a. bad)
        Es are bytes used for ECC

 */

/*
 *  NAND_ReadSectorInfo
 *
 *  Read SectorInfo out of the spare area. The current implementation only handles
 *  one sector at a time.
 */
void NAND_ReadSectorInfo(SECTOR_ADDR sectorAddr, PSectorInfo pInfo)
{
// RETAILMSG(1, (TEXT("NAND_ReadSectorInfo() page 0x%x!\r\n"), sectorAddr));

    GRABMUTEX();
    
    //  Chip enable
    NF_CE_L();
	NF_CLEAR_RB();

    //  Write the command
    NF_CMD(CMD_READ2);

    //  Write the address
    NF_ADDR(0x00);
    NF_ADDR(sectorAddr & 0xff);
    NF_ADDR((sectorAddr >> 8) & 0xff);

    if (NEED_EXT_ADDR) {
        NF_ADDR((sectorAddr >> 16) & 0xff);
    }

	NF_DETECT_RB();	 // Wait tR(max 12us)

    pInfo->dwReserved1  = NF_DATA_R4();

    //  OEM byte
    pInfo->bOEMReserved = (BYTE) NF_DATA_R();
    //  Read the bad block mark
    pInfo->bBadBlock = (BYTE) NF_DATA_R();

    //  Second reserved field (WORD)
    pInfo->wReserved2 = ((BYTE) NF_DATA_R() << 8);
    pInfo->wReserved2 |= ((BYTE) NF_DATA_R());

    NF_CE_H();

    RELEASEMUTEX();
}

/*
 *  NAND_WriteSectorInfo
 *
 *  Write SectorInfo out to the spare area. The current implementation only handles
 *  one sector at a time.
 */
BOOL NAND_WriteSectorInfo(SECTOR_ADDR sectorAddr, PSectorInfo pInfo)
{
    BOOL    bRet = TRUE;
// RETAILMSG(1, (TEXT("NAND_WriteSectorInfo() Programming page 0x%x!\r\n"), sectorAddr));

    GRABMUTEX();

    //  Chip enable
    NF_CE_L();
	NF_CLEAR_RB();

    //  Write the command
    //  First, let's point to the spare area
    NF_CMD(CMD_READ2);
    NF_CMD(CMD_WRITE);

    //  Write the address
    NF_ADDR(0x00);
    NF_ADDR(sectorAddr & 0xff);
    NF_ADDR((sectorAddr >> 8) & 0xff);

    if (NEED_EXT_ADDR) {
        NF_ADDR((sectorAddr >> 16) & 0xff);
    }

    //  Now let's write the SectorInfo data
    //
    //  Write the first reserved field (DWORD)
    NF_DATA_W4( pInfo->dwReserved1 );

    //  Write OEM reserved flag
    NF_DATA_W( (pInfo->bOEMReserved) );

    //  Write the bad block flag
    NF_DATA_W( (pInfo->bBadBlock) );

    //  Write the second reserved field
    NF_DATA_W( (pInfo->wReserved2 >> 8) & 0xff );
    NF_DATA_W( (pInfo->wReserved2) );

    //  Issue the write complete command
    NF_CMD(CMD_WRITE2);

    //  Check ready bit
	NF_DETECT_RB();	 // Wait tR(max 12us)

    //  Check the status of program
    NF_CMD(CMD_STATUS);

    if(NF_DATA_R() & STATUS_ERROR) {
        RETAILMSG(1, (TEXT("NandFlash Error Programming sector info %d!\r\n"), sectorAddr));
        bRet = FALSE;
    }

    NF_CE_H();

    RELEASEMUTEX();
    return bRet;
}

/*-----------------------------------------------------------------------------
 *  FMD Interface functions
 *
 *----------------------------------------------------------------------------*/
//  FMD_Init
//
//  Initialize the flash chip
//
//  Note: Presently, the Flash size characteristics are hardcoded in CFNAND.H
//		  and are NOT stored in the registry.  Refer to the StratFlash FMD in
//		  %WINCEROOT%\PUBLIC\COMMON\OAK\DRIVERS\BLOCK\... for an example of how
//		  to use the registry for storing this information.
//
PVOID FMD_Init(LPCTSTR lpActiveReg, PPCI_REG_INFO pRegIn, PPCI_REG_INFO pRegOut)
{
	RETAILMSG(1, (TEXT("NandFlash FMD_Init\r\n")));
    //  0. Create the Mutex for shared access between the kernel and MSFLASH
#ifndef BOOT_LOADER
    if (g_hMutex == NULL)
    {
#ifdef NOSYSCALL
#ifndef BOOT_LOADER
        g_hMutex = SC_CreateMutex(NULL, FALSE, TEXT("_FLASH_MUTEX_"));
#endif
#else
        g_hMutex = CreateMutex(NULL, FALSE, TEXT("_FLASH_MUTEX_"));
#endif
        // was mutex creation successful?
        if (g_hMutex == NULL) 
        {
            RETAILMSG(1,(TEXT("NandFlash failed to create mutex\r\n")));
            goto ErrExit;
        }
    }
#endif
    
#ifndef NOSYSCALL
#ifdef NOBINFS
    DWORD dwBytes;

    //  Initialize the FASTCALL structure to 0
    memset(&g_tblFastCall, 0, sizeof(UTL_FASTCALL));

    //  1. CreateFile to get the access to UTLDRV.
    //
    g_hUTLObject = CreateFile(TEXT("UTL0:"), GENERIC_READ|GENERIC_WRITE,
                                FILE_SHARE_READ|FILE_SHARE_WRITE,
                                NULL, OPEN_EXISTING, 0, 0);

    if(INVALID_HANDLE_VALUE == g_hUTLObject) {
        RETAILMSG(1,(TEXT("NandFlash failed to create file UTL %x\r\n"), GetLastError()));
        goto ErrExit;
    }

    //  2. Call IOCTL to get the FAST CALL function pointer.
    //
    if(!DeviceIoControl(g_hUTLObject,
                        IOCTL_UTL_GET_FASTCALL,
                        NULL, 0,
                        &g_tblFastCall, sizeof(g_tblFastCall),
                        &dwBytes, NULL)) {
        RETAILMSG(1,(TEXT("NandFlash failed to DeviceIoControl %x\r\n"), GetLastError()));
        goto ErrExit;
    }

    //  3. Call the fast call to get the PVA for the registers
    //
    //  3.1 Get the register for NAND controller
    if (ERROR_SUCCESS != g_tblFastCall.GetRegisterVA(g_tblFastCall.pContext, NFC_BASE,
                                     32, FALSE, (DWORD *)&pNFReg) ) {
        RETAILMSG(1,(TEXT("NandFlash failed to GetRegisterVA \r\n")));
        goto ErrExit;
    }

    //  3.2 Get the register for the CLKPWR register
    if (ERROR_SUCCESS != g_tblFastCall.GetRegisterVA(g_tblFastCall.pContext, CLKPWR_BASE,
                                     32, FALSE, (DWORD *)&v_s2440CLKPWR) ) {
        RETAILMSG(1,(TEXT("NandFlash failed to GetRegisterVA for CLKPWR\r\n")));
        goto ErrExit;
    }
#ifdef CEDAR_ONLY
    // ++ CE 3.0 Specific Code. Not needed for 4.x +

    //  4. Register the Block driver to the Power On Monitor
    //
    if (ERROR_SUCCESS != g_tblFastCall.RegisterBlockDrv(g_tblFastCall.pContext,
                                                        PowerOnCallback)) {
        RETAILMSG(1,(TEXT("NandFlash failed to RegisterBlockDrv %x\r\n"), GetLastError()));
        goto ErrExit;
    }

    // -- CE 3.0 Specific Code. Not needed for 4.x +
#endif // CEDAR_ONLY
#else
//	RETAILMSG(1, (TEXT("FMD::FMD_Init:VirtualAlloc \r\n")));
    pNFReg = (PUSHORT) VirtualAlloc(0, 0x1000, MEM_RESERVE, PAGE_NOACCESS);

    if(!pNFReg) {
        RETAILMSG(1,(TEXT("NandFlash failed to VirtualAlloc \r\n")));
        goto ErrExit;
    }

    if(!VirtualCopy(pNFReg, (LPVOID) NFC_BASE, 0x1000, 
                    PAGE_READWRITE|PAGE_NOCACHE)) {
        RETAILMSG(1,(TEXT("NandFlash failed to VirtualCopy for NFC_BASE\r\n")));
        goto ErrExit;
    }

    //  Allocate for the clock control register

    //  Clock control register
    v_s2440CLKPWR = (CLKPWRreg *)VirtualAlloc(NULL, 0x1000, MEM_RESERVE, PAGE_NOACCESS);
    ASSERT(v_s2440CLKPWR);

    if (!VirtualCopy((LPVOID) v_s2440CLKPWR, (LPVOID) CLKPWR_BASE, 0x1000,
                     PAGE_READWRITE | PAGE_NOCACHE)) {
        RETAILMSG(1,(TEXT("NandFlash failed to VirtualCopy for CLKPWR_BASE\r\n")));
        goto ErrExit;
    }

#ifdef USENANDDMA
	// From HMSEO
	// DMA Virtual alloc
	v_pDMAregs = (volatile DMAreg *) VirtualAlloc(0,sizeof(DMAreg),MEM_RESERVE, PAGE_NOACCESS);
    ASSERT(v_pDMAregs);

	if(!VirtualCopy((PVOID)v_pDMAregs,(PVOID)(DMA_BASE),sizeof(DMAreg),
			PAGE_READWRITE | PAGE_NOCACHE )) {
        RETAILMSG(1,(TEXT("NandFlash failed to VirtualCopy for DMA_BASE\r\n")));
        goto ErrExit;
	}

	// Allocate DMA buffer
	pDMABuffer = (unsigned char *)VirtualAlloc(0, NAND_BUFFER_LENG, MEM_RESERVE, PAGE_NOACCESS);
    ASSERT(pDMABuffer);
                                  
	if(!VirtualCopy(pDMABuffer,
					(PVOID)NAND_DMA_BUFFER_BASE,
					NAND_BUFFER_LENG,
					PAGE_READWRITE | PAGE_NOCACHE) )
	{
        RETAILMSG(1,(TEXT("NandFlash failed to VirtualCopy for NAND_DMA_BUFFER_BASE\r\n")));
        goto ErrExit;
    }

#ifndef USESETKMODE
	// allocate the interrupt event for DMA
	gDMA3IntrEvent = CreateEvent(NULL, FALSE, FALSE,NULL);

	if (NULL == gDMA3IntrEvent) {
        RETAILMSG(1,(TEXT("NandFlash failed to CreateEvent \r\n")));
        goto ErrExit;
	}
    
	if (!InterruptInitialize (SYSINTR_DMA3, gDMA3IntrEvent,NULL,0)) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合一个色综合| 欧美日韩在线免费视频| 精品久久久久久综合日本欧美| 午夜久久久久久| 在线播放国产精品二区一二区四区| 亚洲国产精品精华液网站| 欧美精品777| 国产一区二区在线视频| 国产喷白浆一区二区三区| 不卡大黄网站免费看| 亚洲国产一区二区三区青草影视| 欧美美女bb生活片| 久久激五月天综合精品| 国产精品美女视频| 在线观看欧美黄色| 久久99这里只有精品| 欧美激情在线观看视频免费| 91久久线看在观草草青青| 日本不卡中文字幕| 日本一区二区视频在线观看| 在线精品亚洲一区二区不卡| 美国毛片一区二区| 国产精品美女久久久久久| 欧美无砖砖区免费| 国产美女娇喘av呻吟久久| 亚洲黄网站在线观看| 久久久久久日产精品| 色视频一区二区| 国产精品99久久久| 亚洲成人黄色影院| 国产精品国产三级国产aⅴ无密码| 欧美久久久久久蜜桃| 成人永久aaa| 欧美aaa在线| 一区二区三区日韩欧美精品| 久久久夜色精品亚洲| 欧美日韩在线播放三区| 国产九色精品成人porny| 亚洲成人精品在线观看| 国产精品三级久久久久三级| 欧美一级黄色大片| 91精品91久久久中77777| 国产精品一区二区x88av| 午夜天堂影视香蕉久久| 亚洲日穴在线视频| 日本一区二区在线不卡| 欧美一区二区视频在线观看 | 国产精品―色哟哟| 日韩精品专区在线| 欧美人妖巨大在线| 在线看日韩精品电影| 一本色道久久加勒比精品| 国产成人久久精品77777最新版本| 午夜欧美视频在线观看| 一区二区三区中文免费| 成人欧美一区二区三区在线播放| 久久久久久久电影| 日韩精品综合一本久道在线视频| 在线观看91精品国产入口| av亚洲精华国产精华精华| 国产一区二区三区免费看| 日本免费新一区视频| 一区二区三区不卡视频| 亚洲日本乱码在线观看| 亚洲欧洲日韩一区二区三区| 国产三级久久久| 久久一日本道色综合| 欧美大片拔萝卜| 日韩一级高清毛片| 欧美一三区三区四区免费在线看 | 日韩欧美高清在线| 在线成人免费视频| 欧美一区二区私人影院日本| 777色狠狠一区二区三区| 欧美蜜桃一区二区三区| 欧美另类一区二区三区| 欧美日韩一区二区三区四区| 91国偷自产一区二区三区成为亚洲经典| 久久婷婷综合激情| 精品sm在线观看| 国产日本一区二区| 久久久99精品免费观看不卡| 久久精品视频免费| 国产精品久久久久桃色tv| 国产精品乱人伦中文| 亚洲欧美日韩一区二区三区在线观看| 亚洲欧美福利一区二区| 亚洲免费在线视频| 香蕉av福利精品导航| 麻豆精品国产91久久久久久| 国内成人精品2018免费看| 国产精品1区2区3区| a4yy欧美一区二区三区| 色8久久精品久久久久久蜜| 欧美裸体bbwbbwbbw| 精品国产一二三| 国产精品私人影院| 亚洲国产你懂的| 精品一区二区三区在线观看| 国产成人精品亚洲日本在线桃色| 91伊人久久大香线蕉| 欧美日韩国产经典色站一区二区三区| 欧美精品一二三四| 日本一区二区三级电影在线观看| 国产精品国产三级国产a| 香蕉久久一区二区不卡无毒影院| 久久99国产精品尤物| 成人国产免费视频| 欧美视频一区在线| 久久久久久**毛片大全| 欧美高清一级片在线观看| 一区av在线播放| 狠狠色综合日日| 91丨porny丨国产| 日韩欧美中文字幕公布| 国产精品国产三级国产aⅴ中文| 亚洲3atv精品一区二区三区| 国产成a人亚洲精品| 欧美日韩欧美一区二区| 国产欧美一二三区| 青草国产精品久久久久久| 99久久综合狠狠综合久久| 日韩午夜激情视频| 亚洲免费资源在线播放| 国产高清精品网站| 777色狠狠一区二区三区| 欧美激情中文字幕一区二区| 日本欧美韩国一区三区| 成人久久视频在线观看| 91精品一区二区三区久久久久久| 国产精品免费看片| 美女视频黄a大片欧美| 91福利国产成人精品照片| 国产欧美一区在线| 久久成人av少妇免费| 欧美性大战xxxxx久久久| 亚洲国产精品成人综合| 久久99国产精品麻豆| 欧美日韩dvd在线观看| 国产精品欧美极品| 国产中文字幕精品| 日韩午夜激情电影| 日韩激情中文字幕| 欧美性猛片xxxx免费看久爱| 国产欧美日韩激情| 国产成人在线视频网站| 日韩欧美国产三级电影视频| 日韩国产一二三区| 欧美日本一区二区三区| 亚洲一二三四在线| 91精品办公室少妇高潮对白| 亚洲欧美另类在线| 99久久精品国产一区二区三区 | 色呦呦一区二区三区| 中文字幕国产一区| 国产剧情一区在线| 久久先锋影音av鲁色资源网| 韩国视频一区二区| 精品少妇一区二区三区日产乱码| 免费观看一级欧美片| 91精品在线麻豆| 美洲天堂一区二卡三卡四卡视频| 91精品国产福利在线观看| 日产国产欧美视频一区精品| 欧美美女一区二区三区| 亚洲v中文字幕| 欧美绝品在线观看成人午夜影视| 亚洲123区在线观看| 欧美日韩一区二区在线观看 | 国产精品66部| 久久久久久毛片| 国产精品亚洲一区二区三区妖精| 久久久精品日韩欧美| 狠狠色伊人亚洲综合成人| 久久精品欧美一区二区三区麻豆| 国产.欧美.日韩| **网站欧美大片在线观看| 色婷婷综合久久久中文字幕| 亚洲国产毛片aaaaa无费看| 欧美日韩精品免费观看视频| 日韩高清不卡在线| 欧美成人艳星乳罩| 国产成人综合在线播放| 中文字幕字幕中文在线中不卡视频| 91视频一区二区| 午夜精品福利一区二区三区av | 丝袜诱惑亚洲看片| 欧美一级二级三级蜜桃| 国内成+人亚洲+欧美+综合在线| 日本一区二区视频在线| 日本道在线观看一区二区| 婷婷国产在线综合| 久久色在线视频| 色婷婷av一区二区三区软件| 日本亚洲视频在线| 国产视频在线观看一区二区三区| 91丨porny丨户外露出| 青青草伊人久久| 国产欧美精品国产国产专区| 色婷婷久久综合|