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

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

?? sc2440pdd.cpp

?? 三星2440 cpu WINCE 5.00板級支持包
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
#include <windows.h>
#include <nkintr.h>
#include <ddkreg.h>
#include "sc2440pdd.h"


#define UDC_REG_PRIORITY_VAL _T("Priority256")

enum EP0_STATE {
    EP0_STATE_IDLE = 0,
    EP0_STATE_IN_DATA_PHASE,
    EP0_STATE_OUT_DATA_PHASE
};

#define IN_TRANSFER  1
#define OUT_TRANSFER 2


#define EP0_STALL_BITS (EP0_SEND_STALL | EP0_SENT_STALL)


typedef struct EP_STATUS {
    DWORD                   dwEndpointNumber;
    DWORD                   dwDirectionAssigned;
    DWORD                   dwPacketSizeAssigned;
    BOOL                    fInitialized;
    DWORD                   dwEndpointType;
    PSTransfer              pTransfer;
    CRITICAL_SECTION        cs;
} *PEP_STATUS;

#define LOCK_ENDPOINT(peps)     EnterCriticalSection(&peps->cs)
#define UNLOCK_ENDPOINT(peps)   LeaveCriticalSection(&peps->cs)


#define EP_0_PACKET_SIZE    0x8    // Could also be 16 but they recommend 8  

#define ENDPOINT_COUNT  5
#define EP_VALID(x)     ((x) < ENDPOINT_COUNT)


#define DEFAULT_PRIORITY 100

typedef struct CTRL_PDD_CONTEXT {
    PVOID             pvMddContext;
    DWORD             dwSig;
    HANDLE            hIST;
    HANDLE            hevInterrupt;
    BOOL              fRunning;
    CRITICAL_SECTION  csIndexedRegisterAccess;
    BOOL              fSpeedReported;
    BOOL              fRestartIST;
    BOOL              fExitIST;
    BOOL              attachedState;
    BOOL              sendDataEnd;
    EP0_STATE         Ep0State;
    
    // registry 
    DWORD             dwIOBase;
    DWORD             dwSysIntr;
    DWORD             dwIrq;
    DWORD             dwIOLen;
    DWORD             dwISTPriority;

    EP_STATUS         rgEpStatus[ENDPOINT_COUNT];
    
    PFN_UFN_MDD_NOTIFY      pfnNotify;
    HANDLE                  hBusAccess;
    CEDEVICE_POWER_STATE    cpsCurrent;
} *PCTRLR_PDD_CONTEXT;

#define SC2440_SIG '2440' // "SC2440" signature

#define IS_VALID_SC2440_CONTEXT(ptr) \
    ( (ptr != NULL) && (ptr->dwSig == SC2440_SIG) )


#ifdef DEBUG

#define ZONE_POWER           DEBUGZONE(8)

UFN_GENERATE_DPCURSETTINGS(UFN_DEFAULT_DPCURSETTINGS_NAME, 
    _T("Power"), _T(""), _T(""), _T(""), 
    DBG_ERROR | DBG_INIT); 

// Validate the context.
static
VOID
ValidateContext(
                PCTRLR_PDD_CONTEXT pContext
                )
{
    PREFAST_DEBUGCHK(pContext);
    DEBUGCHK(pContext->dwSig == SC2440_SIG);
    DEBUGCHK(!pContext->hevInterrupt || pContext->hIST);
    DEBUGCHK(VALID_DX(pContext->cpsCurrent));
    DEBUGCHK(pContext->pfnNotify);
}

#else
#define ValidateContext(ptr)
#endif

volatile BYTE *g_pUDCBase;

#define CTRLR_BASE_REG_ADDR(offset) ((volatile ULONG*) ( (g_pUDCBase) + (offset)))


// Read a register.
inline
BYTE
ReadReg(
        PCTRLR_PDD_CONTEXT pContext,
        DWORD dwOffset
        )
{
    DEBUGCHK(IS_VALID_SC2440_CONTEXT(pContext));

    volatile ULONG *pbReg = CTRLR_BASE_REG_ADDR(dwOffset);
    BYTE bValue = (BYTE) *pbReg;
    return bValue;
}


// Write a register.
inline
VOID
WriteReg(
         PCTRLR_PDD_CONTEXT pContext,
         DWORD dwOffset,
         BYTE bValue
         )
{
    DEBUGCHK(IS_VALID_SC2440_CONTEXT(pContext));

    volatile ULONG *pbReg = CTRLR_BASE_REG_ADDR(dwOffset);
    *pbReg = (ULONG) bValue;
}



