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

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

?? phcd.cpp

?? ISP1161 USB Driver under WinCE for StrongARM processor implementation
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
    TEXT("GET_DESCRIPTOR"),
    TEXT("SET_DESCRIPTOR"),
    TEXT("GET_CONFIGURATION"),
    TEXT("SET_CONFIGURATION"),
    TEXT("GET_INTERFACE"),
    TEXT("SET_INTERFACE"),
    TEXT("SYNC_FRAME")
};

static const TCHAR *aszPortFeatureStrings[] =
{
    TEXT("PORT_CONNECTION"),
    TEXT("PORT_ENABLE"),
    TEXT("PORT_SUSPEND"),
    TEXT("PORT_OVER_CURRENT"),
    TEXT("PORT_RESET"),
    TEXT("RSVD (5)"),
    TEXT("RSVD (6)"),
    TEXT("RSVD (7)"),
    TEXT("PORT_POWER"),
    TEXT("PORT_LOW_SPEED"),
    TEXT("RSVD (10)"),
    TEXT("RSVD (11)"),
    TEXT("RSVD (12)"),
    TEXT("RSVD (13)"),
    TEXT("RSVD (14)"),
    TEXT("RSVD (15)"),
    TEXT("C_PORT_CONNECTION"),
    TEXT("C_PORT_ENABLE"),
    TEXT("C_PORT_SUSPEND"),
    TEXT("C_PORT_OVER_CURRENT"),
    TEXT("C_PORT_RESET"),
};

static const TCHAR *aszHubFeatureStrings[] =
{
    TEXT("LOCAL_POWER"),
    TEXT("OVER_CURRENT")
};

inline const TCHAR *DecodeRequestString(UCHAR bRequest)
{
    return ((bRequest < NUM_ELEMENTS(aszRequestStrings)) ? 
            aszRequestStrings[bRequest] : TEXT("Invalid"));
}
inline const TCHAR *DecodePortFeatureString(USHORT wValue)
{
    return ((wValue < NUM_ELEMENTS(aszPortFeatureStrings)) ?
            aszPortFeatureStrings[wValue]:TEXT("Invalid"));
}
inline const TCHAR *DecodeHubFeatureString(USHORT wValue)
{
    return ((wValue < NUM_ELEMENTS(aszHubFeatureStrings)) ?
            aszHubFeatureStrings[wValue]:TEXT("Invalid"));
}

// Routine to decode control transfers - somewhat incomplete, add further decoding
// as necessary...
void
CPhcd::DecodeControlTransfer(SEndpoint * pEndpt, PUSB_DEVICE_REQUEST pDr)
{
    SDevice *pDev;
    EnterCriticalSection(&m_csDeviceListLock);
    pDev = m_ppDevices[pEndpt->pEd->bfFunctionAddress];
    LeaveCriticalSection(&m_csDeviceListLock);
    if (!pDev)
        return;

    // We only care about EP 0 transfers
    if (pEndpt->endptArrayNum == gcEndpoint0Addr) 
    {
        if (pDr->bmRequestType & USB_REQUEST_CLASS)
        {
            if (pDev->pHubPorts)
            {
                // Treat this as a hub request
                switch (pDr->bRequest) {
                    case USB_REQUEST_SET_FEATURE:
                    case USB_REQUEST_CLEAR_FEATURE:
                        // Port 0 == hub command, else port command
                        DEBUGMSG(ISPDBG,(TEXT("PHCD::Control (HUB %X): %s_FEATURE, %s, port:%u\r\n"),pDev,
                                    (pDr->bRequest == USB_REQUEST_SET_FEATURE)? TEXT("SET") : TEXT("CLEAR"),
                                    (pDr->wIndex == 0) ?  DecodeHubFeatureString(pDr->wValue) : DecodePortFeatureString(pDr->wValue), 
                                    pDr->wIndex)); 
                        break;
                    default:
                        DEBUGMSG(ISPDBG,(TEXT("PHCD::Control (HUB %X): %s Val: %u, Idx: %u, Len: %u\r\n"),pDev,
                                    DecodeRequestString(pDr->bRequest),pDr->wValue, pDr->wIndex,pDr->wLength));
                        break;
                }
            }
            else
                RETAILMSG(1,(TEXT("PHCD::Control (CLASS %X): %s Val: %u, Idx: %u, Len: %u\r\n"),pDev,
                            DecodeRequestString(pDr->bRequest),pDr->wValue, pDr->wIndex,pDr->wLength));
        }
        else 
        {
            // Device request
                RETAILMSG(1,(TEXT("PHCD:Control (DEV %X): %s Val: %u, Idx: %u, Len: %u\r\n"),pDev,
                            DecodeRequestString(pDr->bRequest),pDr->wValue, pDr->wIndex,pDr->wLength));
        }
    }
}
//#endif // DEBUG


