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

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

?? isp1161hc.cpp

?? ISP1161 USB Driver under WinCE for StrongARM processor implementation
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
			ULONG paDoneHead;
			paDoneHead = READ_REGISTER_ULONG(HcDoneHead(m_regBase));
			pCurITd->paNextTd = paDoneHead;
			WRITE_REGISTER_ULONG(HcDoneHead(m_regBase), paCurITd);

			while( pEndptDesc->paTdQueueHead != pEndptDesc->paTdQueueTail)
			{
				//Put the next to TdQueueHead
				paCurITd = pEndptDesc->paTdQueueHead;
				pCurITd = (SIsochTransferDescriptor*)m_pobMem->PaToVa(paCurITd);
				
				pEndptDesc->paTdQueueHead = pCurITd->paNextTd;

				//Put itself to DoneHead
				ULONG paDoneHead;
				paDoneHead = READ_REGISTER_ULONG(HcDoneHead(m_regBase));
				pCurITd->paNextTd = paDoneHead;
				WRITE_REGISTER_ULONG(HcDoneHead(m_regBase), paCurITd);
			}

			*pInterrupts |= gcHcInterruptStatusWDHmask;

			//Everything over, set them to 0
			m_TdsPutToITLFirstIndex = 0;
			m_TdsPutToITLSecondIndex = 0;

			return;
				
		}


		/*=====================================================================/
			(1), put to the done queue
		/======================================================================*/
		ULONG paDoneHead;
		paDoneHead = READ_REGISTER_ULONG(HcDoneHead(m_regBase));
		pCurITd->paNextTd = paDoneHead;
		WRITE_REGISTER_ULONG(HcDoneHead(m_regBase), paCurITd);

		*pInterrupts |= gcHcInterruptStatusWDHmask;


		RETAILMSG(0, (TEXT("PHCD: PTD(s), TD 0x%08X is passed to donehead, FrameNumber %08X\r\n"), 
					paCurITd, uFrameNumber));

	} //End of For Loop, which read out the TD that has been processed by HC

	
	//After throwing back the TD to donequeue
	*p_TdsPutToITLIndex = 0;
	
}


