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

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

?? hwctxt.cpp

?? 三星2440 cpu WINCE 5.00板級支持包
?? CPP
?? 第 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.
//
/*++
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:	HWCTXT.CPP

Abstract:		Platform dependent code for the mixing audio driver.

Notes:			The following file contains all the hardware specific code
				for the mixing audio driver.  This code's primary responsibilities
				are:

					* Initialize audio hardware (including codec chip)
					* Schedule DMA operations (move data from/to buffers)
					* Handle audio interrupts

				All other tasks (mixing, volume control, etc.) are handled by the "upper"
				layers of this driver.

				****** IMPORTANT ******
				For the SC2440 CPU, DMA channel 2 can be used for both input and output.  In this,
				configuration, however, only one type operation (input or output) can execute.  In 
				order to implement simultaneous playback and recording, two things must be done:
 
					1) Input DMA should be moved to DMA Channel 1; Output DMA still uses DMA Channel 2.
					2) Step #3 in InterruptThread() needs to be implemented so that the DMA interrupt
					   source (input DMA or output DMA?) can be determined.  The interrupt source needs
					   to be determined so that the appropriate buffers can be copied (Steps #4,#5...etc.).

				Lastly, the m_OutputDMAStatus and m_InputDMAStatus variables shouldn't need to be modified.  
				The logic surrounding these drivers is simply used to determine which buffer (A or B) needs
				processing.

-*/

#include "wavemain.h"
#include <s3c2440x.h>
#include "s3c2440x_dmatransfer.h"
#include "I2S.h"
#include "hwctxt.h"
#include <ceddk.h>

#define DMA_CH_MIC 2
#define DMA_CH_OUT 1

#define L3M (0x04)	// TOUT2
#define L3C (0x10)	// TCLK0
#define L3D (0x08)	// TOUT3

// UDA1341 Register definitions
// The codec has three "addressing modes", which could also be thought of as registers
#define UDA1341_ADDR_DATA0  0x14    // 00010100 | 00  (ID | data0)
#define UDA1341_ADDR_DATA1  0x15    // 00010100 | 01  (ID | data1)
#define UDA1341_ADDR_STATUS	0x16    // 00010100 | 10  (ID | status)

// Status register bits
// Think of the status register as two separate 7-bit register (StatusA and StatusB)
// with bit 7 selecting between the two.

#define UDA1341_STATUS_A            0x00
#define UDA1341_STATUS_B            0x80
#define UDA1341_STATUS_DCFILTER     0x01 // bit 0: DC Filter on
#define UDA1341_STATUS_FMTIIS       0x00 // bit 1-3: format status
#define UDA1341_STATUS_FMT_LSB16    0x02
#define UDA1341_STATUS_FMT_LSB18    0x04
#define UDA1341_STATUS_FMT_LSB20    0x06
#define UDA1341_STATUS_FMT_MSB      0x08
#define UDA1341_STATUS_FMT_MSB16    0x0A
#define UDA1341_STATUS_FMT_MSB18    0x0C
#define UDA1341_STATUS_FMT_MSB20    0x0E
#define UDA1341_STATUS_CLK512       0x00 // bits 4,5: system clock
#define UDA1341_STATUS_CLK384       0x10 // 
#define UDA1341_STATUS_CLK256       0x20 // 
#define UDA1341_STATUS_RESET        0x40 // bit 6: reset

#define UDA1341_STATUS_PWR_DAC      0x01 // bit 0: DAC power on
#define UDA1341_STATUS_PWR_ADC      0x02 // bit 1: ADC power on
#define UDA1341_STATUS_IGS          0x20 // bit 5: IGS - ADC 6dB Boost
#define UDA1341_STATUS_OGS          0x40 // bit 6: OGS - DAC 6dB Boost


int rec_mode=0;
//-------------------------------- Global Variables --------------------------------------
volatile S3C2440X_IISBUS_REG *g_pIISregs		= NULL;		// I2S control registers
volatile S3C2440X_IOPORT_REG *g_pIOPregs		= NULL;		// GPIO registers (needed to enable I2S and SPI)
volatile S3C2440X_SPI_REG    *g_pSPIregs        = NULL;		// SPI control registers

