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

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

?? phcd.cpp

?? ISP1161 USB Driver under WinCE for StrongARM processor implementation
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
    ulValue |= gcHcCommandStatusHCRmask;

	/********************Add by Zou Ying for ISP1161*/
	
	m_HcBulkCurrentED		= 0;
	m_HcControlCurrentED	= 0;
	m_HcBulkHeadED			= 0;
	m_HcBulkCurrentED		= 0;
	m_HcControlHeadED		= 0;
	m_HcControlCurrentED	= 0;
	m_HcHCCA				= 0;
	m_HcPeriodCurrentED		= 0;
	m_HcDoneHead			= 0;
	m_HcPeriodicStart		= 0;

	m_HcControlCBSR			= 0;
	m_HcControlPLE			= 0;
	m_HcControlIE			= 0;
	m_HcControlCLE			= 0;
	m_HcControlBLE			= 0;

	m_HcCommandCLF			= 0;
	m_HcCommandBLF			= 0;
	/**************************************************/

    WRITE_REGISTER_ULONG(HcCommandStatus(regBase), ulValue);

    // Wait for HC to complete reset (max 10us)
    while (READ_REGISTER_ULONG(HcCommandStatus(regBase)) & gcHcCommandStatusHCRmask) 
       ;

    // Put the HC into the USB_RESET state (must do this within 1ms of the above)
    ulValue = READ_REGISTER_ULONG(HcControl(regBase));
    ulValue &= ~gcHcControlHCFSmask;
    ulValue |= gcHcControlFSReset;
    WRITE_REGISTER_ULONG(HcControl(regBase), ulValue);

    // Restore the registers we just saved.
    // They will be restored by PowerManagementCallback if this is a warm boot.
    if (!m_bPoweredUpAfterPowerDown) 
	{
        WRITE_REGISTER_ULONG(HcBulkHeadEd(regBase), m_paHcBulkHeadEdSave);
        WRITE_REGISTER_ULONG(HcControlHeadEd(regBase), m_paHcControlHeadEdSave);
    }

    // Tell the PHCI chip where the Host Controller Communications Area is.
    physAddr = m_pobMem->VaToPa(m_pHcca);
    WRITE_REGISTER_ULONG(HcHCCA(regBase), physAddr);
    DEBUGMSG(ZONE_INIT && !m_bPoweredUpAfterPowerDown,
        (TEXT("Wrote HCCA phys addr = 0x%08X, virt addr 0x%08X\r\n"),
        physAddr, m_pHcca));

    //Enable ISP 1161 interrupts
	/**************************************************/

	//Interrupt enalbe, enable the SOF, ATLInt, and OPR_Reg
	WRITE_REGISTER_USHORT(HcWRInterruptEnable(m_regBase), 0x13);
	
	//ITL BufferLen
	WRITE_REGISTER_USHORT(HcWRITLBufferLength(m_regBase), 1024);
			
	//ATL BufferLen
	WRITE_REGISTER_USHORT(HcWRATLBufferLength(m_regBase), 2048);

	/**************************************************/
	
	// Enable interrupts
    ulValue = READ_REGISTER_ULONG(HcInterruptEnable(regBase));
    ulValue |=
        gcHcInterruptStatusSOmask   |   // Scheduling Overrun
		gcHcInterruptStatusWDHmask	|	// WritebackDoneHead
        gcHcInterruptStatusUEmask   |   // UnrecoverableError
        gcHcInterruptStatusRHSCmask |   // Root Hub Status Change
        gcHcInterruptStatusFNOmask  |   // frame number overflow
        gcHcInterruptStatusMIEmask;     // Master Enable

    WRITE_REGISTER_ULONG(HcInterruptEnable(regBase), ulValue);

    // Enable processing of the different lists
    EnableAllLists(regBase);

    // We need to set the FullSpeedMaxPacketSize value.
    ulValue = READ_REGISTER_ULONG(HcFmInterval(regBase)) & gcHcFmIntervalFImask;

    // This algorithm is straight out of section 5.4 of the OHCI spec
    ulValue |= (((ulValue - gcHcFmIntervalMaxOverhead) * 6) / 7) << 16;
