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

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

?? sc2440pdd.cpp

?? 三星2440 cpu WINCE 5.00板級支持包
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
/****************************************************************
@doc INTERNAL

@func VOID | SerUSB_InternalMapRegisterAddresses |
This routine maps the ASIC registers. 
It's an artifact of this
implementation.

@rdesc None.
****************************************************************/
static
DWORD MapRegisterSet(PCTRLR_PDD_CONTEXT pContext)
{
    SETFNAME();
    FUNCTION_ENTER_MSG();

    PREFAST_DEBUGCHK(pContext);

    DEBUGCHK(g_pUDCBase == NULL);

    PBYTE   pVMem;
    DWORD   dwRet = ERROR_SUCCESS;

    // Map CSR registers.
    pVMem = (PBYTE)VirtualAlloc(0, PAGE_SIZE, MEM_RESERVE, PAGE_NOACCESS);

    if (pVMem) {
        BOOL fSuccess = VirtualCopy(pVMem, (LPVOID)pContext->dwIOBase,
            pContext->dwIOLen, PAGE_READWRITE | PAGE_NOCACHE);
        if (!fSuccess) {
            VirtualFree(pVMem, 0, MEM_RELEASE);
            dwRet = GetLastError();
            DEBUGMSG(ZONE_ERROR, (_T("%s Virtual Copy: FAILED\r\n"), pszFname));
        }
        else {
            g_pUDCBase = pVMem + BASE_REGISTER_OFFSET;

            DEBUGMSG(ZONE_INIT, (_T("%s VirtualCopy Succeeded, pVMem:%x\r\n"), 
                pszFname, pVMem));
        }
    } 
    else {
        dwRet = GetLastError();
        DEBUGMSG(ZONE_ERROR, (_T("%s Virtual Alloc: FAILED\r\n"), pszFname));
    }

    FUNCTION_LEAVE_MSG();
    
    return dwRet;
}

/*++

Routine Description:

Deallocate register space.

Arguments:

None.

Return Value:

None.

--*/
static
VOID
UnmapRegisterSet(PCTRLR_PDD_CONTEXT pContext)
{
    // Unmap any memory areas that we may have mapped.
    if (g_pUDCBase) {
        VirtualFree((PVOID) g_pUDCBase, 0, MEM_RELEASE);
        g_pUDCBase = NULL;
    }
}


// interrupt service routine.
static
DWORD
WINAPI
ISTMain(
        LPVOID lpParameter
        )
{
    SETFNAME();
    FUNCTION_ENTER_MSG();

    PCTRLR_PDD_CONTEXT pContext = (PCTRLR_PDD_CONTEXT) lpParameter;
    ValidateContext(pContext);

    CeSetThreadPriority(pContext->hIST, pContext->dwISTPriority);

    while (!pContext->fExitIST) {
        pContext->fRestartIST = FALSE;

        // Enable Suspend Mode in the Power Register
//        SetClearReg(pContext, PWR_REG_OFFSET, SUSPEND_MODE_ENABLE_CTRL, SET);

        // Disable All Endpoint interrupts
        WriteReg(pContext, EP_INT_EN_REG_OFFSET, 0); // Disable All

        // Enable Device interrupts
        WriteReg(pContext, USB_INT_EN_REG_OFFSET, (USB_RESET_INTR));// | USB_SUSPEND_INTR));

        // Enable Endpoint interrupt 0
        EnableEndpointInterrupt(pContext, 0);

        while (TRUE) {
            DWORD dwWait = WaitForSingleObject(pContext->hevInterrupt, INFINITE);
            if (pContext->fExitIST || pContext->fRestartIST) {
                break;
            }

            if (dwWait == WAIT_OBJECT_0) {
                HandleUSBEvent(pContext);
                InterruptDone(pContext->dwSysIntr);
            }
            else {
                DEBUGMSG(ZONE_INIT, (_T("%s WaitForMultipleObjects failed. Exiting IST.\r\n"), 
                    pszFname));
                break;
            }
        }

        // Disable Device  interrupts - write Zeros to Disable
        WriteReg(pContext, USB_INT_EN_REG_OFFSET, 0 );

        // Disable endpoint interrupts - write Zeros to Disable
        WriteReg(pContext, EP_INT_EN_REG_OFFSET, 0);
        
        // Clear any outstanding device & endpoint interrupts
        // USB Device Interrupt Status - Write a '1' to Clear 
        WriteReg(pContext, USB_INT_REG_OFFSET, 
            (USB_RESET_INTR | USB_RESUME_INTR | USB_SUSPEND_INTR));
        // End point Interrupt Status - Write a '1' to Clear
        WriteReg(pContext, EP_INT_REG_OFFSET, CLEAR_ALL_EP_INTRS);

        // Send detach
        pContext->pfnNotify(pContext->pvMddContext, 
            UFN_MSG_BUS_EVENTS, UFN_DETACH);

        pContext->fSpeedReported = FALSE;
        pContext->attachedState = UFN_DETACH;
    }

    FUNCTION_LEAVE_MSG();

    return 0;
}