EError CPhcd::InitializeSchedule(void)
{
    PBYTE virtAddr;
    ULONG physAddr;
    EError errorCode;
    UINT numTds;
    UINT td;
    ULONG paEd;
    REGISTER regBase = m_regBase;
    SGeneralTransferDescriptor *pTd;
    SIsochTransferDescriptor *pITd;
    SEndpointDescriptor *pEd, *pPrevEd;
    SDevice *pDev;
    SEndpoint *pEndpt;
    PBYTE pSetupBuffer;
    ULONG paSetupBuffer;
    STransfer *pTransfer;

    RETAILMSG(ISPDBG,(TEXT("+PHCD::InitializeSchedule\r\n")));

    // We're going to first get a good page aligned chunk of memory and divy
    // it up between the HCCA and some ED/TDs

    errorCode = ALLOC_PHYS_MEM(m_pobMem, USBPAGESIZE, &virtAddr,
            &physAddr, USBALLOCF_SPECIAL, NULL);

//    errorCode = m_pobMem->AllocateMemory(USBPAGESIZE, &virtAddr,
//            &physAddr, USBALLOCF_SPECIAL);
    if (errorCode != successful)
    {
        DEBUGMSG(ZONE_ERROR,
            (TEXT("PHCD: Couldn't allocate memory for the HCCA and TDs\r\n")));
        return(errorCode);
    }
    m_pHcca = virtAddr;
    virtAddr += gcHccaByteSize;
    physAddr += gcHccaByteSize;


    // This isn't strictly necessary as obviously no one has used the TD Lists
    // yet.  But grabbing an unheld CS is practically free, so this can't hurt.
    EnterCriticalSection(&m_csTdListsLock);

    // That's 256 bytes out of 4K.  Split the remaining memory between EDs, TDs
    // and Isoch TDs.  EDs and TDs are the same size, which is half that of
    // IsochTDs, so just split the remaining memory in half and allocate as
    // many of both kinds of TDs as each will allow.  Note that we can make
    // Tds into Eds and vice versa, so we'll just make TDs, not both.
    numTds = gcNumExtraGeneralTds + (USBPAGESIZE - gcHccaByteSize) /
        (sizeof(SGeneralTransferDescriptor) * 2);

    m_pFreeTdList = (SGeneralTransferDescriptor *)virtAddr;

    for (td = 0; td < numTds - 1; td++)
    {
        pTd = (SGeneralTransferDescriptor *)(virtAddr +
            td * sizeof(SGeneralTransferDescriptor));
        pTd->paNextTd = physAddr +
            (td + 1) * sizeof(SGeneralTransferDescriptor);
    }
    pTd = (SGeneralTransferDescriptor *)(virtAddr +
            (numTds - 1) * sizeof(SGeneralTransferDescriptor));
    pTd->paNextTd = 0;

    virtAddr += numTds * sizeof(SGeneralTransferDescriptor);
    physAddr += numTds * sizeof(SGeneralTransferDescriptor);

    // That did the general tds,  Now finish off the page with isoch ones.
    numTds = (USBPAGESIZE - (virtAddr - m_pHcca)) /
        sizeof(SIsochTransferDescriptor);

    m_pFreeITdList = (SIsochTransferDescriptor *)virtAddr;

    for (td = 0; td < numTds - 1; td++)
    {
        pITd = (SIsochTransferDescriptor *)(virtAddr +
            td * sizeof(SIsochTransferDescriptor));
        pITd->paNextTd = physAddr +
            (td + 1) * sizeof(SIsochTransferDescriptor);
    }
    pITd = (SIsochTransferDescriptor *)(virtAddr +
        (td + 1) * sizeof(SIsochTransferDescriptor));
    pITd->paNextTd = 0;

    // Now that we've got storage set aside for a bunch of descriptors, let's
    // set up the necessary list heads.
    errorCode = InitializeInterruptEds();
    if (errorCode != successful)
    {
        DEBUGMSG(ZONE_ERROR, (TEXT("PHCD: Error setting up InterruptEds\r\n")));
        return(errorCode);
    }

    // Our scheduling lives will be made considerably easier if we put dummy
    // Eds at the  start of the bulk and control Lists.  I've also seen
    // comments in the NT code that suggests this is necessary for CMD parts.
    pEd = (SEndpointDescriptor *)m_pFreeTdList;
    m_pFreeTdList = (SGeneralTransferDescriptor *)
        (m_pobMem->PaToVa(m_pFreeTdList->paNextTd));

    // In the static Eds, the tail pointer points to itself and the
    // head points to null.  This is illegal for PHCI, but since the
    // SKIP bit is set, the HC will never notice.
    pEd->paTdQueueTail = paEd = m_pobMem->VaToPa((PBYTE)pEd);
    pEd->paTdQueueHead = gcStaticEdIdentifier;
    pEd->bfSkip = TRUE;
    pEd->paNextEd = 0;
    WRITE_REGISTER_ULONG(HcBulkHeadEd(regBase), paEd);
    WRITE_REGISTER_ULONG(HcBulkCurrentEd(regBase), paEd);

    pEd = (SEndpointDescriptor *)m_pFreeTdList;
    m_pFreeTdList = (SGeneralTransferDescriptor *)
        (m_pobMem->PaToVa(m_pFreeTdList->paNextTd));
    pEd->paTdQueueTail = paEd = m_pobMem->VaToPa((PBYTE)pEd);
    pEd->paTdQueueHead = gcStaticEdIdentifier;
    pEd->bfSkip = TRUE;
    pEd->paNextEd = 0;
    WRITE_REGISTER_ULONG(HcControlHeadEd(regBase), paEd);
    WRITE_REGISTER_ULONG(HcControlCurrentEd(regBase), paEd);
    pPrevEd = pEd;

    LeaveCriticalSection(&m_csTdListsLock);

    // Now set up the Addr0 device and control endpoint.

    pDev = AddDevice(0, 0, TRUE);

	if (pDev == NULL)
        return(error);
    pEndpt = pDev->ppEndpts[gcEndpoint0Addr];

    errorCode = ALLOC_PHYS_MEM(m_pobMem, sizeof(USB_DEVICE_REQUEST),
                &pSetupBuffer, &paSetupBuffer, 0, NULL);

//    errorCode = m_pobMem->AllocateMemory(sizeof(USB_DEVICE_REQUEST),
//                &pSetupBuffer, &paSetupBuffer);
    if (errorCode != successful)
    {
        DEBUGMSG(ZONE_ERROR,
        (TEXT("PHCD: Couldn't allocate memory for the control queue\r\n")));
        return(errorCode);
    }

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

    pTransfer->lpbClientBuffer = NULL;
    pTransfer->dwClientBufferPerms = 0;
    pTransfer->lpCompletionParameter = NULL;
    pTransfer->lpCompletionStartAddress = NULL;
    pTransfer->lpCancelParameter = NULL;
    pTransfer->lpCancelStartAddress = NULL;
    pTransfer->lpvCancelId = NULL;
    pTransfer->pfComplete = NULL;
    pTransfer->pdwBytesTransfered = NULL;
    pTransfer->pdwError = NULL;
    pTransfer->adwIsochErrors = NULL;
    pTransfer->adwIsochLengths = NULL;
    pTransfer->pSetupBuffer = pSetupBuffer;
    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 = FALSE;
    pTransfer->fCompress = FALSE;
    pTransfer->bufType = gcBufTypeUnused;
    pTransfer->paLastTD = 0;
    pTransfer->pNext = NULL;

    pEndpt->pTransferHead = pTransfer;
    RETAILMSG(ISPDBG,(TEXT("-PHCD::InitializeSchedule\r\n")));

    return(successful);
}