volatile S3C2440X_DMA_REG    *g_pDMAregs		= NULL;		// DMA registers (needed for I/O on I2S bus)
volatile S3C2440X_CLKPWR_REG *g_pCLKPWRreg	= NULL;		// Clock power registers (needed to enable I2S and SPI clocks)
volatile S3C2440X_INTR_REG *s2440INT 		= NULL;
				
HardwareContext *g_pHWContext		= NULL;

PHYSICAL_ADDRESS g_PhysDMABufferAddr;

//----------------------------------------------------------------------------------------

#ifdef DEBUG
DBGPARAM dpCurSettings = {
    TEXT("WaveDriver"), {
		 TEXT("Test")           //  0   ZONE_TEST
		,TEXT("Params")         //  1   ZONE_PARAMS     
		,TEXT("Verbose")        //  2   ZONE_VERBOSE    
		,TEXT("Interrupt")      //  3   ZONE_INTERRUPT  
		,TEXT("WODM")           //  4   ZONE_WODM       
		,TEXT("WIDM")           //  5   ZONE_WIDM       
		,TEXT("PDD")            //  6   ZONE_PDD        
		,TEXT("MDD")            //  7   ZONE_MDD        
		,TEXT("Regs")           //  8   ZONE_REGS       
		,TEXT("Misc")           //  9   ZONE_MISC       
		,TEXT("Init")           // 10   ZONE_INIT       
		,TEXT("IOcontrol")      // 11   ZONE_IOCTL      
		,TEXT("Alloc")          // 12   ZONE_ALLOC      
		,TEXT("Function")       // 13   ZONE_FUNCTION   
		,TEXT("Warning")        // 14   ZONE_WARN       
		,TEXT("Error")          // 15   ZONE_ERROR      
	},
        (1 << 15)   // Errors
    |   (1 << 14)   // Warnings
}; 
#endif

void WriteL3Addr(unsigned char data)
{	
    int i,j;

    g_pIOPregs->GPBDAT &= ~(L3D|L3M|L3C);		//L3D=L/L3M=L(in address mode)/L3C=L
    g_pIOPregs->GPBDAT |= L3C;	                //L3C=H

    for(j=0;j<10;j++);		                    //tsu(L3) > 190ns
    
    //PD[8:6]=L3D:L3C:L3M
    for(i=0;i<8;i++)	                        //LSB first
    {
	if(data&0x1)	                            //if data's LSB is 'H'
	{
	    g_pIOPregs->GPBDAT &= ~L3C;	            //L3C=L
	    g_pIOPregs->GPBDAT |= L3D;	            //L3D=H		    
	    for(j=0;j<10;j++);	                    //tcy(L3) > 500ns
	    g_pIOPregs->GPBDAT |= L3C;	            //L3C=H
	    g_pIOPregs->GPBDAT |= L3D;	            //L3D=H
	    for(j=0;j<10;j++);	                    //tcy(L3) > 500ns
	}
	else		                                //if data's LSB is 'L'
	{
	    g_pIOPregs->GPBDAT &= ~L3C;	            //L3C=L
	    g_pIOPregs->GPBDAT &= ~L3D;	            //L3D=L
	    for(j=0;j<10;j++);	                    //tcy(L3) > 500ns
	    g_pIOPregs->GPBDAT |= L3C;	            //L3C=H
	    g_pIOPregs->GPBDAT &= ~L3D;	            //L3D=L
	    for(j=0;j<10;j++);	                    //tcy(L3) > 500ns
	}
	data >>=1;
    }
    g_pIOPregs->GPBDAT|=L3C|L3M;	            //L3M=H,L3C=H
}


