亚洲欧美第一页_禁久久精品乱码_粉嫩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热| 色婷婷综合五月| 午夜激情一区二区三区| 6080日韩午夜伦伦午夜伦| 麻豆传媒一区二区三区| 久久久久久久综合日本| 97久久精品人人澡人人爽| 亚洲一区在线视频| 欧美一区二区三区播放老司机| 美腿丝袜亚洲色图| 国产精品日韩成人| 欧美中文字幕久久| 国产最新精品精品你懂的| 国产欧美日本一区二区三区| 91蝌蚪porny| 蜜臀av性久久久久蜜臀av麻豆| wwwwxxxxx欧美| 色婷婷综合久久| 经典三级在线一区| 日韩毛片在线免费观看| 91麻豆精品国产91久久久使用方法 | 欧美精品黑人性xxxx| 紧缚捆绑精品一区二区| 亚洲精选视频在线| 精品久久人人做人人爽| 色综合天天综合| 久草在线在线精品观看| 亚洲欧美日韩国产成人精品影院| 日韩一区二区中文字幕| www.亚洲色图.com| 极品少妇一区二区| 亚洲欧美日韩成人高清在线一区| 日韩欧美一区在线| 91美女精品福利| 国产精品伊人色| 亚洲电影一级黄| 国产精品久久久久久久浪潮网站| 91精品欧美一区二区三区综合在| 成人av影视在线观看| 婷婷开心激情综合| 亚洲色图在线视频| 国产拍欧美日韩视频二区| 91精品视频网| 欧美日韩国产片| 色域天天综合网| 国产成人精品在线看| 免费观看在线综合| 亚洲高清免费观看高清完整版在线观看| 久久久久99精品一区| 在线不卡的av| 欧美日韩一区二区三区视频| 北条麻妃国产九九精品视频| 激情五月婷婷综合网| 丝袜美腿成人在线| 亚洲自拍偷拍图区| 亚洲柠檬福利资源导航| 国产精品久久久久久久久快鸭| ww久久中文字幕| 2023国产精品自拍| 日韩三级.com| 日韩午夜激情av| 欧美精品乱人伦久久久久久| 欧美在线观看一二区| 在线视频国内自拍亚洲视频| 99re这里只有精品6| 不卡视频一二三| 不卡一区二区三区四区| 福利一区在线观看| 成人avav影音| 一本色道a无线码一区v| 91片在线免费观看| 欧美色精品在线视频| 日本韩国欧美一区| 欧美亚洲国产一区在线观看网站| 色噜噜狠狠成人中文综合| 91丝袜高跟美女视频| 一本久久a久久免费精品不卡| 暴力调教一区二区三区| 91蝌蚪porny成人天涯| 欧洲国产伦久久久久久久| 欧美日韩在线播放三区四区| 欧美日韩在线播放三区| 欧美一二三区在线观看| 欧美成人一区二区三区在线观看| 精品国产成人系列| 国产精品网站在线观看| 国产精品福利影院| 亚洲国产视频一区| 青草国产精品久久久久久| 国产乱子伦一区二区三区国色天香 | 欧美性受xxxx黑人xyx性爽| 91福利国产成人精品照片| 欧美视频在线观看一区| 91精品黄色片免费大全| www久久精品| 亚洲视频一区在线观看| 亚洲丰满少妇videoshd| 男女男精品网站| 国产精品18久久久久久久网站| 成人福利电影精品一区二区在线观看| 色哟哟一区二区在线观看| 在线播放一区二区三区| 国产亚洲欧美在线| 亚洲精品国产精品乱码不99| 奇米精品一区二区三区四区| 国产精品影视天天线| 欧美在线观看视频在线| 精品嫩草影院久久| 日韩一区欧美小说| 麻豆成人久久精品二区三区小说| 成人性色生活片免费看爆迷你毛片| 99久久精品免费看国产免费软件| 在线观看三级视频欧美| 日韩欧美国产一区二区在线播放 | 激情成人午夜视频| 色激情天天射综合网| 欧美大片在线观看| 亚洲色图第一区| 久久99国内精品| 色婷婷狠狠综合| 久久精品免费在线观看| 日日摸夜夜添夜夜添精品视频| 成人在线视频一区二区| 欧美一区二区三区男人的天堂| 国产精品丝袜久久久久久app| 丝袜美腿亚洲一区二区图片| 成人午夜视频免费看| 91精品婷婷国产综合久久| 亚洲人成小说网站色在线| 精品一区二区免费在线观看| 在线区一区二视频| 亚洲欧洲三级电影| 韩国成人福利片在线播放| 欧美另类z0zxhd电影| 中文字幕视频一区| 国产精品综合网| 欧美一区二区三区在| 一区二区三区四区在线免费观看 | 欧美成人午夜电影| 亚洲国产成人高清精品| kk眼镜猥琐国模调教系列一区二区| 日韩三级视频中文字幕| 亚洲成人免费在线观看| 色综合色狠狠综合色| 国产精品久久久一本精品 | 亚洲日穴在线视频| 国产精品一二三四五| 欧美一区二区三区免费| 午夜天堂影视香蕉久久| 一本到高清视频免费精品| 中文字幕高清一区| 国产在线视频精品一区| 精品国产一区久久| 麻豆国产一区二区| 日韩一级片在线观看| 亚洲电影第三页| 欧美精品黑人性xxxx| 日韩激情视频网站| 69堂成人精品免费视频| 日韩电影在线观看网站| 欧美日韩国产精选| 亚洲成人手机在线| 欧美一区二区三区在线观看 | 丁香亚洲综合激情啪啪综合| 久久夜色精品一区| 国内精品伊人久久久久av一坑| 精品国产制服丝袜高跟| 国产精品123| 中文字幕第一页久久| 99久久久久久| 亚洲午夜久久久久久久久久久| 在线观看亚洲一区| 日韩va亚洲va欧美va久久| 欧美精品自拍偷拍动漫精品| 琪琪一区二区三区| 久久蜜桃一区二区| gogo大胆日本视频一区| 亚洲美女电影在线| 欧美日韩色综合| 久久精品国产秦先生| 国产视频视频一区| 99久久精品国产精品久久| 一区二区三区鲁丝不卡| 欧美精品电影在线播放| 国产一区亚洲一区| 国产精品二三区| 欧美日韩一区二区在线观看视频 | 麻豆成人久久精品二区三区小说| 欧美精品一区在线观看| 成人av在线看| 亚洲午夜久久久久中文字幕久| 日韩视频一区二区三区在线播放| 国产在线国偷精品产拍免费yy| 最新成人av在线| 日韩视频在线你懂得| 97久久久精品综合88久久| 日本伊人午夜精品|