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

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

?? sc2440_usb_ser.c

?? 2440 CE500BSP包, EBOOT可用DEBUG版調試
?? C
?? 第 1 頁 / 共 3 頁
字號:
	@doc OEM
	@func VOID | SerClearRTS | This routine clears RTS.
 
	@rdesc None.
**************************************************************************/
static
VOID SerClearRTS( PVOID   pHead )		// @parm PVOID returned by HWinit.
{
	DEBUGMSG(1, (TEXT("SerClearRTS, 0x%X\r\n"), pHead));

	// We don't support RTS emulation.
}

/*************************************************************************
	@doc OEM
	@func VOID | SerSetRTS | This routine sets RTS.

	@rdesc None.
**************************************************************************/
static
VOID SerSetRTS( PVOID   pHead )			// @parm PVOID returned by HWinit.
{
	DEBUGMSG(1, (TEXT("SerSetRTS, 0x%X\r\n"), pHead));

	// We don't support RTS emulation.
}

/*************************************************************************
	@doc OEM
	@func BOOL | SerEnableIR | This routine enables ir.
			Not exported to users, only to driver.
	
	@rdesc Returns TRUE if successful, FALSEotherwise.
**************************************************************************/
static
BOOL SerEnableIR( PVOID   pHead,		// @parm PVOID returned by Serinit.
				  ULONG   BaudRate )	// @parm PVOID returned by HWinit.
{
	PSER_INFO pHWHead = (PSER_INFO)pHead;

	DEBUGMSG(1, (TEXT("SerEnableIR, 0x%X\r\n"), pHead));

	// We don't support an IR mode, so fail.
	return (FALSE);
}

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

	DEBUGMSG(1, (TEXT("SerDisableIR, 0x%X\r\n"), pHead));

	// We don't support an IR mode.  But don't fail, in case
	// someone calls this redundantly to ensure that we are
	// in wired mode, which is what we support.
	return (TRUE);
}

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

	// We don't have a concept of break over USB serial
}

/*************************************************************************
	@doc OEM
	@func VOID | SerSetBreak | This routine sets break.

	@rdesc None.
*************************************************************************/
static
VOID SerSetBreak( PVOID   pHead )		// @parm PVOID returned by HWinit.
{
	DEBUGMSG(1, (TEXT("SerSetBreak, 0x%X\r\n"), pHead));

	// We don't have a concept of break over USB serial
}

/*************************************************************************
	@doc OEM
	@func	BOOL | SerXmitComChar | Transmit a char immediately
 
	@rdesc	TRUE if succesful
*************************************************************************/
static
BOOL SerXmitComChar( PVOID   pHead,     // @parm PVOID returned by HWInit.
		     UCHAR   ComChar )  // @parm Character to transmit. 
{
	PSER_INFO pHWHead = (PSER_INFO)pHead;
    
	DEBUGMSG(1, (TEXT("+SerXmitComChar 0x%X\r\n"), pHead));

	// Get critical section, then transmit when buffer empties
	DEBUGMSG(1, (TEXT("XmitComChar wait for CritSec %x.\r\n"),
					&(pHWHead->TransmitCritSec)));

	EnterCriticalSection(&(pHWHead->TransmitCritSec));

	DEBUGMSG(1, (TEXT("XmitComChar got CritSec %x.\r\n"),
					&(pHWHead->TransmitCritSec)));
	try
    {

		// TODO - We need to wait for the current transmit to finish and
		// then sneak this data in ahead of whatever else is queued.
#ifdef TODO
		while( TRUE )  // We know THR will eventually empty
		{
			// Write the character if we can
			ReadLSR( pHWHead );
			if( pHWHead->LSR & SERIAL_LSR_THRE ) 
			{
				OUTB(pHWHead, pData, ComChar);
				DEBUGMSG(1, (TEXT("XmitComChar wrote x%X\r\n"), ComChar));
				break;
			}

			// If we couldn't write the data yet, then wait for a
			// TXINTR to come in and try it again.
            
			// Enable xmit intr.
			OUTB(pHWHead, pIER, IER_NORMAL_INTS | SERIAL_IER_THR);
			// Wait until the txintr has signalled.
			DEBUGMSG(1, (TEXT("XmitComChar WaitIntr x%X\r\n"),
							pHWHead->FlushDone));
			WaitForSingleObject(pHWHead->FlushDone, (ULONG)1000);
		}
#else
		DEBUGMSG (0, (TEXT("!!! SerXmitComChar 0x%X not implemented\r\n"),
		 				 pHead));
#endif        
	}
	except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
		EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) 
	{
		// Just exit
	}
    
	LeaveCriticalSection(&(pHWHead->TransmitCritSec));

	DEBUGMSG(1, (TEXT("XmitComChar released CritSec %x.\r\n"),
					&(pHWHead->TransmitCritSec)));
    
	DEBUGMSG(1, (TEXT("-SerXmitComChar 0x%X\r\n"), pHead));
    
	return TRUE;
}
        

