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

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

?? sdiofeat.cpp

?? 6410BSP3
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//
// 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:  
    SDIOFeat.cpp
Abstract:
    SDBus SDIO Setup Feature Implementation.

Notes: 
--*/

#include <windows.h>
#include <types.h>

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

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

///////////////////////////////////////////////////////////////////////////////
//  SDEnableFunction  - enable/disable the device function 
//  Input:  pDevice   - the device 
//          pInfo   - enable info (required if Enable is TRUE)
//          Enable  - enable
//  Output: 
//  Return: SD_API_STATUS code
//          
//  Notes: 
///////////////////////////////////////////////////////////////////////////////
SD_API_STATUS CSDDevice::SDEnableDisableFunction(PSD_IO_FUNCTION_ENABLE_INFO pInfo,BOOL Enable)
{
    UCHAR                       regValue;       // temp register value
    ULONG                       retryCount;     // ready retry count
    SD_API_STATUS               status;         // intermediate status
    BOOL                        fSkipIfMatch;   // Test for setting the same bit twice
    FUNCTION_POWER_STATE        PowerState;     // The function's power state

    if (m_FuncionIndex == 0 ) {
        DEBUGCHK(FALSE);
        return SD_API_STATUS_INVALID_PARAMETER;
    }

    DEBUGMSG(SDBUS_ZONE_DEVICE, (TEXT("SDEnableDisableFunction: Enabling/Disabling SDIO Device Function %d \n"), m_FuncionIndex));
    

        // Get the functions power state
    status = GetFunctionPowerState(&PowerState);

    if (!SD_API_SUCCESS(status)) {
        return status;
    }

    // First check if states already match
    fSkipIfMatch = FALSE;
    if (PowerState.fFunctionEnabled == Enable) {
        if (Enable) { 
            DEBUGMSG(SDCARD_ZONE_WARN,(TEXT("SDEnableDisableFunction: Attempting to enable function that is already enabled \n")));
            fSkipIfMatch = TRUE;
        }
        else {
            DEBUGMSG(SDCARD_ZONE_WARN,(TEXT("SDEnableDisableFunction: Attempting to disable function that is already disabled \n")));
            fSkipIfMatch = TRUE;
        }
    }
        
    if (!fSkipIfMatch) {
        // Attempt to change cards power draw
        status = m_sdSlot.GetHost().ChangeCardPowerHandler(m_sdSlot.GetSlotIndex(),PowerState.EnableDelta);

        if (!SD_API_SUCCESS(status)) {
            return status;
        }

            //update the power used at the slot
        {
            INT SlotPower = m_sdSlot.GetSlotPower();
            SlotPower += PowerState.EnableDelta;
            m_sdSlot.SetSlotPower( SlotPower >= 0? (USHORT)SlotPower : 0 );
        }

        CSDDevice *pDevice0 = m_sdSlot.GetFunctionDevice(0 );
        status = SD_API_STATUS_NO_SUCH_DEVICE;
        if (pDevice0) {
                // update the parent device shadow register
            if (Enable) {     
                pDevice0->m_SDCardInfo.SDIOInformation.pCommonInformation->CCCRShadowIOEnable 
                    |= (1 <<  m_SDCardInfo.SDIOInformation.Function);
            } else {
                pDevice0->m_SDCardInfo.SDIOInformation.pCommonInformation->CCCRShadowIOEnable &= 
                    ~(1 <<  m_SDCardInfo.SDIOInformation.Function);
            }
            // get a copy
            regValue = pDevice0->m_SDCardInfo.SDIOInformation.pCommonInformation->CCCRShadowIOEnable;

            // update the register
            status = pDevice0->SDReadWriteRegistersDirect_I(SD_IO_WRITE, SD_IO_REG_ENABLE,FALSE, &regValue, 1);
            pDevice0->DeRef();
        }        
        if (!SD_API_SUCCESS(status)) {
            return status;
        }
    }

    // if enabling we check for I/O ready
    if (Enable) { 
        CSDDevice *pDevice0 = m_sdSlot.GetFunctionDevice(0 );
        status = SD_API_STATUS_NO_SUCH_DEVICE;
        if (pDevice0) {
            retryCount = pInfo->ReadyRetryCount;

            while (retryCount) {
                // delay the interval time
                Sleep(pInfo->Interval);

                // read the I/O ready register
                status = pDevice0->SDReadWriteRegistersDirect_I( SD_IO_READ, SD_IO_REG_IO_READY,FALSE,&regValue,1);         // one byte
                if (!SD_API_SUCCESS(status)) {
                    break;
                }

                // see if it is ready
                if (regValue & (1 << m_SDCardInfo.SDIOInformation.Function)) {
                    DEBUGMSG(SDBUS_ZONE_DEVICE, (TEXT("SDEnableDisableFunction: Card Function %d is now ready \n"),
                        m_SDCardInfo.SDIOInformation.Function));
                    break;
                }
                // decrement the count
                retryCount--; 
                DEBUGMSG(SDBUS_ZONE_DEVICE, (TEXT("SDEnableDisableFunction: Card Function %d, Not Ready, re-checking (%d) \n"),
                    m_SDCardInfo.SDIOInformation.Function, retryCount));
            }

            if (0 == retryCount) {
                DEBUGMSG(SDBUS_ZONE_DEVICE, (TEXT("SDEnableDisableFunction: Card Function %d, Not ready , exceeded retry count\n"),
                    m_SDCardInfo.SDIOInformation.Function));
                status = SD_API_STATUS_DEVICE_NOT_RESPONDING;
            }
            pDevice0->DeRef();
        }
    }

    return status;
} 