void WriteL3Data(unsigned char data,int halt)
{
    int i,j;

    if(halt)
    {
        g_pIOPregs->GPBDAT|=L3C;	            //L3C=H(while tstp, L3 interface halt condition)
        for(j=0;j<10;j++);                       //tstp(L3) > 190ns
    }

    g_pIOPregs->GPBDAT|=L3C|L3M;	            //L3M=H(in data transfer mode)	
    for(j=0;j<10;j++);	                        //tsu(L3)D > 190ns

    //PD[8:6]=L3D:L3C:L3M
    for(i=0;i<8;i++)
    {
        if(data&0x1)	                        //if data's LSB is 'H'
        {
	    g_pIOPregs->GPBDAT &= ~L3C;	            //L3C=L
            g_pIOPregs->GPBDAT |= L3D;	        //L3D=H
            for(j=0;j<10;j++);	                //tcy(L3) > 500ns
            g_pIOPregs->GPBDAT |= (L3C|L3D);    //L3C=H,L3D=H
            for(j=0;j<10;j++);	                //tcy(L3) > 500ns
        }
        else		//if data's LSB is 'L'
        {
	    g_pIOPregs->GPBDAT &= ~L3C;	            //L3C=L
	    g_pIOPregs->GPBDAT &= ~L3D;	            //L3D=L
            for(j=0;j<10;j++);	                //tcy(L3) > 500ns
            g_pIOPregs->GPBDAT |= L3C;	        //L3C=H
	    g_pIOPregs->GPBDAT &= ~L3D;	            //L3D=L
            for(j=0;j<10;j++);	                //tcy(L3) > 500ns
        }
        data>>=1;	//for check next bit
    }
    
    g_pIOPregs->GPBDAT|=L3C|L3M;	            //L3M=H,L3C=H
}

BOOL HardwareContext::CreateHWContext(DWORD Index)
{
    if (g_pHWContext)
    {
        return(TRUE);
    }

    g_pHWContext = new HardwareContext;
    if (!g_pHWContext)
    {
        return(FALSE);
    }

    return(g_pHWContext->Init(Index));
}

HardwareContext::HardwareContext()
: m_InputDeviceContext(), m_OutputDeviceContext()
{
    InitializeCriticalSection(&m_Lock);
    m_Initialized=FALSE;
}

HardwareContext::~HardwareContext()
{
    DeleteCriticalSection(&m_Lock);
}

BOOL HardwareContext::Init(DWORD Index)
{
    UINT32 Irq;

	m_dwInputGain = 0xFFFF;
	m_dwOutputGain = 0xFFFF;
    m_fInputMute = FALSE;
    m_fOutputMute = FALSE;


    if (m_Initialized)
    {
        return(FALSE);
    }

    // Call the OAL to translate the audio IRQ into a SYSINTR value.
    //
    Irq = IRQ_DMA2;  // audio output DMA interrupt.
    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &Irq, sizeof(UINT32), &m_dwSysintrOutput, sizeof(UINT32), NULL))
    {
        RETAILMSG(TRUE, (TEXT("ERROR: HardwareContext::Init: Failed to obtain sysintr value for output interrupt.\r\n")));
        return FALSE;
    }

    Irq = IRQ_DMA1;  // audio input DMA interrupt.
    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &Irq, sizeof(UINT32), &m_dwSysintrInput, sizeof(UINT32), NULL))
    {
        RETAILMSG(TRUE, (TEXT("ERROR: HardwareContext::Init: Failed to obtain sysintr value for input interrupt.\r\n")));
        return FALSE;
    }

	//----- 1. Initialize the state/status variables -----
    m_DriverIndex		= Index;
    m_InPowerHandler    = FALSE;
    m_InputDMARunning   = FALSE;
    m_OutputDMARunning  = FALSE;
	m_InputDMAStatus	= DMA_CLEAR;				
	m_OutputDMAStatus	= DMA_CLEAR;				

    //----- 2. Map the necessary descriptory channel and control registers into the driver's virtual address space -----
	if(!MapRegisters())
	{
		DEBUGMSG(ZONE_ERROR, (TEXT("WAVEDEV.DLL:HardwareContext::Init() - Failed to map config registers.\r\n")));
        goto Exit;
	}

    //----- 3. Map the DMA buffers into driver's virtual address space -----
    if(!MapDMABuffers())
    {
		DEBUGMSG(ZONE_ERROR, (TEXT("WAVEDEV.DLL:HardwareContext::Init() - Failed to map DMA buffers.\r\n")));
        goto Exit;
    }

    //----- 4. Configure the Codec -----
    InitCodec();
    
	//----- 5. Initialize the interrupt thread -----
    if (!InitInterruptThread())
    {
		DEBUGMSG(ZONE_ERROR, (TEXT("WAVEDEV.DLL:HardwareContext::Init() - Failed to initialize interrupt thread.\r\n")));
        goto Exit;
    }
    m_Initialized=TRUE;

Exit:
    return(m_Initialized);
}


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function:		MapRegisters()

Description:	Maps the config registers used by both the SPI and
				I2S controllers.

Notes:			The SPI and I2S controllers both use the GPIO config
				registers, so these MUST be initialized FIRST.

