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

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

?? sddevice.cpp

?? 6410BSP3
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
//
// 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.
//
//
/*++
  Module Name:  
  SDDevice.cpp
Abstract:
SDBus Implementation.

Notes: 
--*/
#include <windows.h>
#include <types.h>
#include <creg.hxx>

#include "../HSMMCCh1/s3c6410_hsmmc_lib/sdhcd.h"
#include <cesdbus.h>
#include "../HSMMCCh1/s3c6410_hsmmc_lib/sdcard.h"

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

#define SD_GET_IO_RW_DIRECT_RESPONSE_FLAGS(pResponse) (pResponse)->ResponseBuffer[SD_IO_R5_RESPONSE_FLAGS_BYTE_OFFSET]   
#define SD_GET_IO_RW_DIRECT_DATA(pResponse)           (pResponse)->ResponseBuffer[SD_IO_R5_RESPONSE_DATA_BYTE_OFFSET]  


DWORD CSDDevice::g_FuncRef = 0 ;
    CSDDevice::CSDDevice(DWORD dwFunctionIndex, CSDSlot& sdSlot)
    :   m_sdSlot(sdSlot)
        ,   m_FuncionIndex(dwFunctionIndex)
{
    m_DeviceType = Device_Unknown;
    m_RelativeAddress = 0 ;
    m_FuncRef = (DWORD)InterlockedIncrement((LPLONG)&g_FuncRef);


    m_fAttached = FALSE;
    m_pDriverFolder = NULL;

    m_hCallbackHandle = NULL;
    m_fIsHandleCopied = FALSE;
    m_ClientName[0] = 0;
    m_ClientFlags = 0;
    m_DeviceType=Device_Unknown;
    m_pDeviceContext = NULL;
    m_pSlotEventCallBack = NULL;
    m_RelativeAddress = 0;
    m_OperatingVoltage =0 ;
    m_pSystemContext = NULL;
    // set default access clocks
    memset(&m_SDCardInfo,0,sizeof(m_SDCardInfo));
    m_SDCardInfo.SDMMCInformation.DataAccessReadClocks = SD_UNSPECIFIED_ACCESS_CLOCKS;
    m_SDCardInfo.SDMMCInformation.DataAccessWriteClocks = SD_UNSPECIFIED_ACCESS_CLOCKS;
    m_SDCardInfo.SDIOInformation.Function = (UCHAR)dwFunctionIndex;
    m_bCardSelectRequest = FALSE;
    m_bCardDeselectRequest = FALSE;

    m_dwCurSearchIndex = 0; 
    m_dwCurFunctionGroup = 0 ;
    m_hSyncEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
#ifdef _MMC_SPEC_42_
    /**
     * Description : to set initial MMC type
     */
    m_dwMMCSpecVer = Device_MMC;
    memset(m_ucEXTCSD, 0, MMC_EXTCSD_REGISTER_SIZE);
#endif

}

CSDDevice::~CSDDevice()
{
    Detach();
    if (m_hSyncEvent)
        CloseHandle(m_hSyncEvent);
    if (m_SDCardInfo.SDIOInformation.pCommonInformation!=NULL) {
        if (m_SDCardInfo.SDIOInformation.pCommonInformation->pProductInformation)
            delete[] m_SDCardInfo.SDIOInformation.pCommonInformation->pProductInformation;
        delete m_SDCardInfo.SDIOInformation.pCommonInformation;
    }

}

BOOL CSDDevice::Init()
{
    if (!m_hSyncEvent)
        return FALSE;
    memset(&m_CardInterfaceEx,0,sizeof(m_CardInterfaceEx));
    m_CardInterfaceEx.ClockRate = SD_DEFAULT_CARD_ID_CLOCK_RATE;
    return TRUE;
}
BOOL CSDDevice::Attach() 
{
    m_fAttached = TRUE;
    return TRUE;
}

