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

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

?? fmd_lb.cpp

?? 6410BSP3
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//
// 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.
//
// Copyright (c) Samsung Electronics. Co. LTD. All rights reserved.

/*++

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.

Module Name:

    fmd_lb.cpp

Abstract:

    This module implements main functions of FMD PDD for Large Block(1024K, 2048KBytes Block Size)

Functions:

    FMD_LB_*

Notes:

--*/

#include "precomp.h"

// SpareArea Map(Byte Addressing)
// 0~7   : SectorInfo
// 8~23  : MECC data(128bit)
// 24~27 : SECC1 Data(32bit) 
// 28~31 : SECC2 Data[32bit]

void SubmitSpareAreaReadCmd(DWORD SectorStartAddr, DWORD SpareStartAddr)
{
    NF_nFCE_L();

    NF_CLEAR_RB();

    NF_CMD(CMD_READ);                            // Send read command.

    NF_ADDR((SpareStartAddr)&0xff);
    NF_ADDR((SpareStartAddr>>8)&0xff);
    NF_ADDR((SectorStartAddr) & 0xff);
    NF_ADDR((SectorStartAddr >> 8) & 0xff);
    if(g_bNeedExtAddr)
    {
        NF_ADDR((SectorStartAddr >> 16) & 0xff);
    }

    NF_CMD(CMD_READ3);                        // 2nd command

    NF_DETECT_RB();                                // Wait for command to complete.
}

// the 1st byte through ECC engine is badblock byte for SectorInfo structure in large block NAND flash
// the relationship between input through ECC engine and SectorInfo structure is like this
//
//   ReadByte  -  ECC input byte  -----------  SectorInfoLocation(if pSectorInfo = (LPBYTE)pData) (Little Endian)
//     1byte   -  bBadBlock                 -  6th byte  (*pData[5])
//     4byte   -  dwReserved1 & 0xff        -  1st byte  (*pData[0])
//             -  (dwReserved1>>8) & 0xff   -  2nd byte  (*pData[1])
//             -  (dwReserved1>>16) & 0xff  -  3rd byte  (*pData[2])
//             -  (dwReserved1>>24) & 0xff  -  4th byte  (*pData[3])
//     1byte   -  bOEMReserved              -  5th byte  (*pData[4])
//
void RestructSectorInfo(PSectorInfo pSectorInfoBuff, PBYTE RawSectorInfo)
{
    pSectorInfoBuff->bBadBlock = RawSectorInfo[0];
    pSectorInfoBuff->dwReserved1 = RawSectorInfo[1];
    pSectorInfoBuff->dwReserved1 |= RawSectorInfo[2]<<8;
    pSectorInfoBuff->dwReserved1 |= RawSectorInfo[3]<<16;
    pSectorInfoBuff->dwReserved1 |= RawSectorInfo[4]<<24;
    pSectorInfoBuff->bOEMReserved = RawSectorInfo[5];
    pSectorInfoBuff->wReserved2 = RawSectorInfo[6];
    pSectorInfoBuff->wReserved2 |= (RawSectorInfo[7]<<8);
}
        
void ReadOneSectorInfo(PBYTE RawSectorInfoBuf)        ///< Read One SectorInfo by sizeof(SectorInfo)
{
    int i;
    // Initialize MECC Module
    NF_RSTECC();
    NF_MECC_UnLock();

    for(i =0 ; i< 6; i++){  // Except Reserved2. Reserved2 area can vary 
        RawSectorInfoBuf[i] = NF_RDDATA_BYTE();
    }

    NF_MECC_Lock();
    RawSectorInfoBuf[6] = NF_RDDATA_BYTE();
    RawSectorInfoBuf[7] = NF_RDDATA_BYTE();    
}