/*************************************************************************
	@doc OEM
	@func	ULONG | SerGetStatus | This structure is called by the MDD
				to retrieve the contents of a COMSTAT structure.

	@rdesc	The return is a ULONG, representing success (0) or failure (-1).
*************************************************************************/
static
ULONG SerGetStatus( PVOID		pHead,	// @parm PVOID returned by HWInit.
					LPCOMSTAT	lpStat )// Pointer to LPCOMMSTAT to hold status.
{
	PSER_INFO	pHWHead	 = (PSER_INFO)pHead;
	ULONG		RetVal	 = pHWHead->CommErrors;
    
	DEBUGMSG(1, (TEXT("++SerGetStatus 0x%X\r\n"), pHead));

	pHWHead->CommErrors = 0; // Clear old errors each time

	// We don't emulate any of this, so always return a fixed result.
	if (lpStat) 
	{
		// TODO - Make sure we return reasonable results here.
		pHWHead->Status.fCtsHold = 0;
		pHWHead->Status.fDsrHold = 0;
		pHWHead->Status.cbInQue  = 0;
		pHWHead->Status.cbOutQue = 0;
	}
	else
		RetVal = (ULONG)-1;

	DEBUGMSG(1, (TEXT("--SerGetStatus 0x%X\r\n"), pHead));

	return RetVal;
}

/*************************************************************************
	@doc OEM
	@func ULONG | SerReset | Perform any operations associated
			with a device reset

	@rdesc	None.
*************************************************************************/
static
VOID SerReset( PVOID   pHead )	// @parm PVOID returned by HWInit.
{
	PSER_INFO pHWHead = (PSER_INFO)pHead;

	DEBUGMSG(1, (TEXT("++SerReset 0x%X\r\n"), pHead));

	memset(&pHWHead->Status, 0, sizeof(COMSTAT));

	// TODO - Is there anything special we need to do here.
    
	DEBUGMSG(1, (TEXT("--SerReset 0x%X\r\n"), pHead));
}

/*************************************************************************
	@doc OEM
	@func	VOID | SerGetModemStatus | Retrieves modem status.

	@rdesc	None.
*************************************************************************/
static
VOID SerGetModemStatus( PVOID   pHead,	       // @parm PVOID returned by HWInit.
						PULONG  pModemStatus ) // @parm PULONG passed in by user.
{
	PSER_INFO pHWHead = (PSER_INFO)pHead;
    
	DEBUGMSG(1, (TEXT("++SerGetModemStatus 0x%X\r\n"), pHead));

	*pModemStatus = pHWHead->ModemStatus;

	DEBUGMSG (0, (TEXT("--SerGetModemStatus 0x%X (stat x%X) \r\n"),
						pHead,
						*pModemStatus));
	return;
}

