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

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

?? isp1161hc.cpp

?? ISP1161 USB Driver under WinCE for StrongARM processor implementation
?? CPP
?? 第 1 頁 / 共 4 頁
字號:

	m_ITLTransferLen		= 0;

	for (UINT index =0; index < m_TdsPutToITLIndex; index++)
	{
		paCurITd = m_TdsPutToITL[index];
		pCurITd = (SIsochTransferDescriptor*)m_pobMem->PaToVa(paCurITd);
		
		SDevice *pDev;
		SEndpoint *pEndpt;
		SEndpointDescriptor *pEndptDesc;
    
		EnterCriticalSection(&m_csDeviceListLock);
		pDev = m_ppDevices[pCurITd->paBufferPage0 & gcITdAddrMask];
		LeaveCriticalSection(&m_csDeviceListLock);

		ASSERT(pDev);

		EnterCriticalSection(&pDev->csAccessingEndpointArray);
		pEndpt = pDev->ppEndpts[
				(pCurITd->paBufferPage0 & gcITdEndptMask) >> gcITdAddrBitSize];
		LeaveCriticalSection(&pDev->csAccessingEndpointArray);

		ASSERT(pEndpt);

		pEndptDesc = pEndpt->pEd;

		LONG iRelativeNumber = (LONG)uFrameNumber - (LONG)pCurITd->bfStartFrame;

		if((iRelativeNumber < 0))
		{
			break; //break out from this loop
		}
		else if (iRelativeNumber > (LONG)pCurITd->bfFrameCount)
		{
			break; //should break out this endpoint only
		}
		

		//Calcalate the length according to spec page 25

		LONG dwBufferLen;

		ULONG uspaEndingBuffer = 0;
		ULONG uspaStartingBuffer = 0;
								
		if (pCurITd->offsetPsw[iRelativeNumber] == pCurITd->offsetPsw[iRelativeNumber+1] )
		{
			dwBufferLen = 0;
		}
		else
		{
			//Staring address
			if (pCurITd->offsetPsw[iRelativeNumber] & 0x1000)
				uspaStartingBuffer = pCurITd->paBufferEnd & 0xFFFFF000;
			else
				uspaStartingBuffer = pCurITd->paBufferPage0 & 0xFFFFF000;
			uspaStartingBuffer |= pCurITd->offsetPsw[iRelativeNumber] & 0xFFF;

			//Ending address
				
			if (iRelativeNumber < (LONG)pCurITd->bfFrameCount) //not the last one
			{
				ULONG temp = pCurITd->offsetPsw[iRelativeNumber + 1] -1;
				if(temp & 0x1000)
					uspaEndingBuffer = pCurITd->paBufferEnd & 0xFFFFF000;
				else
					uspaEndingBuffer = pCurITd->paBufferPage0 & 0xFFFFF000;
				uspaEndingBuffer |= temp & 0xFFF;
			}
			else
			{
				uspaEndingBuffer = pCurITd->paBufferEnd;
			}
						
			dwBufferLen = (LONG)(uspaEndingBuffer & 0xFFF) - (LONG)(uspaStartingBuffer & 0xFFF);

			if ( (uspaStartingBuffer & 0xFFFFF000) != (uspaEndingBuffer & 0xFFFFF000))
				dwBufferLen += 4096;
				
			dwBufferLen += 1;

			if (dwBufferLen == 0x1040)
			{
				WRITE_PORT_USHORT((PUSHORT)m_regBase, 0x8888);
				WRITE_PORT_USHORT((PUSHORT)m_regBase, 0x9999);
			}

			/*===================================================================/
				Alignment of 4 bytes, If there are more than 1 PTD in ATL buffer,
				the next should be alignment in 4 bytes
			====================================================================*/
			if (index < m_TdsPutToITLIndex -1)
			{
				if (dwBufferLen %4)
				{
					USHORT dwPayLoad = 4 - dwBufferLen % 4;
					m_ITLTransferLen += dwPayLoad;
				}
			}


		}
		m_ITLTransferLen += dwBufferLen + sizeof(SPhilipsTransferDescriptor);


		//As it turned out, this stack doesn't calculate correctly
		//when crossing 4k boundary. I have to apply page 27 of 
		//OHCI to check offsetPsw[R] and offsetPsw[R+1] to skip
		//this offset if smaller
		
		if (iRelativeNumber < (LONG)pCurITd->bfFrameCount) 
		{
			if (pCurITd->offsetPsw[iRelativeNumber + 1] < pCurITd->offsetPsw[iRelativeNumber]) 
				m_ITLTransferLen = 0;
		}
		else
		{
			if (pCurITd->offsetPsw[pCurITd->bfFrameCount] <pCurITd->offsetPsw[ pCurITd->bfFrameCount]) 
				m_ITLTransferLen = 0;
		}
	}

	/*=====================================================================/
		Break out from this loop if nothing to dump, No need, since 
		all the above cases that can cause m_ITLLengh is 0 has been break
		already.
	/=====================================================================*/
	if (m_ITLTransferLen == 0)
	{
		return;
	}

	/*=====================================================================/
			Prepare Transfer counter
	/=====================================================================*/
		
	WRITE_REGISTER_USHORT(HcWRTransCounter(m_regBase), (USHORT)m_ITLTransferLen); 
		
	/*=====================================================================/
		Go through the array and push them one by one to ITL  
	/=====================================================================*/
	WRITE_PORT_USHORT((PUSHORT)(m_regBase+2), 0xc0);	
		
	for (index =0; index < m_TdsPutToITLIndex; index++)
	{
			
		paCurITd = m_TdsPutToITL[index];
		pCurITd = (SIsochTransferDescriptor*)m_pobMem->PaToVa(paCurITd);

		SDevice *pDev;
		SEndpoint *pEndpt;
		SEndpointDescriptor *pEndptDesc;
    
		EnterCriticalSection(&m_csDeviceListLock);
		pDev = m_ppDevices[pCurITd->paBufferPage0 & gcITdAddrMask];
		LeaveCriticalSection(&m_csDeviceListLock);

		ASSERT(pDev);

		EnterCriticalSection(&pDev->csAccessingEndpointArray);
		pEndpt = pDev->ppEndpts[
				(pCurITd->paBufferPage0 & gcITdEndptMask) >> gcITdAddrBitSize];
		LeaveCriticalSection(&pDev->csAccessingEndpointArray);

		ASSERT(pEndpt);

		pEndptDesc = pEndpt->pEd;

		//Depending on OHCD spec page 101 to calcuate length, m_ITLTransferLen

		LONG iRelativeNumber = (LONG)uFrameNumber - (LONG)pCurITd->bfStartFrame;
			
		LONG	dwBufferLen = 0;

		ULONG	uspaEndingBuffer;
		ULONG	uspaStartingBuffer;
								
		if (pCurITd->offsetPsw[iRelativeNumber] == pCurITd->offsetPsw[iRelativeNumber+1] )
		{
			dwBufferLen = 0;
		}
		else
		{
			//Staring address
			if (pCurITd->offsetPsw[iRelativeNumber] & 0x1000)
				uspaStartingBuffer = pCurITd->paBufferEnd & 0xFFFFF000;
			else
				uspaStartingBuffer = pCurITd->paBufferPage0 & 0xFFFFF000;
			uspaStartingBuffer |= pCurITd->offsetPsw[iRelativeNumber] & 0xFFF;

			//Ending address
			if (iRelativeNumber < (LONG)pCurITd->bfFrameCount) //not the last one
			{
				
				ULONG temp = pCurITd->offsetPsw[iRelativeNumber + 1] -1;
				if(temp & 0x1000)
					uspaEndingBuffer = pCurITd->paBufferEnd & 0xFFFFF000;
				else
					uspaEndingBuffer = pCurITd->paBufferPage0 & 0xFFFFF000;
				uspaEndingBuffer |= temp & 0xFFF;
			}
			else
			{
				uspaEndingBuffer = pCurITd->paBufferEnd;
			}
						
			dwBufferLen = (LONG)(uspaEndingBuffer & 0xFFF) - (LONG)(uspaStartingBuffer & 0xFFF);

			if ( (uspaStartingBuffer & 0xFFFFF000) != (uspaEndingBuffer & 0xFFFFF000))
				dwBufferLen += 4096;
			
			dwBufferLen += 1;

		}
				
		//ExecuteUSBTransanction 
		UCHAR dwEndpointType = pEndpt->endptType;	

		SPhilipsTransferDescriptor		sPTD;
			
		sPTD.bActualBytes		= 0;
		
		sPTD.bfToggle = pEndpt->fPhcdToggleBit;
	
		sPTD.bfActive			= 1; //Start the transfer
		sPTD.bCompletionCode    = 0;
			
		sPTD.bMaxPacketSize		= pEndptDesc->bfMaxPacketSize; //Lost the MSB
//		sPTD.bMaxPacketSize		= 64; //Lost the MSB

		sPTD.bfSpeed			= pEndptDesc->bfIsLowSpeed;

//		sPTD.bfLastTd			= pCurGTd->bfLastTd;
					
		if (index == m_TdsPutToITLIndex -1)
			sPTD.bfLastTd			= 1;
		else
			sPTD.bfLastTd			= 0;

		sPTD.bEndpointNumber	= pEndptDesc->bfEndpointNumber;
			
		sPTD.bTotalBytes		= dwBufferLen;

		sPTD.bfPID				= pEndptDesc->bfDirection;
		sPTD.bTokenOnce			= 0; //Not applicable
		sPTD.bfAddr				= pCurITd->paBufferPage0 & gcITdAddrMask;
		sPTD.bFormat			= pEndptDesc->bfIsIsochronous;
		sPTD.bUnused1			= 0;
		sPTD.bUnused2			= 0;
		sPTD.bUnused3			= 0;

		/*=====================================================================/
				Send the PTD and the data inside TD to ATL 
		/======================================================================*/

		UINT i;
		PUSHORT pData;
		PUSHORT psPTDData;

		//PTD structure 
		psPTDData = (PUSHORT)(&sPTD);
							
		for (i = 0; i< sizeof(SPhilipsTransferDescriptor)/sizeof(USHORT); i++)
			WRITE_PORT_USHORT((PUSHORT)m_regBase, *(psPTDData+i));
											
		//Data in the TD 
		if ( dwBufferLen > 0) 
		{
			pData = (PUSHORT)m_pobMem->PaToVa(uspaStartingBuffer);
			// dwBufferLen += 1, In odd case, we add one more byte. 
			for (i=0;  i< (dwBufferLen + 1)/sizeof(USHORT); i++)
			{
				WRITE_PORT_USHORT((PUSHORT)m_regBase, *(pData + i));
			}

			/*=====================================================================/
				Send Alignment (4 bytes) data to ATL buffer 
			/======================================================================*/
			if (index < m_TdsPutToITLIndex -1)
			{
				if (dwBufferLen %4)
				{
					DWORD dwPayLoad = 4 - dwBufferLen % 4;
					for (i=0; i< dwPayLoad/sizeof(USHORT); i++)
					{
						WRITE_PORT_USHORT((PUSHORT)m_regBase, 0);
					}
				}
			}
		
		}

/*
		WRITE_PORT_USHORT((PUSHORT)m_regBase, 0x8888);
		WRITE_PORT_USHORT((PUSHORT)m_regBase, 0x9999);
*/

		RETAILMSG(0,
			(TEXT("PHCD::PTD(s) %d, ITL TD[%d] 0x%08X -> [%d], m_ITLTransferLen %04X\r\n"), 
			m_TdsPutToITLIndex, iRelativeNumber, paCurITd, index,  m_ITLTransferLen));

	}//End of For loop

}



