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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? sc2440_usb_ser.c

?? SMDK2440 友善之臂MINI2440使用
?? C
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):

	pHWHead->fIRMode  = FALSE;   // Select wired by default

    pHWHead->State = IDLE;
    
	// Here is where we do any actual init for the hardware.  In the case of
	// USB function, we mostly just validate the hardware and then enable
 	// interrupts.  When we detect the presence of the bus, GetIntr will take
	// care of identify us to the host and kicking things off.

	SC2440_USB_Init(pHWHead);			

	DEBUGMSG (1, (TEXT("--SerInit - %X\r\n"), pHWHead ));

	return (pHWHead);

ALLOCFAILED:
	// Unmap any memory areas that we may have mapped.
	if ( pHWHead->pUSBCtrlAddr)
		VirtualFree((PVOID)pHWHead->pUSBCtrlAddr, 0, MEM_RELEASE);

	if ( pHWHead->pIrqCtrlAddr)
		VirtualFree((PVOID)pHWHead->pIrqCtrlAddr, 0, MEM_RELEASE);

	if ( pHWHead->pCLKPWR)
		VirtualFree((PVOID)pHWHead->pCLKPWR, 0, MEM_RELEASE);

	LocalFree(pHWHead);

	// Free any critical sections we have allocated
	DeleteCriticalSection(&(pHWHead->TransmitCritSec));
	DeleteCriticalSection(&(pHWHead->HwRegCritSec));

	// And free the context data structure
	LocalFree(pHWHead);

	DEBUGMSG (1,(TEXT("--SerInit - %X\r\n"), pHWHead ));

	return (NULL);
}

/*************************************************************************
 @doc OEM 
 @func PVOID | SerPostInit | Performs final hardware initialization.
 ************************************************************************/
static
BOOL SerPostInit(PVOID   pHead)   // @parm PVOID returned by SerInit.
{
	PSER_INFO pHWHead = (PSER_INFO)pHead;

	DEBUGMSG(1, (TEXT("+++SerPostInit\r\n")));

	// We use a PDD specific thread, rather than the default thread provided
	// by the MDD.
	StartEventThread( pHWHead );

	// Enable interrupts after thread is started - DAL
	// ....
	
	return TRUE;
}

/*************************************************************************
 @doc OEM 
 @func PVOID | SerDeinit | Deinitializes device identified by argument.
 *  This routine frees any memory allocated by SerInit.
 ************************************************************************/
static
BOOL SerDeinit(PVOID   pHead)   // @parm PVOID returned by SerInit.
{
	PSER_INFO pHWHead = (PSER_INFO)pHead;

	DEBUGMSG(1, (TEXT("+SerDeinit\r\n")));

	// Disable interrupts
	// ...

	if ( !pHWHead )
		return (FALSE);

	// Make sure device is closed before doing DeInit
	if ( pHWHead->cOpenCount )
		SerClose( pHead );

	if ( pHWHead->pUSBCtrlAddr)
		VirtualFree((PVOID)pHWHead->pUSBCtrlAddr, 0, MEM_RELEASE);

	if ( pHWHead->pIrqCtrlAddr)
		VirtualFree((PVOID)pHWHead->pIrqCtrlAddr, 0, MEM_RELEASE);

	if ( pHWHead->pCLKPWR)
		VirtualFree((PVOID)pHWHead->pCLKPWR, 0, MEM_RELEASE);

	UsbdDeallocateVm(); //:-)

	// Free any critical sections we have allocated
	DeleteCriticalSection(&(pHWHead->TransmitCritSec));
	DeleteCriticalSection(&(pHWHead->HwRegCritSec));

	// Free the HWObj allocated in GetSerialObject
	LocalFree(pHWHead->pHWObj);

	LocalFree(pHWHead);

	DEBUGMSG(1, (TEXT("-SerDeinit\r\n")));

	return (TRUE);
}

/*************************************************************************
 @doc OEM
 @func BOOL | SerOpen | This routine is called when the port is opened.
 *  Not exported to users, only to driver.
 *
 @rdesc Returns TRUE if successful, FALSEotherwise.
 ************************************************************************/
