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

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

?? fmd.cpp

?? windows ce 50 drive program
?? 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一区二区三区免费野_久草精品视频
日本亚洲视频在线| 色综合激情五月| 美女免费视频一区| 日本女人一区二区三区| 亚洲r级在线视频| 爽好久久久欧美精品| 日本午夜一本久久久综合| 偷窥少妇高潮呻吟av久久免费| 亚洲成人综合网站| 午夜伊人狠狠久久| 日本欧美一区二区在线观看| 六月婷婷色综合| 国产乱码精品一区二区三区忘忧草| 国产盗摄一区二区| 成人免费av资源| 91在线看国产| 在线精品视频小说1| 欧美在线高清视频| 欧美一级在线视频| 国产亚洲短视频| 日韩伦理电影网| 肉丝袜脚交视频一区二区| 久久精品国产免费| 91久久一区二区| 欧美日韩国产高清一区二区三区 | 午夜精品久久久久久不卡8050| 亚洲综合激情小说| 免费欧美在线视频| 国产精品一卡二| 91久久人澡人人添人人爽欧美| 欧美电影在哪看比较好| 亚洲精品一区二区三区蜜桃下载 | 欧美伊人久久久久久久久影院 | 亚洲午夜在线视频| 久久国产剧场电影| 99这里只有精品| 在线综合亚洲欧美在线视频| 久久久欧美精品sm网站| 亚洲色图视频免费播放| 秋霞午夜鲁丝一区二区老狼| 国产精品99久久久久久久女警| 色综合网色综合| 欧美电影免费观看高清完整版在线 | 成人免费精品视频| 欧美色欧美亚洲另类二区| 精品美女被调教视频大全网站| 欧美国产日韩a欧美在线观看| 亚洲一区二区三区不卡国产欧美| 久久99久久精品欧美| 成人午夜av在线| 欧美乱妇一区二区三区不卡视频| 久久欧美一区二区| 一区二区三区四区在线免费观看| 久久99国产精品免费| 91国产视频在线观看| 久久九九国产精品| 偷窥国产亚洲免费视频| 不卡大黄网站免费看| 欧美一级精品在线| 亚洲欧美区自拍先锋| 国产一区二区视频在线播放| 欧美日韩一区二区三区高清| 久久人人爽爽爽人久久久| 香蕉乱码成人久久天堂爱免费| 青青草国产成人99久久| 91电影在线观看| 国产喷白浆一区二区三区| 亚洲综合一区二区精品导航| 高清不卡一区二区| 精品国产区一区| 日韩高清不卡一区二区| 色婷婷亚洲综合| 久久久精品2019中文字幕之3| 日本视频中文字幕一区二区三区| 日本福利一区二区| 国产精品情趣视频| 国产自产视频一区二区三区| 884aa四虎影成人精品一区| 亚洲欧美电影一区二区| 国产成人h网站| 久久精品视频一区| 韩国欧美一区二区| 欧美一区二区日韩一区二区| 亚洲r级在线视频| 欧美亚洲一区二区在线| 亚洲日本一区二区三区| 99精品国产热久久91蜜凸| 国产亚洲精品资源在线26u| 奇米四色…亚洲| 91精品国产美女浴室洗澡无遮挡| 亚洲国产成人av网| 在线免费视频一区二区| 亚洲免费观看高清完整版在线观看熊 | 国产精品日日摸夜夜摸av| 国产综合色视频| 久久久三级国产网站| 激情成人综合网| 日韩三级精品电影久久久| 麻豆成人综合网| 欧美一区二区三区免费观看视频| 日韩综合在线视频| 3atv在线一区二区三区| 亚洲午夜久久久久久久久电影院| 亚洲一区二区欧美激情| 亚洲人成精品久久久久| 91免费小视频| 一区二区三区中文免费| 91福利视频在线| 亚洲黄色小视频| 欧美日韩在线播放| 日韩黄色一级片| 日韩一区和二区| 麻豆国产精品777777在线| 欧美xingq一区二区| 精品一区二区免费在线观看| 欧美成人官网二区| 国产精品亚洲第一区在线暖暖韩国| 国产欧美精品一区二区色综合 | 日韩高清在线不卡| 久久夜色精品国产欧美乱极品| 久久国产精品色| 国产喷白浆一区二区三区| 成人网在线播放| 亚洲免费伊人电影| 欧美日韩成人在线一区| 蜜桃视频一区二区| 久久久国产午夜精品| 不卡视频在线看| 亚洲综合色区另类av| 69堂精品视频| 国产一区二区三区在线观看免费视频| 国产欧美一区二区精品性| 91首页免费视频| 日韩激情av在线| 欧美韩国日本不卡| 欧美性猛片aaaaaaa做受| 奇米综合一区二区三区精品视频| 久久久国产精华| 一本一道波多野结衣一区二区| 亚洲成av人片| 欧美videos大乳护士334| 懂色一区二区三区免费观看| 亚洲线精品一区二区三区| 精品国产91乱码一区二区三区 | 一本久久a久久精品亚洲| 69堂成人精品免费视频| 亚洲免费大片在线观看| 91精品国产免费久久综合| 国产精品系列在线播放| 亚洲三级电影网站| 欧美一区二区美女| 成人午夜私人影院| 亚洲aaa精品| 国产精品久久久久影院亚瑟| 337p亚洲精品色噜噜狠狠| 成人手机电影网| 午夜精品久久久久久久久久久| 久久久精品国产免大香伊| 欧美三级三级三级爽爽爽| 国产成人午夜视频| 午夜国产不卡在线观看视频| 久久久精品tv| 欧美丰满一区二区免费视频| 成年人午夜久久久| 精品无人码麻豆乱码1区2区| 一区二区三区日韩精品视频| 国产夜色精品一区二区av| 欧美另类高清zo欧美| 不卡一区二区中文字幕| 韩国女主播一区二区三区| 亚洲va国产天堂va久久en| 国产精品国产三级国产专播品爱网| 91麻豆精品国产91久久久久久| 99久久精品免费精品国产| 国产精品亚洲综合一区在线观看| 五月激情综合色| 亚洲精品国产精华液| 国产欧美日韩综合精品一区二区| 日韩一级二级三级精品视频| 欧美三级在线看| 91女人视频在线观看| 高清shemale亚洲人妖| 激情综合五月婷婷| 日本欧美大码aⅴ在线播放| 亚洲成人你懂的| 日韩一区在线看| 日本一区免费视频| 久久免费美女视频| 精品国产污污免费网站入口| 日韩视频一区二区三区在线播放| 欧美三级三级三级| 欧美写真视频网站| 在线视频国内一区二区| 一本一道综合狠狠老| 99热精品国产| 99视频超级精品| 色婷婷一区二区三区四区| 色综合天天狠狠| 色猫猫国产区一区二在线视频| 99国产精品久久久久久久久久 |