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

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

?? isp1161hc.cpp

?? ISP1161 USB Driver under WinCE for StrongARM processor implementation
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
/*++
Copyright (c) 2000  Philips Electronic Company, APIC

Module Name:  
    Isp1161Hc.cpp
Abstract:  
    This file implements the USB host controller driver for the
    Philips ISP1161 HCI interface.
Author:
	Zou Ying
Notes: Intial code released	 by zou ying for the x86 platform.												 

--*/

// C4100 unrefrenced formal parameter
// C4101 unrefrenced local variable
// C4705 statement has no effect
// C4706 assignment in conditional
#pragma warning (3 : 4100 4101 4705 4706)

#include <windows.h>
extern "C" {  // nkintr.h now contains this, but autopc doesn't have the latest,
              // so include here as well for now.
#include <nkintr.h>
}
#include <ceddk.h>
#include <phcdddsi.h>

#include "hcdi.h"
#include "globals.hpp"
#include "mem.hpp"
#include "hub.hpp"
#include "phcdinc.hpp"
#include "phcd.hpp"


#define ISP1161DBG	0
#define ISPDATADBG	0
#define ISPEP		0

DWORD CPhcd::ServiceList(PULONG pInterrupts)
{
	pInterrupts = pInterrupts;
	ServiceITLList();
	ServiceATLList();
	return 0;
}

DWORD CPhcd::ServiceITLList()
{
	
	ULONG ulHcControlValue = READ_REGISTER_ULONG(HcControl(m_regBase)); 

	if( ulHcControlValue & gcHcControlPLEmask) 
	{
		ULONG ulIsoListEnabled = ulHcControlValue & gcHcControlIEmask;
		if (ulIsoListEnabled)
		{
			ServiceEndpoint(gcEndptTypeIsochronous);
		
		}
	}

	//if m_TdsPutToITLFirstIndex is NOT 0
	if ( m_TdsPutToITLFirstIndex != 0 || m_TdsPutToITLSecondIndex != 0 )
	{
		ServiceITLTransferDescriptor(m_TdsPutToITLFirstIndex, m_TdsPutToITLFirst);
		ServiceITLTransferDescriptor(m_TdsPutToITLSecondIndex, m_TdsPutToITLSecond);
	
	}

	return 0;
  	
}

