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

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

?? usb.c

?? 嵌入式LINUX9系統應用開發詳解中USB編程實例
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*********************************************************************
 *
 * Copyright:
 *	MOTOROLA, INC. All Rights Reserved.  
 *  You are hereby granted a copyright license to use, modify, and
 *  distribute the SOFTWARE so long as this entire notice is
 *  retained without alteration in any modified and/or redistributed
 *  versions, and that such modified versions are clearly identified
 *  as such. No licenses are granted by implication, estoppel or
 *  otherwise under any patents or trademarks of Motorola, Inc. This 
 *  software is provided on an "AS IS" basis and without warranty.
 *
 *  To the maximum extent permitted by applicable law, MOTOROLA 
 *  DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING 
 *  IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
 *  PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE 
 *  SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY 
 *  ACCOMPANYING WRITTEN MATERIALS.
 * 
 *  To the maximum extent permitted by applicable law, IN NO EVENT
 *  SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING 
 *  WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS 
 *  INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
 *  LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.   
 * 
 *  Motorola assumes no responsibility for the maintenance and support
 *  of this software
 ********************************************************************/

/*
 * File:		usb.c
 * Purpose:		Device Driver for the USB module of the MCF5272
 */

#include "mcf5272.h"
#include "init.h"

/********************************************************************/

/* Global Endpoint Status Structures */
USB_EP_STATE ep[NUM_ENDPOINTS];

/* Global Remote Wakeup Flag */
volatile int fRemoteWakeup = 0;

/* Global USB Descriptor Data (application specific) */
extern USB_DEVICE_DESC Descriptors;

/********************************************************************/
void 
usb_init(void)
{
	uint32 i, DescSize;
	uint32 *pConfigRam;
	uint32 *pDevDesc;
	MCF5272_IMM *imm = mcf5272_get_immp();

	/* Initialize Descriptor pointers and variables */
	pConfigRam = (uint32 *)((uint32)imm + MCF5272_USB_CFG_RAM);
	pDevDesc = (uint32 *)usb_get_desc(-1, -1, -1, -1);
	DescSize = usb_get_desc_size() + 3;

	/* Initialize Endpoint status structures */
	ep[0].ttype = CONTROL;
	ep[0].packet_size = ((USB_DEVICE_DESC *)pDevDesc)->bMaxPacketSize0;
	ep[0].fifo_length = (uint16)(ep[0].packet_size * FIFO_DEPTH);
	ep[0].buffer.start = 0;
	ep[0].buffer.free = 0;

	/* Set the EP0 IN-BUSY bit -- This is only required on
	   pre-2K75N masks. This bit is set by HW beginning with
	   the 2K75N silicon. */
	MCF5272_WR_USB_EP0CTL(imm, MCF5272_RD_USB_EP0CTL(imm) 
		| MCF5272_USB_EP0CTL_IN_BUSY);
	
	for (i = 1; i < NUM_ENDPOINTS; i++)
		ep[i].ttype = DISABLED;

	/* Invalidate Configuration RAM and disable Endpoint 0 */
	MCF5272_WR_USB_EP0CTL(imm, 0);

	/* Load the Configuration RAM with the descriptors */
	for (i = 0; i < (DescSize/4); i++)
		pConfigRam[i] = pDevDesc[i];

	/* Initialize FIFOs */
	usb_fifo_init();

	/* Initialize the Interrupts */
	usb_isr_init();

	/* Enable USB controller, Config RAM, EXT AFE */
#if (DEBUG)
	MCF5272_WR_USB_EP0CTL(imm, 0
		| MCF5272_USB_EP0CTL_DEBUG
	/*	| MCF5272_USB_EP0CTL_AFE_EN	*/
		| MCF5272_USB_EP0CTL_USB_EN
		| MCF5272_USB_EP0CTL_CFG_RAM_VAL);
#else
	MCF5272_WR_USB_EP0CTL(imm, 0
	/*	| MCF5272_USB_EP0CTL_AFE_EN	*/
		| MCF5272_USB_EP0CTL_USB_EN
		| MCF5272_USB_EP0CTL_CFG_RAM_VAL);
#endif
	
	/* Enable desired interrupts on EP0 */
	MCF5272_WR_USB_EP0IMR(imm, 0
		| MCF5272_USB_EP0IMR_DEV_CFG_EN
		| MCF5272_USB_EP0IMR_VEND_REQ_EN
		| MCF5272_USB_EP0IMR_WAKE_CHG_EN
		| MCF5272_USB_EP0IMR_RESUME_EN
		| MCF5272_USB_EP0IMR_SUSPEND_EN
		| MCF5272_USB_EP0IMR_RESET_EN
		| MCF5272_USB_EP0IMR_OUT_EOT_EN
		| MCF5272_USB_EP0IMR_OUT_EOP_EN
		| MCF5272_USB_EP0IMR_IN_EOT_EN
		| MCF5272_USB_EP0IMR_IN_EOP_EN
		| MCF5272_USB_EP0IMR_UNHALT_EN
		| MCF5272_USB_EP0IMR_HALT_EN);
}