static
VOID
StartTransfer(
              PCTRLR_PDD_CONTEXT pContext,
              PEP_STATUS peps,
              PSTransfer pTransfer
              )
{
    SETFNAME();

    DEBUGCHK(pContext);
    PREFAST_DEBUGCHK(peps);

    DEBUGCHK(!peps->pTransfer);
    ValidateTransferDirection(pContext, peps, pTransfer);

    LOCK_ENDPOINT(peps);
    FUNCTION_ENTER_MSG();

    DEBUGMSG(ZONE_TRANSFER, (_T("%s Setting up %s transfer on ep %u for %u bytes\r\n"),
        pszFname, (pTransfer->dwFlags == USB_IN_TRANSFER) ? _T("in") : _T("out"),
        peps->dwEndpointNumber, pTransfer->cbBuffer));

    // Enable transfer interrupts.
    peps->pTransfer = pTransfer;

    if (pTransfer->dwFlags == USB_IN_TRANSFER) {
        // Must Clear both Send and Sent Stall - the HW is setting this bit 
        // during the Endpoint initialization process. It must be cleared here 
        // to insure proper operation.
//        SetClearIndexedReg(pContext, peps->dwEndpointNumber, IN_CSR1_REG_OFFSET,
//            (IN_SEND_STALL | IN_SENT_STALL), CLEAR);               

        if (peps->dwEndpointNumber == 0) {
            BYTE bEP0IrqStatus = ReadIndexedReg(pContext, 0, EP0_CSR_REG_OFFSET);

            // Write 0 to SEND_STALL and SENT_STALL to clear them, so we need to 
            // leave them unchanged by default.
            BYTE bEp0CsrToWrite = (bEP0IrqStatus & EP0_STALL_BITS);

            if (bEP0IrqStatus & EP0_OUT_PACKET_RDY) {
                bEp0CsrToWrite |= SERVICED_OUT_PKT_RDY;
                DEBUGMSG(ZONE_COMMENT, (_T("%s Writing 0x%02x to EP0_CSR_REG\r\n"), pszFname, bEp0CsrToWrite));
                WriteIndexedReg(pContext, 0, EP0_CSR_REG_OFFSET, bEp0CsrToWrite);
                bEp0CsrToWrite &= ~SERVICED_OUT_PKT_RDY;
            }

            bEp0CsrToWrite |= HandleTx(pContext, peps, 0);
            
            DEBUGMSG(ZONE_COMMENT, (_T("%s Writing 0x%02x to EP0_CSR_REG\r\n"), pszFname, bEp0CsrToWrite));
            WriteIndexedReg(pContext, 0, EP0_CSR_REG_OFFSET, bEp0CsrToWrite);
        }
        else {
            BYTE bIrqStatus = ReadIndexedReg(pContext, 0, IN_CSR1_REG_OFFSET);

            // Write 0 to SEND_STALL and SENT_STALL to clear them, so we need to 
            // leave them unchanged by default.
            BYTE bEpStatToWrite = (bIrqStatus & (IN_SENT_STALL & IN_SEND_STALL));

            bEpStatToWrite |= HandleTx(pContext, peps, 1);

            DEBUGMSG(ZONE_COMMENT, (_T("%s Writing 0x%02x to IN_CSR1_REG\r\n"), pszFname));
            WriteIndexedReg(pContext, peps->dwEndpointNumber, 
                IN_CSR1_REG_OFFSET, bEpStatToWrite);
        }
    }
    else {
        if (peps->dwEndpointNumber == 0) {
            BYTE bEP0IrqStatus = ReadIndexedReg(pContext, 0, EP0_CSR_REG_OFFSET);

            // Write 0 to SEND_STALL and SENT_STALL to clear them, so we need to 
            // leave them unchanged by default.
            BYTE bEp0CsrToWrite = (bEP0IrqStatus & EP0_STALL_BITS);
            
            // Mark that we are done with the setup packet. The IST will take care
            // of the data transfer.
            if (bEP0IrqStatus & EP0_OUT_PACKET_RDY) {
                bEp0CsrToWrite |= SERVICED_OUT_PKT_RDY;
                DEBUGMSG(ZONE_COMMENT, (_T("%s Writing 0x%02x to EP0_CSR_REG\r\n"), pszFname, bEp0CsrToWrite));
                WriteIndexedReg(pContext, 0, EP0_CSR_REG_OFFSET, bEp0CsrToWrite);
            }
        }
        else {
            EnableEndpointInterrupt(pContext, peps->dwEndpointNumber);

            // There may be a packet available.  If so process it...
            BYTE bEpIrqStat = ReadIndexedReg(pContext, peps->dwEndpointNumber,
                OUT_CSR1_REG_OFFSET);
            
            if (bEpIrqStat & OUT_PACKET_READY) {
                BOOL fCompleted;
                DWORD dwStatus;
                BYTE bToWrite = HandleRx(pContext, peps, &fCompleted, &dwStatus);
                DEBUGMSG(ZONE_COMMENT, (_T("%s Writing 0x%02x to OUT_CSR1_REG\r\n"), pszFname, 
                    bToWrite));

                // There should be no double-buffering
                DEBUGCHK(ReadIndexedReg(pContext, peps->dwEndpointNumber, OUT_FIFO_CNT1_REG_OFFSET) == 0);

                if (fCompleted) {
                    // Disable transfer interrupts until another transfer is issued.
                    DisableEndpointInterrupt(pContext, peps->dwEndpointNumber);
                }

                WriteIndexedReg(pContext, peps->dwEndpointNumber, OUT_CSR1_REG_OFFSET, bToWrite);
                
                if (fCompleted) {
                    CompleteTransfer(pContext, peps, dwStatus);
                }    
            }
        }
    }
    
    FUNCTION_LEAVE_MSG();

    UNLOCK_ENDPOINT(peps);
}