DWORD CPhcd::ServiceATLList()
{

	/*=========================================================
	  We first check whether m_bReDump is TRUE or not. It it is,
	  that means, we can't server list, cause right now, some 
	  PTD needs to be dumped again. We will call ReDump to dump
	  the PTDs. If m_bReDump is FALSE, we will begin to process
	  each list. 
	==========================================================*/
	if (m_bReDump == TRUE)
	{
		ReDumpPtd();
		m_bReDump = FALSE;
		return 0;
	}

	/*========================================================
		This ServiceList will be called every 1ms. It is possible
		we can't dump PTD to ATL buffer, cause if you dump PTD
		in the previous ms, hardware will be busy to process
		ATL buffer in this ms. So, in this frame, you should 
		lave the buffer as it is. We use a variable m_ATLBeingReadOut
		to record whether ATL buffer is busy or free. If it is
		FALSE, we can ServiceList. If not, we will leave this 
		routine. This variable will be set to TRUE in IsTDComplete
	==========================================================*/
	if ( m_ATLBeingReadOut == TRUE)
		return 0;

	//Begin check lists. 
	ULONG ulHcControlValue = 0;

	ulHcControlValue = READ_REGISTER_ULONG(HcControl(m_regBase)); 
	
	// Porcess Perodic List
	if( ulHcControlValue & gcHcControlPLEmask) 
	{
		uFrameNumber = *HccaFrameNumber(m_pHcca);
		ULONG paCur = *(HccaInterrupt(m_pHcca, (uFrameNumber & 0x1F))); 

		if ( paCur)
		{
			SEndpointDescriptor* pCur = (SEndpointDescriptor*)m_pobMem->PaToVa(paCur);
			
			//OK, here is the first endpoint, it can't be ISO, so 
			//Service Interrupt endpoint directly. 
			ServiceEndpoint(gcEndptTypeInterrupt);
		}
	}
  	
	//Process Control List
	if( ulHcControlValue & gcHcControlCLEmask )
	{
		m_ControlBulkRatio = (ulHcControlValue & gcHcControlCBSRmask) + 1;  

		while (m_ControlBulkRatio)
		{
			ULONG paCtrlCurEd = READ_REGISTER_ULONG(HcControlCurrentEd(m_regBase));
			if (paCtrlCurEd)
			{
				DEBUGMSG(ISP1161DBG, 
					(TEXT("PHCD:: Processing Control List,when ControlCurrentEdpoint is set\r\n")));
				ServiceEndpoint(gcEndptTypeControl);
				//should check frame time left
			}
			else
			{
				ULONG dwValue = READ_REGISTER_ULONG(HcCommandStatus(m_regBase));
				if (dwValue & gcHcCommandStatusCLFmask)
				{
					ULONG paCtrlHeadEd;
					paCtrlHeadEd = READ_REGISTER_ULONG(HcControlHeadEd(m_regBase));

					WRITE_REGISTER_ULONG(HcControlCurrentEd(m_regBase), paCtrlHeadEd);
							
					//OHCI spec Page 96
					ClearControlListFilledBit(m_regBase);
							
					ULONG paCtrlCurEd = READ_REGISTER_ULONG(HcControlCurrentEd(m_regBase));
					if (paCtrlCurEd)
					{
						DEBUGMSG(ISP1161DBG, 
							(TEXT("PHCD:: Processing Control List,when ControlHeadEdpoint is set\r\n")));
						ServiceEndpoint(gcEndptTypeControl);
						//should check frame time left
					}
				}
			}
			
			m_ControlBulkRatio--;
		}
	}

	//Process Bulk List
	if( ulHcControlValue & gcHcControlBLEmask)
	{		
			
		ULONG paBulkCurEd = READ_REGISTER_ULONG(HcBulkCurrentEd(m_regBase));			
		if (paBulkCurEd )
		{
				
			DEBUGMSG(ISP1161DBG, 
				(TEXT("PHCD:: Processing Bulk List,when BulkCurrentEdpoint is set\r\n")));
			ServiceEndpoint(gcEndptTypeBulk);
		}
		else
		{
				
			ULONG dwValue = READ_REGISTER_ULONG(HcCommandStatus(m_regBase));
							
			if (dwValue & gcHcCommandStatusBLFmask)
			{
				ULONG paBulkHeadEd;

				paBulkHeadEd = READ_REGISTER_ULONG(HcBulkHeadEd(m_regBase));

				WRITE_REGISTER_ULONG(HcBulkCurrentEd(m_regBase), paBulkHeadEd);
								
				//OHCI spec Page 96
				ClearBulkListFilledBit(m_regBase);

				ULONG paBulkCurEd = READ_REGISTER_ULONG(HcBulkCurrentEd(m_regBase));
				if (paBulkCurEd)
				{
					DEBUGMSG(ISP1161DBG, 
						(TEXT("PHCD:: Processing Bulk List,when BulkHeadEdpoint is set\r\n")));
					ServiceEndpoint(gcEndptTypeBulk);
					//should check frame time left
				}

			}
		}
		
	}
		
	/*======================================================
	 We have prepared all the TDs that should be dumped to
	 ATL buffer, next fire ServiceTransferDescriptor
	=======================================================*/

	if ( m_TdsPutToATLIndex != 0)
		ServiceATLTransferDescriptor();
	
	return (0);
}

