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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? sdbusreq.cpp

?? 6410BSP3
?? CPP
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES OR INDEMNITIES.
//
//
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.

Module Name:  
    SDBusReq.cpp
Abstract:
    SDBus Implementation.

Notes: 
--*/

#include <windows.h>
#include <bldver.h>
#include <cesdbus.h>
#include <marshal.hpp>

#include "../HSMMCCh1/s3c6410_hsmmc_lib/sdhcd.h"

#include "sdbus.hpp"
#include "sdslot.hpp"
#include "sdbusreq.hpp"

void * CSDBusRequest::operator new(size_t stSize)
{
    return CSDHostContainer::AllocateBusRequest(stSize);
}
void CSDBusRequest::operator delete (void *pointer)
{
    CSDHostContainer::FreeBusRequest((CSDBusRequest *)pointer);
}
DWORD CSDBusRequest::g_dwRequestIndex = 0 ;
CSDBusRequest::CSDBusRequest(CSDDevice& sdDevice, SD_BUS_REQUEST& sdBusRequest, HANDLE hCallback, CSDBusRequest * pParentBus )
:   m_pParentBus(pParentBus)
,   m_hCallback(hCallback)
,   m_sdDevice(sdDevice)
{
    m_lRefCount = 0;
    m_pAsyncQueueNext = NULL;
    m_pChildListNext = NULL;

    m_dwRequestIndex = (SDBUS_REQUEST_INDEX_MASK & (DWORD)InterlockedIncrement((PLONG)&g_dwRequestIndex));

    ListEntry.Flink = NULL;
    ListEntry.Blink = NULL;
    hDevice = (m_sdDevice.GetDeviceHandle()).hValue;
    SystemFlags = sdBusRequest.SystemFlags;
    TransferClass = sdBusRequest.TransferClass;
    CommandCode = sdBusRequest.CommandCode;
    CommandArgument = sdBusRequest.CommandArgument;
    CommandResponse.ResponseType = sdBusRequest.CommandResponse.ResponseType;
    RequestParam   = sdBusRequest.RequestParam;
    NumBlocks = sdBusRequest.NumBlocks;
    BlockSize = sdBusRequest.BlockSize;
    HCParam = 0;
    pBlockBuffer = NULL ;
    pCallback    = sdBusRequest.pCallback;
    DataAccessClocks = 0; // reset data access clocks
    Flags = sdBusRequest.Flags ;
    Status = SD_API_STATUS_PENDING ;
    m_pOrinalAddr =  sdBusRequest.pBlockBuffer;
    if ((Flags & SD_BUS_REQUEST_PHYS_BUFFER) &&  sdBusRequest.cbSizeOfPhysList && sdBusRequest.pPhysBuffList) {
        cbSizeOfPhysList = sdBusRequest.cbSizeOfPhysList/sizeof(PHYS_BUFF_LIST); // Convert to unit.
        m_pOrignalPhysAddr = sdBusRequest.pPhysBuffList;
        if (!SUCCEEDED(CeAllocAsynchronousBuffer((PVOID *)&pPhysBuffList,m_pOrignalPhysAddr,cbSizeOfPhysList*sizeof(PHYS_BUFF_LIST),ARG_I_PTR))) {
            Flags &= ~SD_BUS_REQUEST_PHYS_BUFFER;
            pPhysBuffList = NULL;
            cbSizeOfPhysList = 0 ;
        }
    }
    else {
        m_pOrignalPhysAddr= pPhysBuffList = NULL;
        cbSizeOfPhysList = 0;
    }

    if (m_pParentBus)
        m_pParentBus->AddRef();
    m_dwArguDesc = 0 ;
    m_fCompleted = FALSE;
    m_ExternalHandle = NULL;
}
CSDBusRequest::~CSDBusRequest()
{
    TerminateLink();
    if (m_pOrinalAddr && pBlockBuffer && m_pOrinalAddr != pBlockBuffer) {
        HRESULT hResult= CeFreeAsynchronousBuffer(pBlockBuffer,m_pOrinalAddr, NumBlocks*BlockSize, m_dwArguDesc) ;
        ASSERT(SUCCEEDED(hResult));
    }
    if ( pPhysBuffList && cbSizeOfPhysList && m_pOrignalPhysAddr && m_pOrignalPhysAddr!=pPhysBuffList) {
        HRESULT hResult= CeFreeAsynchronousBuffer(pPhysBuffList,m_pOrignalPhysAddr, cbSizeOfPhysList*sizeof(PHYS_BUFF_LIST), ARG_I_PTR) ;
        ASSERT(SUCCEEDED(hResult));
    }
}
BOOL CSDBusRequest::Init()
{
        BOOL fRet = TRUE;
    if( TransferClass == SD_READ || TransferClass == SD_WRITE ) {
        if( NumBlocks == 0 ) {
            DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("SDBusRequest: SDBusRequest- No transfer buffers passed \n")));
            Status = SD_API_STATUS_INVALID_PARAMETER;
            fRet = FALSE;
        }
        else if( m_pOrinalAddr == NULL ) {
        // check pointer to see if block array ptr is non-NULL
            DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("SDBusRequest: SDBusRequest- NULL buffer pointer passed \n")));
            Status =  SD_API_STATUS_INVALID_PARAMETER;
            fRet = FALSE;
        } else if ( m_pOrinalAddr && NumBlocks && BlockSize && m_hCallback ) { // External call
            m_dwArguDesc = (TransferClass == SD_READ?ARG_O_PTR:ARG_I_PTR);
            if (NumBlocks>=(1<<16) || BlockSize>=(1<<16) || !SUCCEEDED(CeAllocAsynchronousBuffer((PVOID *)&pBlockBuffer,m_pOrinalAddr,NumBlocks*BlockSize,m_dwArguDesc))) {
                DEBUGMSG(SDCARD_ZONE_ERROR,   (TEXT("SDBusRequest__X CeAllocAsynchronousBuffer Error (%d)\r\n"),GetLastError()));
                ASSERT(FALSE);
                Status = SD_API_STATUS_ACCESS_VIOLATION;
                pBlockBuffer = NULL ;
                fRet = FALSE;
            } 
        }
        else {
            pBlockBuffer = (PUCHAR) m_pOrinalAddr ;
        }
    }
    if (fRet) {
        if ((Device_SD_Memory == m_sdDevice.GetDeviceType()) || (Device_MMC == m_sdDevice.GetDeviceType())) {
            if (TransferClass == SD_READ) {
                // set for read
                DataAccessClocks = m_sdDevice.GetCardInfo().SDMMCInformation.DataAccessReadClocks;
            } else if (TransferClass == SD_WRITE) {
                // set write
                DataAccessClocks = m_sdDevice.GetCardInfo().SDMMCInformation.DataAccessWriteClocks; 
            }
        }
        SystemFlags &= ~SYSTEM_FLAGS_RETRY_COUNT_MASK;
        SystemFlags |= (CSDHostContainer::GetRetryCount() & SYSTEM_FLAGS_RETRY_COUNT_MASK);
        SystemFlags |= ((Flags & SD_SLOTRESET_REQUEST)!=0?SD_BUS_REQUEST_SLOT_RESET:0);
        
        if (m_pParentBus == NULL) { // This is paranet
        
            UCHAR ucSDIOFlags =  m_sdDevice.GetCardInfo().SDIOInformation.Flags;
            if ((( 1 < NumBlocks ) && 
                       ((SD_CMD_IO_RW_EXTENDED == CommandCode) && 
                         (((SD_READ == TransferClass) && 
                           (0 != (ucSDIOFlags & (SFTBLK_USE_FOR_CMD53_READ | SFTBLK_USE_ALWAYS )))) ||
                       ((SD_WRITE == TransferClass ) && 
                           (0 != (ucSDIOFlags & (SFTBLK_USE_FOR_CMD53_WRITE | SFTBLK_USE_ALWAYS ))))))) ||
                    ((SD_CMD_READ_MULTIPLE_BLOCK == CommandCode) && 
                       (0 != (ucSDIOFlags & (SFTBLK_USE_FOR_CMD18 | SFTBLK_USE_ALWAYS )))) ||
                    ((SD_CMD_WRITE_MULTIPLE_BLOCK == CommandCode) && 
                       (0 != (ucSDIOFlags & (SFTBLK_USE_FOR_CMD25 | SFTBLK_USE_ALWAYS ))))) {
                // It is really hard to seperate physical buffer. If this happen. we disable physical buffer.
                Flags &= ~SD_BUS_REQUEST_PHYS_BUFFER;
                fRet = BuildSoftBlock();
            }
            if (((SD_CMD_READ_MULTIPLE_BLOCK != CommandCode) || 
                      (0 == (ucSDIOFlags & (SFTBLK_USE_FOR_CMD18 | SFTBLK_USE_ALWAYS)))) &&
                    ((SD_CMD_WRITE_MULTIPLE_BLOCK != CommandCode) || 
                      (0 == (ucSDIOFlags & (SFTBLK_USE_FOR_CMD25 | SFTBLK_USE_ALWAYS )))) && 
                    (0 == (ucSDIOFlags & SFTBLK_USE_ALWAYS))) {
                // check for optional request
                fRet =  BuildOptionalRequest( ucSDIOFlags );
            }        
        }
    }
    ASSERT(fRet);
    if (!fRet)
        m_fCompleted = TRUE;
    return fRet;
        
}