DWORD
WINAPI
UfnPdd_IssueTransfer(
    PVOID  pvPddContext,
    DWORD  dwEndpoint,
    PSTransfer pTransfer
    )
{
    SETFNAME();
    FUNCTION_ENTER_MSG();

    DEBUGCHK(EP_VALID(dwEndpoint));

    PCTRLR_PDD_CONTEXT pContext = (PCTRLR_PDD_CONTEXT) pvPddContext;
    ValidateContext(pContext);

    PEP_STATUS peps = GetEpStatus(pContext, dwEndpoint);
    LOCK_ENDPOINT(peps);
    DEBUGCHK(peps->fInitialized);
    DEBUGCHK(pTransfer->cbTransferred == 0);

    DWORD dwRet = ERROR_SUCCESS;

    // Note For the HW NAKs IN requests and DOES NOT let SW
    // know that the Host is trying to send a request. SO... Start the Transfer 
    // In Now!
    // Start the Transfer
    DEBUGCHK(peps->pTransfer == NULL);
    StartTransfer(pContext, peps, pTransfer);

    UNLOCK_ENDPOINT(peps);

    FUNCTION_LEAVE_MSG();

    return dwRet;
}


DWORD
WINAPI
UfnPdd_AbortTransfer(
    PVOID           pvPddContext,
    DWORD           dwEndpoint,
    PSTransfer      pTransfer
    )
{
    SETFNAME();
    FUNCTION_ENTER_MSG();

    PREFAST_DEBUGCHK(pTransfer);
    DEBUGCHK(EP_VALID(dwEndpoint));

    PCTRLR_PDD_CONTEXT pContext = (PCTRLR_PDD_CONTEXT) pvPddContext;
    ValidateContext(pContext);

    PEP_STATUS peps = GetEpStatus(pContext, dwEndpoint);
    LOCK_ENDPOINT(peps);
    DEBUGCHK(peps->fInitialized);

    ValidateTransferDirection(pContext, peps, pTransfer);

    DEBUGCHK(pTransfer == peps->pTransfer);
    CompleteTransfer(pContext, peps, UFN_CANCELED_ERROR);

    if (dwEndpoint == 0) {
        pContext->Ep0State = EP0_STATE_IDLE;
    }
    
    ResetEndpoint( pContext,peps);

    UNLOCK_ENDPOINT(peps);

    FUNCTION_LEAVE_MSG();

    return ERROR_SUCCESS;
}


