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

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

?? isp1161hc.cpp

?? ISP1161 USB Driver under WinCE for StrongARM processor implementation
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
			}
		}
		else
		{
			//sPTD
			psPTDData = (PUSHORT)&sPTDReDump[index];
			for (i = 0; i< sizeof(SPhilipsTransferDescriptor)/sizeof(USHORT); i++)
			{
				*(psPTDData + i) = READ_PORT_USHORT((PUSHORT)m_regBase);
				STRONGARM_DELAY(10);
			}
			//Data	
			if ( pCurGTd->paCurBuffer) 
			{
				pData = (PUSHORT)m_pobMem->PaToVa(pCurGTd->paCurBuffer);
				//In odd case, we add one more byte. 
				for (i = 0; i< (dwBufferLen + 1)/sizeof(USHORT); i++)
				{
					*(pData + i) = READ_PORT_USHORT((PUSHORT)m_regBase);
					STRONGARM_DELAY(10);
				}

				/*=====================================================================/
					Read alignment (4 bytes) data out from ATL buffer 
				/======================================================================*/
									
				if (index < m_TdsPutToATLIndex -1) 
				{
					if (dwBufferLen %4)
					{
						DWORD dwPayLoad = 4 - dwBufferLen % 4;
						for (i=0; i< (dwPayLoad)/sizeof(USHORT); i++)
						{
							READ_PORT_USHORT((PUSHORT)m_regBase);
							STRONGARM_DELAY(10);
						}
					}
				}
			}
		}

		/*=====================================================================/
			Analyze the PTD read out
		/======================================================================*/
			
		if ((sPTDReDump[index].bfActive == 1) && (pEndpt->endptType != gcEndptTypeInterrupt))
		{
				
			/*=====================================================================/
				OK, now, we will redump the PTD again, and jump out of this routine
				that means, 1) we don't set m_ATLBeingReadOut to FALSE, So, in next
				frame, the service List routine will not be called to refresh 
				the TD array. 2). We don't put the TD to the done queue
			/======================================================================*/
			DEBUGMSG(ISP1161DBG, (TEXT("PHCD:: bfActive ---- 1\r\n")));
			m_bsPTDReDump[index] = TRUE;
			sPTDReDump[index].bCompletionCode = 0;
			m_bReDump = TRUE;

			/*===================================================
				This is presumed as NAK. What we need to do is to
				clear the error counter
			====================================================*/
			pCurGTd->bfErrorCount = 0;
			continue;
		}

		//Old codes, For interrupt, this is an NAK. means this PTD will not be tried, if it will be retired.
		if ((sPTDReDump[index].bfActive == 1) && (pEndpt->endptType == gcEndptTypeInterrupt))
		{
			sPTDReDump[index].bfActive = 0;
			pCurGTd->bfErrorCount = 0;
			continue;
		}

		//New codes, For interrupt, this is an NAK. means this PTD will not be tried, if it will be retired.
	/*	
		if (pEndpt->endptType == gcEndptTypeInterrupt)
		{
		//	sPTDReDump[index].bfActive = 0;
			if (sPTDReDump[index].bActualBytes == 0)
			{
				//pEndpt->fPhcdToggleBit =  sPTDReDump[index].bfToggle;
				if (sPTDReDump[index].bfToggle)
					pEndpt->fPhcdToggleBit = 0;
				else
					pEndpt->fPhcdToggleBit = 1;
				
				//pEndpt->fPhcdToggleBit =  sPTDReDump[index].bfToggle;

				//This is presumed as NAK. What we need to do is to	clear the error counter
				pCurGTd->bfErrorCount = 0;

				continue;
			}
		}
*/

		/*=====================================================================/
		(Sepc 6.4.4.5) Status Completion part.
			1) Completion code write back
			2) Update CurrentBufferPoint
		/======================================================================*/

		/*=====================================================================/
			1) Completion code write back 
		/======================================================================*/
	
		/*=================================================================
			Refer to USB spec page 172 packet error and 1161 spec 7.6 PTD
		==================================================================*/
			
		if( (sPTDReDump[index].bCompletionCode == 0x1) ||
			(sPTDReDump[index].bCompletionCode == 0x3) || 
			(sPTDReDump[index].bCompletionCode == 0x4) || 
			(sPTDReDump[index].bCompletionCode == 0x5) || 
			(sPTDReDump[index].bCompletionCode == 0x6) ||
			(sPTDReDump[index].bCompletionCode == 0x7))
		{
			
			RETAILMSG(0, (TEXT("PHCD:: PTD CC error: %d, EpNum %d, count: %d\r\n"), 
					sPTDReDump[index].bCompletionCode, pEndpt->endptArrayNum, 
					pCurGTd->bfErrorCount));
	
			pCurGTd->bfErrorCount++;
			
			/*
			if ( pEndpt->endptType == gcEndptTypeInterrupt)
			{
				if (pCurGTd->bfErrorCount < 3)
				{
					continue;
				}
			}
			else if ( pEndpt->endptType == gcEndptTypeControl)
			{
				if (pCurGTd->bfErrorCount < 3)
				{
					sPTDReDump[index].bfActive = 1;
					sPTDReDump[index].bCompletionCode = 0;

					m_bsPTDReDump[index] = TRUE;
					m_bReDump = TRUE;
					continue;
				}
			}
			*/
			continue;

		}
		else
		{
			/* ================================================
				No error has happened, clear the error counter
			 =================================================*/
			pCurGTd->bfErrorCount = 0;

		}

		pCurGTd->bfConditionCode = sPTDReDump[index].bCompletionCode;

		//	if( (sPTDReDump[index].bCompletionCode == 0x9) && (pCurGTd->bfShortPacketOk == 1))
		if (sPTDReDump[index].bCompletionCode == 0x9) 
		{
			pCurGTd->bfConditionCode = 0;
		}
		//Some devices may return more data than you request. don't treat them as error
		if (sPTDReDump[index].bCompletionCode == 0x8) 
		{
			pCurGTd->bfConditionCode = 0;
			RETAILMSG(1, (TEXT("PHCD:: PTD completion error: %d, EpNum %d\r\n"), 
					sPTDReDump[index].bCompletionCode, pEndpt->endptArrayNum));
		}

		if (sPTDReDump[index].bCompletionCode)
			RETAILMSG(1, (TEXT("PHCD:: PTD completion error: %d, EpNum %d\r\n"), 
					sPTDReDump[index].bCompletionCode, pEndpt->endptArrayNum));
	
		/*=====================================================================/
			2) Update CurrentBufferPoint
		/======================================================================*/

		pCurGTd->paCurBuffer = pCurGTd->paCurBuffer + sPTDReDump[index].bActualBytes;

		/*=====================================================================/
		(Sepc 6.4.4.6)  Transfer Desciptor Retirement 
			(1), put to the done queue
			(2), update Endpoints TD, put the next in the first place
			(3), DataToggleCarry bit
		/======================================================================*/

		/*=====================================================================/
			(3), DataToggleCarry bit. 
		/======================================================================*/

		if ( (sPTDReDump[index].bCompletionCode & gcPTDCompletionCodemask) == 0)
		{
			pEndpt->fPhcdToggleBit = sPTDReDump[index].bfToggle;
		}
			
		/*=====================================================================/
			(2), update Endpoints TD, put the next in the first place
		/======================================================================*/

		pEndptDesc->paTdQueueHead = pCurGTd->paNextTd;
		DEBUGMSG(ISPEP, 
			(TEXT("PHCD:: TD 0x%08X is put to the TdQueueHead\r\n"), 
			pCurGTd->paNextTd));
	
		/*=====================================================================/
			(1), put to the done queue
		/======================================================================*/
		
		ULONG paDoneHead;
		paDoneHead = READ_REGISTER_ULONG(HcDoneHead(m_regBase));
		pCurGTd->paNextTd = paDoneHead;
		WRITE_REGISTER_ULONG(HcDoneHead(m_regBase), paCurGTd);

		*pInterrupts |= gcHcInterruptStatusWDHmask;

		
		DEBUGMSG(ISP1161DBG, 
				(TEXT("PHCD: PTD(s) %u TD 0x%08X is passed to donehead\r\n"), 
				m_TdsPutToATLIndex, paCurGTd));
	} //End of For Loop, which read out the TD that has been processed by HC

	
	  /*======================================================================/
	   After reading out ATL buffer, we save the PTD that should be redumped 
	   to m_TdsRePutToATL array. And now we dump them again to ATL.
	   Note, this should be put outside of the for loop. 
	/======================================================================*/
	if (m_bReDump)
	{
		return;
	}

	/*=====================================================================/
		Reset m_TdsPutToATLIndex to 0. So the next time, When goes into
		ServiceTransferDescriptor to prepare ATLList, the TD "paCur" will 
		be put at the begining at the array m_TDsPutToATL[]

		Set m_ATLBeingReadOut to FALSE. means I have read them out. Cause
		when SOF comes, it will only call SeviceList, when this is FALSE. 
	/======================================================================*/

	m_TdsPutToATLIndex		= 0;
	m_ATLBeingReadOut		= FALSE;

}