// Calling with dwMask = 0 and SET reads and writes the contents unchanged.
inline
BYTE
SetClearReg(
            PCTRLR_PDD_CONTEXT pContext,
            DWORD dwOffset,
            BYTE dwMask,
            BOOL  bSet
            )
{
    DEBUGCHK(IS_VALID_SC2440_CONTEXT(pContext));

    volatile ULONG *pbReg = CTRLR_BASE_REG_ADDR(dwOffset);
    BYTE bValue = (BYTE) *pbReg;

    if (bSet) {
        bValue |= dwMask;
    }
    else {
        bValue &= ~dwMask;
    }

    *pbReg = bValue;

    return bValue;
}
// Calling with dwMask = 0 and SET reads and writes the contents unchanged.
inline
BYTE
SetClearIndexedReg(
                   PCTRLR_PDD_CONTEXT pContext,
                   DWORD dwEndpoint,
                   DWORD dwOffset,
                   BYTE dwMask,
                   BOOL  bSet
                   )
{
    DEBUGCHK(IS_VALID_SC2440_CONTEXT(pContext));
    BYTE bValue = 0;

    EnterCriticalSection(&pContext->csIndexedRegisterAccess);
    // Write the EP number to the index reg
    WriteReg(pContext, IDXADDR_REG_OFFSET, (BYTE) dwEndpoint);    
    // Now Write the Register associated with this Endpoint for a given offset
    bValue = SetClearReg(pContext, dwOffset, dwMask, bSet);
    LeaveCriticalSection(&pContext->csIndexedRegisterAccess);

    return bValue;
}
#define SET   TRUE
#define CLEAR FALSE



// Read an indexed register.
inline
BYTE
ReadIndexedReg(
               PCTRLR_PDD_CONTEXT pContext,
               DWORD dwEndpoint,
               DWORD regOffset
               )
{
    DEBUGCHK(IS_VALID_SC2440_CONTEXT(pContext));

    EnterCriticalSection(&pContext->csIndexedRegisterAccess);
    // Write the EP number to the index reg
    WriteReg(pContext, IDXADDR_REG_OFFSET, (BYTE) dwEndpoint);
    // Now Read the Register associated with this Endpoint for a given offset
    BYTE bValue = ReadReg(pContext, regOffset);
    LeaveCriticalSection(&pContext->csIndexedRegisterAccess);
    return bValue;
}


// Write an indexed register.
inline
VOID
WriteIndexedReg(
                PCTRLR_PDD_CONTEXT pContext,
                DWORD dwEndpoint,
                DWORD regOffset,
                BYTE  bValue
                )
{  
    DEBUGCHK(IS_VALID_SC2440_CONTEXT(pContext));

    EnterCriticalSection(&pContext->csIndexedRegisterAccess);
    // Write the EP number to the index reg
    WriteReg(pContext, IDXADDR_REG_OFFSET, (BYTE) dwEndpoint);    
    // Now Write the Register associated with this Endpoint for a given offset
    WriteReg(pContext, regOffset, bValue);
    LeaveCriticalSection(&pContext->csIndexedRegisterAccess);
}

/*++

Routine Description:

Return the data register of an endpoint.

Arguments:

dwEndpoint - the target endpoint

Return Value:

The data register of the target endpoint.

--*/
static
volatile ULONG*
_GetDataRegister(
                 DWORD        dwEndpoint    
                 )
{
    volatile ULONG *pulDataReg = NULL;

    //
    // find the data register (non-uniform offset)
    //
    switch (dwEndpoint) {
        case  0: pulDataReg = CTRLR_BASE_REG_ADDR(EP0_FIFO_REG_OFFSET);  break;
        case  1: pulDataReg = CTRLR_BASE_REG_ADDR(EP1_FIFO_REG_OFFSET);  break;
        case  2: pulDataReg = CTRLR_BASE_REG_ADDR(EP2_FIFO_REG_OFFSET);  break;
        case  3: pulDataReg = CTRLR_BASE_REG_ADDR(EP3_FIFO_REG_OFFSET);  break;
        case  4: pulDataReg = CTRLR_BASE_REG_ADDR(EP4_FIFO_REG_OFFSET);  break;
        default:
            DEBUGCHK(FALSE);
            break;
    }

    return pulDataReg;
} // _GetDataRegister


// Retrieve the endpoint status structure.
inline
static
PEP_STATUS
GetEpStatus(
            PCTRLR_PDD_CONTEXT pContext,
            DWORD dwEndpoint
            )
{
    ValidateContext(pContext);
    DEBUGCHK(EP_VALID(dwEndpoint));

    PEP_STATUS peps = &pContext->rgEpStatus[dwEndpoint];

    return peps;
}