VOID CPhcd::CheckITLList(PULONG p_TdsPutToITLIndex, ULONG m_TdsPutToITL[], PULONG pInterrupts)
{

	//Quit1 if we don't want have to process it.

	if( *p_TdsPutToITLIndex == 0)
		return;

	SIsochTransferDescriptor*		pCurITd;
	ULONG							paCurITd;

	uFrameNumber = *HccaFrameNumber(m_pHcca);

	RETAILMSG(ISP1161DBG, 
			(TEXT("PHCD: CheckITLList, uFramNumber,0x%08X \r\n"), uFrameNumber));

	for ( UINT index =0; index<*p_TdsPutToITLIndex; index++)
	{
		paCurITd = m_TdsPutToITL[index];
		pCurITd = (SIsochTransferDescriptor*)m_pobMem->PaToVa(paCurITd);
		
		SDevice *pDev;
		SEndpoint *pEndpt;
		SEndpointDescriptor* pEndptDesc;

		EnterCriticalSection(&m_csDeviceListLock);
		pDev = m_ppDevices[pCurITd->paBufferPage0 & gcITdAddrMask];
		LeaveCriticalSection(&m_csDeviceListLock);

		ASSERT(pDev);

		EnterCriticalSection(&pDev->csAccessingEndpointArray);
		pEndpt = pDev->ppEndpts[
			(pCurITd->paBufferPage0 & gcITdEndptMask) >> gcITdAddrBitSize];
		LeaveCriticalSection(&pDev->csAccessingEndpointArray);

		pEndptDesc = pEndpt->pEd;

		//Quit2: if we haven't reached to the end of bfFrameCount

		/*==============================================================
			In the FrameNumber turn around time, We need do some trick. 
			Well, as it turned out, this has become a big headache. Cause
			as uFrameNumber turn around 0xFFFF, I don't know whether this
			Frame is just bigger than bfStartFrame, or the transfer haven't
			started, just user choose a big startFrame. I wonder how the
			OHCI does this job.
			Another issue is OS thread schedule delay, by the time this 
			CheckITLList is called, we may miss a lot of frames already.
			So, I add a value 1000. That means even this CheckITLList is
			called 1000 frame later, we will still clean this ITD.
		===============================================================*/
	
		if ((pCurITd->bfStartFrame + pCurITd->bfFrameCount +1) >= 0xFFFF)
		{
			if (uFrameNumber <= 
				pCurITd->bfStartFrame + pCurITd->bfFrameCount +1 - 0xFFFF + 1000)
				uFrameNumber += 0xFFFF;
		}

		//Plus 1 is because ITL be processed after the frame it is dumped.
		if (uFrameNumber <= pCurITd->bfStartFrame + pCurITd->bfFrameCount + 1)
			return;
			
		//Time to put TD back.
		pCurITd->bfConditionCode = 0;
		
		/*================================================================/
			(2), update Endpoints TD, put the next in the first place

			This place has turned out to be more tricker than before. The 
			story is we must check both m_TdsPutToITLFirstIndex and 
			m_TdsPutToITLSecondIndex, if either of them is NOT zero, that 
			means the next TD has been taken out and saved already. So, 
			we can't take out the next TD as put it to head position, instead
			we should take out 2 of them.
			
			And even tricker is we must check whether we are just in the 
			right frame to jump 2 frames. As it turned out, if we are late
			for many frames, we can't simply jump 2 frames. Cause CheckITL
			ITLSecond will be called right after CheckITLFirst.

		/=================================================================*/
		if (uFrameNumber == pCurITd->bfStartFrame + pCurITd->bfFrameCount + 1 + 1)
		{
	
			if((m_TdsPutToITLFirstIndex !=0) && (m_TdsPutToITLSecondIndex !=0))
			{
				SIsochTransferDescriptor*		pNextITd;
				pNextITd = (SIsochTransferDescriptor*)m_pobMem->PaToVa(pCurITd->paNextTd);
				pEndptDesc->paTdQueueHead = pNextITd->paNextTd;
				RETAILMSG(0, 
					(TEXT("PHCD: Jump 2 TD, paCurITd 0x%08X, NextTd 0x%08X, Next-NextTd 0x%08X\r\n"), 
					paCurITd, pCurITd->paNextTd, pNextITd->paNextTd));
			}
			else
			{
				pEndptDesc->paTdQueueHead = pCurITd->paNextTd;
				RETAILMSG(0, (TEXT("PHCD: Jump 1 TD, CurITd 0x%08X, NextId 0x%08X\r\n"),	
					paCurITd, pCurITd->paNextTd));
			}
		}
		else
		{
			//We have been later now, First compare FirstIndex with SecondIndex
			//To determine which is first and then go till the end and reverse
			//them and put them to DoneHead

			//I presume CheckITLList(m_TdsPutToITLFirstIndex is called

			if (m_TdsPutToITLSecondIndex)
			{
				
				SIsochTransferDescriptor*		pTempITd;
				ULONG							paTempITd;

				paTempITd = m_TdsPutToITLSecond[0];
				pTempITd = (SIsochTransferDescriptor*)m_pobMem->PaToVa(paTempITd);
		
				SDevice *pDev;
				SEndpoint *pEndpt;
				SEndpointDescriptor* pEndptDesc;

				EnterCriticalSection(&m_csDeviceListLock);
				pDev = m_ppDevices[pTempITd->paBufferPage0 & gcITdAddrMask];
				LeaveCriticalSection(&m_csDeviceListLock);

				ASSERT(pDev);
	
				EnterCriticalSection(&pDev->csAccessingEndpointArray);
				pEndpt = pDev->ppEndpts[
					(pTempITd->paBufferPage0 & gcITdEndptMask) >> gcITdAddrBitSize];
				LeaveCriticalSection(&pDev->csAccessingEndpointArray);

				pEndptDesc = pEndpt->pEd;


				//We still don't know which TD is earlier, well, if pTempITd->next is
				//pCurITd, TD is Second is indeed earlier.

				if (pTempITd->paNextTd == paCurITd)
				{
					//Assign pTempITd to pCurITd, cause we will operate on pCurITd 
					pCurITd = pTempITd;
					paCurITd = paTempITd;
				}

			}

			//Do a while loop to reach to the bottom
			
			//Put the next to TdQueueHead
			pEndptDesc->paTdQueueHead = pCurITd->paNextTd;
			//Put itself to DoneHead

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
福利一区二区在线| 久久尤物电影视频在线观看| 91精品国产色综合久久不卡电影| 欧美va亚洲va香蕉在线| 一区二区三区欧美在线观看| 国产91在线看| 欧美成人高清电影在线| 亚洲人成在线播放网站岛国| 久久99国产精品免费网站| 欧美怡红院视频| 国产欧美精品一区二区三区四区| 图片区小说区国产精品视频| 99久久精品99国产精品| 国产亚洲精品7777| 秋霞影院一区二区| 欧美日本不卡视频| 亚洲午夜免费电影| 99久久综合狠狠综合久久| 久久久蜜桃精品| 久久99精品久久久久婷婷| 在线成人av网站| 亚洲第一在线综合网站| 91丨九色丨蝌蚪丨老版| 国产精品久久久久永久免费观看 | 成人免费黄色在线| 欧美成人三级在线| 久久电影网电视剧免费观看| 91精品国产欧美一区二区| 亚洲午夜电影在线| 91欧美激情一区二区三区成人| 国产色婷婷亚洲99精品小说| 韩国理伦片一区二区三区在线播放 | 在线日韩国产精品| 亚洲欧美怡红院| hitomi一区二区三区精品| 国产欧美久久久精品影院| 国产一区二三区| 精品国产99国产精品| 久久精品国产999大香线蕉| 91精品国产手机| 奇米精品一区二区三区在线观看| 欧美日韩一区二区三区免费看| 亚洲一区二三区| 欧美丰满一区二区免费视频| 午夜精品久久久久久久| 91精品午夜视频| 老司机午夜精品99久久| 久久这里只有精品首页| 成人久久视频在线观看| 欧美激情在线一区二区三区| www.欧美日韩| 亚洲国产精品久久久男人的天堂| 91精品国产综合久久国产大片| 寂寞少妇一区二区三区| 国产精品乱码一区二区三区软件| 不卡在线观看av| 亚洲国产美国国产综合一区二区| 欧美色欧美亚洲另类二区| 麻豆精品一区二区| 国产欧美一区二区精品秋霞影院| 99热99精品| 午夜精品一区二区三区三上悠亚| 日韩欧美一区在线| 成人免费视频网站在线观看| 亚洲国产日韩a在线播放性色| 日韩欧美中文字幕制服| 丰满岳乱妇一区二区三区| 亚洲色欲色欲www| 91精选在线观看| 成人精品亚洲人成在线| 午夜欧美大尺度福利影院在线看| 久久精品夜色噜噜亚洲aⅴ| 91色婷婷久久久久合中文| 日本欧美韩国一区三区| 国产精品久久久久aaaa樱花| 欧美精品自拍偷拍动漫精品| 国产精品一级二级三级| 亚洲一区二区三区影院| 亚洲国产精品国自产拍av| 欧美日韩国产综合久久| 福利一区在线观看| 青青草原综合久久大伊人精品优势 | 欧美一a一片一级一片| 国产一区二区三区蝌蚪| 亚洲一区二区高清| 亚洲国产精品成人久久综合一区 | 日韩国产欧美一区二区三区| 国产精品国产三级国产aⅴ入口| 欧美精品777| 色偷偷成人一区二区三区91| 国产精品一区在线观看乱码| 性做久久久久久久免费看| 国产精品大尺度| 欧美大片在线观看一区| 91国产成人在线| 国产 日韩 欧美大片| 美女视频黄久久| 午夜久久福利影院| 樱花草国产18久久久久| 中文成人综合网| 久久伊人中文字幕| 日韩视频免费直播| 欧美美女激情18p| 欧美丝袜自拍制服另类| 91成人免费网站| 91久久免费观看| 99久久久久免费精品国产| 岛国精品在线观看| 国产成人免费视频| 国产成人精品免费看| 国产精品影视网| 国产精品亚洲一区二区三区在线 | 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 欧美一区二区三区小说| 欧日韩精品视频| 欧洲精品一区二区三区在线观看| av亚洲精华国产精华精华 | 欧美激情艳妇裸体舞| 久久精品这里都是精品| 国产亚洲精久久久久久| 国产婷婷色一区二区三区四区| 久久影院视频免费| 国产三级欧美三级| 国产精品初高中害羞小美女文| 中文字幕av不卡| 国产精品国产自产拍高清av| 国产精品嫩草影院av蜜臀| 亚洲欧美中日韩| 亚洲欧美一区二区三区久本道91| 自拍偷拍亚洲综合| 亚洲最色的网站| 亚洲第一二三四区| 久久机这里只有精品| 国产麻豆精品久久一二三| 国产成人亚洲综合色影视| 91免费版pro下载短视频| 欧美日韩一区三区| 欧美成人在线直播| 久久精品欧美一区二区三区不卡 | 欧美一区二区精品| 精品成人私密视频| 亚洲丝袜自拍清纯另类| 亚洲成人精品一区二区| 麻豆精品视频在线观看视频| 国产98色在线|日韩| 在线免费不卡视频| 日韩免费在线观看| 亚洲视频一区二区免费在线观看| 一区二区三区国产精华| 另类的小说在线视频另类成人小视频在线 | 亚洲视频中文字幕| 日韩vs国产vs欧美| 国产精品一区在线观看你懂的| 色激情天天射综合网| 制服视频三区第一页精品| 欧美精品一区二区久久婷婷| 亚洲国产精品成人综合色在线婷婷 | 国产亚洲福利社区一区| 亚洲日本韩国一区| 九九在线精品视频| 91精彩视频在线| 久久精品一区二区三区av| 一区二区久久久| 国产成人av一区二区三区在线观看| 在线观看欧美日本| 国产亚洲综合色| 五月激情综合色| 99久久99久久精品国产片果冻| 日韩一级片在线观看| 亚洲欧美日韩在线播放| 国产精品一区二区三区四区| 在线成人午夜影院| 国产精品灌醉下药二区| 国产盗摄女厕一区二区三区| 欧美影院精品一区| ...xxx性欧美| 久久电影网站中文字幕| 欧美日韩精品专区| 亚洲人成在线观看一区二区| 国产成人综合亚洲91猫咪| 欧美日韩夫妻久久| 亚洲欧美日韩国产成人精品影院| 国产九色sp调教91| 精品日韩一区二区| 日韩va欧美va亚洲va久久| 在线欧美日韩国产| 亚洲私人黄色宅男| www.66久久| 国产性做久久久久久| 狠狠狠色丁香婷婷综合激情| 欧美一区二区三区免费在线看| 亚洲一区二区三区影院| 在线观看视频一区二区欧美日韩| 国产精品久久久久精k8| youjizz国产精品| 一区二区中文字幕在线| 成人精品在线视频观看| 国产精品久久三| 国产iv一区二区三区| 国产午夜精品久久|