//	  ulValue |= (((ulValue - gcHcFmIntervalMaxOverhead) * 1) / 7) << 16;

    WRITE_REGISTER_ULONG(HcFmInterval(regBase), ulValue);

    // We need to put 90% of the FmInterval into the Periodic Start Reg.
    // This means roughly ten percent of the frame time is devoted to
    // control and bulk.
    ulValue = 9 * (READ_REGISTER_ULONG(HcFmInterval(regBase)) &
        gcHcFmIntervalFImask) / 10;

    WRITE_REGISTER_ULONG(HcPeriodicStart(regBase), ulValue);

    // let's reset the frame number so that it doesn't overflow after 50 days
    // of suspend
    m_dwFrameNumber = 0;

    DEBUGMSG(1 && !m_bPoweredUpAfterPowerDown,
             (TEXT("-PHCD::InitializeHardware\r\n")));    
    return(successful);
}

// Put HC in OPERATIONAL state.  In this state, the HC may process lists and 
// will generate SOFs.
VOID CPhcd::EnterOperationalState()
{
    REGISTER regBase = m_regBase;
    ULONG ulValue;

    // InitializeHardware left the HC in the USB_RESET state
    // but we don't know how long ago that was. He can't sleep
    // because he might've been called from the power mgmt callback
    // so we'll wait the full 10 msec right here.
    Sleep(10);

    DEBUGMSG(ZONE_INIT, (TEXT("PHCD:EnterOperationalState - leaving stabilization mode\n")));
	
    m_fStabilizing = FALSE;

    // Set the functional state to USBOPERATIONAL - this will cause
    // SOF generation to begin in 1ms. Set the Control Bulk Service 
    // ratio at the same time.
    ulValue = READ_REGISTER_ULONG(HcControl(regBase)) &
              ~(gcHcControlCBSRmask | gcHcControlHCFSmask);
    
	
//	ulValue |= gcHcControlCBSR4to1 | gcHcControlFSOperational;

	//ISP 1161, put this value to 1:1
	ulValue |= gcHcControlCBSR1to1 | gcHcControlFSOperational; 

	//ISP 1161 According to W.J. Add 0x600 to it. 
	ulValue |= 0x600;

    WRITE_REGISTER_ULONG(HcControl(regBase), ulValue);

    // The system should now be running.  Enable power to the root hub ports.
    ulValue = READ_REGISTER_ULONG(HcRhDescriptorA(regBase));
    if ((ulValue & gcRhDescriptorANPSmask) == 0) 
	{
        ulValue |= gcRhDescriptorANPSmask;  // No power switching
        WRITE_REGISTER_ULONG(HcRhDescriptorA(regBase), ulValue);
    }

    ulValue = READ_REGISTER_ULONG(HcRhStatus(regBase));
    ulValue |= gcRhStatusLPSCmask;
    WRITE_REGISTER_ULONG(HcRhStatus(regBase), ulValue);

    // We must wait until power is OK before accessing any ports on the root hub
    Sleep(m_PowerOnToPowerGoodTime);
}

static inline BOOL IsHub (SDevice *pDev)
{
    return pDev->pHubPorts != NULL;
}

// Function to check whether a particular device (or hub) is drawing power from
// the bus.  This is static - it is based on the configuration that was selected
// when the device was set up.
static BOOL
IsStaticSelfPowered(SDevice *pDev)
{
    if (pDev->ohciDevice.lpActiveConfig) 
        return !!(pDev->ohciDevice.lpActiveConfig->Descriptor.bmAttributes & SELF_POWERED);
    else
        // No config selected yet, assume bus power
        return FALSE;
}