/*************************************************************************
	@doc OEM
	@func	VOID | SerGetCommProperties | Retrieves Comm Properties.
 
	@rdesc	None.
*************************************************************************/
static
VOID SerGetCommProperties( 
			PVOID   pHead,		// @parm PVOID returned by SerInit. 
			LPCOMMPROP  pCommProp )	// @parm Pointer to receive COMMPROP structure. 
{
	PSER_INFO pHWHead = (PSER_INFO)pHead;

	DEBUGMSG(1, (TEXT("SerGetCommProperties 0x%X\r\n"), pHead));

	*pCommProp = pHWHead->CommProp;
	return;
}

/*************************************************************************
	@doc OEM
	@func	VOID | SerPurgeComm | Purge RX and/or TX
 
	@rdesc	None.
*************************************************************************/
static
VOID SerPurgeComm( PVOID   pHead,		 // @parm PVOID returned by HWInit.
				   DWORD   fdwAction )	 // @parm Action to take. 
{
	PSER_INFO pHWHead = (PSER_INFO)pHead;
    
	DEBUGMSG(1, (TEXT("++SerPurgeComm 0x%X\r\n"), pHead));

	EnterCriticalSection(&(pHWHead->HwRegCritSec));

	if ( (fdwAction & PURGE_TXCLEAR) || (fdwAction & PURGE_TXABORT) ) 
	{
		// Abort any pending TX data.  The MDD takes care of aborting
		// data pended in the driver.  All I can do to stop an IN that
		// has already been queued is to Un-Arm this endpoint, causing
		// subsequent INs to get naked.  If the IN transfer has started, 
		// its not clear I can stop it in progress.
		// In addition to NAKing host, clearing ARM tells TxIntr that he
		// can use the buffer for the next write that comes down.

#if TODO
		ucECR = SC2440_USB_Read(pHWHead, EP1AControl);
		ucECR &= 0xFE;   // Clear the ARM bit.

		SC2440_USB_Write(pHWHead, EP1AControl, ucECR );
#endif
	}

	if ( (fdwAction & PURGE_RXCLEAR) || (fdwAction & PURGE_RXABORT) ) {
#if TODO
		// Abort any pending RX data.
		SC2440_USB_Write(pHWHead, IntStatus, 0x04 );   // Clear the EP2 interrupt
		SC2440_USB_Write(pHWHead, EP2AControl, 0x03);  // Reenable the endpoint
#endif
	}
    
	LeaveCriticalSection(&(pHWHead->HwRegCritSec));

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

/************************************************************************
	@doc OEM
	@func	BOOL | SerSetDCB | Sets new values for DCB.  This
		routine gets a DCB from the MDD.  It must then compare
		this to the current DCB, and if any fields have changed take
		appropriate action.
 
	@rdesc	BOOL
************************************************************************/
static
BOOL SerSetDCB( PVOID   pHead,	    // @parm	PVOID returned by HWInit.
		LPDCB   lpDCB )     // @parm    Pointer to DCB structure
{
	PSER_INFO pHWHead = (PSER_INFO)pHead;
	BOOL bRet;
    
	DEBUGMSG(1, (TEXT("++SerSetDCB 0x%X\r\n"), pHead));

	bRet = TRUE;

	// If the device is open, scan for changes and do whatever
	// is needed for the changed fields.  if the device isn't
	// open yet, just save the DCB for later use by the open.
	if( pHWHead->OpenCount ) 
	{
#ifdef TODO
		// We don't really support any of this.  Ignore for now
		// Note, fparity just says whether we should check
		// receive parity.  And the 16550 won't let us NOT
		// check parity if we generate it.  So this field
		// has no effect on the hardware.
    
		if ( lpDCB->BaudRate != pHWHead->dcb.BaudRate ) 
		{
			bRet = SerSetBaudRate( pHWHead, lpDCB->BaudRate );
		}
    
		if ( bRet && (lpDCB->ByteSize != pHWHead->dcb.ByteSize )) 
		{
			bRet = SerSetByteSize( pHWHead, lpDCB->ByteSize );
		}
    
		if ( bRet && (lpDCB->Parity != pHWHead->dcb.Parity )) 
		{
			bRet = SerSetParity( pHWHead, lpDCB->Parity );
		}
    
		if ( bRet && (lpDCB->StopBits != pHWHead->dcb.StopBits )) 
		{
			bRet = SerSetStopBits( pHWHead, lpDCB->StopBits );
		}

		// Don't worry about fOutxCtsFlow.  It is a flag which
		// will be examined every time we load the TX buffer.
		// No special action required here.
#endif         
	}
    
	if (bRet) 
	{
		// Now that we have done the right thing, store this DCB
		pHWHead->dcb = *lpDCB;
	}

	DEBUGMSG(1, (TEXT("--SerSetDCB 0x%X\r\n"), pHead));

	return bRet;
}

/*************************************************************************
	@doc OEM
	@func	BOOL | SerSetCommTimeouts | Sets new values for the
		CommTimeouts structure. routine gets a DCB from the MDD.  It
		must then compare this to the current DCB, and if any fields
		have changed take appropriate action.

	@rdesc	ULONG
*************************************************************************/
static
ULONG SerSetCommTimeouts( 
	PVOID   pHead,			  // @parm	PVOID returned by HWInit.
	LPCOMMTIMEOUTS   lpCommTimeouts ) // @parm Pointer to CommTimeout structure
{
	PSER_INFO pHWHead = (PSER_INFO)pHead;
	ULONG retval      = 0;
    
	DEBUGMSG(1, (TEXT("++SerSetCommTimeout 0x%X\r\n"), pHead));

	// OK, first check for any changes and act upon them
	if( lpCommTimeouts->WriteTotalTimeoutMultiplier !=
		pHWHead->CommTimeouts.WriteTotalTimeoutMultiplier )
	{

	}
    
	// Now that we have done the right thing, store this DCB
	pHWHead->CommTimeouts = *lpCommTimeouts;

	DEBUGMSG(1, (TEXT("--SerSetCommTimeout 0x%X\r\n"), pHead));

	return retval;
}

/*************************************************************************
    @doc OEM
    @func    BOOL | SerIoctl | Device IO control routine.  
    @parm DWORD | dwOpenData | value returned from COM_Open call
    @parm DWORD | dwCode | io control code to be performed
    @parm PBYTE | pBufIn | input data to the device
    @parm DWORD | dwLenIn | number of bytes being passed in
    @parm PBYTE | pBufOut | output data from the device
    @parm DWORD | dwLenOut |maximum number of bytes to receive from device
    @parm PDWORD | pdwActualOut | actual number of bytes received from device

    @rdesc        Returns TRUE for success, FALSE for failure

    @remark  The MDD will pass any unrecognized IOCTLs through to this function.
*************************************************************************/
static
BOOL SerIoctl(PVOID pHead, DWORD dwCode,PBYTE pBufIn,DWORD dwLenIn,
         PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut)
{
	PSER_INFO pHWHead = (PSER_INFO)pHead;
 	BOOL RetVal = TRUE;

	DEBUGMSG(1, (TEXT("++SerIoctl 0x%X\r\n"), pHead));

	switch (dwCode) 
	{
		// Currently, no defined IOCTLs
		default:
			RetVal = FALSE;

			DEBUGMSG(1, (TEXT(" Unsupported ioctl 0x%X\r\n"), dwCode));
			break;            
	}

	DEBUGMSG(1, (TEXT("--SerIoctl 0x%X\r\n"), pHead));

	return(RetVal);
}

const
HW_VTBL IoVTbl = {
    SerInit,
    SerPostInit,
    SerDeinit,
    SerOpen,
    SerClose,
    SerGetInterruptType,
    SerRxIntr,
    SerTxIntr,
    SerModemIntr,
    SerLineIntr,
    SerGetRxBufferSize,
    SerPowerOff,
    SerPowerOn,
    SerClearDTR,
    SerSetDTR,
    SerClearRTS,
    SerSetRTS,
    SerEnableIR,
    SerDisableIR,
    SerClearBreak,
    SerSetBreak,
    SerXmitComChar,
    SerGetStatus,
    SerReset,
    SerGetModemStatus,
    SerGetCommProperties,
    SerPurgeComm,
    SerSetDCB,
    SerSetCommTimeouts,
    SerIoctl};

extern const HW_VTBL SerCardIoVTbl;

PHWOBJ
GetSerialObject( DWORD DeviceArrayIndex )
{
	PHWOBJ pSerObj;

	// We do not have a statically allocated array of HWObjs.  Instead, we 
	// allocate a new HWObj for each instance of the driver.  The MDD will 
	// always call GetSerialObj/HWInit/HWDeinit in that order, so we can do 
	// the alloc here and do any subsequent free in HWDeInit.
  
	// Allocate space for the HWOBJ.
	pSerObj = (PHWOBJ)LocalAlloc( LPTR, sizeof(HWOBJ) );
	if ( !pSerObj )
		return (NULL);

	// Fill in the HWObj structure that we just allocated.
	pSerObj->BindFlags = THREAD_IN_PDD;      // We take care of our own IST
	pSerObj->dwIntID = SYSINTR_USBD;   // SysIntr 
	pSerObj->pFuncTbl = (HW_VTBL *) &IoVTbl; // Return pointer to functions

	// Now return this structure to the MDD.
	return (pSerObj);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩视频免费观看高清完整版在线观看 | 欧美性生活一区| 成人欧美一区二区三区小说| 国产美女一区二区三区| ww亚洲ww在线观看国产| 国产精品一级二级三级| 中文字幕国产一区二区| 99久久久免费精品国产一区二区| 中文字幕一区二区三区四区 | 99热精品一区二区| 亚洲女与黑人做爰| 欧美三级视频在线播放| 免费高清在线一区| 久久久久国产精品麻豆ai换脸| 国产精华液一区二区三区| 日本一区二区综合亚洲| k8久久久一区二区三区| 艳妇臀荡乳欲伦亚洲一区| 欧美日韩精品一区视频| 精品一区在线看| 国产精品污www在线观看| 91网站最新地址| 日韩国产高清在线| 国产欧美一区二区精品久导航| 91在线精品一区二区| 调教+趴+乳夹+国产+精品| 久久久午夜精品理论片中文字幕| 99精品视频免费在线观看| 五月天婷婷综合| 久久久久久毛片| 在线中文字幕一区二区| 国产一区二区三区蝌蚪| 樱花影视一区二区| 精品精品国产高清a毛片牛牛| 成人黄色免费短视频| 日韩国产欧美一区二区三区| 国产精品久久久久久久久免费樱桃 | 日韩免费看的电影| 91在线视频播放| 蜜臀精品一区二区三区在线观看| 国产精品乱人伦中文| 日韩一区二区三区免费观看| av在线这里只有精品| 蜜臀av性久久久久av蜜臀妖精 | 欧美自拍偷拍一区| 国产盗摄女厕一区二区三区| 亚洲一区二区三区中文字幕| 久久精品人人做人人爽人人| 欧美一区日韩一区| 色婷婷av一区二区三区大白胸| 国模套图日韩精品一区二区| 一区二区三区精品| 国产精品沙发午睡系列990531| 日韩三级免费观看| 色www精品视频在线观看| 国内精品免费**视频| 亚洲自拍偷拍网站| 亚洲视频一区二区在线| 久久青草欧美一区二区三区| 欧美日韩精品欧美日韩精品| 97se狠狠狠综合亚洲狠狠| 国产在线不卡视频| 秋霞午夜av一区二区三区| 一区二区三区四区在线| 国产精品视频九色porn| 国产亚洲综合色| 欧美大度的电影原声| 精品视频全国免费看| 91久久精品一区二区| 99久久夜色精品国产网站| 国产成人亚洲综合色影视| 久草在线在线精品观看| 日本不卡高清视频| 日韩黄色免费网站| 午夜久久久久久久久| 亚洲国产成人tv| 一区二区三区波多野结衣在线观看| 中日韩免费视频中文字幕| 久久久国产精华| 国产亚洲精品资源在线26u| 日韩精品一区二区三区老鸭窝| 欧美精品久久一区二区三区| 欧美色网站导航| 欧美日韩不卡在线| 91精品国产综合久久久久| 欧美一区二区视频观看视频| 日韩一区二区三区视频在线| 日韩免费观看高清完整版| 久久综合色之久久综合| 久久久久久久久久久电影| 国产片一区二区| 国产精品丝袜久久久久久app| 国产精品美女久久久久久久| 国产精品灌醉下药二区| 国产精品久久精品日日| 伊人一区二区三区| 亚洲成人免费视| 麻豆久久一区二区| 国产一区二区三区在线观看免费| 国产高清在线观看免费不卡| 成人91在线观看| 一本色道久久综合亚洲精品按摩| 欧美体内she精视频| 欧美一卡2卡三卡4卡5免费| 26uuu亚洲| 国产精品久久久99| 婷婷夜色潮精品综合在线| 毛片av中文字幕一区二区| 成人免费视频国产在线观看| 色综合激情五月| 91精品久久久久久久久99蜜臂| 精品成人私密视频| 亚洲三级免费电影| 日韩电影在线一区二区三区| 国产精品 欧美精品| 在线免费不卡电影| 精品三级在线看| 亚洲三级免费电影| 久久 天天综合| 一本一本大道香蕉久在线精品| 欧美一级欧美三级| 国产精品毛片高清在线完整版| 亚洲mv在线观看| 丁香桃色午夜亚洲一区二区三区| 欧亚洲嫩模精品一区三区| 26uuu亚洲| 亚洲成人动漫av| 成人毛片老司机大片| 69p69国产精品| 最新日韩在线视频| 久久99这里只有精品| 色婷婷av一区二区| 欧美激情自拍偷拍| 免费成人美女在线观看| 色婷婷综合久久久久中文 | 国产乱色国产精品免费视频| 日本精品一级二级| 久久婷婷国产综合精品青草| 亚洲国产成人av| av亚洲精华国产精华精| 精品国产伦一区二区三区免费 | 美脚の诱脚舐め脚责91| 91麻豆swag| 中文字幕乱码亚洲精品一区| 麻豆国产精品一区二区三区| 欧美在线短视频| 一区免费观看视频| 国产成人精品免费在线| 欧美一级视频精品观看| 亚洲综合av网| 色婷婷久久久综合中文字幕| 国产日韩欧美制服另类| 激情五月激情综合网| 欧美精品v国产精品v日韩精品| 亚洲欧美一区二区三区极速播放 | 69堂亚洲精品首页| 亚洲成人一区在线| 色婷婷香蕉在线一区二区| 国产精品久久网站| 懂色一区二区三区免费观看| 精品国内二区三区| 九九**精品视频免费播放| 欧美一区二区三区小说| 亚洲成人激情综合网| 欧美日韩精品系列| 午夜精品成人在线视频| 欧美精品一二三| 视频一区国产视频| 在线成人高清不卡| 日韩中文字幕亚洲一区二区va在线 | 99久久99久久精品免费看蜜桃| 久久精品亚洲国产奇米99| 国产精品香蕉一区二区三区| 久久中文字幕电影| 国产美女娇喘av呻吟久久| 精品欧美一区二区三区精品久久| 久久国产精品72免费观看| 精品久久免费看| 国产一区二区免费视频| 久久精品亚洲乱码伦伦中文| 国产成人一区二区精品非洲| 国产精品美女久久久久久久久 | 天堂午夜影视日韩欧美一区二区| 欧美日韩卡一卡二| 免费在线观看一区| 精品久久久久久久久久久久包黑料 | 东方欧美亚洲色图在线| 国产精品国产馆在线真实露脸| 色综合欧美在线| 亚洲电影视频在线| 欧美一区二区三区在线看| 国产在线视频精品一区| 国产精品女主播在线观看| 色噜噜偷拍精品综合在线| 五月婷婷久久综合| 久久蜜桃av一区精品变态类天堂| 波多野结衣中文字幕一区二区三区| 亚洲精品ww久久久久久p站 | 欧美成人综合网站| 99视频一区二区|