亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
欧美体内she精视频| 精品国产91乱码一区二区三区| 欧美日韩精品系列| 久久久国产综合精品女国产盗摄| 一区二区三区丝袜| 大尺度一区二区| 在线成人av网站| 中文字幕一区二区三区色视频| 日韩国产精品大片| 欧美午夜精品一区二区三区| 国产精品久久久久久久裸模| 精品一区二区三区视频| 欧美日韩在线直播| 亚洲中国最大av网站| 波多野结衣中文字幕一区 | 蜜桃av一区二区三区电影| 不卡的电影网站| 国产色综合久久| 日本成人中文字幕在线视频 | 国产精品亚洲人在线观看| 欧美顶级少妇做爰| 亚洲狠狠爱一区二区三区| 一本到不卡免费一区二区| 亚洲欧洲在线观看av| 精品中文av资源站在线观看| 欧美日韩免费高清一区色橹橹| 久久九九全国免费| 一区二区三区在线影院| 精品一区二区三区蜜桃| 欧美日韩免费高清一区色橹橹 | 99久久精品国产一区二区三区| 欧美一区二区三区在线看| 国产精品国产三级国产a| 国产一区二区女| 欧美一区二区三区在线观看视频| 亚洲精品国产一区二区精华液 | 日韩久久精品一区| 亚洲成av人片一区二区梦乃| 99久久综合色| 1000部国产精品成人观看| 国产一区二区不卡老阿姨| 日韩欧美国产午夜精品| 日韩电影在线一区二区三区| 欧美精品第一页| 日韩中文字幕av电影| 欧美猛男gaygay网站| 亚洲影视在线观看| 99久久久精品| 亚洲少妇屁股交4| av亚洲精华国产精华| 国产日韩欧美不卡| 北条麻妃国产九九精品视频| 国产精品久久久久影院老司| 国产宾馆实践打屁股91| 欧美韩国日本综合| caoporm超碰国产精品| 国产精品嫩草影院com| 国产一区二区三区| 国产欧美视频在线观看| 久久精品国产成人一区二区三区 | 精品一区二区三区蜜桃| 7777精品伊人久久久大香线蕉| 亚洲丝袜美腿综合| 色综合久久六月婷婷中文字幕| 亚洲欧洲日产国产综合网| 99热国产精品| 久久精品av麻豆的观看方式| 欧美大片国产精品| 国产成人精品亚洲日本在线桃色| 中文字幕久久午夜不卡| 不卡一卡二卡三乱码免费网站| 亚洲欧洲三级电影| 欧美日韩一区二区三区免费看| 日韩中文字幕区一区有砖一区 | 亚洲欧洲精品一区二区三区不卡| 94-欧美-setu| 婷婷综合五月天| 亚洲精品在线三区| 91美女精品福利| 蜜臀av性久久久久蜜臀av麻豆 | 久久66热re国产| 亚洲欧洲一区二区三区| 4438x成人网最大色成网站| 国产美女在线精品| 亚洲一区二区三区四区五区黄| 日韩欧美你懂的| 色噜噜狠狠色综合中国| 亚洲成人激情社区| 69堂国产成人免费视频| 国产91精品在线观看| 美女视频黄免费的久久| 精品处破学生在线二十三| av亚洲精华国产精华精华| 美日韩一区二区三区| 中文字幕亚洲欧美在线不卡| 日韩一区二区免费在线电影| 99在线精品视频| 美女视频黄 久久| 亚洲福利视频三区| 国产精品污网站| 欧美www视频| 欧美日韩精品一区二区| 国产成人激情av| 琪琪一区二区三区| 亚洲激情校园春色| 国产精品入口麻豆九色| 精品日韩在线观看| 制服丝袜中文字幕一区| 色94色欧美sute亚洲线路一ni| 极品少妇一区二区| 日本不卡视频在线| 亚洲成av人片观看| 亚洲网友自拍偷拍| 亚洲男人的天堂网| 日本一区二区不卡视频| 亚洲精品一区二区三区精华液 | 亚洲精品一区二区三区精华液| 欧美综合色免费| 91丨porny丨首页| av一区二区三区黑人| 国产精品综合网| 日韩av电影免费观看高清完整版| 一级特黄大欧美久久久| 亚洲丝袜精品丝袜在线| 欧美日韩大陆一区二区| 成人自拍视频在线| 国产综合色精品一区二区三区| 91麻豆精品久久久久蜜臀| 91精彩视频在线| 日本乱人伦aⅴ精品| 91丨porny丨中文| 色综合天天性综合| 色综合色狠狠综合色| av中文字幕亚洲| 91麻豆产精品久久久久久| av中文字幕一区| 欧美亚洲国产一区二区三区| 在线观看www91| 欧美精品第1页| 精品伦理精品一区| 日韩三级免费观看| 欧美日韩精品欧美日韩精品| 色婷婷激情综合| 国产激情91久久精品导航| 成人sese在线| 国产精品一区2区| 国产偷v国产偷v亚洲高清| 亚洲理论在线观看| 国产专区综合网| 波多野结衣视频一区| 在线中文字幕不卡| 制服丝袜中文字幕亚洲| 精品久久一区二区| 国产欧美一区二区精品忘忧草 | 久久嫩草精品久久久精品一| 久久久另类综合| 亚洲欧美影音先锋| 无码av免费一区二区三区试看| 久久精品国产亚洲一区二区三区| 国产一区在线看| 国产成人免费av在线| 3d成人动漫网站| 欧美国产亚洲另类动漫| 亚洲夂夂婷婷色拍ww47| 久久精品99国产精品日本| 成人高清免费观看| 日韩一区二区免费高清| 国产精品欧美精品| 亚洲女人的天堂| 狠狠色狠狠色综合| 91麻豆免费看片| 日韩欧美aaaaaa| 亚洲女子a中天字幕| 精品一区二区国语对白| 色94色欧美sute亚洲线路一久| 日韩精品一区二区三区四区 | 一本久久综合亚洲鲁鲁五月天 | 久久久久国产精品免费免费搜索| 国产精品乱人伦一区二区| 天天av天天翘天天综合网 | 黑人精品欧美一区二区蜜桃| 成人av电影免费在线播放| 制服丝袜国产精品| 亚洲另类春色国产| 极品少妇一区二区三区精品视频| 成人理论电影网| 这里是久久伊人| 亚洲黄网站在线观看| 懂色av噜噜一区二区三区av| 日韩三级精品电影久久久| 一区二区三区日韩| 国产成人福利片| 欧美岛国在线观看| 五月激情综合婷婷| 欧美亚洲图片小说| 亚洲欧美日韩综合aⅴ视频| 成人影视亚洲图片在线| 26uuu亚洲综合色欧美| 午夜精品久久久久久久久| 99视频精品全部免费在线|