void CPhcd::ServiceATLTransferDescriptor()
{
	
	ULONG							paCurGTd;
	SGeneralTransferDescriptor*		pCurGTd;

	DEBUGMSG(ISP1161DBG, (TEXT("+PHCD::ServiceTransferDescriptor\r\n")));
		
	//Set Length, transfer counter
	m_ATLTransferLen		= 0;

	for(UINT i=0; i< sizeof(m_bsPTDReDump)/sizeof(BOOL); i++)
		m_bsPTDReDump[i] = FALSE;

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

	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);
	
	}

	/*=====================================================================/
				Prepare Transfer counter
	/=====================================================================*/

	//Transfer counter
	WRITE_REGISTER_USHORT(HcWRTransCounter(m_regBase), m_ATLTransferLen); 
	
	/*=====================================================================/
		Go through the array and push them one by one to ATL  
	/=====================================================================*/
	WRITE_PORT_USHORT((PUSHORT)(m_regBase+2), 0xc1);
	STRONGARM_DELAY(10);
	
	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, m_ATLTransferLen
		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;

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

		SPhilipsTransferDescriptor		sPTD;
		sPTD.bActualBytes		= 0;
			
		/*=====================================================================/
			The following code is to calcuate the data toggling. For control
			pipe, I am clear, the code is right. 
			As for Bulk transfer, cause ISP1161 can toggle itself. So, just
			set the toggle bit to 0. 
		/======================================================================*/
		{
					
			if (dwEndpointType == gcEndptTypeControl) 
			{
				if (pCurGTd->bfDataToggle & 0x2)
				{
					sPTD.bfToggle = pCurGTd->bfDataToggle & 0x1;
					m_DataToggleBit = 1;
				}
				else
				{
					sPTD.bfToggle = m_DataToggleBit;
					if (m_DataToggleBit == 0)
						m_DataToggleBit = 1;
					else
						m_DataToggleBit = 0;
				}
			}
			else
			{
				sPTD.bfToggle = pEndpt->fPhcdToggleBit;
			}

		}

		sPTD.bfActive			= 1; //Start the transfer
		sPTD.bCompletionCode    = 0;
		sPTD.bMaxPacketSize		= pEndptDesc->bfMaxPacketSize; //Lost the MSB
		sPTD.bfSpeed			= pEndptDesc->bfIsLowSpeed;

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

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

		sPTD.bfPID				= pCurGTd->bfPID;
		if (dwEndpointType == gcEndptTypeInterrupt)
			sPTD.bTokenOnce = 1;
		else
			sPTD.bTokenOnce = 0;

		sPTD.bfAddr				= pCurGTd->bfAddr;
		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));
			STRONGARM_DELAY(10);
		}
										
		//Data in the TD 

		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));
				
				//Zouying, This should be removed to reach 14 packets for bulk
				STRONGARM_DELAY(10);
			}

			/*=====================================================================/
				Send Alignment (4 bytes) data to ATL buffer 
			/======================================================================*/
			if (index < m_TdsPutToATLIndex -1)
			{
				if (dwBufferLen %4)
				{
					DWORD dwPayLoad = 4 - dwBufferLen % 4;
					
					DEBUGMSG(ISP1161DBG, (TEXT("PHCD:: Payload data is written, %u, atl Len %u\r\n"), 
						dwPayLoad, m_ATLTransferLen));
					
					for (i=0; i< dwPayLoad/sizeof(USHORT); i++)
					{
						WRITE_PORT_USHORT((PUSHORT)m_regBase, 0);
						STRONGARM_DELAY(10);
					}
				}
			}
	
		}

		DEBUGMSG(ISP1161DBG, 
			(TEXT("PHCD::PTD(s)%d,TD 0x%08X->[%d],bufLen %u,EP %d,CurBuf 0x%08X\r\n"), 
			m_TdsPutToATLIndex, paCurGTd, index, dwBufferLen, pEndpt->endptType, pCurGTd->paCurBuffer));

	}//End of For loop

	/*=====================================================================/
		Set m_ATLBeingReadOut to TRUE. When the next interrupt comes, 
		even though we expect it to be ATLInt, which means the ATL we have
		just input is finished, so the IspTDTransferComplete will be called
		to read it out and put to the done queue.
		But it is still possible, that the next interrupt coming in is
		SOF interrupt, our program will happily go to ServieList and find
		other TDs and put them to ATL buffer, even though the existing ATL
		buffer is not read out. 
	/======================================================================*/
	
	m_ATLBeingReadOut = TRUE;
	DEBUGMSG(ISP1161DBG, (TEXT("-PHCD::ServiceTransferDescriptor\r\n")));
}


