亚洲欧美第一页_禁久久精品乱码_粉嫩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热这里都是精品| 一区二区成人在线| 亚洲国产成人精品视频| 日日摸夜夜添夜夜添精品视频| 日韩一区精品字幕| 国产中文字幕精品| av午夜精品一区二区三区| 欧美人狂配大交3d怪物一区| 亚洲精品乱码久久久久久黑人| 欧美一区二区三区的| 国产99久久久久| 欧美精品1区2区| 亚洲人成精品久久久久| 久久66热re国产| 久久精品一级爱片| 欧美日韩国产欧美日美国产精品| 天天色综合成人网| 中文字幕制服丝袜一区二区三区 | 91视频国产资源| 成人在线综合网| 欧美一区二区三区系列电影| 欧美成人在线直播| 亚洲妇女屁股眼交7| 粉嫩嫩av羞羞动漫久久久| 69成人精品免费视频| 国产精品白丝在线| 色偷偷久久人人79超碰人人澡| 欧美本精品男人aⅴ天堂| 天堂在线一区二区| 亚洲成人7777| 成人app在线| 久久久亚洲综合| 自拍偷拍欧美精品| 懂色一区二区三区免费观看| 精品少妇一区二区三区在线视频| 国产精品亚洲一区二区三区在线 | 精品视频在线免费看| 成人国产一区二区三区精品| 国产高清亚洲一区| 91丨国产丨九色丨pron| 97se亚洲国产综合自在线观| 欧美日韩国产综合草草| 色婷婷综合激情| 国内精品伊人久久久久av影院| 久久人人超碰精品| 91婷婷韩国欧美一区二区| 视频一区中文字幕国产| 日韩三级在线观看| 欧美色爱综合网| 国产不卡在线一区| 夜夜爽夜夜爽精品视频| 欧美性色综合网| 风流少妇一区二区| 麻豆一区二区99久久久久| 亚洲免费资源在线播放| 久久精品久久精品| 亚洲人成在线观看一区二区| 色999日韩国产欧美一区二区| 亚洲国产视频在线| 亚洲天堂免费在线观看视频| 亚洲一区二区四区蜜桃| 日韩毛片一二三区| 精品一二三四区| 色诱视频网站一区| 久久久亚洲精品石原莉奈| 亚洲欧美综合色| 成人av免费网站| 久久久国产精品午夜一区ai换脸| 午夜不卡在线视频| eeuss鲁片一区二区三区| 夫妻av一区二区| 99re视频精品| 色呦呦网站一区| 欧美日韩五月天| 26uuu成人网一区二区三区| 在线精品视频免费观看| 欧美一二三区在线观看| 欧美午夜在线一二页| 欧美色综合天天久久综合精品| 成人av在线网站| 欧美日韩在线播放| 欧美日韩高清一区二区三区| 亚洲三级在线免费观看| 国产xxx精品视频大全| av电影在线不卡| 成人h版在线观看| 欧美性猛交xxxx乱大交退制版 | 国产成人综合在线观看| www激情久久| 成人免费观看av| 亚洲免费av观看| 久久综合久色欧美综合狠狠| 色女孩综合影院| 奇米影视在线99精品| 亚洲欧洲色图综合| 美国精品在线观看| 色婷婷香蕉在线一区二区| 欧美成人高清电影在线| 亚洲国产婷婷综合在线精品| 成人av电影观看| 国产精品免费aⅴ片在线观看| 秋霞成人午夜伦在线观看| 在线视频中文字幕一区二区| 久久久久亚洲综合| 国模无码大尺度一区二区三区| 日本高清不卡aⅴ免费网站| 亚洲免费视频中文字幕| 成人激情免费网站| 精品一二三四在线| 九一久久久久久| 久久日韩精品一区二区五区| 精品国产伦一区二区三区观看体验| 日韩一区欧美小说| 欧美视频一区二区三区在线观看| 伊人一区二区三区| www国产亚洲精品久久麻豆| 成人白浆超碰人人人人| 久久国产日韩欧美精品| 久久精品国内一区二区三区| 美腿丝袜在线亚洲一区| 强制捆绑调教一区二区| 日韩精品亚洲专区| 亚洲国产美女搞黄色| 婷婷亚洲久悠悠色悠在线播放| 依依成人精品视频| 亚洲欧美另类图片小说| 日韩欧美三级在线| 欧美日韩一区视频| 国产成人在线免费| 日韩理论在线观看| 精品人伦一区二区色婷婷| 国产69精品久久久久毛片| 国产精品传媒视频| 欧美一区二区三区精品| 91免费国产视频网站| 老司机免费视频一区二区三区| 日韩一级完整毛片| 欧美一区二区三区视频免费 | 99re这里只有精品6| 亚洲激情网站免费观看| 日韩三级免费观看| 欧美日韩大陆在线| 欧美日韩综合色| 中文一区二区完整视频在线观看| 7777精品久久久大香线蕉| 欧美国产禁国产网站cc| 视频在线观看91| 成人黄色电影在线| 日韩美女一区二区三区四区| 一二三四区精品视频| 在线观看国产日韩| 国产日韩亚洲欧美综合| 久久国产三级精品| 精品国产乱码久久久久久免费 | 亚洲一区二区综合| 中文字幕av不卡| 自拍偷拍国产亚洲| 欧美bbbbb| 麻豆国产精品视频| 狠狠色丁香婷婷综合久久片| 美脚の诱脚舐め脚责91| 国产91在线看| 色综合天天综合网国产成人综合天 | 高清日韩电视剧大全免费| 91精品福利在线| 欧美视频一区二区三区在线观看| 成人黄色av电影| 99国产精品久久久久久久久久| 91精品久久久久久蜜臀| 亚洲欧美在线另类| 国产91在线|亚洲| 久久久久久久性| 欧美极品美女视频| 91免费观看国产| 日韩福利电影在线观看| 国产日韩成人精品| 欧美三级电影精品| 精品一区二区综合| 亚洲图片激情小说| 欧美mv日韩mv国产网站| 激情五月婷婷综合| 亚洲最大的成人av| 91精品婷婷国产综合久久| 欧美激情中文不卡| 国产乱子伦一区二区三区国色天香| 91麻豆蜜桃一区二区三区| 久久久久青草大香线综合精品| 日韩高清在线一区| 精品国产一区二区亚洲人成毛片| 青青草国产精品97视觉盛宴| 欧美在线视频不卡| 视频在线在亚洲| 亚洲精品一区二区三区四区高清| 亚洲免费观看在线视频| 国产成人免费在线观看| 国产精品动漫网站| 欧美疯狂做受xxxx富婆| 午夜精品福利在线| 欧美激情一区二区|