///////////////////////////////////////////////////////////////////////////////
//  SDFunctionSelectPower  - switch device function to High or Low power state
//  Input:  pDevice   - the device 
//          fLowPower - High or Low Power state
//  Output: 
//  Return: SD_API_STATUS code
//          
//  Notes: 
///////////////////////////////////////////////////////////////////////////////
SD_API_STATUS CSDDevice::SDFunctionSelectPower( BOOL  fLowPower)
{
    UCHAR                       regValue;       // temp register value
    SD_API_STATUS               status;         // intermediate status
    FUNCTION_POWER_STATE        PowerState;     // The function's power state
    DWORD                       FBROffset;      // calculated FBR offset


        // get the parent device
    
    if (0 == m_FuncionIndex) {
        DEBUG_ASSERT(FALSE);
        return SD_API_STATUS_INVALID_PARAMETER;
    }

    DEBUGMSG(SDBUS_ZONE_DEVICE, (TEXT("SDFunctionSelectPower: SDIO Device Function %d Power Select\n"),
            m_SDCardInfo.SDIOInformation.Function));

        // Get the functions power state
    status = GetFunctionPowerState(&PowerState);

    if (!SD_API_SUCCESS(status)) {
        return status;
    }

    //check if power selection is supported
    if((!PowerState.fPowerControlSupport) || (!PowerState.fSupportsPowerSelect)) {
        DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("SDFunctionSelectPower: Card or Function does not support Power Select.\n")));
        return SD_API_STATUS_INVALID_DEVICE_REQUEST;
    }
    // Check if states already match
    if (PowerState.fLowPower == fLowPower){
        if (fLowPower) { 
            DEBUGMSG(SDCARD_ZONE_WARN, (TEXT("SDFunctionSelectPower: Attempting to select low power state when that is already enabled \n")));
        }
        else{
            DEBUGMSG(SDCARD_ZONE_WARN, (TEXT("SDFunctionSelectPower: Attempting to select high power state when that is already enabled \n")));
        }
        return SD_API_STATUS_SUCCESS;
    }
        
    // Attempt to change cards power draw
    status = m_sdSlot.GetHost().ChangeCardPowerHandler(m_sdSlot.GetSlotIndex(),PowerState.SelectDelta);
    if (!SD_API_SUCCESS(status)) {
        return status;
    }

    //update the power used at the slot
    {
        INT SlotPower = m_sdSlot.GetSlotPower();
        SlotPower += PowerState.SelectDelta;
        m_sdSlot.SetSlotPower( SlotPower >= 0? (USHORT)SlotPower : 0 );
    }

    CSDDevice *pDevice0 = m_sdSlot.GetFunctionDevice(0 );
    status = SD_API_STATUS_NO_SUCH_DEVICE;
    if (pDevice0) {
        // select the function's power state
        FBROffset = SD_IO_FBR_1_OFFSET + (m_SDCardInfo.SDIOInformation.Function - 1) * SD_IO_FBR_LENGTH;
        status = pDevice0->SDReadWriteRegistersDirect_I(SD_IO_READ,FBROffset + SD_IO_FBR_POWER_SELECT,FALSE,&regValue,1); 

        if (SD_API_SUCCESS(status)) {
            if(fLowPower) {
                regValue |= SD_IO_FUNCTION_POWER_SELECT_STATE;
            }
            else {
                regValue &= ~SD_IO_FUNCTION_POWER_SELECT_STATE;
            }

            status = pDevice0->SDReadWriteRegistersDirect_I(SD_IO_WRITE,FBROffset + SD_IO_FBR_POWER_SELECT,FALSE,&regValue,1);
        }
        pDevice0->DeRef();
    }
    return status;
} 