// Don't even try to understand this without first reading the portion of
// the PHCI spec that describes the Interrupt Ed structure.
EError CPhcd::InitializeInterruptEds(void)
{
    SEndpointDescriptor * pEd;
    SEndpointDescriptor * pStaticEds[gcIntrNumStaticEds];
    PULONG pEdListHead;
    UINT ed;
    UINT balanceEd = 0;
    UINT extra = 0;
    UINT balance[] =
        { 0, 16, 8, 24, 4, 20, 12, 28, 2, 18, 10, 26, 6, 22, 14, 30 };

    ASSERT(m_pHcca != NULL);

    DEBUGMSG(ISPDBG,(TEXT("+PHCD::InitializeInterruptEds\r\n")));
    
    for (ed = 0; ed < gcIntrNumStaticEds; ed++)
    {
        pEd = (SEndpointDescriptor *)m_pFreeTdList;
        m_pFreeTdList = (SGeneralTransferDescriptor *)
            (m_pobMem->PaToVa(m_pFreeTdList->paNextTd));
        // In the static intr eds, the tail pointer points to itself and the
        // head points to null.  This is illegal for PHCI, but since the
        // SKIP bit is set, the HC will never notice.
        pEd->paTdQueueTail = m_pobMem->VaToPa((PBYTE)pEd);
        pEd->paTdQueueHead = gcStaticEdIdentifier;
        pEd->bfSkip = TRUE;
        pStaticEds[ed] = pEd;
        if (ed != 0)
        {
            // Remember, this sets pEd->paNextEd to the Phys Addr of
            // pStaticEds[(ed - 1)/2];
            pEd->paNextEd = pStaticEds[(ed - 1) / 2]->paTdQueueTail;
        }
        else
        {
            // This is the last Interrupt Descriptor.  Isoch descriptors
            // go after these.
            pEd->paNextEd = 0;
            m_paLastIntrEd = m_pobMem->VaToPa((PBYTE)pEd);
        }

        if (ed >= gcIntrNumStaticEds - gcIntrNumListHeads)
        {
            // The final 32 go in the HCCA in a wierd order as defined by
            // the balance array above.
            // To save space, I used a balance array that is 1/2 as big as
            // necessary.  The second set of 16 values are equal to the first
            // set with each being + 1 bigger.
            pEdListHead = (PULONG)(m_pHcca +
                4 * (balance[balanceEd] + extra));
            *pEdListHead = pEd->paTdQueueTail;  //pEd's PhysAddr
            balanceEd++;
            if (balanceEd > 15)
            {
                balanceEd = 0;
                extra = 1;
            }
        }
    }
    DEBUGMSG(ISPDBG,(TEXT("-PHCD::InitializeInterruptEds\r\n")));
    return(successful);
}