Returns:		Boolean indicating success
-------------------------------------------------------------------*/
BOOL HardwareContext::MapRegisters()
{

	// IIS registers.
	//
    g_pIISregs = (volatile S3C2440X_IISBUS_REG*)VirtualAlloc(0, sizeof(S3C2440X_IISBUS_REG), MEM_RESERVE, PAGE_NOACCESS);
	if (!g_pIISregs)
	{
		DEBUGMSG(1, (TEXT("IISreg: VirtualAlloc failed!\r\n")));
		return(FALSE);
	}
	if (!VirtualCopy((PVOID)g_pIISregs, (PVOID)(S3C2440X_BASE_REG_PA_IISBUS >> 8), sizeof(S3C2440X_IISBUS_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
	{
		DEBUGMSG(1, (TEXT("IISreg: VirtualCopy failed!\r\n")));
		return(FALSE);
	}

	// SPI registers.
	//
    g_pSPIregs = (volatile S3C2440X_SPI_REG*)VirtualAlloc(0, sizeof(S3C2440X_SPI_REG), MEM_RESERVE, PAGE_NOACCESS);
	if (!g_pSPIregs)
	{
		DEBUGMSG(1, (TEXT("SPIreg: VirtualAlloc failed!\r\n")));
		return(FALSE);
	}
	if (!VirtualCopy((PVOID)g_pSPIregs, (PVOID)(S3C2440X_BASE_REG_PA_SPI >> 8), sizeof(S3C2440X_SPI_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
	{
		DEBUGMSG(1, (TEXT("SPIreg: VirtualCopy failed!\r\n")));
		return(FALSE);
	}

	g_pIOPregs = (volatile S3C2440X_IOPORT_REG*)VirtualAlloc(0, sizeof(S3C2440X_IOPORT_REG), MEM_RESERVE, PAGE_NOACCESS);
	if (!g_pIOPregs)
	{
		DEBUGMSG(1, (TEXT("IOPreg: VirtualAlloc failed!\r\n")));
		return(FALSE);
	}
	if (!VirtualCopy((PVOID)g_pIOPregs, (PVOID)(S3C2440X_BASE_REG_PA_IOPORT >> 8), sizeof(S3C2440X_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
	{
		DEBUGMSG(1, (TEXT("IOPreg: VirtualCopy failed!\r\n")));
		return(FALSE);
	}

	g_pDMAregs = (volatile S3C2440X_DMA_REG*)VirtualAlloc(0, sizeof(S3C2440X_DMA_REG), MEM_RESERVE, PAGE_NOACCESS);
	if (!g_pDMAregs)
	{
		DEBUGMSG(1, (TEXT("DMAreg: VirtualAlloc failed!\r\n")));
		return(FALSE);
	}
	if (!VirtualCopy((PVOID)g_pDMAregs, (PVOID)(S3C2440X_BASE_REG_PA_DMA >> 8), sizeof(S3C2440X_DMA_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
	{
		DEBUGMSG(1, (TEXT("DMAreg: VirtualCopy failed!\r\n")));
		return(FALSE);
	}

	s2440INT = (volatile S3C2440X_INTR_REG*)VirtualAlloc(0, sizeof(S3C2440X_INTR_REG), MEM_RESERVE, PAGE_NOACCESS);
	if (!s2440INT)
	{
		DEBUGMSG(1, (TEXT("INTreg: VirtualAlloc failed!\r\n")));
		return(FALSE);
	}
	if (!VirtualCopy((PVOID)s2440INT, (PVOID)(S3C2440X_BASE_REG_PA_INTR >> 8), sizeof(S3C2440X_INTR_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
	{
		DEBUGMSG(1, (TEXT("INTreg: VirtualCopy failed!\r\n")));
		return(FALSE);
	}

	g_pCLKPWRreg = (volatile S3C2440X_CLKPWR_REG*)VirtualAlloc(0, sizeof(S3C2440X_CLKPWR_REG), MEM_RESERVE, PAGE_NOACCESS);
	if (!g_pCLKPWRreg)
	{
		DEBUGMSG(1, (TEXT("DMAreg: VirtualAlloc failed!\r\n")));
		return(FALSE);
	}
	if (!VirtualCopy((PVOID)g_pCLKPWRreg, (PVOID)(S3C2440X_BASE_REG_PA_CLOCK_POWER >> 8), sizeof(S3C2440X_CLKPWR_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
	{
		DEBUGMSG(1, (TEXT("DMAreg: VirtualCopy failed!\r\n")));
		return(FALSE);
	}
   
    PowerUp();

	return(TRUE);
}


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function:		Deinit()

Description:	Deinitializest the hardware: disables DMA channel(s), 
				clears any pending interrupts, powers down the audio
				codec chip, etc.

Returns:		Boolean indicating success
-------------------------------------------------------------------*/
BOOL HardwareContext::Deinit()
{
	//----- 1. Disable the input/output channels -----
//	AUDIO_IN_DMA_DISABLE();
	AUDIO_OUT_DMA_DISABLE();

	//----- 2. Disable/clear DMA input/output interrupts -----
	AUDIO_IN_CLEAR_INTERRUPTS();
	AUDIO_OUT_CLEAR_INTERRUPTS();

	//----- 3. Turn the audio hardware off -----
    AudioMute(DMA_CH_OUT | DMA_CH_MIC, TRUE);

    //----- 4. Unmap the control registers and DMA buffers -----
    UnmapRegisters();
	UnmapDMABuffers();

    return TRUE;
}


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function:		UnmapRegisters()

Description:	Unmaps the config registers used by both the SPI and
				I2S controllers.

Notes:			The SPI and I2S controllers both use the GPIO config
				registers, so these MUST be deinitialized LAST.

Returns:		Boolean indicating success
-------------------------------------------------------------------*/
BOOL HardwareContext::UnmapRegisters()
{
	return TRUE;
}


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function:		MapDMABuffers()

Description:	Maps the DMA buffers used for audio input/output
				on the I2S bus.

Returns:		Boolean indicating success
-------------------------------------------------------------------*/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品国久久99热| 亚洲国产精品二十页| 久久精品国产精品亚洲综合| 91豆麻精品91久久久久久| 亚洲v日本v欧美v久久精品| 久久蜜桃一区二区| av不卡在线播放| 日本 国产 欧美色综合| 国产精品五月天| 欧美日韩成人在线一区| 亚洲国产精品一区二区www| 日韩一区二区在线观看| 国产精品99久久久久久久vr| 亚洲另类在线视频| 国产欧美一区二区精品婷婷| 日韩午夜精品视频| 欧美色老头old∨ideo| 成年人午夜久久久| 国产美女在线观看一区| 日本不卡一区二区| 亚洲综合999| 亚洲视频在线一区二区| 国产日韩欧美不卡| 精品国产乱码久久久久久老虎| 欧美美女喷水视频| 欧美色爱综合网| 在线观看av不卡| 色婷婷亚洲综合| 97久久精品人人爽人人爽蜜臀| 国产成人鲁色资源国产91色综| 麻豆一区二区在线| 免费高清不卡av| 婷婷综合久久一区二区三区| 亚洲国产wwwccc36天堂| 亚洲永久精品国产| 亚洲国产精品一区二区久久恐怖片| 亚洲免费观看高清完整版在线| 中文字幕一区二区在线观看| 日本一区二区三级电影在线观看| 国产亚洲一本大道中文在线| 久久亚洲二区三区| 欧美激情一区三区| 国产精品嫩草影院av蜜臀| 国产精品欧美久久久久一区二区| 国产人妖乱国产精品人妖| 久久久久久久久久久黄色| 久久久久久毛片| 国产目拍亚洲精品99久久精品| 国产精品嫩草影院com| 亚洲少妇最新在线视频| 一区二区成人在线| 日本少妇一区二区| 国产精品一二三四五| 成人18视频日本| 91传媒视频在线播放| 欧美高清视频www夜色资源网| 日韩欧美一级精品久久| 久久色中文字幕| 国产精品天干天干在观线| 亚洲美女在线一区| 亚洲123区在线观看| 黄一区二区三区| av中文字幕在线不卡| 91行情网站电视在线观看高清版| 欧美精品高清视频| 日韩精品一区二| 欧美国产日产图区| 亚洲香肠在线观看| 国产在线精品一区二区三区不卡 | 成人精品国产免费网站| 91玉足脚交白嫩脚丫在线播放| 欧美性生活一区| 日韩欧美国产高清| 1000部国产精品成人观看| 亚洲影院久久精品| 久久99精品国产麻豆婷婷洗澡| 成人一区二区三区| 欧美日韩亚洲综合一区二区三区| 欧美草草影院在线视频| 国产精品美女久久福利网站| 亚洲地区一二三色| 国产美女一区二区三区| 欧美综合一区二区三区| 久久色在线视频| 亚洲午夜三级在线| 国产精品一二三四| 欧美电影一区二区| 中文字幕免费在线观看视频一区| 性做久久久久久久久| 国产成人精品一区二区三区四区| 欧美日韩国产小视频在线观看| 337p粉嫩大胆噜噜噜噜噜91av| 亚洲激情一二三区| 国产精品18久久久| 777奇米四色成人影色区| 欧美激情一区二区三区不卡| 秋霞av亚洲一区二区三| 91在线播放网址| 国产午夜久久久久| 日韩国产一二三区| 色婷婷精品久久二区二区蜜臀av | 亚洲精品国产一区二区精华液 | 在线观看成人小视频| 久久久天堂av| 日韩精品一二三四| 91视频一区二区三区| 精品成人a区在线观看| 亚洲一区二区视频在线| 国产成人精品一区二| 日韩久久免费av| 亚洲午夜电影在线| 成+人+亚洲+综合天堂| 精品国一区二区三区| 午夜不卡av在线| 色婷婷av一区二区三区之一色屋| 久久久久久99久久久精品网站| 视频一区二区三区中文字幕| 91麻豆精品视频| 国产精品免费aⅴ片在线观看| 韩国欧美国产一区| 精品国产一区久久| 日本不卡中文字幕| 欧美一区二区女人| 天堂久久久久va久久久久| 欧美羞羞免费网站| 亚洲精品乱码久久久久久| 成人黄色小视频在线观看| 国产婷婷色一区二区三区四区| 久久精品国产久精国产爱| 日韩欧美精品在线视频| 日韩av在线发布| 日韩一区二区在线看片| 日韩专区在线视频| 欧美二区在线观看| 午夜成人免费视频| 678五月天丁香亚洲综合网| 亚洲国产精品久久不卡毛片 | 日本二三区不卡| 亚洲视频小说图片| 91免费视频观看| 一区二区三区精品久久久| 一本大道久久a久久综合婷婷| 亚洲精品少妇30p| 欧美午夜在线观看| 日本成人超碰在线观看| 亚洲精品在线网站| 国产成人综合在线观看| 国产精品女主播在线观看| av亚洲精华国产精华精华| 亚洲男人的天堂在线观看| 欧美日韩一区二区三区不卡 | 国产ts人妖一区二区| 国产精品久久久久久久久搜平片 | 国产校园另类小说区| 懂色av一区二区三区免费看| 亚洲欧洲www| 欧洲一区二区三区在线| 美女视频一区在线观看| 国产亚洲女人久久久久毛片| 国产aⅴ精品一区二区三区色成熟| 中文字幕精品一区二区精品绿巨人 | 亚洲va韩国va欧美va精品| 91精品国产色综合久久不卡蜜臀| 久久精工是国产品牌吗| 久久精品人人做| 91女厕偷拍女厕偷拍高清| 婷婷久久综合九色国产成人| 精品国产乱码久久久久久久| 国产成人av资源| 亚洲精品ww久久久久久p站| 欧美精品乱码久久久久久| 国产另类ts人妖一区二区| 一区二区三区在线观看欧美 | 国产欧美日本一区视频| 欧美专区亚洲专区| 麻豆精品视频在线| 国产精品久久久久久亚洲毛片| 欧美日韩免费视频| 国产精品99久久久久久有的能看| 一区二区高清在线| 国产亚洲一本大道中文在线| 欧美午夜电影一区| 国产二区国产一区在线观看| 夜夜嗨av一区二区三区网页| 久久久蜜臀国产一区二区| 色噜噜狠狠色综合欧洲selulu| 久久99精品国产麻豆不卡| 亚洲免费视频成人| 国产日产精品1区| 欧美一区二区三区在线观看视频 | 亚洲国产精品一区二区久久恐怖片 | 亚洲国产婷婷综合在线精品| 久久精品人人做| 在线观看91av| 色吧成人激情小说| 岛国一区二区三区| 毛片av中文字幕一区二区| 伊人婷婷欧美激情| 日本一区二区视频在线观看| 欧美一区二区三区免费在线看 |