/********************************************************************/
void 
usb_isr_init(void)
{
	MCF5272_IMM *imm = mcf5272_get_immp();

	/* Clear any pending interrupts in all Endpoints */
	MCF5272_WR_USB_EP0ISR(imm, 0x0001FFFF);
	MCF5272_WR_USB_EP1ISR(imm, 0x001F);
	MCF5272_WR_USB_EP2ISR(imm, 0x001F);
	MCF5272_WR_USB_EP3ISR(imm, 0x001F);
	MCF5272_WR_USB_EP4ISR(imm, 0x001F);
	MCF5272_WR_USB_EP5ISR(imm, 0x001F);
	MCF5272_WR_USB_EP6ISR(imm, 0x001F);
	MCF5272_WR_USB_EP7ISR(imm, 0x001F);

	/* Enable all interrupts on all Endpoints */
	/* These will be altered on configuration/interface changes */
	MCF5272_WR_USB_EP0IMR(imm, 0x0001FFFF);
	MCF5272_WR_USB_EP1IMR(imm, 0x001F);
	MCF5272_WR_USB_EP2IMR(imm, 0x001F);
	MCF5272_WR_USB_EP3IMR(imm, 0x001F);
	MCF5272_WR_USB_EP4IMR(imm, 0x001F);
	MCF5272_WR_USB_EP5IMR(imm, 0x001F);
	MCF5272_WR_USB_EP6IMR(imm, 0x001F);
	MCF5272_WR_USB_EP7IMR(imm, 0x001F);

	/* Initialize Interrupt Control Registers */
	MCF5272_WR_SIM_ICR2(imm, 0
		| (0x00008888)
		| (USB_EP0_LEVEL << 12) 
		| (USB_EP1_LEVEL << 8) 
		| (USB_EP2_LEVEL << 4) 
		| (USB_EP3_LEVEL << 0));
	MCF5272_WR_SIM_ICR3(imm, 0
		| (0x88880000)
		| (USB_EP4_LEVEL << 28) 
		| (USB_EP5_LEVEL << 24) 
		| (USB_EP6_LEVEL << 20) 
		| (USB_EP7_LEVEL << 16));
}