// Return the irq bit for this endpoint.
inline
static
BYTE
EpToIrqStatBit(
               DWORD dwEndpoint
               )
{
    DEBUGCHK(EP_VALID(dwEndpoint));

    return (1 << (BYTE)dwEndpoint);
}

/*++

Routine Description:

Enable the interrupt of an endpoint.

Arguments:

dwEndpoint - the target endpoint

Return Value:

None.

--*/
static
VOID
EnableDisableEndpointInterrupt(
                        PCTRLR_PDD_CONTEXT  pContext,
                        DWORD               dwEndpoint,
                        BOOL                fEnable
                        )
{
    // TODO: Make new cs or rename this one
    EnterCriticalSection(&pContext->csIndexedRegisterAccess);
    
    // Disable the Endpoint Interrupt
    BYTE bEpIntReg = ReadReg(pContext, EP_INT_EN_REG_OFFSET);
    BYTE bIrqEnBit = EpToIrqStatBit(dwEndpoint);

    if (fEnable) {
        bEpIntReg |= bIrqEnBit;
    }
    else {
        bEpIntReg &= ~bIrqEnBit;
    }
    
    WriteReg(pContext, EP_INT_EN_REG_OFFSET, bEpIntReg);

    LeaveCriticalSection(&pContext->csIndexedRegisterAccess);    
}

static
inline
VOID
EnableEndpointInterrupt(
    PCTRLR_PDD_CONTEXT  pContext,
    DWORD               dwEndpoint
    )
{
    SETFNAME();
    FUNCTION_ENTER_MSG();
    
    EnableDisableEndpointInterrupt(pContext, dwEndpoint, TRUE);

    FUNCTION_LEAVE_MSG();
}

static
inline
VOID
DisableEndpointInterrupt(
    PCTRLR_PDD_CONTEXT  pContext,
    DWORD               dwEndpoint
    )
{
    SETFNAME();
    FUNCTION_ENTER_MSG();
    
    EnableDisableEndpointInterrupt(pContext, dwEndpoint, FALSE);

    FUNCTION_LEAVE_MSG();
}