BOOL CSDBusRequest::CheckForCompletion()
{
    if (m_pParentBus!=NULL) {
        return m_pParentBus->CheckForCompletion();
    }
    else if (IsComplete()) {
        // This one is completed.
        if (SD_API_SUCCESS(Status) && m_pChildListNext!=NULL) {
            Status = m_pChildListNext->GetFirstFailedStatus();
        }
#ifdef DEBUG
        SD_CARD_STATUS cardStatus;

        if (SDBUS_ZONE_REQUEST) {
            DEBUGMSG(SDBUS_ZONE_REQUEST, (TEXT("--- SDBusDriver: CMD%d  CMDArg: 0x%08X TransferClass:%d ResponseType: %s Complete\n"),
                CommandCode, CommandArgument,TransferClass,  SDCardResponseTypeLookUp[CommandResponse.ResponseType & 0x7]));

            if (SD_API_SUCCESS(Status)) {
                if ( (ResponseR1 == CommandResponse.ResponseType) || (ResponseR1b == CommandResponse.ResponseType)) {
                    SDGetCardStatusFromResponse(&CommandResponse, &cardStatus);
                    DEBUGMSG(SDBUS_ZONE_REQUEST, (TEXT("--- SDBusDriver: R1,R1b Response, Card Status: 0x%08X,  Last State: %s \n"),
                        cardStatus,
                        SDCardStateStringLookUp[((CommandResponse.ResponseBuffer[2] >> 1) & 0x0F)]));
                }

                if (NoResponse != CommandResponse.ResponseType) {

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91成人在线精品| 日韩情涩欧美日韩视频| 极品瑜伽女神91| 最新不卡av在线| 精品国产一区二区三区不卡| 91激情五月电影| 国产白丝网站精品污在线入口| 亚洲国产va精品久久久不卡综合| 国产欧美一区二区三区沐欲 | 欧美猛男gaygay网站| 丁香网亚洲国际| 精品在线免费观看| 日韩成人精品在线| 亚洲精品你懂的| 中文无字幕一区二区三区| 日韩一区二区麻豆国产| 欧美怡红院视频| 97精品电影院| 成人久久视频在线观看| 国产精品1024| 国产在线视频一区二区| 美女任你摸久久| 日产国产欧美视频一区精品| 亚洲高清不卡在线| 亚洲高清视频在线| 一个色妞综合视频在线观看| 亚洲私人影院在线观看| 国产精品久久久一区麻豆最新章节| 久久亚洲一区二区三区四区| 日韩久久久精品| 欧美xxxx在线观看| 精品美女在线观看| 久久婷婷国产综合精品青草| 在线中文字幕一区| 亚洲mv在线观看| 亚洲欧美激情在线| 国产精品久久久久久一区二区三区 | 91福利在线观看| 91色九色蝌蚪| 色屁屁一区二区| 欧美性欧美巨大黑白大战| 欧美日韩一区二区三区四区五区| 91久久香蕉国产日韩欧美9色| 色网综合在线观看| 欧美日韩一级黄| 51精品秘密在线观看| 欧美mv日韩mv国产网站| 精品国产乱码久久久久久牛牛| 欧美成人性福生活免费看| 久久久不卡网国产精品二区| 欧美国产日本韩| 一区二区三区精密机械公司| 午夜成人在线视频| 欧美bbbbb| 日本三级亚洲精品| 国产一区二区视频在线| 国产不卡在线一区| 91免费版pro下载短视频| 在线精品亚洲一区二区不卡| 欧美日韩国产天堂| 亚洲精品在线观| 国产精品不卡在线观看| 亚洲最大的成人av| 七七婷婷婷婷精品国产| 高清视频一区二区| 欧美中文一区二区三区| 日韩欧美国产电影| 国产精品乱人伦中文| 亚洲一区二区在线免费看| 免费av成人在线| 成人激情小说乱人伦| 欧美在线播放高清精品| 精品免费视频.| 亚洲乱码一区二区三区在线观看| 日韩国产欧美三级| zzijzzij亚洲日本少妇熟睡| 3d成人h动漫网站入口| 久久久亚洲国产美女国产盗摄| 亚洲黄色性网站| 国产伦精品一区二区三区免费 | 成人h动漫精品一区二| 欧美色手机在线观看| 久久精品水蜜桃av综合天堂| 亚洲丝袜自拍清纯另类| 蜜桃精品视频在线| 91视频免费观看| 精品处破学生在线二十三| 亚洲免费在线视频一区 二区| 免费三级欧美电影| 在线观看欧美日本| 国产欧美一区二区三区网站| 日韩不卡在线观看日韩不卡视频| 不卡av电影在线播放| 精品国产乱码久久久久久浪潮| 亚洲精品国久久99热| 国产精品自拍毛片| 88在线观看91蜜桃国自产| 亚洲视频在线观看一区| 国产精品自拍网站| 日韩欧美一二区| 亚洲激情综合网| 不卡欧美aaaaa| 久久久99精品久久| 麻豆成人av在线| 欧美日韩第一区日日骚| 亚洲激情男女视频| 波多野结衣欧美| 久久久综合精品| 久久国产综合精品| 欧美一区三区四区| 亚洲h动漫在线| 欧美性猛片aaaaaaa做受| 亚洲视频在线一区| 成人精品国产免费网站| 久久网站最新地址| 日韩vs国产vs欧美| 欧美日韩国产美| 亚洲国产aⅴ成人精品无吗| 91国偷自产一区二区三区观看| 中文字幕在线不卡| 成人网男人的天堂| 国产免费观看久久| 国产盗摄精品一区二区三区在线| 精品日韩99亚洲| 久久99久久久欧美国产| 欧美一级久久久久久久大片| 日韩国产欧美在线视频| 欧美精三区欧美精三区 | 成人精品国产福利| 国产精品久久三| av在线播放成人| 亚洲美女视频一区| 色女孩综合影院| 亚洲午夜精品久久久久久久久| 精品视频全国免费看| 亚洲成av人片一区二区| 欧美老肥妇做.爰bbww| 亚洲va国产天堂va久久en| 欧美精品v日韩精品v韩国精品v| 午夜不卡在线视频| 欧美一区二区视频在线观看| 蜜桃精品视频在线观看| 久久综合九色欧美综合狠狠| 国产毛片精品视频| 中文字幕永久在线不卡| 日本精品一级二级| 日韩高清电影一区| 欧美sm美女调教| 国产v综合v亚洲欧| 亚洲少妇30p| 欧美午夜宅男影院| 免费欧美在线视频| 国产亚洲欧美在线| 91在线免费播放| 午夜婷婷国产麻豆精品| 欧美成人精品二区三区99精品| 国产一区 二区| 亚洲欧美另类久久久精品2019| 欧美片网站yy| 国产一区二区美女| 亚洲日本乱码在线观看| 宅男在线国产精品| 国产精品亚洲人在线观看| 一区二区三区四区不卡视频 | 亚洲免费在线播放| 91精品国产入口| 国产v日产∨综合v精品视频| 亚洲精品久久久蜜桃| 日韩午夜精品视频| 91色婷婷久久久久合中文| 日韩高清不卡在线| 国产精品美女久久久久高潮| 欧美日韩高清在线播放| 国产成人在线免费| 亚洲午夜精品在线| 国产农村妇女精品| 欧美日韩一区高清| 国产91丝袜在线18| 午夜精品一区二区三区三上悠亚| 欧美成人伊人久久综合网| 91丨porny丨户外露出| 久久se精品一区精品二区| 亚洲老妇xxxxxx| 26uuu成人网一区二区三区| 一本到不卡免费一区二区| 另类小说一区二区三区| 亚洲卡通欧美制服中文| 欧美精品一区二区三区高清aⅴ | 欧美一级免费大片| 91影视在线播放| 久久国产尿小便嘘嘘尿| 一区二区三区在线视频免费| 久久久影视传媒| 67194成人在线观看| 色哟哟欧美精品| 国产.欧美.日韩| 九九视频精品免费| 首页综合国产亚洲丝袜| 自拍偷拍亚洲欧美日韩| 久久久国产精品午夜一区ai换脸 |