BOOL FMD_LB_ReadSector(SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff, PSectorInfo pSectorInfoBuff, DWORD dwNumSectors)
{
    ULONG SectorAddr = (ULONG)startSectorAddr;
    DWORD       i;
    volatile DWORD        rddata;
    UINT32 nRetEcc = 0;
    DWORD MECCBuf[MAX_SECTORS_PER_PAGE];
    
    UINT16 nSectorLoop;
    int NewSpareAddr = NAND_PAGE_SIZE;
    int NewDataAddr = 0;
    int NewSectorAddr = startSectorAddr;

    DWORD SECCBuf1;         // 1st Spare ECC
    DWORD SECCBuf2;         // 2nd Spare ECC(cloned from 1st)
    BYTE RawSectorInfo[8];

    RETAILMSG(FMD_ZONE_FUNCTION,(TEXT("#### FMD_DRIVER:::FMD_LB_READSECTOR %x %x\r\n"),startSectorAddr,NewDataAddr));

    if (!pSectorBuff && !pSectorInfoBuff)
    {
        return(FALSE);
    }

    if ( dwNumSectors > 1 )
    {
        RETAILMSG(FMD_ZONE_ERROR, (TEXT("######## FATAL ERROR => FMD::FMD_ReadSector->dwNumsectors is bigger than 1. \r\n")));
        return FALSE;
    }

    if (!pSectorBuff)
    {
        return NAND_LB_ReadSectorInfo(startSectorAddr, pSectorInfoBuff);
    }

    SubmitSpareAreaReadCmd(NewSectorAddr, NewSpareAddr+NAND_SECC1_OFFSET);    //< Spare Area Start Address, SECTOR_SIZE(512)*SECTOS_PER_PAGE(4)=2048 -> Physical Page Size

    // Read SECC1, SECC2 from Spare area
    SECCBuf1 = NF_RDDATA_WORD();
    SECCBuf2 = NF_RDDATA_WORD();

    // Set address for random access to read SectorInfo and MECC code from Spare Area
    NF_CMD(CMD_RDO);    // Send read random data output command
    NF_ADDR((NewSpareAddr)&0xff);
    NF_ADDR(((NewSpareAddr)>>8)&0xff);
    NF_CMD(CMD_RDO2);   // Command done

    if (pSectorInfoBuff)            /// Read SectorInfo doesn't check this
    {
        ReadOneSectorInfo(RawSectorInfo);        ///< Read One SectorInfo by sizeof(SectorInfo)
        
        // Check ECC abour SectorInfo         
        NF_WRMECCD0( ((SECCBuf1&0xff00)<<8)|(SECCBuf1&0xff) );    
        NF_WRMECCD1( ((SECCBuf1&0xff000000)>>8)|((SECCBuf1&0xff0000)>>16) );

        nRetEcc = NF_ECC_ERR0;

        if (!ECC_CorrectData(startSectorAddr, RawSectorInfo, nRetEcc, ECC_CORRECT_SPARE1)) // Use specific byte
        {
            RETAILMSG(FMD_ZONE_ERROR, (TEXT("#### SECC1 ECC correction failed\n")));   
            NF_nFCE_H();
            return FALSE;
        }

        RestructSectorInfo(pSectorInfoBuff, RawSectorInfo);
    }
    else
    {
         for(i=0; i<sizeof(SectorInfo)/sizeof(DWORD); i++)
         {
            rddata = (DWORD) NF_RDDATA_WORD();        // read and trash the data
         }
    }

    // Initialize MECC module
    NF_RSTECC();
    NF_MECC_UnLock();

    // Read MECC parity code from Spare Area
    for (nSectorLoop = 0; nSectorLoop < SECTORS_PER_PAGE; nSectorLoop++)
    {
        MECCBuf[nSectorLoop] = NF_RDDATA_WORD();
    }
    NF_MECC_Lock();

    // Check ECC about MECC parity code
    NF_WRMECCD0( ((SECCBuf2&0xff00)<<8)|(SECCBuf2&0xff) );
    NF_WRMECCD1( ((SECCBuf2&0xff000000)>>8)|((SECCBuf2&0xff0000)>>16) );

    nRetEcc = NF_ECC_ERR0;

    if (!ECC_CorrectData(startSectorAddr, (LPBYTE)MECCBuf, nRetEcc, ECC_CORRECT_SPARE2))
    {
        RETAILMSG(FMD_ZONE_ERROR, (TEXT("#### SECC2 ECC correction failed\n")));
        NF_nFCE_H();
        return FALSE;
    }

    // Read each Sector in the Page. (using SECTORS_PER_PAGE)
    for (nSectorLoop = 0; nSectorLoop < SECTORS_PER_PAGE; nSectorLoop++)
    {
        NewDataAddr = nSectorLoop * SECTOR_SIZE;

        NF_CMD(CMD_RDO);                            // Send read command.
        NF_ADDR((NewDataAddr)&0xff);
        NF_ADDR((NewDataAddr>>8)&0xff);
        NF_CMD(CMD_RDO2);    // 2nd command

        NF_RSTECC();
        NF_MECC_UnLock();

        if( ((DWORD) (pSectorBuff+nSectorLoop*SECTOR_SIZE)) & 0x3)
        {
            RdPage512Unalign(pSectorBuff+nSectorLoop*SECTOR_SIZE);
        }
        else
        {
            // Usual case to handle 4byte aligned buffer pointer
            RdPage512(pSectorBuff+nSectorLoop*SECTOR_SIZE);                    // Read page/sector data.
        }

        NF_MECC_Lock();

        // Check ECC about Main data with MECC parity code
        NF_WRMECCD0( ((MECCBuf[nSectorLoop]&0xff00)<<8)|(MECCBuf[nSectorLoop]&0xff) );
        NF_WRMECCD1( ((MECCBuf[nSectorLoop]&0xff000000)>>8)|((MECCBuf[nSectorLoop]&0xff0000)>>16) );

        nRetEcc = NF_ECC_ERR0;

        if (!ECC_CorrectData(startSectorAddr, pSectorBuff+nSectorLoop*SECTOR_SIZE, nRetEcc, ECC_CORRECT_MAIN))
        {
            RETAILMSG(FMD_ZONE_ERROR, (TEXT("#### MECC ECC correction failed\n")));
            NF_nFCE_H();            
            return FALSE;
        }
    }

    NF_nFCE_H();
    
    return TRUE;
}