static
BOOL SerOpen(PVOID   pHead) /*@parm PVOID returned by Serinit. */
{
	PSER_INFO pHWHead = (PSER_INFO)pHead;

	DEBUGMSG(1,
			(TEXT("SerOpen+\r\n")));

	// Disallow multiple simultaneous opens
	if (pHWHead->cOpenCount)
		return (FALSE);
    
	pHWHead->cOpenCount++;

#ifdef POLL_FOR_DISCONNECT
	// Yuck.  We want to poll for detaches when the device is open.
	// But right now, the IST is in a wait infinite.  Spoof an interrupt
	// to let him know we have been opened and he needs to start polling.
	SetEvent(pHWHead->hSerialEvent);
#endif

	return (TRUE);
}

/*************************************************************************
 @doc OEM
 @func ULONG | SerClose | This routine closes the device identified by the 
 *  PVOID returned by SerInit.
 *  Not exported to users, only to driver.
 *
 @rdesc The return value is 0.
 ************************************************************************/
static
ULONG SerClose(PVOID   pHead)   // @parm PVOID returned by SerInit.
{
	PSER_INFO pHWHead = (PSER_INFO)pHead;

	DEBUGMSG (1, (TEXT("++SerClose\r\n")));

	if (pHWHead->cOpenCount) 
	{
		DEBUGMSG (1, (TEXT("SerClose, closing device\r\n")));
		pHWHead->cOpenCount--;

#ifdef TODO
		// Do we need something similar on USB???
		// while we are still transmitting, sleep.
		uTries = 0;

		while ( ((pHWHead->ser16550.IER = READ_PORT_UCHAR(pHWHead->ser16550.pIER)) 
					& SERIAL_IER_THR) &&	// indicates TX in progress
					(uTries++ < 100) &&     // safety net
								// indicates FIFO not yet empty
					!(pHWHead->ser16550.LSR & SERIAL_LSR_TEMT)) 
		{

				DEBUGMSG(1, (TEXT("SerClose, TX in progress, IER 0x%X, LSR 0x%X\r\n"),
						*pHWHead->ser16550.pIER, pHWHead->ser16550.LSR));
				Sleep(10);
		}
#endif

		// TODO - When the device is closed, should power it down or somehow try to
		// let the desktop know that we aren't doing anything with any data that it
		// might be sending our way..
    
		// Mask interrupts? - No, we wont see any more traffic - MBE.
		//pHWHead->pIrqCtrlAddr->icmr.sp0 = 0;
	}

	DEBUGMSG(1,(TEXT("--SerClose\r\n")));

	return (0);
}

/*************************************************************************
 @doc OEM
 @func ULONG | SerRxIntr | This routine gets several characters from the 
	hardware receive buffer and puts them in a buffer provided via the se-
	cond argument. It returns the number of bytes lost to overrun.

 @rdesc The return value indicates the number of overruns detected.
	The actual number of dropped characters may be higher.
**************************************************************************/
static
ULONG SerRxIntr(PVOID pHead,                // @parm Pointer to hardware head
		PUCHAR pRxBuffer,           // @parm Pointer to receive buffer
		ULONG *pBufflen )           // @parm In = max bytes to read, out = bytes read
{
	PSER_INFO   pHWHead			 = (PSER_INFO)pHead;
	ULONG       RetVal			 = 0;
	ULONG       TargetRoom			 = *pBufflen;
	BOOL        fRXFlag			 = FALSE;
	BOOL        fReplaceparityErrors = FALSE;
	BOOL        fNull;
	UCHAR       cEvtChar;
	PUCHAR      pRxOrig			 = pRxBuffer;

	DEBUGMSG(1, (TEXT("++SerRxIntr %d\r\n"), *pBufflen));

	cEvtChar = pHWHead->dcb.EvtChar;
	fNull	 = pHWHead->dcb.fNull;

	if( pHWHead->dcb.fErrorChar && pHWHead->dcb.fParity )
		fReplaceparityErrors = TRUE;
  
	// Protect the following from collision on hardware registers.
	// In particular, we can't let anyone else do SC2440_USB_ accesses between
	// time we set the read address and time we do the actual read in 
	// the loop below.
	EnterCriticalSection(&(pHWHead->HwRegCritSec));
	
	fRXFlag = SC2440_USB_RxIntHandler(pHWHead, pRxBuffer, pBufflen);

	LeaveCriticalSection(&(pHWHead->HwRegCritSec));

	// if we saw one (or more) EVT chars, then generate an event
	if( fRXFlag )
		EvaluateEventFlag( pHWHead->pMddHead, EV_RXFLAG );

#ifdef DEBUG
	if( ZONE_RXDATA )
		CELOGDATA(1, CELID_RAW_UCHAR, pRxOrig, (WORD)*pBufflen, 1, CELZONE_MISC);
#endif

	DEBUGMSG(1, (TEXT("--SerRxIntr - rx %d, drop %d.\r\n"),
			*pBufflen,
			pHWHead->DroppedBytes));

	RetVal		      = pHWHead->DroppedBytes;
	pHWHead->DroppedBytes = 0;

	return RetVal;
}