/********************************************************************/
void 
usb_endpoint0_isr(void)
{
	MCF5272_IMM *imm = mcf5272_get_immp();
	uint32 event;

	event = MCF5272_RD_USB_EP0ISR(imm) & MCF5272_RD_USB_EP0IMR(imm);

	if (event & MCF5272_USB_EP0ISR_DEV_CFG)
	{
		usb_devcfg_service();
		/* Clear this interrupt bit */
		MCF5272_WR_USB_EP0ISR(imm, MCF5272_USB_EP0ISR_DEV_CFG);
	}
	if (event & MCF5272_USB_EP0ISR_VEND_REQ)
	{
		/* Is this a GET_DESCRIPTOR(String) request? */
		if ((MCF5272_RD_USB_DRR1(imm) & 0xFF00 >> 8) == GET_DESCRIPTOR)
		{
			/* To do: Return STRING Descriptor if it exists */
			printf("Host requested the String Descriptor\n");
			while (1) ;
		}
		/* Clear this interrupt bit */
		MCF5272_WR_USB_EP0ISR(imm, MCF5272_USB_EP0ISR_VEND_REQ);
		usb_vendreq_service(
			(uint8)(MCF5272_RD_USB_DRR1(imm) & 0xFF),
			(uint8)(MCF5272_RD_USB_DRR1(imm) >> 8),
			(uint16)(MCF5272_RD_USB_DRR1(imm) >> 16),
			(uint16)(MCF5272_RD_USB_DRR2(imm) & 0xFFFF),
			(uint16)(MCF5272_RD_USB_DRR2(imm) >> 16));
	}
	if (event & MCF5272_USB_EP0ISR_FRM_MAT)
	{
		/* Clear this interrupt bit */
		MCF5272_WR_USB_EP0ISR(imm, MCF5272_USB_EP0ISR_FRM_MAT);
	}
	if (event & MCF5272_USB_EP0ISR_ASOF)
	{
		/* Clear this interrupt bit */
		MCF5272_WR_USB_EP0ISR(imm, MCF5272_USB_EP0ISR_ASOF);
	}
	if (event & MCF5272_USB_EP0ISR_SOF)
	{
		/* Clear this interrupt bit */
		MCF5272_WR_USB_EP0ISR(imm, MCF5272_USB_EP0ISR_SOF);
	}
	if (event & MCF5272_USB_EP0ISR_WAKE_CHG)
	{
        if (MCF5272_RD_USB_EP0SR(imm) & MCF5272_USB_EP0SR_WAKE_ST)
        {
            /* Enable Wake-on-Ring */
            MCF5272_WR_USB_EP0CTL(imm,
                  MCF5272_RD_USB_EP0CTL(imm)
                | MCF5272_USB_EP0CTL_WOR_EN);
            /* Wake-on-Ring function is invoked when /INT1 pin is 0 */
            MCF5272_WR_USB_EP0CTL(imm,
                  MCF5272_RD_USB_EP0CTL(imm)
                & ~MCF5272_USB_EP0CTL_WOR_LVL);
 		    #if (DEBUG)
			    printf("Wake-on-Ring enabled.\n");
		    #endif
        }
        else
        {
			/* Disable Wake-on-Ring */
			MCF5272_WR_USB_EP0CTL(imm,
				   MCF5272_RD_USB_EP0CTL(imm)
				& ~MCF5272_USB_EP0CTL_WOR_EN);
			#if (DEBUG)
				printf("Wake-on-Ring disabled.\n");
			#endif
        }
        /* Clear this interrupt bit */
		MCF5272_WR_USB_EP0ISR(imm, MCF5272_USB_EP0ISR_WAKE_CHG);
	}
	if (event & MCF5272_USB_EP0ISR_RESUME)
	{
        usb_bus_state_chg_service(RESUME);
		/* Clear this interrupt bit */
		MCF5272_WR_USB_EP0ISR(imm, MCF5272_USB_EP0ISR_RESUME);
	}
	if (event & MCF5272_USB_EP0ISR_SUSPEND)
	{
        if (MCF5272_RD_USB_EP0SR(imm) & MCF5272_USB_EP0SR_WAKE_ST)
            usb_bus_state_chg_service(SUSPEND | ENABLE_WAKEUP);
        else
            usb_bus_state_chg_service(SUSPEND);
		/* Clear this interrupt bit */
		MCF5272_WR_USB_EP0ISR(imm, MCF5272_USB_EP0ISR_SUSPEND);
	}
	if (event & MCF5272_USB_EP0ISR_RESET)
	{
        usb_bus_state_chg_service(RESET);
		/* Clear this interrupt bit */
		MCF5272_WR_USB_EP0ISR(imm, MCF5272_USB_EP0ISR_RESET);
	}
	if (event & ( MCF5272_USB_EP0ISR_OUT_EOT
				| MCF5272_USB_EP0ISR_OUT_EOP
				| MCF5272_USB_EP0ISR_OUT_LVL))
	{
		usb_out_service(0, event);
	}
	if (event & ( MCF5272_USB_EP0ISR_IN_EOT
				| MCF5272_USB_EP0ISR_IN_EOP
				| MCF5272_USB_EP0ISR_IN_LVL))
	{
		usb_in_service(0, event);
	}
	if (event & MCF5272_USB_EP0ISR_UNHALT)
	{
		#if (DEBUG)
			printf("Endpoint 0 has been UNHALTed\n");
		#endif
		/* Clear this interrupt bit */
		MCF5272_WR_USB_EP0ISR(imm, MCF5272_USB_EP0ISR_UNHALT);
	}
	if (event & MCF5272_USB_EP0ISR_HALT)
	{
		#if (DEBUG)
			printf("Endpoint 0 has been HALTed\n");
		#endif
		/* Clear this interrupt bit */
		MCF5272_WR_USB_EP0ISR(imm, MCF5272_USB_EP0ISR_HALT);
	}

}