//REVIEW aLenthgs must be a valid array of Lengths!
BOOL CPhcd::IssueTransfer(UINT iDevice, UINT iEndpointIndex,
        LPTRANSFER_NOTIFY_ROUTINE lpStartAddress, LPVOID lpvNotifyParameter,
        DWORD dwFlags, LPCVOID lpvControlHeader, DWORD dwStartingFrame,
        DWORD dwFrames, LPCDWORD aLengths, DWORD dwBufferSize, LPVOID lpvBuffer,
        ULONG paBuffer, LPCVOID lpvCancelId, LPDWORD adwIsochErrors,
        LPDWORD adwIsochLengths, LPBOOL lpfComplete,
        LPDWORD lpdwBytesTransfered, LPDWORD lpdwError)
{
    
	
	SDevice * pDev;
    SEndpoint * pEndpt;
    SPhysAddr * pPhysAddrHead = NULL;
    SPhysAddr * pCur;
    SPhysAddr * * ppCur;
    EError  errorCode = successful;
    ULONG paSetupBuf;
    STransfer * pTransfer;
    BOOL fToDevice = !(dwFlags & USB_IN_TRANSFER);
    BOOL fShortTransferOk = !!(dwFlags & USB_SHORT_TRANSFER_OK);
    BOOL fUseStartingFrame = !(dwFlags & USB_START_ISOCH_ASAP);
    INT cPhysAddr = 0;
    DWORD dwMemAllocFlags;

    EnterCriticalSection(&m_csDeviceListLock);
    pDev = m_ppDevices[iDevice];
    LeaveCriticalSection(&m_csDeviceListLock);

    DEBUGMSG(ISPDBG,(TEXT("+PHCD::IssueTransfer, iDev:%u, iEp:%u, Fl:0x%X, StartFrame:%u, Frames:%u, BufSiz:%u\r\n"),
                            iDevice, iEndpointIndex, dwFlags,dwStartingFrame,dwFrames,dwBufferSize));
    if (pDev == NULL) 
    {
        DEBUGMSG(ZONE_ERROR,
            (TEXT("!PHCD: Error transfer sent to non-existant device, pDev:0x%X\r\n"),pDev));
        return FALSE;
    }
    if (pDev->fDetached == TRUE)
    {
        DEBUGMSG(ZONE_WARNING,(TEXT("PHCD::IssueTransfer, pDev:0x%X has been detached\r\n"),pDev));
        return FALSE;
    }

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

    if (pEndpt == NULL)
    {
        DEBUGMSG(ZONE_ERROR,
            (TEXT("!PHCD: Error transfer sent to closed endpt\r\n")));
        return FALSE;
    }

    BOOL fIsIsoch = (pEndpt->endptType == gcEndptTypeIsochronous);

    // Set up our flags for memory allocations - isoch buffers come from a special high
    // priority pool, and don't block.  Other transfer types default to blocking to wait
    // for memory unless the DONT_BLOCK flag is set by the client.
    if (fIsIsoch)
        dwMemAllocFlags = USBALLOCF_HIGHPRIORITY;
    else if (dwFlags & USB_DONT_BLOCK_FOR_MEM)
        dwMemAllocFlags = USBALLOCF_NOBLOCK;
    else
        dwMemAllocFlags = 0; // Default, block until memory available (or pipe closed)

    //either we have a list of offsets with the # of offsets in the array
    //or we have a non isoch transfer
    ASSERT((adwIsochErrors && adwIsochLengths && aLengths && dwFrames) || !fIsIsoch);
    ASSERT(lpfComplete && lpdwBytesTransfered && lpdwError && lpvCancelId);
    ASSERT(iDevice);

    *lpfComplete = FALSE;
    *lpdwBytesTransfered = 0;
    *lpdwError = USB_NO_ERROR;

    EnterCriticalSection(&m_csOtherListsLock);
    if (m_pFreeTransferHead != NULL)
    {
        pTransfer = m_pFreeTransferHead;
        m_pFreeTransferHead = pTransfer->pNext;
    }
    else
    {
        pTransfer = new STransfer;
    }
    LeaveCriticalSection(&m_csOtherListsLock);

    if (pTransfer == NULL)
    {
        DEBUGMSG(ZONE_ERROR,(TEXT("!PHCD: Error allocating transfer struct\r\n")));
        return FALSE;
    }
    pTransfer->lpbClientBuffer = (PBYTE)lpvBuffer;
    // Store the current process permissions, so the IST can access the 
    // client buffer directly.
    pTransfer->dwClientBufferPerms = GetCurrentPermissions();
    pTransfer->lpCompletionParameter = lpvNotifyParameter;
    pTransfer->lpCompletionStartAddress = lpStartAddress;
    pTransfer->lpCancelParameter = NULL;
    pTransfer->lpCancelStartAddress = NULL;
    pTransfer->lpvCancelId = lpvCancelId;
    pTransfer->pfComplete = lpfComplete;
    pTransfer->pdwBytesTransfered = lpdwBytesTransfered;
    pTransfer->pdwError = lpdwError;
    pTransfer->adwIsochErrors = adwIsochErrors;
    pTransfer->adwIsochLengths = adwIsochLengths;
    pTransfer->pSetupBuffer = NULL;
    pTransfer->cbBuffer1 = 0;
    pTransfer->pDataBuffer1 = NULL;
    pTransfer->paDataBuffer1 = 0;
    pTransfer->cbBuffer2 = 0;
    pTransfer->pDataBuffer2 = NULL;
    pTransfer->paDataBuffer2 = 0;
    pTransfer->aCopyLengths = NULL;
    pTransfer->pCopyLength = NULL;
#ifdef USE_CRITICAL_THREAD
    pTransfer->cCriticalTds = 0;
#endif
    pTransfer->cNormalTds = 0;
    pTransfer->fCanceled = FALSE;
    pTransfer->fActiveCanceled = FALSE;
    pTransfer->fIn = !!(dwFlags & USB_IN_TRANSFER);
    pTransfer->fCompress = !!(dwFlags & USB_COMPRESS_ISOCH);
    pTransfer->bufType = gcBufTypeAlt;
    pTransfer->paLastTD = 0;
    pTransfer->pNext = NULL;

    // Create a chain of SPhysAddr structures that describe the client buffer
    if(!(dwBufferSize == 0 && pEndpt->endptType == gcEndptTypeControl))
    {
        UINT cbBuffer1Bytes = 0;
        UINT cbBuffer2Bytes = 0;
        UINT cbTransfer;

        BOOL fFirstBuffer = TRUE;

        ppCur = &pPhysAddrHead;

        if (fIsIsoch)
        {
            UINT cOffsets;
            UINT iCurrentOffset = 0;
            UINT cbSegment;

            // This code does not consider zero byte isoch transfers
            // we need to test how PHCI works before implementing this - it is not
            // clear how to set up the TDs. 

            while(iCurrentOffset < dwFrames)
            {
                cbTransfer = 0;
                cOffsets = 0;

                while((cOffsets < gcMaxOffsetsPerTd) && (iCurrentOffset < dwFrames))
                {
                    cbSegment = aLengths[iCurrentOffset];

                    ASSERT(cbSegment <= pEndpt->maxPacket);

                    if(cbTransfer + cbSegment > gcMaxTransferSize)
                        break;

                    *adwIsochErrors++ = USB_NO_ERROR;
                    *adwIsochLengths++ = cbSegment;

                    ++cOffsets;
                    cbTransfer += cbSegment;
                    ++iCurrentOffset;
                }

                EnterCriticalSection(&m_csOtherListsLock);
                if (m_pFreePhysAddrHead != NULL)
                {
                    *ppCur = m_pFreePhysAddrHead;
                    m_pFreePhysAddrHead = (*ppCur)->pNext;
                }
                else
                {
                    *ppCur = new SPhysAddr;
                }
                LeaveCriticalSection(&m_csOtherListsLock);

                ++cPhysAddr;

                pCur = *ppCur;
                pCur->pNext = NULL;
                ppCur = &pCur->pNext;

                pCur->cIsochOffsets = cOffsets;
                pCur->length = cbTransfer;

                // We use two physical buffers to copy to/from the client buffer.
                // Here, determine size needed for each of these buffers.
                if(fFirstBuffer)
                {
                    if(cbTransfer > cbBuffer1Bytes)
                        cbBuffer1Bytes = cbTransfer;
                    fFirstBuffer = FALSE;
                }
                else
                {
                    if(cbTransfer > cbBuffer2Bytes)
                        cbBuffer2Bytes = cbTransfer;
                    fFirstBuffer = TRUE;
                }
            }

            ASSERT(iCurrentOffset == dwFrames);
        }
        else
        {
            //all packets must be maxPacket divisible except the last (USB spec)
            UINT cbMaxTransferSize =
                    (gcMaxTransferSize / pEndpt->maxPacket) * pEndpt->maxPacket;

            UINT cbRemaining = dwBufferSize;

            if(dwBufferSize > cbMaxTransferSi

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产高清不卡| 国产.欧美.日韩| 成人在线综合网| 欧美日韩激情在线| 亚洲欧洲日韩在线| 国产一区二区三区日韩| 欧美在线一区二区三区| 国产欧美精品一区aⅴ影院| 日韩成人免费电影| 欧美视频在线观看一区二区| 国产午夜精品久久久久久久| 麻豆精品一区二区| 欧美日韩一区二区三区在线| 亚洲欧洲一区二区在线播放| 国产白丝网站精品污在线入口| 日韩一区二区三区电影在线观看| 亚洲第一福利一区| 欧美在线观看一区二区| 亚洲视频资源在线| 91啪亚洲精品| 亚洲精品乱码久久久久久久久| 岛国一区二区三区| 日韩欧美卡一卡二| 日精品一区二区| 欧美性猛交xxxx黑人交| 亚洲综合在线观看视频| 99精品视频一区二区三区| 国产精品色哟哟网站| 懂色av一区二区三区蜜臀| 国产三级一区二区| 国产成人综合在线| 国产欧美日韩综合精品一区二区| 国产精品综合一区二区| 中文字幕第一区| 成人免费毛片嘿嘿连载视频| 国产亚洲人成网站| av在线不卡网| 亚洲区小说区图片区qvod| 一本大道久久精品懂色aⅴ| 亚洲精品水蜜桃| 欧美日韩色综合| 奇米影视一区二区三区小说| 欧美mv日韩mv国产网站| 国产精品系列在线观看| 中文字幕日韩av资源站| 在线观看免费成人| 青青青伊人色综合久久| 亚洲精品一区二区三区香蕉 | 日韩—二三区免费观看av| 日韩欧美一区二区三区在线| 国产剧情一区二区| 男女视频一区二区| 国产校园另类小说区| 99久久综合色| 五月天中文字幕一区二区| 制服丝袜中文字幕亚洲| 国产精品77777竹菊影视小说| 日韩理论片网站| 91精品国产综合久久香蕉麻豆| 久久狠狠亚洲综合| 日韩毛片视频在线看| 制服视频三区第一页精品| 国产精品羞羞答答xxdd| 亚洲一级二级三级| 久久综合狠狠综合| 91精品1区2区| 国产一区二区视频在线播放| 自拍偷自拍亚洲精品播放| 7777精品伊人久久久大香线蕉经典版下载 | 日韩欧美国产一区在线观看| 成人动漫av在线| 日本中文字幕一区二区有限公司| 国产亚洲精品bt天堂精选| 欧美色综合久久| 国产jizzjizz一区二区| 日本亚洲视频在线| 亚洲精品久久久久久国产精华液| 欧美一区二区三区的| 99久久99久久精品国产片果冻| 美女精品一区二区| 亚洲精品乱码久久久久久久久 | 91精品一区二区三区在线观看| 国产精品综合一区二区| 日韩激情在线观看| 亚洲欧美日韩在线| 久久精品亚洲麻豆av一区二区| 欧美性大战xxxxx久久久| 国产精品一二一区| 男女性色大片免费观看一区二区| 亚洲男人的天堂一区二区| 26uuu久久天堂性欧美| 精品视频在线免费观看| 99久久久无码国产精品| 粉嫩av一区二区三区在线播放| 秋霞午夜av一区二区三区| 亚洲第一福利视频在线| 亚洲美女精品一区| 中文一区在线播放| 欧美经典三级视频一区二区三区| 日韩精品影音先锋| 日韩视频国产视频| 欧美日韩精品一区二区天天拍小说 | 亚洲精品伦理在线| 国产精品毛片高清在线完整版| 精品国产一区二区三区久久久蜜月| 欧美亚洲综合一区| 91在线一区二区三区| 成人精品免费视频| 国产精品18久久久久久vr| 久久99精品久久久| 激情亚洲综合在线| 精品一区二区三区在线播放视频 | 欧美一区二区三区四区久久| 成人激情视频网站| 国产999精品久久| 国产福利91精品一区二区三区| 国产一区欧美二区| 久久丁香综合五月国产三级网站| 日本不卡中文字幕| 极品瑜伽女神91| 国产精品99久久久久久似苏梦涵| 国产麻豆精品theporn| 国产乱人伦偷精品视频不卡| 国产福利一区二区| 一本到不卡精品视频在线观看| 色综合久久综合| 在线观看日韩国产| 日韩你懂的在线观看| 国产日韩精品视频一区| 欧美国产日韩一二三区| 亚洲视频一二区| 日韩av电影免费观看高清完整版在线观看 | 亚洲一区欧美一区| 青青草伊人久久| 国产一区二区三区电影在线观看| 东方aⅴ免费观看久久av| 99久久99久久精品免费看蜜桃| 欧美三级在线看| 久久嫩草精品久久久久| 中文字幕亚洲一区二区av在线 | ㊣最新国产の精品bt伙计久久| 亚洲乱码国产乱码精品精小说 | 中文字幕一区二区三中文字幕| 亚洲精品高清视频在线观看| 蜜臀av性久久久久蜜臀aⅴ流畅 | 久久丁香综合五月国产三级网站| 国产福利一区在线| 欧美性受极品xxxx喷水| 精品日韩在线观看| 亚洲手机成人高清视频| 久久精品免费观看| 色综合天天综合色综合av| 日韩一区二区电影| 亚洲精品免费在线| 国产麻豆欧美日韩一区| 欧美另类videos死尸| 亚洲欧美中日韩| 美女脱光内衣内裤视频久久网站| 99re亚洲国产精品| 亚洲精品一区二区在线观看| 一区二区三区四区乱视频| 国产一区在线精品| 91精品国产色综合久久不卡电影| 中文字幕一区二区三区乱码在线| 另类小说综合欧美亚洲| 日本韩国精品一区二区在线观看| 亚洲精品在线免费播放| 亚洲成人免费视频| 91麻豆精品秘密| 欧美精彩视频一区二区三区| 青青草国产精品亚洲专区无| 欧美在线视频不卡| 亚洲色图欧美在线| 成人影视亚洲图片在线| 亚洲精品在线一区二区| 免费精品视频在线| 欧美日本国产视频| 亚洲一区自拍偷拍| 在线精品视频一区二区| 综合精品久久久| 99国产精品一区| 国产女同性恋一区二区| 国产一区二区按摩在线观看| 日韩免费一区二区| 日本va欧美va瓶| 91精品欧美一区二区三区综合在| 亚洲另类色综合网站| 99精品视频一区二区三区| 国产精品久久免费看| 国产成人av电影| 国产精品理论片| 成人午夜av在线| 国产精品毛片大码女人| 国产jizzjizz一区二区| 国产精品久久精品日日| 不卡的电视剧免费网站有什么| 日本一区二区三区在线观看| 粉嫩绯色av一区二区在线观看| 国产精品视频线看| 99视频精品免费视频|