/*************************************************************************
	@doc OEM
	@func PVOID | SerGetRxStart | This routine returns the start of the 
			hardware receive buffer.  See SerGetRxBufferSize.
 
	@rdesc The return value is a pointer to the start of the device 
			receive buffer.
*************************************************************************/ 
static
PVOID SerGetRxStart( PVOID   pHead )	// @parm PVOID returned by Serinit.
{
	DEBUGMSG(1, (TEXT("SerGetRxStart\r\n")));   

	return  NULL;
}

/*************************************************************************
	@doc OEM
	@func ULONG | SerGetInterruptType | This function is called
			by the MDD whenever an interrupt occurs.  The return code
			is then checked by the MDD to determine which of the four
			interrupt handling routines are to be called.

	@rdesc This routine returns a bitmask indicating which interrupts
			are currently pending.
*************************************************************************/ 
static
INTERRUPT_TYPE SerGetInterruptType( PVOID pHead ) // Pointer to hardware head
{
	PSER_INFO	pHWHead		= (PSER_INFO)pHead;
	INTERRUPT_TYPE	interrupts=0;
    
	DEBUGMSG(1, (TEXT("++SerGetInterruptType 0x%X\r\n"), pHead));	

	interrupts = SC2440_USB_GetInterruptType(pHWHead);

	if (INTR_LINE & interrupts)
	{
		pHWHead->dConfIdx = 0;
		SignalRemoval(pHWHead);
	}

#ifdef POLL_FOR_DISCONNECT

	//interrupts = HW_GetInterruptType(pHWHead);

	//RETAILMSG(1, (TEXT("interrupts = 0x%x\r\n"), interrupts));

	if (interrupts) 
	{
		pHWHead->wSOFStableCnt = 0;
		//RETAILMSG(1, (TEXT("pHWHead->wSOFStableCnt = 0x%x\r\n"), pHWHead->wSOFStableCnt));
	} 
	else if (pHWHead->dConfIdx && (pHWHead->wPrevSOF == pHWHead->wSOF))
	{
		if (++pHWHead->wSOFStableCnt > SOF_STABLE_MAX)
		{
			//RETAILMSG(1, (TEXT("DCD Dropped due to: wSOFStableCnt: %u\r\n"), pHWHead->wSOFStableCnt));
			pHWHead->dConfIdx = 0;
			SignalRemoval(pHWHead);
		}
	}

#endif

	DEBUGMSG (1, (TEXT("--SerGetInterruptType 0x%X, 0x%X\r\n"),
					pHead, interrupts));
	return interrupts;
}