/*++

Routine Description:

Clear the interrupt status register index of an endpoint.

Arguments:

dwEndpoint - the target endpoint

Return Value:

None.

--*/
static
VOID
ClearEndpointInterrupt(
                       PCTRLR_PDD_CONTEXT pContext,
                       DWORD        dwEndpoint
                       )
{    
    SETFNAME();

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99精品视频在线观看| 日韩精品一级中文字幕精品视频免费观看 | 一区二区三区日韩欧美精品| 99re热这里只有精品视频| 亚洲视频狠狠干| 欧美在线看片a免费观看| 中文字幕在线视频一区| 一本色道亚洲精品aⅴ| 亚洲第一综合色| 555夜色666亚洲国产免| 精品系列免费在线观看| 国产日韩欧美综合在线| 99久久婷婷国产综合精品电影 | 2021中文字幕一区亚洲| 成人综合婷婷国产精品久久免费| 国产精品久久久久久久久果冻传媒| 欧美中文字幕亚洲一区二区va在线 | 亚洲欧洲日韩一区二区三区| 欧美体内she精高潮| 免费日本视频一区| 国产日韩视频一区二区三区| 在线视频亚洲一区| 捆绑变态av一区二区三区| 国产精品乱人伦一区二区| 欧美日韩在线播放三区四区| 久久精品99国产精品| 国产精品传媒在线| 69精品人人人人| 国产**成人网毛片九色| 亚洲国产成人av| 久久看人人爽人人| 精品视频123区在线观看| 国产综合色在线| 一区二区三区 在线观看视频| 欧美成人a视频| 一本一本大道香蕉久在线精品| 青青草国产精品亚洲专区无| 亚洲丝袜美腿综合| 久久综合999| 欧美人与z0zoxxxx视频| 成人app网站| 蜜桃av一区二区在线观看| 亚洲欧洲精品一区二区三区不卡| 欧美美女网站色| 99久久er热在这里只有精品66| 美女网站色91| 亚洲国产精品嫩草影院| 亚洲国产精品激情在线观看| 欧美电影免费提供在线观看| 91久久国产综合久久| 成人天堂资源www在线| 美女视频免费一区| 亚洲国产日韩精品| 中文字幕一区在线| 久久品道一品道久久精品| 在线成人免费视频| 在线免费观看一区| 91影视在线播放| 国产精品亚洲第一| 国产在线精品一区在线观看麻豆| 视频一区欧美日韩| 亚洲午夜在线电影| 亚洲精选视频免费看| 国产精品热久久久久夜色精品三区| 精品国产污污免费网站入口 | 视频一区欧美日韩| 午夜激情久久久| 亚洲国产综合色| 亚洲一区二区三区自拍| 亚洲日本一区二区三区| 国产精品久久久一本精品| ㊣最新国产の精品bt伙计久久| 国产日韩欧美a| 国产日韩欧美激情| 国产欧美日本一区视频| 国产亚洲欧美中文| 国产校园另类小说区| 久久久高清一区二区三区| 久久一区二区三区四区| 久久久久久亚洲综合| 久久只精品国产| 久久先锋影音av鲁色资源网| 久久久天堂av| 国产精品久久久久影院| 中文字幕一区二区三区四区| 一区免费观看视频| 亚洲视频1区2区| 一区二区成人在线视频| 亚洲精品成人精品456| 亚洲图片自拍偷拍| 日本美女视频一区二区| 国内外成人在线视频| 国产 欧美在线| 91麻豆国产自产在线观看| 一本色道a无线码一区v| 欧美日韩精品三区| 精品国产一区二区三区久久影院 | 成人免费av在线| 97久久精品人人澡人人爽| 91免费看视频| 欧美精品在线一区二区三区| 久久久亚洲综合| 国产精品国产成人国产三级| 亚洲永久免费av| 蜜臂av日日欢夜夜爽一区| 高潮精品一区videoshd| 日本精品视频一区二区| 欧美一卡二卡三卡| 国产女人18毛片水真多成人如厕| 亚洲精品视频自拍| 另类调教123区| www.欧美.com| 欧美日韩国产一级| 久久精品亚洲麻豆av一区二区| 亚洲激情图片一区| 久久国内精品自在自线400部| 不卡一卡二卡三乱码免费网站 | 51精品秘密在线观看| 国产日韩视频一区二区三区| 亚洲国产精品视频| 国产精品一级在线| 欧美日本在线播放| 欧美激情一区二区三区全黄| 亚洲电影一级黄| 成人黄色大片在线观看| 欧美精品国产精品| 国产婷婷一区二区| 午夜欧美视频在线观看| 国产成a人亚洲精品| 这里只有精品视频在线观看| 国产精品久久久久影视| 韩国av一区二区三区| 欧美日韩亚洲综合在线 | 久久久久久久久久久久久女国产乱| 亚洲视频免费看| 国产老妇另类xxxxx| 欧美午夜精品久久久| 国产精品无码永久免费888| 日本大胆欧美人术艺术动态| 91色porny| 久久精品欧美日韩精品| 免费欧美高清视频| 欧美偷拍一区二区| 亚洲日本护士毛茸茸| 国产98色在线|日韩| 精品成人私密视频| 午夜精品久久久久久久久久 | 国产欧美日韩在线看| 久久国产尿小便嘘嘘尿| 欧美性猛交一区二区三区精品| 国产精品全国免费观看高清| 精品一二三四区| 日韩一区二区影院| 婷婷夜色潮精品综合在线| 色综合久久久久久久久久久| 国产精品高潮久久久久无| 国产一区二区精品久久91| 欧美一级在线免费| 偷拍与自拍一区| 欧美日韩一区中文字幕| 亚洲国产综合色| 欧美日韩午夜影院| 亚洲国产精品一区二区尤物区| 91福利视频在线| 一区二区三区美女| 色狠狠桃花综合| 亚洲精选在线视频| 欧美色图天堂网| 午夜久久久久久久久久一区二区| 欧美日韩一卡二卡| 无吗不卡中文字幕| 91精品国产综合久久香蕉麻豆| 亚洲成人综合在线| 日韩一区二区三区免费看| 日本aⅴ免费视频一区二区三区| 欧美一级片免费看| 狠狠色综合日日| 国产喷白浆一区二区三区| 成人免费视频视频| 1024精品合集| 欧美视频三区在线播放| 天天操天天干天天综合网| 91精品国产综合久久精品app | 婷婷夜色潮精品综合在线| 日韩视频一区二区在线观看| 另类成人小视频在线| 国产区在线观看成人精品| 色美美综合视频| 午夜伊人狠狠久久| 2023国产精品自拍| 色综合天天在线| 亚洲bdsm女犯bdsm网站| 精品国产伦一区二区三区观看体验| 国产suv一区二区三区88区| 国产精品欧美一区二区三区| 色丁香久综合在线久综合在线观看| 亚洲第一会所有码转帖| 久久影院视频免费| 色天天综合久久久久综合片| 婷婷久久综合九色综合伊人色|