BOOL CSDDevice::Detach()
{
    Lock();
    if (m_fAttached) {
        m_fAttached = FALSE;
        SDIOConnectDisconnectInterrupt(NULL,FALSE);
        SDUnloadDevice();
        for (DWORD dwIndex=0; dwIndex<m_dwArraySize ; dwIndex++ ) {
            if( m_rgObjectArray[m_dwCurSearchIndex] ) {
                // After this point the status should return during the completion.
                SDBUS_REQUEST_HANDLE sdBusRequestHandle ;
                sdBusRequestHandle.bit.sdBusIndex = m_sdSlot.GetHost().GetIndex();
                sdBusRequestHandle.bit.sdSlotIndex = m_sdSlot.GetSlotIndex();
                sdBusRequestHandle.bit.sdFunctionIndex = m_FuncionIndex;
                sdBusRequestHandle.bit.sdRequestIndex = dwIndex;
                sdBusRequestHandle.bit.sd1f = 0x1f;
                sdBusRequestHandle.bit.sdRandamNumber =RawObjectIndex(m_dwCurSearchIndex)->GetRequestRandomIndex();

                SDFreeBusRequest_I(sdBusRequestHandle.hValue);
            }
        }
    }
    Unlock();    
    return FALSE;
}

SDBUS_DEVICE_HANDLE CSDDevice::GetDeviceHandle()
{
    SDBUS_DEVICE_HANDLE retHandle ;
    if (m_fAttached) {
        retHandle.bit.sdBusIndex = m_sdSlot.GetHost().GetIndex();
        retHandle.bit.sdSlotIndex = m_sdSlot.GetSlotIndex();
        retHandle.bit.sdFunctionIndex = m_FuncionIndex;
        retHandle.bit.sdRandamNumber = m_FuncRef;
        retHandle.bit.sdF = SDBUS_DEVICE_HANDLE_FLAG;
    }
    else
        retHandle.hValue = NULL;
    return retHandle;
}

BOOL    CSDDevice::IsValid20Card()
{
    BOOL fValid20Card = FALSE;
    if (m_DeviceType!= Device_SD_IO && m_DeviceType != Device_SD_Combo ) {
        SD_API_STATUS status = SD_API_STATUS_DEVICE_UNSUPPORTED;
        SD_COMMAND_RESPONSE  response;                       // response buffer
        // Supported Voltage.
        const BYTE fCheckFlags = 0x5a;
        BYTE fVHS = (((m_sdSlot.VoltageWindowMask & 0x00f80000)!=0)? 1: 2); // 2.0 / 4.3.13
        status = SendSDCommand(SD_CMD_SEND_IF_COND,((DWORD)fVHS<<8)| fCheckFlags , ResponseR7, &response);
        if (SD_API_SUCCESS(status)) {
            if (response.ResponseBuffer[1]== fCheckFlags && response.ResponseBuffer[2]== fVHS) {
                fValid20Card = TRUE;
            }
            else {
                DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("CSDDevice::DetectSDCard: unusable device found in slot %d , CMD8 response %x, %x \n"),
                            m_sdSlot.GetSlotIndex(),response.ResponseBuffer[1],response.ResponseBuffer[2]));                         
                status = SD_API_STATUS_DEVICE_UNSUPPORTED ;
            }
        }
        else {//if (SD_API_SUCCESS_RESPONSE_TIMEOUT_OK(status)) // This may cause by SDHC. we have know way to tell.
            ASSERT(SD_API_SUCCESS_RESPONSE_TIMEOUT_OK(status));
            DEBUGMSG(SDCARD_ZONE_ERROR && !SD_API_SUCCESS_RESPONSE_TIMEOUT_OK(status), 
                    (TEXT("CSDDevice::DetectSDCard:  found CMD8 failed in slot %d, please check SDHC make sure to support Response7, SD error =0x%x \n"),m_sdSlot.GetSlotIndex(),status));                         
            status = SD_API_STATUS_SUCCESS;
        }
    }
    return fValid20Card;
}