BOOL NAND_LB_ReadSectorInfo(SECTOR_ADDR sectorAddr, PSectorInfo pInfo)
{
    BOOL bRet = TRUE;
    int NewSectorAddr = sectorAddr;
    UINT32 nRetEcc = 0;
    DWORD MECCBuf[MAX_SECTORS_PER_PAGE];
    DWORD SECCBuf;    
    BYTE RawSectorInfo[8];

/*    if(sectorAddr == 0)
    {
        // Bad Block must be treated as valid for steploader and eboot
        pInfo->bOEMReserved = ~(OEM_BLOCK_RESERVED | OEM_BLOCK_READONLY);
        pInfo->bBadBlock    = BADBLOCKMARK;
        pInfo->dwReserved1  = 0xffffffff;
        pInfo->wReserved2   = 0xffff;
        return TRUE;
    }
*/
    SubmitSpareAreaReadCmd(NewSectorAddr, NAND_PAGE_SIZE);
    
    ReadOneSectorInfo(RawSectorInfo);

    // Read MECC parity code from Spare area, actually don't use these data..
    MECCBuf[0] = NF_RDDATA_WORD();
    MECCBuf[1] = NF_RDDATA_WORD();
    MECCBuf[2] = NF_RDDATA_WORD();
    MECCBuf[3] = NF_RDDATA_WORD();
    // Check ECC about SectorInfo with SECC1 parity code
    SECCBuf = NF_RDDATA_WORD();


    NF_WRMECCD0( ((SECCBuf&0xff00)<<8)|(SECCBuf&0xff) );
    NF_WRMECCD1( ((SECCBuf&0xff000000)>>8)|((SECCBuf&0xff0000)>>16) );
    
    nRetEcc = NF_ECC_ERR0;

    bRet = ECC_CorrectData(sectorAddr, (LPBYTE)&RawSectorInfo, nRetEcc, ECC_CORRECT_SPARE1);
    if(!bRet)
    {
        RETAILMSG(FMD_ZONE_ERROR, (TEXT("#### Warning:NAND_LB_ReadSectorInfo Spare ECC operation for SectorInfo failed\n")));
        RETAILMSG(FMD_ZONE_READ, (TEXT("\n#### RawSectorInfo:bOEMReserved:0x%x, bBadBlock:0x%x, dwReserved1:0x%x, wReserved2:0x%x"),
                                        ((PSectorInfo)&RawSectorInfo)->bOEMReserved, ((PSectorInfo)&RawSectorInfo)->bBadBlock,
                                        ((PSectorInfo)&RawSectorInfo)->dwReserved1, ((PSectorInfo)&RawSectorInfo)->wReserved2));        
        RETAILMSG(FMD_ZONE_READ, (TEXT("\n#### SECCBuf : 0x%x"), SECCBuf));
//        NF_nFCE_H();
/*      Implementation 2
        pInfo->bOEMReserved = ~(OEM_BLOCK_RESERVED | OEM_BLOCK_READONLY);
        pInfo->bBadBlock    = BADBLOCKMARK;
        pInfo->dwReserved1  = 0xffffffff;
        pInfo->wReserved2   = 0xffff;
*/
//       return TRUE;        // Bad Block must be treated as valid for steploader and eboot

//        return bRet;
    }

    RestructSectorInfo(pInfo, RawSectorInfo);

    NF_nFCE_H();

    return bRet;
}