/********************************************************************/
void 
usb_endpoint_isr(uint32 epnum)
{
	int event;
	MCF5272_IMM *imm = mcf5272_get_immp();

	#if (DEBUG)
		printf("Received interrupt for Endpoint %d\n",epnum);
	#endif

	event = MCF5272_RD_USB_EPISR(imm, epnum) 
		  & MCF5272_RD_USB_EPIMR(imm, epnum);

	if (event & ( MCF5272_USB_EPNISR_EOT	
				| MCF5272_USB_EPNISR_EOP
				| MCF5272_USB_EPNISR_FIFO_LVL))
	{
		/* IN Endpoint */
		if (MCF5272_RD_USB_EPISR(imm, epnum) & MCF5272_USB_EPNISR_DIR)
			usb_in_service(epnum, event);
		/* OUT Endpoint */
		else
			usb_out_service(epnum,event);
	}
	if (event & MCF5272_USB_EPNISR_HALT)
	{
		/* Call Project specific routine */
		usb_ep_halt(epnum);
		MCF5272_WR_USB_EPISR(imm, epnum, MCF5272_USB_EPNISR_HALT);
	}
	if (event & MCF5272_USB_EPNISR_UNHALT)
	{
		/* Call Project specific routine */
		usb_ep_unhalt(epnum);
		MCF5272_WR_USB_EPISR(imm, epnum, MCF5272_USB_EPNISR_UNHALT);
	}

}