// This does not do much because there is not any way to control
// power on this controller.
static
CEDEVICE_POWER_STATE
SetPowerState(
    PCTRLR_PDD_CONTEXT      pContext,
    CEDEVICE_POWER_STATE    cpsNew
    )
{
    SETFNAME();
    
    PREFAST_DEBUGCHK(pContext);
    DEBUGCHK(VALID_DX(cpsNew));
    ValidateContext(pContext);

    // Adjust cpsNew.
    if (cpsNew != pContext->cpsCurrent) {
        if (cpsNew == D1 || cpsNew == D2) {
            // D1 and D2 are not supported.
            cpsNew = D0;
        }
        else if (pContext->cpsCurrent == D4) {
            // D4 can only go to D0.
            cpsNew = D0;
        }
    }

    if (cpsNew != pContext->cpsCurrent) {
        DEBUGMSG(ZONE_POWER, (_T("%s Going from D%u to D%u\r\n"),
            pszFname, pContext->cpsCurrent, cpsNew));
        
        if ( (cpsNew < pContext->cpsCurrent) && pContext->hBusAccess ) {
            SetDevicePowerState(pContext->hBusAccess, cpsNew, NULL);
        }

        switch (cpsNew) {
        case D0:
            KernelIoControl(IOCTL_HAL_DISABLE_WAKE, &pContext->dwSysIntr,  
                sizeof(pContext->dwSysIntr), NULL, 0, NULL);
            
            if (pContext->fRunning) {
                // Cause the IST to restart.
                pContext->fRestartIST = TRUE;
                SetInterruptEvent(pContext->dwSysIntr);
            }           
            break;

        case D3:
            KernelIoControl(IOCTL_HAL_ENABLE_WAKE, &pContext->dwSysIntr,  
                sizeof(pContext->dwSysIntr), NULL, 0, NULL);
            break;

        case D4:
            KernelIoControl(IOCTL_HAL_DISABLE_WAKE, &pContext->dwSysIntr,  
                sizeof(pContext->dwSysIntr), NULL, 0, NULL);
            break;
        }

        if ( (cpsNew > pContext->cpsCurrent) && pContext->hBusAccess ) {
            SetDevicePowerState(pContext->hBusAccess, cpsNew, NULL);
        }

		pContext->cpsCurrent = cpsNew;
    }

    return pContext->cpsCurrent;
}