void CPhcd::ServiceEndpoint(UINT dwEndpointType)
{

	SEndpointDescriptor* pCurEPDescriptor;
	ULONG paCur;
	ULONG paTd;

	int i=0;

	/*=======================================================
		First, calculate how many PTDs we should prepare
	/=======================================================*/
	
	switch(dwEndpointType)
	{
		
	case gcEndptTypeControl:
				
		paCur = READ_REGISTER_ULONG(HcControlCurrentEd(m_regBase));
			
		while ( paCur != 0)
		{
			
			pCurEPDescriptor = (SEndpointDescriptor*)m_pobMem->PaToVa(paCur);
			
			if (pCurEPDescriptor->bfSkip)  //Don't forget halt bit.
			{
				paCur = pCurEPDescriptor->paNextEd;
				continue;
			}
			
			paTd = (pCurEPDescriptor->paTdQueueHead & gcEdTdQueueHeadMask);
		
			if( (paTd != gcStaticEdIdentifier) && (paTd != pCurEPDescriptor->paTdQueueTail))
			{
			
				/*=======================================================
					This variable records how many times Endpoint is
					services, which means, how many TDs are supposed to 
					be put into the list. 
				/=======================================================*/
				m_EdpointServicedOne1ms++;			
				
				/*===============================================================/
					Put the TD which will be processed to m_TdsPutToATL[] buffer
				/===============================================================*/

				m_TdsPutToATL[m_TdsPutToATLIndex] = pCurEPDescriptor->paTdQueueHead;
				m_TdsPutToATLIndex++;

				//OHCI spec Page 98
				SetControlListFilledBit(m_regBase);

				/*================================================================
				 We have recorded the PTD that will be processed and are going to
				 jump out of this loop. At this time, we should also update CuurentEd
				 to the next ed.
				==================================================================*/
				paCur = pCurEPDescriptor->paNextEd; 
				WRITE_REGISTER_ULONG(HcControlCurrentEd(m_regBase), paCur);
				break;
			}

			paCur = pCurEPDescriptor->paNextEd; 
			WRITE_REGISTER_ULONG(HcControlCurrentEd(m_regBase), paCur);
		
		}
		
		break;
	case gcEndptTypeBulk:
		
		paCur = READ_REGISTER_ULONG(HcBulkCurrentEd(m_regBase));
					
		while ( paCur != 0) 
		{
			pCurEPDescriptor = (SEndpointDescriptor*)m_pobMem->PaToVa(paCur);
			
			if (pCurEPDescriptor->bfSkip)  //Don't forget halt bit.
			{
				paCur = pCurEPDescriptor->paNextEd;
				continue;
			}

			paTd = (pCurEPDescriptor->paTdQueueHead & gcEdTdQueueHeadMask);
		
			if ( paTd != gcStaticEdIdentifier && paTd != pCurEPDescriptor->paTdQueueTail )
			{
				m_EdpointServicedOne1ms++;
				
				/*=====================================================================/
					Put the TD which will be processed to m_TdsPutToATL[] buffer
				/=====================================================================*/

				m_TdsPutToATL[m_TdsPutToATLIndex] = pCurEPDescriptor->paTdQueueHead;
				m_TdsPutToATLIndex++;

				//OHCI spec Page 98
				SetBulkListFilledBit(m_regBase);

				paCur = pCurEPDescriptor->paNextEd; //Goes to the next
				WRITE_REGISTER_ULONG(HcBulkCurrentEd(m_regBase), paCur);
				break;
			}

			paCur = pCurEPDescriptor->paNextEd; //Goes to the next
			WRITE_REGISTER_ULONG(HcBulkCurrentEd(m_regBase), paCur);
			
		}

		break;
	case gcEndptTypeInterrupt:

		uFrameNumber = *HccaFrameNumber(m_pHcca);
		paCur = *HccaInterrupt(m_pHcca, (uFrameNumber & 0x1F)); 

		while ( paCur != 0) 
		{
			pCurEPDescriptor = (SEndpointDescriptor*)m_pobMem->PaToVa(paCur);
			
			if (pCurEPDescriptor->bfSkip || pCurEPDescriptor->bfIsIsochronous)  //Don't forget halt bit.
			{
				paCur = pCurEPDescriptor->paNextEd;
				continue;
			}
			
			paTd = (pCurEPDescriptor->paTdQueueHead & gcEdTdQueueHeadMask);
			if ( paTd != gcStaticEdIdentifier && paTd != pCurEPDescriptor->paTdQueueTail )
			{
				
				/*=====================================================================/
					Put the TD which will be processed to m_TdsPutToATL[] buffer
				/=====================================================================*/

				m_TdsPutToATL[m_TdsPutToATLIndex] = pCurEPDescriptor->paTdQueueHead;
				m_TdsPutToATLIndex++;
			}
			
			paCur = pCurEPDescriptor->paNextEd; //Goes to the next
		}
		
	
		break;

	case gcEndptTypeIsochronous:
		
		uFrameNumber = *HccaFrameNumber(m_pHcca);
		paCur = *HccaInterrupt(m_pHcca, (uFrameNumber & 0x1F)); 

		while ( paCur != 0) 
		{
			pCurEPDescriptor = (SEndpointDescriptor*)m_pobMem->PaToVa(paCur);
			
			//We have reached to the bottom. It's possible this Endpoint 
			// is "skip" and not an ISO.
			if (pCurEPDescriptor->bfSkip || (pCurEPDescriptor->bfIsIsochronous == 0))  
			{
				paCur = pCurEPDescriptor->paNextEd;
				continue;
			}
			
			paTd = (pCurEPDescriptor->paTdQueueHead & gcEdTdQueueHeadMask);
			if ( paTd != gcStaticEdIdentifier && paTd != pCurEPDescriptor->paTdQueueTail )
			{
				/*=====================================================================/
					Put the TD which will be processed to m_TdsPutToATLA or B[] buffer
					If buffer A is empty, we put to A, If buffer B is empty, 
					we put to B. One more thing, by the time we put one TD to A, it is
					possible this TD has already been put to B, and vice verca. So, every
					time we put something to A, we check whether this TD is inside B, if
					it is, we will not this TD to A anymore. 
					Policy updates:
					The purpose of this function is to find out how many offset this ITD 
					may have and allocate each of them to ITLA and ITLB alternatively.
					Not matter what, ITLA and ITLB contains the same ISO TD. 
					Well, we still need to guanrantee whether this TD is already dumped. 
				/=====================================================================*/

				SIsochTransferDescriptor*		pITd;
				SIsochTransferDescriptor*		pNextITd;
				ULONG							paNextITd;

				pITd = (SIsochTransferDescriptor*)m_pobMem->PaToVa(paTd);
				
				BOOL bFirstFilledIn = FALSE;
				if (m_TdsPutToITLFirstIndex == 0)
				{	
					m_TdsPutToITLFirst[m_TdsPutToITLFirstIndex] = paTd;
					m_TdsPutToITLFirstIndex++;
					bFirstFilledIn = TRUE;

					RETAILMSG(0, 
					(TEXT("PHCD::ServiceEndpoint: %d ISO TD: 0x%08X is added to ITLFirst, FrameNumber 0x%08X\r\n"),
								m_TdsPutToITLFirstIndex, pCurEPDescriptor->paTdQueueHead, uFrameNumber));
				}

				//If First is filled in, we will choose the next.
				
				if (bFirstFilledIn == TRUE)
				{
					paNextITd = pITd->paNextTd; 				
				}
				else
				{
					paNextITd = paTd;
				}

				if ( paNextITd != gcStaticEdIdentifier && paNextITd != pCurEPDescriptor->paTdQueueTail )
				{
					pNextITd = (SIsochTransferDescriptor*)m_pobMem->PaToVa(paNextITd);

					if (m_TdsPutToITLSecondIndex == 0)
					{
						m_TdsPutToITLSecond[m_TdsPutToITLSecondIndex] = paNextITd;
						m_TdsPutToITLSecondIndex++;

						RETAILMSG(0, 
							(TEXT("PHCD::ServiceEndpoint: %d ISO TD: 0x%08X is added to ITLSecond, FrameNumber 0x%08X\r\n"),
								m_TdsPutToITLSecondIndex, paNextITd, uFrameNumber));
					}
				}
				
			}
			
			paCur = pCurEPDescriptor->paNextEd; //Goes to the next
		}
	
		break;
	default:
		break;

	}
}