// Reset and initialize the HC hardware. Will leave the HC in RESET state, call
// EnterOperationalState() to actually start sending SOFs.  
// Note: This function may be called within the context of a power handler routine,
// so cannot make any system calls if m_bPoweredUpAfterPowerDown is set!
EError CPhcd::InitializeHardware(void)
{
    REGISTER regBase = m_regBase;
    ULONG physAddr;
    ULONG ulValue;

    // if there was a previous driver changing the frame length then
    // we want to clear this condition when the device goes through
    // a warm reboot.
    DEBUGMSG(ZONE_INIT && !m_bPoweredUpAfterPowerDown,
             (TEXT("+PHCD::InitializeHardware\r\n")));

    m_nAdjustFrame = 0;
    m_fAdjust = FALSE;
    m_hAdjustmentEvent = NULL;

    // These registers need to be saved before we reset the HC
    // because a software reset will zero them.
    // They were already saved by the PowerManagementCallback if this is a warm boot.
    if (!m_bPoweredUpAfterPowerDown) 
	{
        m_paHcBulkHeadEdSave = READ_REGISTER_ULONG(HcBulkHeadEd(regBase));
        m_paHcControlHeadEdSave = READ_REGISTER_ULONG(HcControlHeadEd(regBase));
    }

    // Reset the chip
    ulValue = READ_REGISTER_ULONG(HcCommandStatus(regBase));

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美国产亚洲另类动漫| 日本欧美韩国一区三区| 国产欧美日本一区二区三区| 精品福利av导航| 精品999在线播放| 精品国产乱码久久久久久图片| 国产精品性做久久久久久| 午夜精品一区二区三区三上悠亚| 欧美专区亚洲专区| 日韩欧美美女一区二区三区| 日韩一区二区三区免费看| 乱一区二区av| 一区二区三区影院| 日韩欧美在线一区二区三区| 国产综合色产在线精品| 国产一区二区网址| 欧美视频一区二区| 琪琪一区二区三区| 欧美探花视频资源| 国产精品自产自拍| 美女任你摸久久 | 国产在线播放一区三区四| 美女在线观看视频一区二区| 日韩专区一卡二卡| 日韩免费在线观看| 日日摸夜夜添夜夜添国产精品| 91精品国产91热久久久做人人 | 五月天一区二区| 国产一区视频导航| 在线播放国产精品二区一二区四区| 欧美精品电影在线播放| 日韩一区日韩二区| 国产丝袜欧美中文另类| 欧美成人性福生活免费看| 亚洲精品国久久99热| 国产精品家庭影院| 欧美国产97人人爽人人喊| 国产免费久久精品| 日本一区二区三区在线不卡| 日本欧美一区二区三区乱码| 色狠狠av一区二区三区| 欧美精品日韩精品| 加勒比av一区二区| 久久久国际精品| 精品一区二区三区免费毛片爱| 国模一区二区三区白浆| 久久久久久99久久久精品网站| 国产在线视频不卡二| 成人午夜视频免费看| 国产美女久久久久| av中文字幕亚洲| 亚洲欧美欧美一区二区三区| 亚洲自拍欧美精品| 午夜视频在线观看一区| 精品剧情在线观看| 美洲天堂一区二卡三卡四卡视频| 日韩欧美你懂的| 亚洲九九爱视频| 欧美三级在线看| 一区二区三区日韩在线观看| 韩国成人在线视频| 亚洲精品五月天| 国产一区不卡精品| 在线看一区二区| 午夜私人影院久久久久| 欧美绝品在线观看成人午夜影视| 国产一区二区三区在线观看免费视频 | 国产女人aaa级久久久级| 精品少妇一区二区三区在线视频| 欧美日韩情趣电影| 久久疯狂做爰流白浆xx| 国产精品网曝门| 精品成人在线观看| 亚洲午夜电影网| 久久亚洲精品国产精品紫薇| 成人av在线网| 精品日产卡一卡二卡麻豆| 亚洲精品日日夜夜| 国产不卡在线视频| 色婷婷av一区| 1024成人网色www| 国产美女一区二区| 国产馆精品极品| www久久精品| 国产精品视频一二| 日本 国产 欧美色综合| 欧美一区二区三区性视频| av一区二区久久| 26uuu另类欧美| 日本 国产 欧美色综合| 3d动漫精品啪啪| 国内精品免费**视频| 欧美日韩精品一区二区在线播放| 国产精品久久久久久妇女6080| 日韩欧美国产综合| 成人免费小视频| 国产精品一区二区三区乱码 | 精品久久人人做人人爽| 欧美不卡在线视频| 国产女主播视频一区二区| 五月婷婷久久丁香| 欧洲av一区二区嗯嗯嗯啊| 欧美电视剧在线看免费| 亚洲欧洲国产日韩| 99久久99久久精品国产片果冻| 中文字幕av免费专区久久| 国产精品中文有码| 国产精品无遮挡| 99这里只有精品| 亚洲欧美激情在线| 91福利在线播放| 亚洲成人av电影在线| 91精品福利在线一区二区三区| 日韩av高清在线观看| 日韩欧美一二三区| 国产一区日韩二区欧美三区| 国产午夜精品久久久久久免费视 | 高清shemale亚洲人妖| 久久网站热最新地址| 国产久卡久卡久卡久卡视频精品| 久久精品亚洲国产奇米99 | 中国色在线观看另类| 成人黄色一级视频| 中文字幕中文在线不卡住| 99国产精品久久久久久久久久 | 国产精品第13页| 日本韩国精品在线| 三级久久三级久久| 久久综合一区二区| 99久久婷婷国产精品综合| 一区二区三区蜜桃| 日韩女优av电影| 成人不卡免费av| 亚洲午夜在线电影| 日韩欧美自拍偷拍| 国产精品99久久久| 夜夜操天天操亚洲| 日韩欧美成人午夜| jlzzjlzz国产精品久久| 午夜精品久久久久影视| 久久新电视剧免费观看| 91香蕉视频污| 五月婷婷综合网| 国产情人综合久久777777| 91亚洲国产成人精品一区二三| 亚洲www啪成人一区二区麻豆| 2欧美一区二区三区在线观看视频| 波多野洁衣一区| 日韩国产欧美三级| 亚洲国产精品99久久久久久久久| 在线免费不卡视频| 国产一区二区三区观看| 一区二区三区毛片| 久久久精品国产免大香伊| 欧洲一区二区三区在线| 国产精品一色哟哟哟| 亚洲成人你懂的| 国产精品伦一区| 日韩视频123| 日本久久一区二区| 国产大陆亚洲精品国产| 天天av天天翘天天综合网| 国产免费成人在线视频| 91麻豆精品91久久久久同性| 国产精品1区二区.| 热久久久久久久| 亚洲三级在线观看| 久久色成人在线| 欧美巨大另类极品videosbest | 国产午夜精品一区二区三区四区| 欧美日韩一区二区三区视频| 成人免费av网站| 精品亚洲欧美一区| 香蕉久久夜色精品国产使用方法 | 26uuu亚洲| 欧美一区二区三区四区久久| 99re视频精品| 国产伦精一区二区三区| 丝袜美腿一区二区三区| 亚洲天堂精品在线观看| 国产欧美日韩在线| 欧美精品一区二区三区四区| 欧美日韩成人综合在线一区二区| 波多野洁衣一区| 国产成人av福利| 久久精品99国产国产精| 视频一区二区中文字幕| 亚洲一区二区三区四区五区黄 | 国产精品久久久爽爽爽麻豆色哟哟| 91精品久久久久久久91蜜桃 | 亚洲女性喷水在线观看一区| 国产欧美精品一区二区三区四区| 精品国产凹凸成av人导航| 欧美一区二区精品| 777xxx欧美| 欧美一卡二卡在线观看| 欧美日韩精品久久久| 欧美体内she精高潮| 欧美三级一区二区| 欧美日韩免费在线视频|