static
VOID
FreeCtrlrContext(
    PCTRLR_PDD_CONTEXT pContext

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区在线看| 奇米888四色在线精品| 亚洲一区影音先锋| 日本在线不卡一区| 国产乱码精品一区二区三区av | 亚洲美女在线国产| 天堂av在线一区| 国产一区在线观看麻豆| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 99国产精品国产精品久久| 欧美在线高清视频| 久久综合资源网| 亚洲色图清纯唯美| 免费观看在线综合| 91在线高清观看| 欧美成人三级在线| 一区二区高清视频在线观看| 看片的网站亚洲| 91蝌蚪porny| 精品国产1区二区| 一区二区三区久久久| 国产美女一区二区| 欧美视频中文字幕| 中文字幕av一区二区三区免费看 | 欧美亚洲日本一区| 国产亚洲一区字幕| 亚洲一本大道在线| 国产91精品免费| 91精品国产欧美一区二区| 亚洲欧洲av色图| 美国毛片一区二区三区| 在线免费观看日本一区| 国产日韩综合av| 日本大胆欧美人术艺术动态| caoporn国产一区二区| 精品少妇一区二区三区在线视频 | 欧美群妇大交群中文字幕| 国产精品久久久久久久岛一牛影视 | 婷婷综合五月天| 91免费观看视频在线| 国产女主播视频一区二区| 美女网站视频久久| 欧美福利电影网| 一区二区三区国产精品| 成人在线一区二区三区| 2020国产精品| 欧美电影免费观看高清完整版在线观看| 国产精品女同互慰在线看 | 国产亚洲综合在线| 老司机午夜精品| 欧美疯狂做受xxxx富婆| 亚洲美女精品一区| 白白色亚洲国产精品| 国产日韩欧美精品综合| 精品一区二区三区在线观看国产 | 强制捆绑调教一区二区| 欧美日韩精品欧美日韩精品| 亚洲免费在线看| 99re热视频精品| 成人欧美一区二区三区视频网页| 国产乱色国产精品免费视频| 日韩三级在线观看| 日本午夜精品一区二区三区电影| 欧美三级在线看| 9人人澡人人爽人人精品| 久久丁香综合五月国产三级网站 | 欧美精品一区二区三区久久久| 亚洲电影第三页| 色94色欧美sute亚洲13| 亚洲黄色在线视频| 91久久人澡人人添人人爽欧美 | 欧洲一区二区av| 一区二区在线看| 色婷婷综合激情| 亚洲激情在线播放| 欧美视频日韩视频在线观看| 亚洲香肠在线观看| 欧美日韩一区二区欧美激情| 午夜精品久久久久久久99水蜜桃| 精品视频在线视频| 日韩和的一区二区| 日韩免费福利电影在线观看| 久久国产麻豆精品| 欧美成人高清电影在线| 国产精品白丝av| 中文字幕精品三区| 成人av网站在线| 玉足女爽爽91| 欧美日韩国产综合视频在线观看| 婷婷综合在线观看| 精品国产亚洲在线| 国产.欧美.日韩| 亚洲欧美日韩小说| 欧美精品一卡二卡| 黄网站免费久久| 国产精品久久久久影院色老大 | 亚洲欧洲国产专区| 91国偷自产一区二区三区成为亚洲经典 | 亚洲天堂成人在线观看| 在线免费观看不卡av| 午夜精品在线看| 精品国产精品一区二区夜夜嗨| 国产很黄免费观看久久| 国产精品白丝在线| 精品视频999| 麻豆精品一区二区av白丝在线| 精品成人佐山爱一区二区| 国产乱码精品一区二区三| 中文字幕一区二区在线播放| 欧美在线观看视频一区二区三区| 日本aⅴ亚洲精品中文乱码| 久久久国际精品| 91欧美一区二区| 日本不卡免费在线视频| 国产欧美一区二区精品忘忧草 | 亚洲精品国产精华液| 3atv一区二区三区| 成人网页在线观看| 亚洲国产精品久久久男人的天堂| 欧美tickling挠脚心丨vk| 成人黄色国产精品网站大全在线免费观看 | 老司机免费视频一区二区| 欧美国产日韩a欧美在线观看| 精品1区2区3区| 国产精品一区二区视频| 一区二区三区久久久| 久久综合九色综合久久久精品综合| 91丨九色丨蝌蚪丨老版| 麻豆国产欧美日韩综合精品二区| 国产精品乱人伦一区二区| 88在线观看91蜜桃国自产| 国产电影一区二区三区| 亚洲成av人片在www色猫咪| 国产午夜精品一区二区三区嫩草 | 亚洲大片精品永久免费| 国产欧美一区二区三区鸳鸯浴| 欧美色偷偷大香| 处破女av一区二区| 日韩国产高清在线| 亚洲欧美偷拍卡通变态| 久久久综合视频| 337p亚洲精品色噜噜| 91网站视频在线观看| 国产一区二区导航在线播放| 亚洲mv在线观看| 国产精品国产自产拍高清av| 2欧美一区二区三区在线观看视频| 欧美系列亚洲系列| caoporm超碰国产精品| 激情综合网av| 亚洲一区二区视频在线观看| 国产精品不卡在线观看| 久久这里都是精品| 欧美一区日本一区韩国一区| 91国内精品野花午夜精品| 成人激情av网| 高清成人免费视频| 精品一区在线看| 日韩高清不卡在线| 亚洲国产三级在线| 亚洲精品高清视频在线观看| 中文字幕一区免费在线观看| 国产亚洲自拍一区| 久久综合久久综合久久综合| 日韩区在线观看| 欧美日韩成人一区二区| 色老汉av一区二区三区| 91麻豆swag| 91免费看`日韩一区二区| aa级大片欧美| 成人激情校园春色| 播五月开心婷婷综合| 国产成人精品综合在线观看| 国产精品一区二区果冻传媒| 经典三级在线一区| 国内成人精品2018免费看| 精品无人码麻豆乱码1区2区| 狂野欧美性猛交blacked| 久久国产日韩欧美精品| 久久超碰97人人做人人爱| 精品一区二区三区免费视频| 天天射综合影视| 日韩激情视频网站| 美日韩一区二区| 黄色成人免费在线| 国产精品一品视频| 国产精品12区| 国产99久久久久久免费看农村| 国产成人av电影在线播放| 风流少妇一区二区| 成人精品高清在线| 91女神在线视频| 欧美亚一区二区| 91精品国产综合久久福利| 91精品国产免费久久综合| 日韩视频在线观看一区二区| 精品福利一二区| 欧美国产一区视频在线观看| 亚洲素人一区二区| 亚洲午夜在线视频|