BOOL FMD_LB_WriteSector(SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff, PSectorInfo pSectorInfoBuff, DWORD dwNumSectors)
{
    DWORD   i;
    BOOL    bRet = TRUE;
    BYTE Status;    
    DWORD MECCBuf[MAX_SECTORS_PER_PAGE];
    UINT16 nSectorLoop;
    
    int NewSpareAddr = NAND_PAGE_SIZE;
    int NewDataAddr = 0;
    int NewSectorAddr = startSectorAddr;

    DWORD SECCBuf1;
    DWORD SECCBuf2;


    RETAILMSG(FMD_ZONE_WRITE, (TEXT("FMD::FMD_LB_WriteSector 0x%x \r\n"), startSectorAddr));

    if (!pSectorBuff && !pSectorInfoBuff)
        return(FALSE);

    if ( dwNumSectors > 1 )
    {
        RETAILMSG(FMD_ZONE_ERROR, (TEXT("######## FATAL ERROR => FMD::FMD_WriteSector->dwNumsectors is bigger than 1. \r\n")));
        return FALSE;
    }

    if (!pSectorBuff)
    {
        NAND_LB_WriteSectorInfo(startSectorAddr, pSectorInfoBuff);
        return TRUE;
    }

    //  Enable Chip
    NF_nFCE_L();

    NF_CLEAR_RB();

    //  Issue command
    NF_CMD(CMD_WRITE);

    //  Setup address
    NF_ADDR((NewDataAddr)&0xff);
    NF_ADDR((NewDataAddr>>8)&0xff);
    NF_ADDR((NewSectorAddr)&0xff);
    NF_ADDR((NewSectorAddr>>8)&0xff);
    if(g_bNeedExtAddr)
    {
        NF_ADDR((NewSectorAddr>>16)&0xff);
    }

    for (nSectorLoop = 0; nSectorLoop < SECTORS_PER_PAGE; nSectorLoop++)
    {
        //  Initialize ECC register
        NF_RSTECC();
        NF_MECC_UnLock();

        //  Special case to handle un-aligned buffer pointer.
        //
        if( ((DWORD) (pSectorBuff+nSectorLoop*SECTOR_SIZE)) & 0x3)
        {
            //  Write the data
            WrPage512Unalign(pSectorBuff+nSectorLoop*SECTOR_SIZE);            
        }
        else
        {
            WrPage512(pSectorBuff+nSectorLoop*SECTOR_SIZE);
        }

        //  Read out the ECC value generated by HW
        NF_MECC_Lock();

        MECCBuf[nSectorLoop] = NF_RDMECC0();
    }

    NF_CMD(CMD_RDI);
    NF_ADDR((NewSpareAddr)&0xff);
    NF_ADDR((NewSpareAddr>>8)&0xff);

    // Write the SectorInfo data to the media
    // NOTE: This hardware is odd: only a byte can be written at a time and it must reside in the
    //       upper byte of a USHORT.
    if(pSectorInfoBuff)
    {
        // Initialize MECC module
        NF_RSTECC();
        NF_MECC_UnLock();

        //  Write SectorInfo
        NF_WRDATA_BYTE(pSectorInfoBuff->bBadBlock);
        NF_WRDATA_WORD(pSectorInfoBuff->dwReserved1);
        NF_WRDATA_BYTE(pSectorInfoBuff->bOEMReserved);

        NF_MECC_Lock();

        // Store SECC parity code for SectorInfo
        SECCBuf1 = NF_RDMECC0();

        NF_WRDATA_BYTE(pSectorInfoBuff->wReserved2&0xff);
        NF_WRDATA_BYTE((pSectorInfoBuff->wReserved2>>8)&0xff);
    }
    else
    {
        // Make sure we advance the Flash's write pointer (even though we aren't writing the SectorInfo data)
        for(i=0; i<sizeof(SectorInfo)/sizeof(DWORD); i++)
        {
            NF_WRDATA_WORD(0xffffffff);
        }
    }


    //  Write the ECC value to the flash (16 btes for 4 sectors)
    // Initialize MECC module
    NF_RSTECC();
    NF_MECC_UnLock();

    // Store MECC parity code for main data
    NF_WRDATA_WORD(MECCBuf[0]);
    NF_WRDATA_WORD(MECCBuf[1]);
    NF_WRDATA_WORD(MECCBuf[2]);
    NF_WRDATA_WORD(MECCBuf[3]);

    NF_MECC_Lock();     // get SECC

    // Store MECC parity code for MECC parity code
    SECCBuf2 = NF_RDMECC0();

    if(pSectorInfoBuff)
    {
        // Store SECC1, SECC2
        NF_WRDATA_WORD(SECCBuf1);
        NF_WRDATA_WORD(SECCBuf2);
    }

    //  Finish up the write operation
    NF_CMD(CMD_WRITE2);

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

    if ( NF_RDSTAT & STATUS_ILLACC )
    {
        RETAILMSG(FMD_ZONE_ERROR, (TEXT("FMD_WriteSector() ######## Error Programming page (Illegal Access) %d!\n"), startSectorAddr));
        g_pNFConReg->NFSTAT =  STATUS_ILLACC;    // Write 1 to clear.
        bRet = FALSE;
    }
    else
    {
        //  Check the status
        do
        {
            NF_CMD(CMD_STATUS);
            Status = NF_RDDATA_BYTE();                    // Read command status.
        }while(!(Status & STATUS_READY));

        if(Status & STATUS_ERROR)
        {
            RETAILMSG(FMD_ZONE_ERROR, (TEXT("FMD_WriteSector() ######## Error Programming page %d!\n"), startSectorAddr));
            bRet = FALSE;
        }
    }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩激情一区| 国产精品久久一卡二卡| 国产精品视频免费| 亚洲线精品一区二区三区八戒| 九九**精品视频免费播放| 成人97人人超碰人人99| 日韩美一区二区三区| 亚洲精品国产a久久久久久 | 日韩丝袜美女视频| 亚洲男女一区二区三区| 国产精品123| 欧美大片在线观看| 亚洲自拍偷拍综合| a级精品国产片在线观看| 精品免费国产二区三区| 亚洲香蕉伊在人在线观| 91影院在线免费观看| 国产午夜精品在线观看| 久久国产欧美日韩精品| 91精品国产色综合久久不卡蜜臀 | 国产精品乱码一区二区三区软件| 日韩av一区二区三区四区| 91啪亚洲精品| 中文字幕欧美激情一区| 狠狠色丁香婷婷综合久久片| 日韩精品一区二区三区在线播放| 午夜在线电影亚洲一区| 欧美性videosxxxxx| 亚洲欧美偷拍卡通变态| 色综合久久综合| 亚洲精品一二三| 日本伦理一区二区| 夜夜精品视频一区二区| 91小视频在线免费看| 国产精品第一页第二页第三页| 福利91精品一区二区三区| 国产拍揄自揄精品视频麻豆| 国产精品12区| 国产日本欧洲亚洲| 成人动漫一区二区在线| 亚洲美女免费在线| 色婷婷亚洲精品| 天堂久久久久va久久久久| 欧美一区二区三区啪啪| 激情综合五月天| 国产日韩欧美麻豆| 91亚洲国产成人精品一区二三| 亚洲老妇xxxxxx| 91成人在线精品| 午夜精品影院在线观看| 7777精品伊人久久久大香线蕉经典版下载| 亚洲成人福利片| 日韩免费性生活视频播放| 国产一区在线视频| 日韩一区欧美小说| 欧美人与z0zoxxxx视频| 国产乱色国产精品免费视频| 亚洲婷婷在线视频| 91麻豆精品国产自产在线| 国内精品写真在线观看| 国产精品久久久久影视| 欧美自拍偷拍一区| 免费在线观看日韩欧美| 欧美高清在线一区| 欧美日韩综合不卡| 久久 天天综合| 国产精品福利在线播放| 51精品国自产在线| 99精品国产热久久91蜜凸| 日本sm残虐另类| 国产日韩欧美高清在线| 91久久久免费一区二区| 国产综合一区二区| 亚洲精品视频免费观看| xfplay精品久久| 色婷婷精品大视频在线蜜桃视频 | 91精品欧美久久久久久动漫 | 国产剧情在线观看一区二区| 亚洲乱码国产乱码精品精的特点| 欧美成人三级电影在线| 91国偷自产一区二区开放时间 | 免费看欧美美女黄的网站| 欧美国产成人在线| 欧美一级片在线| 91成人在线观看喷潮| 成人激情av网| 99久久99久久精品免费观看| 欧美激情一区二区三区四区 | 日韩欧美一区在线观看| 大桥未久av一区二区三区中文| 亚洲欧美aⅴ...| 日韩一二三区视频| 91蝌蚪porny| 久久不见久久见免费视频7| 中文字幕综合网| 久久九九影视网| 成人高清免费在线播放| a级高清视频欧美日韩| 久久福利资源站| 日韩不卡一二三区| 亚洲综合久久久| 亚洲人吸女人奶水| 日韩精品一区二区三区视频 | 国产日韩av一区| 欧美xxxx老人做受| 91麻豆精品国产91久久久久久| 欧美在线观看18| 成人午夜精品一区二区三区| 国产成人在线视频免费播放| 国产在线精品一区二区不卡了| 蜜臀av性久久久久蜜臀aⅴ | 粉嫩嫩av羞羞动漫久久久| 精品一区二区三区免费观看| 麻豆精品视频在线观看免费| 日本人妖一区二区| 捆绑调教一区二区三区| 麻豆国产欧美日韩综合精品二区| 青青草97国产精品免费观看无弹窗版| 天天影视色香欲综合网老头| 性久久久久久久久| 日本美女视频一区二区| 理论电影国产精品| 国产精品亚洲一区二区三区在线| 国产精品一卡二卡| 成人动漫一区二区在线| 91视频国产观看| 欧美亚男人的天堂| 欧美日本高清视频在线观看| 欧美大片拔萝卜| 国产日韩av一区二区| 最新日韩av在线| 亚洲大片一区二区三区| 免费在线观看日韩欧美| 国产乱淫av一区二区三区| 成人美女在线视频| 在线免费观看一区| 日韩一区二区三区视频在线| 国产女人水真多18毛片18精品视频| 国产精品免费视频网站| 亚洲精品你懂的| 日韩精品福利网| 国产精品91一区二区| 在线观看国产精品网站| 91精品国产福利在线观看| 久久久精品天堂| 亚洲自拍偷拍图区| 国产美女久久久久| 色爱区综合激月婷婷| 欧美zozozo| 亚洲精品日韩综合观看成人91| 日韩电影在线看| 国产成人h网站| 69精品人人人人| 中文乱码免费一区二区 | 亚洲欧美另类久久久精品| 婷婷成人激情在线网| 高清国产午夜精品久久久久久| 欧美在线影院一区二区| 精品国产a毛片| 亚洲国产三级在线| 国产成人综合网| 欧美日韩国产乱码电影| 国产精品理论在线观看| 日本人妖一区二区| 色88888久久久久久影院野外| 日韩视频一区在线观看| 亚洲免费在线观看视频| 黄色成人免费在线| 欧美区一区二区三区| 日本一区二区电影| 美女一区二区久久| 91久久精品一区二区三区| 久久久久一区二区三区四区| 一区二区成人在线视频| 国产成人在线看| 欧美一卡二卡在线观看| 亚洲高清免费视频| 99久久免费精品| 日本一区二区在线不卡| 老司机精品视频线观看86| 色婷婷av久久久久久久| 国产日韩欧美综合一区| 极品少妇xxxx精品少妇偷拍 | 粉嫩欧美一区二区三区高清影视| 91精品国产手机| 亚洲一区二区视频| 成年人午夜久久久| 日本一区二区三区电影| 精品在线你懂的| 成人精品鲁一区一区二区| 午夜a成v人精品| 国产日韩精品一区二区浪潮av| 欧美va亚洲va在线观看蝴蝶网| 亚洲最快最全在线视频| 99热精品国产| 国产女人aaa级久久久级| 久久草av在线| 精品国产一区a| 麻豆国产欧美一区二区三区| 欧美日韩国产高清一区二区三区 |