/********************************************************************/
void 
usb_in_service(uint32 epnum, uint32 event)
{
	MCF5272_IMM *imm = mcf5272_get_immp();
	uint16 i;
	uint32 free_space;

	#if (DEBUG)
		if (event & MCF5272_USB_EP0ISR_IN_EOT)
			printf("Received IN_EOT for EP #%d\n",epnum);
		if (event & MCF5272_USB_EP0ISR_IN_EOP)
			printf("Received IN_EOP for EP #%d\n",epnum);
		if (event & MCF5272_USB_EP0ISR_IN_LVL)
			printf("Received IN_LVL for EP #%d\n",epnum);
	#endif

	/* Clear the FIFO Level interrupt now */
	if (event & MCF5272_USB_EPNISR_FIFO_LVL)
		MCF5272_WR_USB_EPISR(imm, epnum, MCF5272_USB_EPNISR_FIFO_LVL);

	if (event & (MCF5272_USB_EPNISR_EOP | MCF5272_USB_EPNISR_FIFO_LVL))
	{	
		/* Clear this interrupt bit */
		MCF5272_WR_USB_EPISR(imm, epnum, MCF5272_USB_EPNISR_EOP);

		if (ep[epnum].buffer.position < ep[epnum].buffer.length)
		{
			/* USBEPDP0 only monitors the OUT FIFO */
			if (epnum == 0)
				free_space = ep[0].packet_size;
			else
				free_space = (uint16)(ep[epnum].fifo_length \
								- MCF5272_RD_USB_EPDPR(imm, epnum));
	
			for (i = ep[epnum].buffer.position; \
				 i < ep[epnum].buffer.position + free_space; )
			{
				/* Write from the buffer to the FIFO */
				if ((((ep[epnum].buffer.position + free_space) - i) > 3) 
					&& ((i + 4) < ep[epnum].buffer.length))
				{
					MCF5272_WR_USB_EPDR(imm, epnum, 32,
						*(uint32 *)(&ep[epnum].buffer.start[i]));
					i += 4;
				}
				else
				{
					MCF5272_WR_USB_EPDR(imm,epnum,8,ep[epnum].buffer.start[i]);
					i++;
				}
				if ( i >= ep[epnum].buffer.length )
				{
					/* All done -> Clear the IN-BUSY bit */
					MCF5272_WR_USB_EPCTL(imm, epnum, 
						MCF5272_RD_USB_EPCTL(imm, epnum)
						& ~MCF5272_USB_EPNCTL_IN_BUSY);
					break;
				}
			}
			ep[epnum].buffer.position = i;
		}
	}
	if ((event & MCF5272_USB_EPNISR_FIFO_LVL) && 
		(ep[epnum].ttype == ISOCHRONOUS))
	{
		/* Clear this interrupt bit */
		MCF5272_WR_USB_EPISR(imm, epnum, 0
			| MCF5272_USB_EPNISR_FIFO_LVL );
		if (ep[epnum].buffer.start && 
			 (ep[epnum].buffer.length == ep[epnum].buffer.position))
		{
			usb_ep_tx_done(epnum);
			ep[epnum].buffer.start = 0;
			ep[epnum].buffer.length = 0;
			ep[epnum].buffer.position = 0;
			ep[epnum].buffer.free = 0;

		}
	}
	if (event & MCF5272_USB_EPNISR_EOT)
	{
		MCF5272_WR_USB_EPISR(imm, epnum, 0
			| MCF5272_USB_EPNISR_EOT);
		if (ep[epnum].buffer.start)
		{
			if (ep[epnum].buffer.free)
				free(ep[epnum].buffer.start);

			/* Call the Tx Handler */
			usb_ep_tx_done(epnum);
		}
		ep[epnum].buffer.start = 0;
		ep[epnum].buffer.length = 0;
		ep[epnum].buffer.position = 0;
		ep[epnum].buffer.free = 0;

		/* Set the IN-BUSY bit
		   This is only required on pre-2K75N masks. This bit is set by 
		   HW beginning with the 2K75N silicon. */
		MCF5272_WR_USB_EPCTL(imm, epnum, MCF5272_RD_USB_EPCTL(imm, epnum) 
			| MCF5272_USB_EPNCTL_IN_BUSY);
	}
}