SD_API_STATUS CSDDevice::DetectSDCard( DWORD& dwNumOfFunct)
{
    if (m_FuncionIndex!=0) {
        ASSERT(FALSE);
        return SD_API_STATUS_DEVICE_UNSUPPORTED;
    }
    SD_API_STATUS status = SD_API_STATUS_DEVICE_UNSUPPORTED;
    SD_COMMAND_RESPONSE  response;                       // response buffer
    dwNumOfFunct = 1;
    SDCARD_DEVICE_TYPE deviceType = Device_Unknown;
    // Detect SD IO Card.
    status = SendSDCommand(SD_CMD_IO_OP_COND, 0,ResponseR4,&response);
    if (SD_API_SUCCESS_RESPONSE_TIMEOUT_OK(status)) {
        if (SD_API_SUCCESS(status)) {
            UpdateCachedRegisterFromResponse(SD_INFO_REGISTER_IO_OCR,&response);
            DWORD   dwNumFunctions = SD_GET_NUMBER_OF_FUNCTIONS(&response);
            BOOL    fMemoryPresent = SD_MEMORY_PRESENT_WITH_IO(&response);
            // Note. dwNumOfFunc does not include function 0. SDIO 3.3
            dwNumOfFunct = dwNumFunctions + 1; 
            if (dwNumFunctions ) {
                SetDeviceType(deviceType = (fMemoryPresent? Device_SD_Combo: Device_SD_IO));
                status = SetOperationVoltage(Device_SD_IO, TRUE);
                if (!SD_API_SUCCESS(status) && fMemoryPresent) {
                    SetDeviceType(deviceType = Device_Unknown); // Try Memory
                    status = SD_API_STATUS_SUCCESS;
                }
            }
            else // Only one function.
                if (!fMemoryPresent) { // This is unsported.
                    status = SD_API_STATUS_DEVICE_UNSUPPORTED ;
                }

        }
        else {
            DEBUGMSG(SDBUS_ZONE_DEVICE, (TEXT("SDBusDriver: SDIO Card check timeout, moving on \n"))); 
            status = SD_API_STATUS_SUCCESS; // Timeout is OK . we will continue to skan memory.
        }
    }

    // Detect SD MMC 
    if (SD_API_SUCCESS(status) && (deviceType == Device_Unknown || deviceType == Device_SD_Combo )) { // We have to do other than SD_IO.
        // Intiaize 
        status = SendSDCommand( SD_CMD_GO_IDLE_STATE,  0x00000000,  NoResponse, NULL);
        BOOL fValid20Card = IsValid20Card();
        if (SD_API_SUCCESS(status)) {
            if (deviceType != Device_SD_Combo) {
                // Detect MMC Card.
#ifdef _MMC_SPEC_42_
                /**
                 * Description : To support MMC SPEC 4.2
                 */
                status = SendSDCommand( SD_CMD_MMC_SEND_OPCOND,(m_sdSlot.VoltageWindowMask | (1<<30)), ResponseR3, &response);
#else                
                status = SendSDCommand( SD_CMD_MMC_SEND_OPCOND,m_sdSlot.VoltageWindowMask, ResponseR3, &response);
#endif
                if (SD_API_SUCCESS_RESPONSE_TIMEOUT_OK(status)) {
                    if (SD_API_SUCCESS(status)) {
                        UpdateCachedRegisterFromResponse( SD_INFO_REGISTER_OCR, &response);
                        SetDeviceType(deviceType = Device_MMC);
                        status = SetOperationVoltage(Device_MMC,TRUE);
                    }
                    else {
                        status = SD_API_STATUS_SUCCESS;
                    }
                }
            }
            // Detect SD Memory
            if (SD_API_SUCCESS(status) && (deviceType == Device_Unknown || deviceType == Device_SD_Combo )) { // We Try Memory
                // PhiscalLayer 2.0 Table 4-27.
                status = SendSDAppCommand( SD_ACMD_SD_SEND_OP_COND, (fValid20Card? (m_sdSlot.VoltageWindowMask | 0x40000000): 0), ResponseR3,  &response);
                if (SD_API_SUCCESS(status)) {
                    UpdateCachedRegisterFromResponse( SD_INFO_REGISTER_OCR, &response);
                    if (deviceType == Device_Unknown) 
                        SetDeviceType(deviceType = Device_SD_Memory);
                    status = SetOperationVoltage(Device_SD_Memory, deviceType == Device_SD_Memory );                    
                }

            }

        }
        if (!SD_API_SUCCESS(status)){
            // check to see what we discovered and post the appropriate error message
            if (Device_SD_Combo == deviceType) {
                DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("SDBusDriver: SDIOCombo, Memory portion in slot %d not responsing to ACMD41 \n"), m_sdSlot.GetSlotIndex()));          
                status = SD_API_STATUS_SUCCESS;
                SetDeviceType(deviceType = Device_SD_IO);
            } else {            
                DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("SDBusDriver: Unknown device found in slot %d \n"),m_sdSlot.GetSlotIndex()));                         
                status = SD_API_STATUS_DEVICE_UNSUPPORTED;
            }
        }
    }
    ASSERT(SD_API_SUCCESS(status));
    ASSERT(deviceType != Device_Unknown);
    return status;
}