///////////////////////////////////////////////////////////////////////////////
//  SDSetFunctionBlockSize  - set the block size of the function
//  Input:  pDevice   - the device 
//          BlockSize - block size to set
//  Output: 
//  Return: SD_API_STATUS code
//          
//  Notes: 
///////////////////////////////////////////////////////////////////////////////
SD_API_STATUS CSDDevice::SDSetFunctionBlockSize(DWORD BlockSize)
{
    USHORT bytesPerBlock = (USHORT)BlockSize; // desired block size
    DWORD                  FBROffset;         // FBR offset
    SD_API_STATUS          status;
    
    DEBUGCHK(0 != m_SDCardInfo.SDIOInformation.Function);
    // calculate the FBR offset based on the function number
    FBROffset = SD_IO_FBR_1_OFFSET + (m_SDCardInfo.SDIOInformation.Function - 1) * SD_IO_FBR_LENGTH;
    CSDDevice *pDevice0 = m_sdSlot.GetFunctionDevice(0 );
    status = SD_API_STATUS_NO_SUCH_DEVICE;
    
    if (pDevice0) {
        // update the register
        status = pDevice0->SDReadWriteRegistersDirect_I( SD_IO_WRITE, FBROffset + SD_IO_FBR_IO_BLOCK_SIZE, FALSE,(PUCHAR)&bytesPerBlock,sizeof(USHORT));           // two bytes    
        pDevice0->DeRef();
    }
    
    return status;
}
SD_API_STATUS CSDDevice::SetCardFeature_Interface(SD_CARD_INTERFACE_EX& CardInterfaceEx)
{
    SD_API_STATUS               status = SD_API_STATUS_SUCCESS;  // intermediate status
    // Check if the slot can accept this interface request
    // For multifunction card or combo card, the requested interface may not be fitted
    // for other functions.
    {
        BOOL bAllFunctionsAcceptThisInterface = TRUE;

        // Start from parent device
        BOOL fContinue = TRUE; 
        for (DWORD dwIndex = 0; dwIndex < SD_MAXIMUM_DEVICE_PER_SLOT && fContinue ; dwIndex++) {
            CSDDevice * pDevice = m_sdSlot.GetFunctionDevice(dwIndex);
            if (pDevice != NULL ) {
                if (dwIndex!=GetDeviceFuncionIndex() &&  pDevice->GetDeviceType() != Device_Unknown ) {
                    // Check if current device supports 4 bit mode request
                    if (CardInterfaceEx.InterfaceModeEx.bit.sd4Bit && !(pDevice->m_CardInterfaceEx.InterfaceModeEx.bit.sd4Bit)) {
                        bAllFunctionsAcceptThisInterface = FALSE;
                        fContinue = FALSE;
                    }
                    else
                    // Check if request clock rate is too high for this device
                    if (CardInterfaceEx.ClockRate > pDevice->m_CardInterfaceEx.ClockRate) {
                        bAllFunctionsAcceptThisInterface = FALSE;
                        fContinue = FALSE;
                    }
                    else 
                    if (!(CardInterfaceEx.InterfaceModeEx.bit.sdHighSpeed) && pDevice->m_CardInterfaceEx.InterfaceModeEx.bit.sdHighSpeed){
                        bAllFunctionsAcceptThisInterface = FALSE;
                        fContinue = FALSE;
                    }
                }
                pDevice->DeRef();
            }
        }

        if (bAllFunctionsAcceptThisInterface == FALSE) {
            DbgPrintZo(SDCARD_ZONE_ERROR, (TEXT("SDSetCardFeature: SD_SET_CARD_INTERFACE - invalod interface request\n")));

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩视频第一区| 成人高清视频在线| 欧美亚洲图片小说| 丝袜国产日韩另类美女| 日韩欧美一区二区视频| 成人一级片网址| 天天色 色综合| 国产精品欧美久久久久一区二区| 91在线观看成人| 日本成人在线电影网| 亚洲国产经典视频| 欧美xxxxx裸体时装秀| 在线免费av一区| 成人app网站| 色婷婷综合久久久久中文一区二区| 久久99深爱久久99精品| 亚洲一区二区黄色| 国产精品第13页| 国产亚洲欧美日韩俺去了| 91精品国产91久久久久久一区二区 | 欧美一区二区三区日韩| 欧美福利一区二区| 欧美视频自拍偷拍| 日韩欧美久久久| 国产精品嫩草影院av蜜臀| 亚洲精品久久嫩草网站秘色| 中文字幕永久在线不卡| 国产日产精品1区| 精品电影一区二区| 欧美videos大乳护士334| 精品国产电影一区二区| 亚洲人123区| 国产精品国产三级国产aⅴ原创| 一区二区三区在线免费播放| 亚洲色图在线播放| 一区二区三区日韩欧美精品| 午夜精品福利一区二区三区av| 久草中文综合在线| 精品无人区卡一卡二卡三乱码免费卡| 国产电影一区二区三区| 成人av免费在线观看| 欧美日韩和欧美的一区二区| 欧美色网一区二区| 精品国产91洋老外米糕| 亚洲自拍偷拍av| 成人精品一区二区三区四区| 欧美电影一区二区| 亚洲卡通动漫在线| 国模少妇一区二区三区| 国产成人亚洲精品狼色在线| 欧美老年两性高潮| 亚洲欧美国产高清| 国产精品系列在线播放| 99在线视频精品| 欧美视频一区二区在线观看| 国产欧美日韩中文久久| 老司机午夜精品| 欧美三级中文字幕在线观看| 国产精品伦一区二区三级视频| 日韩成人av影视| 欧美一区二区在线免费观看| 日韩码欧中文字| 成人国产在线观看| 欧美激情一区在线观看| 韩国一区二区在线观看| 欧美一区二区免费| 日韩av一二三| 欧美成人午夜电影| 麻豆精品在线看| 日本高清无吗v一区| 日韩一区二区三区在线观看| 国产午夜精品美女毛片视频| 久久精品国产亚洲aⅴ| 欧美一区二区三区四区五区 | 婷婷国产v国产偷v亚洲高清| 色噜噜狠狠色综合欧洲selulu| 国产精品久久精品日日| 成人毛片视频在线观看| 国产精品福利电影一区二区三区四区| 国产 日韩 欧美大片| 欧美日韩高清影院| 日本va欧美va精品发布| 91丨porny丨国产| 亚洲婷婷综合色高清在线| 91亚洲精品久久久蜜桃网站| 亚洲色图都市小说| 欧美性大战xxxxx久久久| 日日夜夜免费精品| 精品国产免费久久| 成人美女在线观看| 亚洲一区二区三区视频在线播放| 制服丝袜激情欧洲亚洲| 亚洲少妇中出一区| 欧美系列一区二区| 老司机午夜精品| 国产午夜一区二区三区| 99久久国产综合色|国产精品| 精品999久久久| 成人av网在线| 国产一区二区在线免费观看| 狠狠v欧美v日韩v亚洲ⅴ| 中文久久乱码一区二区| 91亚洲国产成人精品一区二区三 | 成年人国产精品| 国产欧美一区二区三区在线老狼| 大桥未久av一区二区三区中文| 亚洲欧美综合另类在线卡通| 欧美日韩一区二区三区视频| 卡一卡二国产精品| 亚洲色图.com| 欧美一级搡bbbb搡bbbb| 99九九99九九九视频精品| 午夜欧美2019年伦理| 欧美国产激情一区二区三区蜜月| 在线观看日产精品| 国产一区二区按摩在线观看| 亚洲精品一卡二卡| 国产日韩欧美制服另类| 欧美日韩五月天| av男人天堂一区| 国精品**一区二区三区在线蜜桃| 亚洲视频一二三| 国产亚洲一区字幕| 欧美日韩黄色一区二区| eeuss影院一区二区三区| 美女mm1313爽爽久久久蜜臀| 一区二区欧美国产| 国产精品久久久久久久久搜平片 | 欧美日韩黄色影视| 97精品电影院| 丁香天五香天堂综合| 麻豆精品视频在线观看| 亚洲精品福利视频网站| 国产精品无遮挡| 国产亚洲美州欧州综合国| 欧美一区二区人人喊爽| 91麻豆精品视频| 成人免费精品视频| 国产精品亚洲视频| 国产伦精一区二区三区| 麻豆精品一区二区av白丝在线| 亚洲国产一二三| 91精品国产色综合久久不卡蜜臀 | 欧美日韩精品免费| 欧美天堂一区二区三区| 不卡的电影网站| www.亚洲人| 91丨porny丨国产入口| 成人少妇影院yyyy| 国产精品伊人色| 国产99精品国产| 丁香一区二区三区| 不卡视频在线观看| 95精品视频在线| 色哦色哦哦色天天综合| 一本一道波多野结衣一区二区| 成人av午夜电影| 99国产精品久久久久| 91日韩精品一区| 欧美曰成人黄网| 欧美视频一区在线观看| 制服丝袜亚洲色图| 久久夜色精品一区| 色激情天天射综合网| 在线观看日产精品| 91精品国产综合久久婷婷香蕉| 日韩一区二区视频| 久久久精品免费免费| 日韩欧美一区二区不卡| 精品国产免费人成在线观看| 国产女主播一区| 亚洲免费观看高清在线观看| 亚洲综合久久久| 美女尤物国产一区| 国产成人精品aa毛片| 91国模大尺度私拍在线视频| 欧美年轻男男videosbes| 日韩精品一区二区三区三区免费 | 日本亚洲欧美天堂免费| 精品一区二区影视| 91丨porny丨蝌蚪视频| 欧美日韩国产首页| 国产清纯白嫩初高生在线观看91 | 91黄色在线观看| 精品人在线二区三区| 亚洲欧洲av色图| 美女脱光内衣内裤视频久久网站| 国产成人一区在线| 欧美日韩的一区二区| 国产色婷婷亚洲99精品小说| 亚洲一区二区高清| 国产精品99久久久久久久vr| 欧洲生活片亚洲生活在线观看| 精品国产免费久久| 亚洲一区二区视频在线| 国产91精品露脸国语对白| 4438成人网| 亚洲人吸女人奶水| 国产精品69毛片高清亚洲| 欧美酷刑日本凌虐凌虐|