/********************************************************************/
void 
usb_out_service(uint32 epnum, uint32 event)
{
	MCF5272_IMM *imm = mcf5272_get_immp();
	uint32 i;
	uint16 fifo_data;

	#if (DEBUG)
		if (event & (MCF5272_USB_EP0ISR_OUT_EOT | MCF5272_USB_EPNISR_EOT))
			printf("Received OUT_EOT on EP%d\n",epnum);
		if (event & (MCF5272_USB_EP0ISR_OUT_EOP | MCF5272_USB_EPNISR_EOP))
			printf("Received OUT_EOP on EP%d\n",epnum);
		if (event & (MCF5272_USB_EP0ISR_OUT_LVL | MCF5272_USB_EPNISR_FIFO_LVL))
			printf("Received OUT_LVL on EP%d\n",epnum);
	#endif
	
	if (event & (MCF5272_USB_EP0ISR_OUT_LVL | MCF5272_USB_EPNISR_FIFO_LVL))
	{
		/* Clear the FIFO Level Interrupt bits now */
		MCF5272_WR_USB_EPISR(imm, epnum, 0
			| MCF5272_USB_EP0ISR_OUT_LVL
			| MCF5272_USB_EPNISR_FIFO_LVL);
	}
	if (event & ( MCF5272_USB_EP0ISR_OUT_LVL 
				| MCF5272_USB_EPNISR_FIFO_LVL
				| MCF5272_USB_EP0ISR_OUT_EOP
				| MCF5272_USB_EPNISR_EOP))
	{
		/* Clear the EOP interrupt bits */
		MCF5272_WR_USB_EPISR(imm, epnum, 0 
			| MCF5272_USB_EP0ISR_OUT_EOP
			| MCF5272_USB_EPNISR_EOP);

		/* Read the Data Present register */
		fifo_data = MCF5272_RD_USB_EPDPR(imm, epnum);

		if (ep[epnum].buffer.start &&
		   (ep[epnum].buffer.position + fifo_data > ep[epnum].buffer.length))
		{
			/* Buffer is going to overflow! */
			/* To do: realloc() to avoid this problem */
			usb_ep_rx_done(epnum,OVERFLOW_ERROR);
			ep[epnum].buffer.start = 0;
		}
		if (ep[epnum].buffer.start == 0)
		{
			/* No Buffer allocated! */
			ep[epnum].buffer.start = (uint8 *) malloc(BUFFER_SIZE);
			if (!ep[epnum].buffer.start)
			{
				/* Could not allocate buffer */
				usb_ep_rx_done(epnum,MALLOC_ERROR);
				return;
			}
			ep[epnum].buffer.free = TRUE;
			ep[epnum].buffer.length = BUFFER_SIZE;
			ep[epnum].buffer.position = 0;
		}

		/* Read the data from the FIFO into the buffer */
		for (i = ep[epnum].buffer.position; \
			 i < ep[epnum].buffer.position + fifo_data;)
		{
			if (ep[epnum].buffer.position + fifo_data - i > 3)
			{
				*((uint32 *)(&ep[epnum].buffer.start[i])) = 
					MCF5272_RD_USB_EPDR(imm, epnum,32);
				i += 4;
			}
			else
			{
				ep[epnum].buffer.start[i] = 
					MCF5272_RD_USB_EPDR(imm, epnum,8);
				i++;
			}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
不卡免费追剧大全电视剧网站| 欧美精品欧美精品系列| 欧美亚洲日本一区| 久久亚洲一区二区三区明星换脸| 中文字幕一区二区不卡 | 欧美性受极品xxxx喷水| 欧美精品一区二区三区高清aⅴ| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆 | 成人福利视频网站| 日韩精品中文字幕在线一区| 亚洲精品国产一区二区精华液 | 91精品在线一区二区| 国产精品三级电影| 韩国视频一区二区| 91精品欧美综合在线观看最新| 亚洲免费av观看| 91原创在线视频| 中文字幕的久久| 丁香婷婷综合网| 欧美zozozo| 日韩成人午夜精品| 欧美日本在线观看| 亚洲国产视频网站| 色狠狠色狠狠综合| 亚洲欧美电影一区二区| 99热在这里有精品免费| 国产精品毛片无遮挡高清| 国产精品18久久久久久久久久久久| 在线播放91灌醉迷j高跟美女| 亚洲色图在线视频| 色偷偷久久人人79超碰人人澡| 欧美激情一区二区在线| 狂野欧美性猛交blacked| 日韩一区二区免费在线电影| 日韩中文字幕亚洲一区二区va在线| 在线观看av一区二区| 亚洲一区二区三区中文字幕在线 | 国产成人在线免费| 国产欧美日韩卡一| 国产成人小视频| 国产女同互慰高潮91漫画| 国产精品亚洲一区二区三区在线| 国产色产综合产在线视频| 国产91精品在线观看| 国产精品亲子伦对白| av亚洲精华国产精华精华| 综合精品久久久| 欧美亚洲免费在线一区| 蜜臀av一区二区| 久久精品亚洲乱码伦伦中文| 97aⅴ精品视频一二三区| 亚洲精品免费在线观看| 7777女厕盗摄久久久| 国产高清视频一区| 亚洲人成人一区二区在线观看| 91免费精品国自产拍在线不卡 | 国产亚洲欧美在线| 色999日韩国产欧美一区二区| 亚洲va在线va天堂| 日韩欧美久久久| 成人午夜又粗又硬又大| 夜夜嗨av一区二区三区四季av| 欧美日韩成人综合在线一区二区| 经典三级视频一区| 亚洲国产成人私人影院tom| 色欧美日韩亚洲| 日韩二区在线观看| 久久久综合网站| 在线观看国产精品网站| 国产一区二区三区观看| 国产精品短视频| 日韩欧美一级二级| 一本大道久久a久久精品综合| 日欧美一区二区| 国产精品视频线看| 91精品欧美福利在线观看| 成人综合婷婷国产精品久久| 亚洲一二三专区| 中文字幕av一区二区三区高 | 91在线高清观看| 久久国产精品一区二区| 依依成人精品视频| 欧美激情一区在线观看| 欧美精品日日鲁夜夜添| 99国产精品久久久久久久久久 | 亚洲一区二区三区激情| 久久亚洲精华国产精华液| 欧美在线不卡视频| 国产福利一区二区三区在线视频| 午夜伦理一区二区| 亚洲三级视频在线观看| 2021久久国产精品不只是精品| 欧美午夜精品一区二区三区| 成人免费高清在线| 国产剧情一区在线| 日本亚洲欧美天堂免费| 亚洲一卡二卡三卡四卡五卡| 中文字幕视频一区| 国产喷白浆一区二区三区| 欧美一卡二卡在线| 欧美日韩国产大片| 一本色道久久综合亚洲精品按摩| 国产成人午夜片在线观看高清观看| 天天色天天爱天天射综合| 亚洲人一二三区| 中文字幕在线不卡一区二区三区| 国产婷婷色一区二区三区在线| 日韩欧美中文一区| 911精品国产一区二区在线| 日本精品一级二级| 一本久久a久久免费精品不卡| 成人av在线一区二区| 成人免费av资源| 91麻豆免费看| 色综合久久88色综合天天6| 一本到不卡精品视频在线观看| 99久久久无码国产精品| 成人av手机在线观看| 99精品偷自拍| 在线一区二区三区四区五区 | 久久久久久久综合色一本| 欧美大片一区二区三区| 精品区一区二区| 久久精品男人天堂av| 国产精品久久久久影视| 综合激情成人伊人| 亚洲国产va精品久久久不卡综合| 午夜精品久久久久久久蜜桃app| 日韩有码一区二区三区| 青娱乐精品视频| 国产成人av福利| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 国产另类ts人妖一区二区| 成人中文字幕在线| 一本色道久久加勒比精品| 欧美中文一区二区三区| 91精品国产综合久久久久| 日韩精品一区二区三区在线观看| 久久亚洲精精品中文字幕早川悠里| 中文字幕免费在线观看视频一区| 亚洲图片激情小说| 亚洲成av人片| 国产成人免费av在线| 91麻豆免费观看| 欧美一二区视频| 成人欧美一区二区三区1314| 亚洲国产aⅴ天堂久久| 狠狠色2019综合网| 色美美综合视频| 精品动漫一区二区三区在线观看| 国产日产亚洲精品系列| 一区二区三区中文在线| 精品无人区卡一卡二卡三乱码免费卡| 成人激情校园春色| 欧美日韩精品一区二区三区四区| 久久久久久久久久久久久女国产乱| 中文字幕亚洲综合久久菠萝蜜| 日韩成人一级片| 91在线国产福利| 精品国产乱码久久久久久蜜臀| 国产精品久久久久影院亚瑟 | 国产欧美日本一区二区三区| 综合亚洲深深色噜噜狠狠网站| 午夜av一区二区三区| 激情偷乱视频一区二区三区| 色av一区二区| 国产欧美综合在线| 日本中文在线一区| 在线视频综合导航| 国产精品毛片久久久久久| 精品一区二区免费在线观看| 在线视频一区二区三| 亚洲欧洲三级电影| 久久99精品国产.久久久久久| 色狠狠综合天天综合综合| 国产女人18水真多18精品一级做| 午夜a成v人精品| 欧美午夜片在线看| 亚洲人成7777| 99久精品国产| 国产精品你懂的| 国产福利精品一区二区| 精品久久免费看| 久久精品国产亚洲a| 欧美日韩视频第一区| 亚洲综合一区二区精品导航| 91色porny| 国产精品理伦片| 国产白丝网站精品污在线入口| 日韩精品中文字幕在线不卡尤物| 午夜伊人狠狠久久| 欧美色中文字幕| 亚洲精品第一国产综合野| 99久久综合精品| 日韩一区日韩二区| 91网站黄www| 亚洲精品视频免费看| 91福利小视频| 午夜精品福利视频网站| 欧美日韩小视频|