/*************************************************************************
	@doc OEM
	@func ULONG | SerModemIntr | This routine is called from the MDD
			whenever INTR_MODEM is returned by SerGetInterruptType.

	@rdesc None
*************************************************************************/
static
VOID SerModemIntr( PVOID pHead )               // Hardware Head
{
	PSER_INFO	pHWHead = (PSER_INFO)pHead;
	DWORD		dwModemStatus;

	dwModemStatus = pHWHead->ModemStatus;

	DEBUGMSG(1, (TEXT("+++SerModemIntr\r\n")));  
    
	SC2440_USB_DoEndpoint0(pHWHead, &dwModemStatus);

	if ( pHWHead->dConfIdx ) 
	{
		if ( pHWHead->cOpenCount) 
		{
			// If open, notify app of any control line changes.
			DEBUGMSG(1, (TEXT("Modem Status %2.2X <> %2.2X\r\n"),
					pHWHead->ModemStatus, dwModemStatus));

			if( (pHWHead->ModemStatus & MS_DSR_ON) != (dwModemStatus & MS_DSR_ON) )
				EvaluateEventFlag(pHWHead->pMddHead, EV_DSR);

			if( (pHWHead->ModemStatus & MS_CTS_ON) != (dwModemStatus & MS_CTS_ON) )
				EvaluateEventFlag(pHWHead->pMddHead, EV_CTS);

			if( (pHWHead->ModemStatus & MS_RLSD_ON) != (dwModemStatus & MS_RLSD_ON) )
				EvaluateEventFlag(pHWHead->pMddHead, EV_RLSD);
	
		} else {
			// If RLSD transitioned to active, we need to generate event.
			if( (dwModemStatus & MS_RLSD_ON) && !(pHWHead->ModemStatus & MS_RLSD_ON) ) 
			{

				if ( IsAPIReady(SH_WMGR) ) 
				{
						CeEventHasOccurred (NOTIFICATION_EVENT_RS232_DETECTED, NULL);
				}
				DEBUGMSG (0, (TEXT("Indicated RS232 Cable Event\r\n")));
			}
		}
  	}
  	pHWHead->ModemStatus = dwModemStatus;

	DEBUGMSG(1, (TEXT("---SerModemIntr\r\n")));   
}

/*************************************************************************
	@doc OEM
	@func ULONG | SerLineIntr | This routine is called from the MDD
			whenever INTR_LINE is returned by SerGetInterruptType.

	@rdesc None
*************************************************************************/
static
VOID SerLineIntr( PVOID pHead )               // Hardware Head
{
	PSER_INFO pHWHead = (PSER_INFO)pHead;

	DEBUGMSG(1, (TEXT("SerLineIntr\r\n")));

 	// USB serial doesn't have a concept of anything like the LSR.
	// But since a bus reset is what we sort of equate to DCD, I use
	// this routine to handle USB reset conditions.

	// Note that by the time we get here with an SC2440_USB , we are actually
	//plugged back into the bus. I added some polling code to try and detect
	// detaches sooner
	SC2440_USB_LineIntHandler(pHWHead);  // Re-initialize the hardware    
}

/*************************************************************************
	@doc OEM
	@func ULONG | SerGetRxBufferSize | This function returns
			the size of the hardware buffer passed to the interrupt
			initialize function.  It would be used only for devices
			which share a buffer between the MDD/PDD and an ISR.

	@rdesc This routine always returns 0 for 16550 UARTS.
**************************************************************************/
static
ULONG SerGetRxBufferSize( PVOID pHead )
{
	DEBUGMSG(1, (TEXT("SerGetRxBufferSize\r\n")));  
	return 10280;
}

/*************************************************************************
	@doc OEM
	@func ULONG | SerTXIntr | This routine is called from the new MDD
			whenever INTR_TX is returned by SerGetInterruptType.  It is 
			responsible for loading up the TX FIFO with next block of data.

	@rdesc None
**************************************************************************/
static
VOID SerTxIntr(	PVOID pHead,            // Hardware Head
				PUCHAR pTxBuffer,       // @parm Pointer to receive buffer
				ULONG *pBuffLen	)		// @parm In = max bytes to transmit,
							            //       out = bytes transmitted
{
	PSER_INFO pHWHead = (PSER_INFO)pHead;

	DEBUGMSG(1, (TEXT("SerTxIntr+\r\n")));

	pHWHead->CommErrors &= ~CE_TXFULL;

	SC2440_USB_TxIntHandler(pHWHead, pTxBuffer, pBuffLen);

	DEBUGMSG(1, (TEXT("SerTxIntr-, %d bytes\r\n"), *pBuffLen));  
}

/*************************************************************************
	@doc OEM
	@func BOOL | SerPowerOff | Called by driver to turn off power to 
			serial port.
			Not exported to users, only to driver.
 
	@rdesc This routine returns a status.
 ************************************************************************/
static
BOOL SerPowerOff( PVOID   pHead )      // @parm	PVOID returned by SerInit.
{
	PSER_INFO pHWHead = (PSER_INFO)pHead;
	pHWHead->cOpenCount = 0;

	//RETAILMSG(1,(TEXT("USB : SerPowerOff \r\n")));

/*	
	if ( pHWHead->cOpenCount )
	{
		EvaluateEventFlag( pHWHead->pMddHead, EV_RXFLAG );
	}
	
	return (TRUE);
*/
    return HW_PowerOff(pHead);
	
}