VOID CPhcd::ReDumpPtd()
{

	DEBUGMSG(ISP1161DBG, 
		(TEXT("PHCD:: ReDumpPtd called, %d\r\n"), m_TdsPutToATLIndex));

	SGeneralTransferDescriptor*		pCurGTd;
	ULONG							paCurGTd;

	/*======================================================================/
	  Remove the PTDs that don't need to be dumped again. Remove the item 
	  in sPTDReDump array, if the corrosponding item in m_bsPTDReDump array 
	  is FALSE.
	  This is added on 22, Nov. This also means sPTDReDump[index].bfActive = 0
	  can be removed. m_bsPTDReDump is FALSE means this PTD needs not to be tried.
	/=======================================================================*/

	UINT i=0;
	
	while( i < m_TdsPutToATLIndex )
	{
		
		if ( m_bsPTDReDump[i] == FALSE ) 
		{
			if ( i == (m_TdsPutToATLIndex -1))
				m_TdsPutToATLIndex--;
			else
			{
				for ( UINT j=i; j< (m_TdsPutToATLIndex - 1); j++)
				{
					m_TdsPutToATL[j] = m_TdsPutToATL[j+1];
					sPTDReDump[j] = sPTDReDump[j+1];
					m_bsPTDReDump[j] = m_bsPTDReDump[j+1];
				}
				m_TdsPutToATLIndex--;
			}
		}
		else
			i++;
	}


	/*========================================================/
		Depending on OHCD spec page 101 to calcuate length.
		Calcuate data length of each TD and m_ATLTransferLen
	/========================================================*/
	m_ATLTransferLen = 0;

	for (UINT index =0; index < m_TdsPutToATLIndex; index++)
	{
		
		paCurGTd = m_TdsPutToATL[index];
		pCurGTd = (SGeneralTransferDescriptor*)m_pobMem->PaToVa(paCurGTd);

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

		ASSERT(pDev);

		EnterCriticalSection(&pDev->csAccessingEndpointArray);
		pEndpt = pDev->ppEndpts[pCurGTd->bfEndptArrayNum];
		LeaveCriticalSection(&pDev->csAccessingEndpointArray);

		ASSERT(pEndpt);

		pEndptDesc = pEndpt->pEd;

		USHORT dwBufferLen;
							
		if (pCurGTd->paCurBuffer == 0)
		{
			dwBufferLen = 0;
		}
		else
		{
			USHORT uspaBufferEnd = (USHORT)(pCurGTd->paBufferEnd & 0xFFF);
			USHORT uspaCurBuffer = (USHORT)(pCurGTd->paCurBuffer & 0xFFF);
		//	dwBufferLen = (USHORT)((pCurGTd->paBufferEnd & 0xFFF) - (pCurGTd->paCurBuffer & 0xFFF));
			dwBufferLen = uspaBufferEnd - uspaCurBuffer;

			if ( (pCurGTd->paBufferEnd & 0xFFFFF000) != (pCurGTd->paCurBuffer & 0xFFFFF000))
				dwBufferLen += 4096;
			dwBufferLen += 1;

			/*===================================================================/
				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_TdsPutToATLIndex -1)
			{
				if (dwBufferLen %4)
				{
					USHORT dwPayLoad = 4 - dwBufferLen % 4;
					m_ATLTransferLen += dwPayLoad;
				}
			}
		}
			
		m_ATLTransferLen += dwBufferLen + sizeof(SPhilipsTransferDescriptor);
	
	}

	//Transfer counter
	
	WRITE_REGISTER_USHORT(HcWRTransCounter(m_regBase), m_ATLTransferLen);
			
	WRITE_PORT_USHORT((PUSHORT)(m_regBase+2), 0xc1);

	for ( index = 0; index < m_TdsPutToATLIndex ; index++)
	{
	
		paCurGTd = m_TdsPutToATL[index];
		pCurGTd = (SGeneralTransferDescriptor*)m_pobMem->PaToVa(paCurGTd);

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

		ASSERT(pDev);

		EnterCriticalSection(&pDev->csAccessingEndpointArray);
		pEndpt = pDev->ppEndpts[pCurGTd->bfEndptArrayNum];
		LeaveCriticalSection(&pDev->csAccessingEndpointArray);

		ASSERT(pEndpt);

		pEndptDesc = pEndpt->pEd;

		//Depending on OHCD spec page 101 to calcuate length.
		USHORT dwBufferLen;
									
		//Calcuate the data length of each TD
					
		if (pCurGTd->paCurBuffer == 0)
		{
			dwBufferLen = 0;
		}
		else
		{
			dwBufferLen = (USHORT)((pCurGTd->paBufferEnd & 0xFFF) - (pCurGTd->paCurBuffer & 0xFFF));

			if ( (pCurGTd->paBufferEnd & 0xFFFFF000) != (pCurGTd->paCurBuffer & 0xFFFFF000))
				dwBufferLen += 4096;
			dwBufferLen += 1;

		}
					

		/*=====================================================================/
			Write PTD and data to ATL buffer 
		/======================================================================*/
				
		if (index == m_TdsPutToATLIndex -1)
			sPTDReDump[index].bfLastTd	= 1;
		else
			sPTDReDump[index].bfLastTd	= 0;

		PUSHORT psPTDData;
		PUSHORT pData;
		psPTDData = (PUSHORT)&sPTDReDump[index];
				
		for (UINT i = 0; i< sizeof(SPhilipsTransferDescriptor)/sizeof(USHORT); i++)
			WRITE_PORT_USHORT((PUSHORT)m_regBase, *(psPTDData+i));

		if ( pCurGTd->paCurBuffer) 
		{
			pData = (PUSHORT)m_pobMem->PaToVa(pCurGTd->paCurBuffer);
					
			// 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 PayLoad data to ATL buffer 
			/======================================================================*/
				
			if  (index < m_TdsPutToATLIndex -1)
			{
				if (dwBufferLen %4)
				{
					DWORD dwPayLoad = 4 - dwBufferLen % 4;
					for (i=0; i< (dwPayLoad)/sizeof(USHORT); i++)
					{
						WRITE_PORT_USHORT((PUSHORT)m_regBase, 0);
					}
				}
			}
		}

		DEBUGMSG(ISP1161DBG, 
			(TEXT("PHCD::PTD(s) %d, TD 0x%08X -> [%d], bufferLen %u, ATL Len: %d, EdptType %d, CurBuffer 0x%08X\r\n"), 
			m_TdsPutToATLIndex, paCurGTd, index, dwBufferLen, m_ATLTransferLen, pEndpt->endptType, pCurGTd->paCurBuffer));
		
	} 
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美专区日韩专区| 69久久99精品久久久久婷婷| 久久99精品久久久久久动态图| 亚洲欧美激情插 | 亚洲chinese男男1069| 一区二区三区精品在线| 亚洲色图19p| 亚洲色图欧美偷拍| 亚洲一区在线观看免费观看电影高清 | 成人免费av网站| 不卡的av中国片| 91在线观看成人| 91搞黄在线观看| 91高清在线观看| 欧美精品aⅴ在线视频| 欧美高清www午色夜在线视频| 欧美一区二区三区性视频| 日韩欧美aaaaaa| 久久精品水蜜桃av综合天堂| 中文字幕欧美日本乱码一线二线 | 丁香婷婷综合色啪| caoporn国产精品| 色吊一区二区三区 | 日本中文字幕一区二区视频| 免费人成黄页网站在线一区二区| 男男视频亚洲欧美| 国产丶欧美丶日本不卡视频| fc2成人免费人成在线观看播放| 91影院在线观看| 欧美日韩精品高清| 26uuu亚洲综合色| 国产精品美女www爽爽爽| 亚洲美女电影在线| 蜜臀国产一区二区三区在线播放 | 91精品国产综合久久久久久| 日韩久久久精品| 亚洲人吸女人奶水| 秋霞午夜鲁丝一区二区老狼| 国产成人免费视频| 在线观看国产日韩| 欧美精品一区二区精品网| 亚洲天堂a在线| 久久精品国内一区二区三区| 丰满岳乱妇一区二区三区| 欧美性受xxxx黑人xyx| 亚洲精品一区二区三区四区高清 | 极品美女销魂一区二区三区| av高清久久久| 欧美日韩精品三区| 欧美激情在线观看视频免费| 亚洲国产精品久久人人爱| 极品瑜伽女神91| 在线看国产日韩| 国产夜色精品一区二区av| 亚洲一区自拍偷拍| 国产激情视频一区二区三区欧美| 在线中文字幕不卡| 久久午夜老司机| 首页国产丝袜综合| 高清国产午夜精品久久久久久| 欧美精品aⅴ在线视频| 亚洲天堂av一区| 狠狠狠色丁香婷婷综合久久五月| 欧美在线影院一区二区| 久久久www成人免费无遮挡大片| 亚洲男女一区二区三区| 国产丶欧美丶日本不卡视频| 91精品国产综合久久久久久久 | 午夜视频在线观看一区二区| 懂色av一区二区在线播放| 欧美丰满嫩嫩电影| 亚洲人成7777| 国产成人精品综合在线观看 | 欧美日本在线视频| 国产精品免费视频观看| 久久97超碰国产精品超碰| 欧美日韩精品一区二区三区四区| 国产精品成人在线观看| 国产在线国偷精品产拍免费yy| 欧美日韩亚洲高清一区二区| 中文字幕五月欧美| 国产传媒一区在线| 日韩精品一区二区在线| 亚洲自拍偷拍九九九| 91热门视频在线观看| 久久精品免费在线观看| 国产精品综合一区二区| 欧美电影免费观看高清完整版在线观看| 亚洲国产另类av| 91久久精品午夜一区二区| 国产精品国产自产拍在线| 国产高清亚洲一区| www国产精品av| 麻豆国产精品一区二区三区| 欧美精品丝袜久久久中文字幕| 亚洲国产精品久久不卡毛片| 一本久久a久久免费精品不卡| 国产精品久久久久久久久果冻传媒 | 中文字幕在线播放不卡一区| 高清成人免费视频| 国产精品网站在线观看| 成人免费三级在线| 中文字幕第一区二区| 国产a视频精品免费观看| 日本一区二区在线不卡| 精品少妇一区二区三区日产乱码| 日日骚欧美日韩| 日韩欧美亚洲国产另类| 看电视剧不卡顿的网站| 久久综合色之久久综合| 国产一区二区精品久久99| 久久久久亚洲蜜桃| 成人激情免费视频| 亚洲视频在线观看一区| 日本韩国欧美在线| 天天综合色天天| 日韩精品中文字幕在线一区| 国产一区二三区好的| 亚洲国产高清在线| 色哟哟欧美精品| 亚洲成人av中文| 欧美一级精品在线| 国产精一品亚洲二区在线视频| 中文无字幕一区二区三区 | 欧美激情在线观看视频免费| 91丨porny丨蝌蚪视频| 亚洲一区在线视频| 欧美一级片在线| 国产成人在线看| 自拍偷拍国产精品| 欧美日韩精品三区| 国产一区高清在线| 亚洲欧美日本在线| 91精品国产综合久久久蜜臀图片| 国产在线观看免费一区| 亚洲欧美日韩系列| 日韩一区二区在线看| 成人精品国产一区二区4080| 一区二区三区日韩精品| 欧美变态口味重另类| 不卡的看片网站| 婷婷久久综合九色国产成人| 国产亚洲视频系列| 色久综合一二码| 蜜臂av日日欢夜夜爽一区| 国产精品嫩草99a| 欧美日韩久久一区| 国产精品18久久久久久久久久久久| 亚洲免费观看高清完整| 欧美sm极限捆绑bd| 色综合天天综合狠狠| 美国毛片一区二区三区| 最新中文字幕一区二区三区| 8x8x8国产精品| 成人av在线观| 美国十次了思思久久精品导航| 国产精品灌醉下药二区| 欧美精品视频www在线观看| 国产91丝袜在线18| 日韩精品国产精品| 国产精品国产馆在线真实露脸| 91精品国产黑色紧身裤美女| 粉嫩绯色av一区二区在线观看| 日韩黄色免费电影| 亚洲精品日日夜夜| 久久精品一区二区三区四区| 欧美日韩国产乱码电影| 不卡的av中国片| 国产一区二区三区电影在线观看| 亚洲动漫第一页| 中文字幕在线观看不卡| 2021国产精品久久精品| 欧美精品乱码久久久久久按摩| 91丨porny丨首页| 国产高清精品久久久久| 免费在线看成人av| 亚洲伦理在线精品| 亚洲国产激情av| 久久综合精品国产一区二区三区| 欧美精品一级二级三级| 91麻豆福利精品推荐| 国产成人午夜高潮毛片| 九九久久精品视频| 丝袜a∨在线一区二区三区不卡| 亚洲激情男女视频| 国产精品久久久久影院| 久久综合九色综合97婷婷女人| 91精品啪在线观看国产60岁| 在线观看91精品国产入口| 99国产精品久久久| 成人性视频网站| 国产成人在线免费| 国产精品一区三区| 国模少妇一区二区三区| 免费在线观看视频一区| 天天综合网天天综合色| 五月天视频一区| 亚洲成人动漫一区| 亚洲午夜久久久久久久久电影网| 亚洲人成在线播放网站岛国|