VOID CPhcd::IspTDTransferComplete(PULONG pInterrupts)
{
	
	DEBUGMSG(ISP1161DBG, (TEXT("PHCD:: A TD is transferred completely\r\n")));
	
	SGeneralTransferDescriptor*		pCurGTd;
	ULONG							paCurGTd;
		
	UINT i = 0;
	/*=====================================================================/
		The TDs we have just put are finished, we will go through the 
		m_TdsPutToATL array to check whether this item needs to be dumped
		again.
	/======================================================================*/
	if ( m_TdsPutToATLIndex != 1)
	{
		//Transfer counter
		WRITE_REGISTER_USHORT(HcWRTransCounter(m_regBase), m_ATLTransferLen);
		//Read ATL command
		WRITE_PORT_USHORT((PUSHORT)(m_regBase+2), 0x41);
		STRONGARM_DELAY(10);
	}
		
	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);

		pEndptDesc = pEndpt->pEd;

		/*=====================================================================/
				Calcuate the data length of each TD 
		/=====================================================================*/

		USHORT dwBufferLen;
					
		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;
		}

		/*=====================================================================/
			Read PTD and Data out from ATL buffer 
			If there is only one PTD and the PID direction is out (either SETUP
			or OUT), we need to read out the PTD only. This can dramastically
			increase the BULK out performance, if there is only one PTD. In 
			this case, we reset the transfer count.
		/======================================================================*/
			
		PUSHORT pData;
		PUSHORT psPTDData;
		
		if ( m_TdsPutToATLIndex == 1) 
		{
			if ( pCurGTd->bfPID == 0x00 || pCurGTd->bfPID == 0x01) 
			{
				//Transfer counter
				WRITE_REGISTER_USHORT(HcWRTransCounter(m_regBase), 
					sizeof(SPhilipsTransferDescriptor));

				//Read ATL command
				WRITE_PORT_USHORT((PUSHORT)(m_regBase+2), 0x41);
				STRONGARM_DELAY(10);

				//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);
				}

			}
			else
			{
				//Transfer counter
				WRITE_REGISTER_USHORT(HcWRTransCounter(m_regBase), 
					sizeof(SPhilipsTransferDescriptor) + dwBufferLen);
				
				//Read ATL command
				WRITE_PORT_USHORT((PUSHORT)(m_regBase+2), 0x41);
				STRONGARM_DELAY(10);
				
				//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);
					}

					/*
					RETAILMSG(1, (TEXT("PHCD:****************************\r\n")));
					//Display the data
					for (i = 0; i< (dwBufferLen + 1)/sizeof(USHORT); i++)
					{
						RETAILMSG(1, (TEXT(" 0x%04X\r\n"), *(pData + i)));
					}
					*/
				}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久99国产精品久久99| 日韩欧美一级二级三级久久久| 日本一区二区三区四区在线视频 | 亚洲男女一区二区三区| caoporn国产一区二区| 亚洲视频综合在线| 在线视频一区二区三| 日本亚洲电影天堂| 国产亚洲一区二区三区四区 | 亚洲欧美日韩国产成人精品影院 | 日本丶国产丶欧美色综合| 亚洲国产欧美一区二区三区丁香婷| 在线观看国产91| 久久精品72免费观看| 欧美国产激情二区三区 | 亚洲成人激情综合网| 日韩欧美你懂的| 不卡视频免费播放| 天堂蜜桃91精品| 国产午夜精品理论片a级大结局| 91丝袜高跟美女视频| 日韩精品一二三| 中文字幕精品综合| 欧美日韩在线三区| 国产精品99久久久| 亚洲成人动漫在线观看| 久久久久久久综合色一本| 91在线观看高清| 久久99国产精品久久| 亚洲美女电影在线| 久久蜜臀中文字幕| 欧美日韩国产免费| a4yy欧美一区二区三区| 蜜臀久久99精品久久久久久9| **欧美大码日韩| 久久久美女毛片| 7777精品伊人久久久大香线蕉经典版下载 | 天堂蜜桃91精品| 中文字幕在线不卡| 精品三级av在线| 日本高清视频一区二区| 国产成人精品亚洲777人妖 | 欧美三级日韩三级| 99视频在线观看一区三区| 毛片av一区二区| 亚洲国产日韩精品| 亚洲色图一区二区| 欧美极品xxx| 精品国产一区二区在线观看| 日本韩国欧美国产| 色综合天天综合网国产成人综合天| 美女尤物国产一区| 日韩高清一级片| 性做久久久久久免费观看欧美| 国产精品妹子av| 国产亚洲欧美在线| 久久影院午夜片一区| 日韩欧美国产高清| 欧美一区二区播放| 欧美日韩色一区| 一本到一区二区三区| 成人理论电影网| 成人免费毛片高清视频| 国产不卡在线一区| 国产毛片精品视频| 国模少妇一区二区三区| 麻豆精品在线观看| 九色综合狠狠综合久久| 日本欧美在线观看| 蜜桃av一区二区| 日本不卡视频一二三区| 日韩av不卡一区二区| 日韩国产欧美三级| 奇米色一区二区三区四区| 天天影视网天天综合色在线播放 | 麻豆国产精品一区二区三区| 亚洲成人在线网站| 日韩国产一二三区| 美女视频黄 久久| 美女视频黄频大全不卡视频在线播放| 日韩精品乱码av一区二区| 奇米影视7777精品一区二区| 蜜桃一区二区三区在线| 久久99久久99| 国产精品亚洲专一区二区三区 | 国产综合久久久久久久久久久久| 另类成人小视频在线| 狠狠久久亚洲欧美| 成人av网站免费| 色婷婷激情综合| 欧美中文一区二区三区| 欧美一卡二卡三卡| 久久久久国色av免费看影院| 欧美精彩视频一区二区三区| 亚洲免费色视频| 三级精品在线观看| 久久99精品一区二区三区三区| 国产盗摄视频一区二区三区| 成人综合激情网| 在线国产电影不卡| 欧美电影免费观看完整版| 欧美激情一区二区三区四区| 亚洲天堂免费在线观看视频| 午夜精品福利久久久| 国产一区在线观看视频| 99精品欧美一区二区蜜桃免费 | 精品国内片67194| 国产女同性恋一区二区| 亚洲bdsm女犯bdsm网站| 国产精品一区二区三区网站| 日本电影亚洲天堂一区| 精品久久国产字幕高潮| 亚洲色图视频网| 九九九久久久精品| 99国产精品久久久久久久久久久| 91精品国产一区二区三区| 亚洲国产精品二十页| 日韩和欧美一区二区三区| 丁香一区二区三区| 91精品欧美一区二区三区综合在 | 国产日韩亚洲欧美综合| 亚洲精品国产无套在线观| 美女久久久精品| 一本久久综合亚洲鲁鲁五月天| 日韩免费一区二区三区在线播放| 日韩一区欧美一区| 久久99最新地址| 欧美一a一片一级一片| 国产日韩精品一区二区浪潮av| 亚洲伊人伊色伊影伊综合网| 国产乱子伦一区二区三区国色天香| 在线精品视频小说1| 国产精品伦一区| 激情综合网最新| 欧美一区二区在线观看| 一区二区三区四区视频精品免费| 国产一区二区精品久久| 日韩女同互慰一区二区| 午夜精品久久久久久久久久| 91一区在线观看| 国产亚洲一二三区| 激情文学综合丁香| 日韩欧美高清dvd碟片| 亚洲亚洲人成综合网络| 色噜噜夜夜夜综合网| 中文字幕欧美日本乱码一线二线| 捆绑调教美女网站视频一区| 欧美美女黄视频| 亚洲国产cao| 日本韩国欧美国产| 亚洲精品视频自拍| 99久久精品免费| 国产精品每日更新| 成人免费毛片片v| 国产欧美日韩视频在线观看| 国产在线日韩欧美| 亚洲精品在线观看网站| 精品一区二区影视| 欧美xxxx老人做受| 久久99九九99精品| 久久综合色一综合色88| 国产一区二区三区不卡在线观看| 日韩一区二区影院| 免播放器亚洲一区| 欧美变态tickle挠乳网站| 久久激五月天综合精品| 久久人人爽人人爽| 成人激情午夜影院| 成人欧美一区二区三区白人| www.欧美精品一二区| 亚洲精品菠萝久久久久久久| 色噜噜狠狠一区二区三区果冻| 亚洲最大的成人av| 88在线观看91蜜桃国自产| 六月丁香婷婷色狠狠久久| 久久在线观看免费| 成人国产电影网| 一区二区三区在线高清| 欧美日韩专区在线| 久久99在线观看| 国产精品久久国产精麻豆99网站| www.成人在线| 亚洲午夜私人影院| 欧美成人a在线| 成人免费av在线| 亚洲综合激情网| 日韩女优制服丝袜电影| 成人性生交大合| 亚洲激情在线播放| 91精品国产综合久久福利软件| 狠狠色狠狠色综合| 成人欧美一区二区三区小说| 欧美丝袜丝交足nylons图片| 久久黄色级2电影| 国产精品久久久久久久久快鸭| 99久久久国产精品| 免费在线观看视频一区| 国产日本欧美一区二区| 欧美少妇xxx| 国产成人啪午夜精品网站男同|