/*************************************************************************
	@doc OEM
	@func BOOL | SerPowerOn | 
			Called by driver to turn on power to serial port.
			Not exported to users, only to driver.
 
	@rdesc This routine returns a status.
 ************************************************************************/
static
BOOL SerPowerOn( PVOID   pHead )      // @parm	PVOID returned by SerInit.
{
	PSER_INFO pHWHead = (PSER_INFO)pHead;

	//RETAILMSG(1,(TEXT("USB : SerPowerOn \r\n")));

    return HW_PowerOn(pHead);
}

/*************************************************************************
	@doc OEM
	@func void | SerClearDtr | This routine clears DTR.

	@rdesc None.
**************************************************************************/
static
VOID SerClearDTR( PVOID   pHead )		// @parm PVOID returned by HWinit.
{
	DEBUGMSG(1, (TEXT("SerClearDTR, 0x%X\r\n"), pHead));
	
	// We don't support DTR emulation.
}

/*************************************************************************
	@doc OEM
	@func VOID | SerSetDTR | This routine sets DTR.
 
	@rdesc None.
**************************************************************************/
static
VOID SerSetDTR( PVOID   pHead )			// @parm PVOID returned by HWinit.
{    
	DEBUGMSG(1, (TEXT("SerSetDTR, 0x%X\r\n"), pHead));

	// We don't support DTR emulation.
}

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

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
高清成人在线观看| 欧美精品黑人性xxxx| 92国产精品观看| 欧美午夜免费电影| 日韩视频一区二区| 亚洲国产精品成人综合| 亚洲狠狠丁香婷婷综合久久久| 亚洲高清免费观看| 国内精品伊人久久久久av影院 | 色老头久久综合| 在线成人av网站| 国产午夜亚洲精品理论片色戒| 亚洲视频一区二区免费在线观看 | 91麻豆精品国产91久久久久| 精品国产免费一区二区三区香蕉| 欧美国产丝袜视频| 一区二区高清免费观看影视大全| 日韩成人一区二区| 国产91高潮流白浆在线麻豆| 91免费版pro下载短视频| 91精品国产一区二区三区蜜臀| 国产日韩精品一区二区三区在线| 亚洲国产成人精品视频| 国产在线播放一区| 色婷婷av一区二区三区gif| 欧美一区二区在线视频| 中文字幕一区二区三区不卡在线 | 欧美三片在线视频观看 | 国产成人免费视频网站 | 蜜臀av一区二区| 99视频在线观看一区三区| 7799精品视频| 日韩毛片视频在线看| 麻豆成人免费电影| 色综合色综合色综合色综合色综合| 91精品国产91综合久久蜜臀| 亚洲欧美日韩中文播放 | 久久久不卡影院| 婷婷国产v国产偷v亚洲高清| www.亚洲精品| 精品对白一区国产伦| 亚洲国产综合91精品麻豆| 成人黄色在线视频| xfplay精品久久| 日韩国产一二三区| 一本色道久久综合狠狠躁的推荐| 2022国产精品视频| 日韩不卡手机在线v区| 色www精品视频在线观看| 欧美高清在线视频| 黄色成人免费在线| 欧美一区二区三区四区视频| 亚洲一区二区三区四区在线观看 | 久久精品一区八戒影视| 日韩在线卡一卡二| 在线精品亚洲一区二区不卡| 国产精品久久久久婷婷| 国产精品影视天天线| 日韩三级伦理片妻子的秘密按摩| 亚洲自拍另类综合| 色天天综合久久久久综合片| 亚洲国产高清在线观看视频| 国产一区二区精品在线观看| 日韩精品影音先锋| 日本成人在线一区| 欧美日韩国产经典色站一区二区三区| 亚洲人成网站影音先锋播放| 国产风韵犹存在线视精品| 欧美成人乱码一区二区三区| 日韩国产高清在线| 欧美一区二区三区四区久久| 午夜欧美视频在线观看 | 午夜国产精品影院在线观看| 日本国产一区二区| 亚洲欧美另类小说视频| 91视频国产观看| 成人欧美一区二区三区1314| av午夜一区麻豆| 中文字幕中文字幕一区二区| www.欧美色图| 国产精品亚洲一区二区三区在线| 日韩你懂的在线播放| 久久国产精品第一页| 精品国产乱码久久久久久久久| 久久国内精品自在自线400部| 8x8x8国产精品| 麻豆91精品视频| 亚洲精品一区二区三区四区高清| 黄页视频在线91| 国产日韩欧美亚洲| 懂色av一区二区三区蜜臀| 国产精品欧美一区二区三区| 91亚洲国产成人精品一区二区三 | 欧美偷拍一区二区| 亚洲.国产.中文慕字在线| 欧美电影在哪看比较好| 天堂va蜜桃一区二区三区| 欧美一区二区成人6969| 黑人精品欧美一区二区蜜桃| 国产亚洲污的网站| 99精品欧美一区| 亚洲电影在线免费观看| 日韩欧美在线网站| 国产精品正在播放| 一区二区三区四区不卡视频| 91精品综合久久久久久| 狠狠色狠狠色综合日日91app| 久久精品欧美一区二区三区麻豆 | 亚洲精品乱码久久久久久黑人 | 亚洲国产精品精华液网站| 欧美一区二区日韩| 成人污污视频在线观看| 亚洲国产一区二区a毛片| 日韩欧美一级片| 播五月开心婷婷综合| 夜夜精品视频一区二区| 日韩亚洲电影在线| 99热国产精品| 天天色天天操综合| 国产午夜精品一区二区 | 亚洲一区二区视频| 日韩一二三区视频| 成人手机在线视频| 日韩精品免费视频人成| 中文字幕va一区二区三区| 在线观看亚洲a| 国产一二三精品| 艳妇臀荡乳欲伦亚洲一区| 精品国产一区二区三区忘忧草| 色综合久久精品| 国产大陆a不卡| 日本亚洲电影天堂| 亚洲免费av网站| 久久一留热品黄| 欧美日韩国产一级片| 国产精品一区二区黑丝| 亚洲国产精品一区二区www在线| 久久久青草青青国产亚洲免观| 在线视频一区二区免费| 丁香一区二区三区| 国产视频一区二区三区在线观看| 日韩精品乱码免费| 亚洲第一主播视频| 麻豆一区二区三| 国产.欧美.日韩| 欧美色电影在线| 欧美视频你懂的| 久久久综合精品| 欧美性大战久久| 风间由美性色一区二区三区| 蜜臀91精品一区二区三区 | 色av一区二区| 丝袜国产日韩另类美女| 久久精品日产第一区二区三区高清版| 欧美日韩国产精品成人| 成人av在线一区二区三区| 日韩二区三区四区| 最新不卡av在线| 欧美日韩午夜影院| 色综合色综合色综合| 国产毛片一区二区| 午夜影院久久久| 久久精品男人的天堂| 欧美成人bangbros| 欧美日本一区二区在线观看| 成人激情动漫在线观看| 看电影不卡的网站| 亚洲国产精品人人做人人爽| 国产精品丝袜久久久久久app| 精品欧美一区二区久久| 欧美亚男人的天堂| 成人国产免费视频| 国内精品伊人久久久久av影院| 亚洲va韩国va欧美va精品| 中文字幕在线观看不卡视频| 精品盗摄一区二区三区| 日韩精品中文字幕一区二区三区 | 国产欧美一区二区精品性色 | 日韩国产一二三区| 亚洲一卡二卡三卡四卡五卡| 国产精品久久久久久久久免费丝袜 | 成人av网站在线观看免费| 久久精品国产99国产| 日本不卡在线视频| 午夜伊人狠狠久久| 亚洲精品欧美专区| 国产精品超碰97尤物18| 国产精品国产馆在线真实露脸 | 最近日韩中文字幕| 国产精品每日更新在线播放网址| 欧美一级理论性理论a| 欧美日韩中字一区| 色视频欧美一区二区三区| 91影院在线免费观看| 成人国产精品免费观看| 国产成人自拍网| 国产精品一区一区| 国产伦精品一区二区三区免费| 懂色av噜噜一区二区三区av| 国产伦精一区二区三区|