void CPhcd::ServiceITLTransferDescriptor(ULONG m_TdsPutToITLIndex, ULONG m_TdsPutToITL[])
{
	SIsochTransferDescriptor*		pCurITd;
	ULONG							paCurITd;
	ULONG							m_ITLTransferLen;

	uFrameNumber = *HccaFrameNumber(m_pHcca);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
不卡视频一二三四| 日韩精品一区在线观看| 3751色影院一区二区三区| 久久综合99re88久久爱| 亚洲黄色性网站| 国产精品综合二区| 91精品国产91综合久久蜜臀| 国产精品无人区| 精品一区二区在线观看| 欧美日韩一级大片网址| 中文字幕的久久| 久久99国产精品免费| 欧美色综合网站| 亚洲欧洲精品一区二区三区不卡| 韩国在线一区二区| 91精品婷婷国产综合久久竹菊| 日韩一区欧美小说| 成人av综合在线| 欧美国产乱子伦| 国产一区二区导航在线播放| 91精品一区二区三区在线观看| 亚洲精品乱码久久久久久日本蜜臀| 国产精品一区二区在线看| 欧美日韩精品欧美日韩精品一| 亚洲男同1069视频| 99久久精品国产导航| 精品国产乱码91久久久久久网站| 亚洲综合久久av| 色综合久久综合中文综合网| 国产精品三级视频| 北条麻妃国产九九精品视频| 亚洲国产精品精华液2区45| 美女被吸乳得到大胸91| 欧美一级日韩免费不卡| 美女久久久精品| 久久久久久久久久看片| 国产一区二区三区在线观看免费视频| 欧美电影影音先锋| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美电影一区二区三区| 美女网站在线免费欧美精品| 欧美电影一区二区| 精品无人区卡一卡二卡三乱码免费卡| 日韩欧美精品三级| 国产精品一品二品| 国产精品理论片在线观看| 成人天堂资源www在线| 中文字幕不卡三区| 91亚洲精品一区二区乱码| 国产精品无码永久免费888| 99久久久无码国产精品| 亚洲亚洲精品在线观看| 91精品国产福利在线观看 | 一区二区三区中文字幕精品精品 | 国产精品久久免费看| 色综合久久综合| 亚洲成人久久影院| 精品国产一区二区国模嫣然| 国产69精品一区二区亚洲孕妇| 国产精品久久影院| 欧美日韩国产高清一区二区 | 成人综合在线视频| 亚洲女人的天堂| 欧美一卡二卡三卡四卡| 国产精品性做久久久久久| 亚洲人成在线播放网站岛国| 欧美私模裸体表演在线观看| 国产一区二区三区在线观看免费 | 亚洲成人福利片| 精品国产3级a| 91麻豆精东视频| 丝袜美腿亚洲综合| 中文字幕第一页久久| 欧美福利视频导航| av在线播放不卡| 美女视频免费一区| 亚洲精品成人在线| 欧美激情一区二区三区| 欧美日韩一区 二区 三区 久久精品| 国产一区二区三区在线观看免费| 一区二区高清免费观看影视大全| 亚洲精品一区二区三区影院| 色综合天天综合网国产成人综合天| 日韩电影免费在线看| 国产午夜精品在线观看| 制服丝袜成人动漫| 色婷婷综合久久| 成人午夜av电影| 国内精品久久久久影院薰衣草| 亚洲卡通欧美制服中文| 久久精品水蜜桃av综合天堂| 欧美日本韩国一区二区三区视频| 99re亚洲国产精品| 国产激情91久久精品导航 | 一区二区三区**美女毛片| 精品国免费一区二区三区| 欧美日韩视频第一区| 色综合婷婷久久| proumb性欧美在线观看| 国产成人在线影院| 亚洲国产精品一区二区久久恐怖片 | 色综合久久久网| 国产成人无遮挡在线视频| 蜜乳av一区二区三区| 午夜精品在线看| 亚洲成人一区二区在线观看| 亚洲美女一区二区三区| 亚洲桃色在线一区| 亚洲人吸女人奶水| 亚洲人xxxx| 伊人色综合久久天天| ...xxx性欧美| 亚洲精品成人a在线观看| 一区二区三区日韩在线观看| 亚洲精品乱码久久久久| 亚洲激情六月丁香| 亚洲影院理伦片| 亚洲444eee在线观看| 日日夜夜精品视频免费| 日本系列欧美系列| 蜜桃av一区二区| 国产精品1区二区.| 成人99免费视频| 不卡av电影在线播放| 91香蕉国产在线观看软件| 日本道精品一区二区三区| 欧美色图免费看| 9191久久久久久久久久久| 日韩精品中文字幕在线不卡尤物 | 欧美精选在线播放| 欧美一区二区三区白人| 2023国产精品视频| 国产精品你懂的在线| 一区二区在线观看视频| 天天av天天翘天天综合网色鬼国产| 亚洲国产日韩一级| 激情都市一区二区| 一本大道av伊人久久综合| 欧美群妇大交群中文字幕| 久久亚洲精品国产精品紫薇| 中文字幕亚洲综合久久菠萝蜜| 亚洲国产精品影院| 国产一区二区三区综合| av午夜一区麻豆| 欧美一区二区三区四区久久 | 国产精品18久久久久久久久久久久| 高清不卡在线观看| 欧美三级在线看| 日韩欧美的一区| 中文字幕视频一区二区三区久| 亚洲 欧美综合在线网络| 国产麻豆成人传媒免费观看| 91社区在线播放| 精品国产人成亚洲区| 亚洲少妇30p| 美女视频黄 久久| 色婷婷av久久久久久久| 精品国产乱码久久久久久老虎| 1024成人网| 国内外精品视频| 欧美性高清videossexo| 国产亚洲视频系列| 午夜视频在线观看一区二区| 国产99一区视频免费| 91精品啪在线观看国产60岁| 国产精品对白交换视频| 国内欧美视频一区二区 | 亚洲国产精品自拍| 激情深爱一区二区| 欧美撒尿777hd撒尿| 国产亚洲人成网站| 美女视频一区二区| 欧美日韩国产影片| 亚洲欧美乱综合| www.66久久| 2024国产精品视频| 久久精品国产秦先生| 欧美日韩一区二区在线观看视频| 国产精品久久影院| 成人午夜免费视频| 亚洲精品在线免费播放| 蜜桃精品视频在线| 欧美一区二区三区日韩| 一区二区三区在线观看欧美| www.色精品| 欧美激情一区二区| 国产成人高清视频| 国产午夜精品美女毛片视频| 精品一区二区在线观看| 日韩一区二区三区观看| 日本sm残虐另类| 欧美日韩大陆一区二区| 亚洲国产三级在线| 欧美午夜宅男影院| 一区二区三区 在线观看视频| 不卡av在线网| 中文字幕一区二区三区四区| 97久久超碰精品国产| 亚洲欧洲日韩一区二区三区| 99久久伊人精品|