CSDBusRequest* CSDDevice::InsertRequestAtEmpty( PDWORD pdwIndex, CSDBusRequest* pObject )
{
    if( pObject )
    {
        Lock();
        CSDBusRequest*  pReturn = NULL;
        DWORD dwStopIndex = m_dwCurSearchIndex;
        do  {
            if( m_rgObjectArray[m_dwCurSearchIndex] == NULL )

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99精品热视频| 91蝌蚪porny九色| 亚洲一区中文在线| 日韩毛片高清在线播放| 国产精品久久久久久亚洲伦| 国产日韩欧美一区二区三区综合| 337p粉嫩大胆色噜噜噜噜亚洲| 日韩欧美自拍偷拍| 欧美一区二区美女| 精品999久久久| 欧美国产成人精品| 中文字幕视频一区二区三区久| 成人免费在线播放视频| 亚洲人123区| 午夜亚洲福利老司机| 日韩av中文在线观看| 国产自产高清不卡| 岛国一区二区三区| 色综合亚洲欧洲| 91麻豆免费在线观看| 成人黄色一级视频| 欧美在线视频全部完| 欧美军同video69gay| 日韩一区二区三区电影| 日本一区二区综合亚洲| 一区二区三区在线播放| 青青青伊人色综合久久| 国产成人福利片| 在线观看视频91| 2023国产精品视频| 亚洲欧美日韩电影| 久久精品国产久精国产爱| 国产成人精品免费网站| 欧美色图天堂网| 欧美r级在线观看| 亚洲午夜电影网| 国产一区美女在线| 91麻豆自制传媒国产之光| 日韩午夜在线影院| 亚洲日本一区二区| 久久99精品久久久久久| proumb性欧美在线观看| 精品美女一区二区| 亚洲图片有声小说| 国产福利一区二区三区在线视频| 色先锋aa成人| 久久精品无码一区二区三区| 亚洲成人黄色小说| 成人免费毛片片v| 91精品国产一区二区人妖| 亚洲欧美日韩中文播放| 国产伦精一区二区三区| 欧美疯狂性受xxxxx喷水图片| 中文字幕av一区二区三区高| 麻豆成人久久精品二区三区小说| 91一区二区在线| 久久久久99精品国产片| 天堂影院一区二区| 色又黄又爽网站www久久| 国产人妖乱国产精品人妖| 成人av在线网| 欧美成人免费网站| 日韩制服丝袜av| 欧美日韩一区二区三区不卡 | 午夜免费久久看| 成人免费视频一区二区| 久久精品亚洲国产奇米99| 国产主播一区二区| 欧美成人精精品一区二区频| 日本亚洲一区二区| 欧美丰满少妇xxxxx高潮对白| 一级中文字幕一区二区| 色哟哟在线观看一区二区三区| 国产亚洲精品久| 国产主播一区二区三区| 久久久三级国产网站| 奇米888四色在线精品| 欧美一区二区三区免费大片| 免费美女久久99| 91精品国产综合久久久久| 亚洲成人动漫在线免费观看| 欧美丰满高潮xxxx喷水动漫 | 欧美美女直播网站| 亚洲男人都懂的| 欧洲一区二区三区免费视频| 亚洲黄一区二区三区| 欧洲一区二区av| 日本不卡一二三区黄网| 日韩视频一区二区在线观看| 激情都市一区二区| 国产精品色在线| 91久久精品国产91性色tv| 一区二区三区 在线观看视频| 欧美日韩一区小说| 久久99久久久欧美国产| 中文字幕精品在线不卡| 91国偷自产一区二区开放时间| 午夜电影久久久| 国产精品免费网站在线观看| 99精品偷自拍| 日韩国产精品久久久久久亚洲| 欧美精品一区男女天堂| 北岛玲一区二区三区四区| 一区二区欧美在线观看| 欧美成人高清电影在线| 菠萝蜜视频在线观看一区| 亚洲自拍偷拍欧美| 欧美mv日韩mv国产网站| 成人一区二区视频| 亚洲国产sm捆绑调教视频 | 色综合中文字幕| 日本不卡的三区四区五区| 国产亚洲综合在线| 91在线视频观看| 裸体健美xxxx欧美裸体表演| 中文字幕欧美区| 欧美日韩在线三区| 丰满放荡岳乱妇91ww| 亚洲成人综合视频| 国产免费观看久久| 337p亚洲精品色噜噜狠狠| 成人黄色电影在线| 免费成人在线播放| 亚洲视频你懂的| 欧美电影免费观看完整版| 91在线你懂得| 国产麻豆视频一区| 五月婷婷激情综合| 国产精品麻豆久久久| 精品成a人在线观看| 欧美日韩一区二区三区在线看| 久久99国产精品尤物| 性欧美疯狂xxxxbbbb| 国产目拍亚洲精品99久久精品| 777久久久精品| 欧美性受极品xxxx喷水| 成人午夜视频福利| 国产精品一区二区在线观看不卡| 一区二区三区久久| 亚洲欧洲中文日韩久久av乱码| 久久精品视频一区| 欧美日韩成人高清| 欧美三级日韩三级| 91久久国产综合久久| av电影在线观看不卡| 国产.精品.日韩.另类.中文.在线.播放| 日韩av一区二区在线影视| 午夜久久福利影院| 亚洲成a人片在线观看中文| 亚洲欧美偷拍三级| 亚洲欧美aⅴ...| 亚洲欧美日韩久久| 麻豆精品新av中文字幕| 亚洲h精品动漫在线观看| 亚洲国产aⅴ成人精品无吗| 一区二区三区不卡在线观看 | 粉嫩欧美一区二区三区高清影视| 男人的天堂久久精品| 日本视频在线一区| 免费在线观看一区| 经典三级在线一区| 国产精品18久久久| 不卡视频一二三四| 欧美性做爰猛烈叫床潮| 欧美日韩国产美女| 欧美tickle裸体挠脚心vk| 国产性天天综合网| 国产欧美一区二区精品婷婷| 国产精品国产三级国产| 一区二区三区影院| 丝袜美腿高跟呻吟高潮一区| 久久国产精品第一页| 国产在线观看免费一区| k8久久久一区二区三区| 欧亚洲嫩模精品一区三区| 5月丁香婷婷综合| 亚洲精品一线二线三线| 国产精品久久久久久久久搜平片 | 精品处破学生在线二十三| 精品女同一区二区| 中文字幕亚洲电影| 亚洲成人av一区| 国产一区二区三区av电影| 99久久99久久综合| 欧美一区二区三区不卡| 久久久不卡网国产精品二区| 成人免费一区二区三区视频 | 久久精品国产免费| 成人18视频在线播放| 欧美美女网站色| 欧美极品aⅴ影院| 亚欧色一区w666天堂| 国产成人午夜精品影院观看视频| 日本道免费精品一区二区三区| 精品国产一区二区亚洲人成毛片| 成人欧美一区二区三区在线播放| 免费国产亚洲视频| 色老头久久综合| 精品捆绑美女sm三区| 亚洲成人免费视频|