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

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

?? sdhcdma.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:  
    SDHCDMA.cpp
Abstract:
    Standard SDHC Driver DMA object implementation.

Notes: 
--*/

#include "SDHC.h"
#include "sdhcdma.hpp"
#include "SDHCSlot.h"

CSDHCSlotBaseDMA::CSDHCSlotBaseDMA (CSDHCSlotBase& SDHCSloteBase)
:   m_SDHCSloteBase (SDHCSloteBase)
{
    m_dwNumOfList = 0;
    m_dwNumOfAvailabe = 0;
    m_pDmaBufferList = NULL;
    m_dwCurDMAListPos = 0;
    m_fDMAProcessing = FALSE;
    m_dwDMACompletionCode = ERROR_SUCCESS;
    
    m_hDma = NULL;
    memset(&m_dmaAdapter,0,sizeof(m_dmaAdapter));
    m_dmaAdapter.Size = sizeof(m_dmaAdapter);
    m_dmaAdapter.BusMaster = TRUE;
    m_dmaAdapter.BusNumber = m_SDHCSloteBase.m_dwBusNumber;
    m_dmaAdapter.InterfaceType = m_SDHCSloteBase.m_interfaceType ;
};
BOOL CSDHCSlotBaseDMA::Init()
{
    m_pDmaBufferList = new CE_DMA_BUFFER_BLOCK[INITIAL_DMA_LIST];
    if (m_pDmaBufferList) {
        m_dwNumOfList = INITIAL_DMA_LIST ;
    }
    return (m_pDmaBufferList!=NULL && m_dwNumOfList != 0);
}

CSDHCSlotBaseDMA::~CSDHCSlotBaseDMA()
{
    if (m_pDmaBufferList)
        delete [] m_pDmaBufferList;
    if (m_hDma) {
        DMACloseBuffer(m_hDma);
    }
    
}

DWORD   CSDHCSlotBaseDMA::ReAllocateDMABufferList(DWORD dwRequired)
{
    if (m_pDmaBufferList && m_dwNumOfList < dwRequired) {
        delete [] m_pDmaBufferList;
        m_dwNumOfList = 0;
        m_pDmaBufferList = NULL;
    }
    if (m_pDmaBufferList == NULL && dwRequired!= 0) {
        m_pDmaBufferList = new CE_DMA_BUFFER_BLOCK[dwRequired];
        if (m_pDmaBufferList) {
            m_dwNumOfList = dwRequired;
        }
        else
        {   // Allocation fail
            m_dwNumOfList = 0;
        }
    }
    return m_dwNumOfList;
}
BOOL CSDHCSlotBaseDMA::CancelDMA()
{
    if (!m_fDMAProcessing) {
        m_fDMAProcessing = FALSE;
        m_dwCurDMAListPos = m_dwNumOfAvailabe;
        m_dwDMACompletionCode = ERROR_CANCELLED ;
    }
    if (!m_fDMAProcessing && m_hDma) {
        DMACloseBuffer(m_hDma);
        m_hDma = NULL;
    }
    return TRUE;
}

BOOL CSDHCSlotBaseDMA::ArmDMA(SD_BUS_REQUEST& Request,BOOL fToDevice) 
{
    ASSERT(!m_fDMAProcessing);
    ASSERT(m_hDma==NULL);
    BOOL fReturn = FALSE;

    // Check for the limitaion.
    if (Request.NumBlocks > 1 && (Request.BlockSize & (sizeof(DWORD)-1)) == 0 
            && ((DWORD)Request.pBlockBuffer & (sizeof(DWORD)-1)) == 0
            && m_hDma == NULL) {
        // We are going to transfer this block as DMA.
        if ( (Request.Flags & SD_BUS_REQUEST_PHYS_BUFFER)!=0 && 
            Request.cbSizeOfPhysList!=0 && Request.pPhysBuffList!=NULL) {
            // We have user passed in Physical Buffer List.
            if (ReAllocateDMABufferList(Request.cbSizeOfPhysList) >= Request.cbSizeOfPhysList) {
                //Copy the Buffer.
                ASSERT(Request.cbSizeOfPhysList <= m_dwNumOfList);
                m_dwNumOfAvailabe = Request.cbSizeOfPhysList ;
                PBYTE pVirtualAddr = Request.pBlockBuffer ;
                for (DWORD dwIndex = 0; dwIndex < Request.cbSizeOfPhysList && dwIndex< m_dwNumOfList; dwIndex ++) {
                    m_pDmaBufferList[dwIndex].dwLength = Request.pPhysBuffList[dwIndex].PhysLen;
                    m_pDmaBufferList[dwIndex].physicalAddress = Request.pPhysBuffList[dwIndex].PhysAddr;
                    m_pDmaBufferList[dwIndex].virtualAddress = pVirtualAddr + m_pDmaBufferList[dwIndex].dwLength;
                }
                fReturn = TRUE;
                
            }
        }
        else { // We need figure out the physical address by using CEDDK DMA function.
            DWORD dwLength = Request.BlockSize * Request.NumBlocks;
            m_dmaAdapter.dwFlags =(fToDevice? DMA_FLAGS_WRITE_TO_DEVICE: 0);
//            if (!fToDevice) {
//                memset(Request.pBlockBuffer,0xc5,dwLength);
//            }
            m_hDma = DMAOpenBuffer(&m_dmaAdapter,1, (PVOID *)&Request.pBlockBuffer,&dwLength);
            if (m_hDma) {
                m_dwNumOfAvailabe = DMAGetBufferPhysAddr(m_hDma, m_dwNumOfList, m_pDmaBufferList);
                if (m_dwNumOfAvailabe>m_dwNumOfList && ReAllocateDMABufferList(m_dwNumOfAvailabe)>=m_dwNumOfAvailabe) {
                    m_dwNumOfAvailabe = DMAGetBufferPhysAddr(m_hDma, m_dwNumOfList, m_pDmaBufferList);
                }
                if (m_dwNumOfAvailabe<= m_dwNumOfList) {
                    fReturn = TRUE;
                }
                else { // FAILED.
                    m_dwNumOfAvailabe = 0;
                    DMACloseBuffer(m_hDma);
                    m_hDma = NULL;
                }
            }
        }
        ASSERT(fReturn);        
    }
    return fReturn;
}

CSDHCSlotBaseSDMA::~CSDHCSlotBaseSDMA()
{
   if (m_StartBuffer.pBufferedVirtualAddr!=NULL) {
        OALDMAFreeBuffer(&m_dmaAdapter, PAGE_SIZE,m_StartBuffer.physicalAddress,m_StartBuffer.pBufferedVirtualAddr,FALSE);
        //OALDMAFreeBuffer(&m_dmaAdapter, PAGE_SIZE*128,m_StartBuffer.physicalAddress,m_StartBuffer.pBufferedVirtualAddr,FALSE);
    }
    if (m_EndBuffer.pBufferedVirtualAddr!=NULL) {
        OALDMAFreeBuffer(&m_dmaAdapter, PAGE_SIZE,m_EndBuffer.physicalAddress,m_EndBuffer.pBufferedVirtualAddr,FALSE);
        //OALDMAFreeBuffer(&m_dmaAdapter, PAGE_SIZE*128,m_EndBuffer.physicalAddress,m_EndBuffer.pBufferedVirtualAddr,FALSE);
    }
    if (m_fLocked )
        UnlockPages( m_lpvLockedAddress, m_dwLockedSize);
    m_fLocked = FALSE;
}

BOOL CSDHCSlotBaseSDMA::Init()  
{
    m_fLocked= FALSE;
    if (!CeGetCacheInfo(sizeof(m_ceCacheInfo), &m_ceCacheInfo)) {
        ASSERT(FALSE);
        return FALSE;
    }
    else  {
        m_StartBuffer.pBufferedVirtualAddr = OALDMAAllocBuffer(&m_dmaAdapter, PAGE_SIZE , &m_StartBuffer.physicalAddress, FALSE );
        m_StartBuffer.dwBufferOffset = 0;
        m_StartBuffer.dwBufferSize = PAGE_SIZE;
        m_StartBuffer.pSrcVirtualAddr = NULL;
        m_StartBuffer.pSrcSize = 0;
        
        m_EndBuffer.pBufferedVirtualAddr = OALDMAAllocBuffer(&m_dmaAdapter, PAGE_SIZE , &m_EndBuffer.physicalAddress, FALSE );
        m_EndBuffer.dwBufferOffset = 0;
        m_EndBuffer.dwBufferSize = PAGE_SIZE;
        m_EndBuffer.pSrcVirtualAddr = NULL;
        m_EndBuffer.pSrcSize = 0;
        return (m_StartBuffer.pBufferedVirtualAddr!=NULL &&  m_EndBuffer.pBufferedVirtualAddr!=NULL && CSDHCSlotBaseDMA::Init());
    }
};


BOOL CSDHCSlotBaseSDMA::GetDMABuffer(SD_BUS_REQUEST& Request,BOOL fToDevice)
{
  // We shouldn't use PAGE_SHIFT in CEDDK because it is too confusing and too dangerouse.
#define PFN_SHIEFT UserKInfo[KINX_PFN_SHIFT]
#define MAX_SUPPORTED_PFN (MAXDWORD>>PFN_SHIEFT)
#define PAGE_MASK (PAGE_SIZE-1)
  ASSERT(!m_fDMAProcessing);
  ASSERT(m_hDma==NULL);
  ASSERT(m_fLocked == FALSE);
  m_StartBuffer.pSrcVirtualAddr = NULL;
  m_StartBuffer.pSrcSize = 0;
  m_EndBuffer.pSrcVirtualAddr = NULL;
  m_EndBuffer.pSrcSize = 0;
  BOOL fReturn = FALSE;
  // Check for the limitaion.
  if (Request.NumBlocks > 1 && (Request.BlockSize & (sizeof(DWORD)-1)) == 0 
      && ((DWORD)Request.pBlockBuffer & (sizeof(DWORD)-1)) == 0
      && m_hDma == NULL) {
    // We are going to transfer this block as DMA.
    if ( (Request.Flags & SD_BUS_REQUEST_PHYS_BUFFER)!=0 && 
        Request.cbSizeOfPhysList!=0 && Request.pPhysBuffList!=NULL) {
      // We have user passed in Physical Buffer List.
      if (ReAllocateDMABufferList(Request.cbSizeOfPhysList) >= Request.cbSizeOfPhysList) {
        //Copy the Buffer.
        ASSERT(Request.cbSizeOfPhysList <= m_dwNumOfList);
        m_dwNumOfAvailabe = Request.cbSizeOfPhysList ;
        PBYTE pVirtualAddr = Request.pBlockBuffer ;
        for (DWORD dwIndex = 0; dwIndex < Request.cbSizeOfPhysList && dwIndex< m_dwNumOfList; dwIndex ++) {
          m_pDmaBufferList[dwIndex].dwLength = Request.pPhysBuffList[dwIndex].PhysLen;
          m_pDmaBufferList[dwIndex].physicalAddress = Request.pPhysBuffList[dwIndex].PhysAddr;
          m_pDmaBufferList[dwIndex].virtualAddress = pVirtualAddr + m_pDmaBufferList[dwIndex].dwLength;
        }
        fReturn = TRUE;

      }
    }
    else { // We need figure out the physical address by using CEDDK DMA function.
      DWORD dwLength = Request.BlockSize * Request.NumBlocks;
      PVOID pUseBufferPtr = Request.pBlockBuffer;
      m_dmaAdapter.dwFlags =(fToDevice? DMA_FLAGS_WRITE_TO_DEVICE: 0);
      //            if (!fToDevice) {
      //                memset(Request.pBlockBuffer,0xc5,dwLength);
      //            }

      m_dwNumOfAvailabe = ADDRESS_AND_SIZE_TO_SPAN_PAGES( pUseBufferPtr, dwLength );
      PDWORD pdwPhysAddress = new DWORD[m_dwNumOfAvailabe];
      if (pdwPhysAddress) {
        if (m_dwNumOfAvailabe> m_dwNumOfList) {
          ReAllocateDMABufferList(m_dwNumOfAvailabe);
        }
        if (m_dwNumOfAvailabe<= m_dwNumOfList ) {
          m_fLocked = LockPages( pUseBufferPtr,dwLength,pdwPhysAddress, // m_pdwPhysAddress to stall PFN temperory.
              fToDevice? LOCKFLAG_READ: LOCKFLAG_WRITE);
          if (m_fLocked) { // Create table for Physical Address and length.
            m_lpvLockedAddress = pUseBufferPtr;
            m_dwLockedSize = dwLength;

            fReturn = TRUE;
            for (DWORD dwIndex = 0; dwIndex< m_dwNumOfAvailabe; dwIndex++) {
              if (pdwPhysAddress[dwIndex] > MAX_SUPPORTED_PFN) {
                ASSERT(FALSE);
                fReturn = FALSE;
                break;
              }
              else {
                m_pDmaBufferList[dwIndex].dwLength = min((PAGE_SIZE - ((DWORD)pUseBufferPtr & PAGE_MASK)),dwLength);
                m_pDmaBufferList[dwIndex].physicalAddress.LowPart = (pdwPhysAddress[dwIndex]<<PFN_SHIEFT) + ((DWORD)pUseBufferPtr & PAGE_MASK);
                m_pDmaBufferList[dwIndex].physicalAddress.HighPart = 0;
                m_pDmaBufferList[dwIndex].virtualAddress = (PBYTE)pUseBufferPtr;
                dwLength -= m_pDmaBufferList[dwIndex].dwLength;
                pUseBufferPtr = (PBYTE)pUseBufferPtr+m_pDmaBufferList[dwIndex].dwLength;
              }
            };
          }

        }
        delete [] pdwPhysAddress;
      }
      if (fReturn && m_dwNumOfAvailabe) { // Check for Cache aligh begin and end.
        if (!fToDevice) {
          DWORD dwDCacheLineSize = GetDataCacheSize() ;
          ASSERT ((dwDCacheLineSize & dwDCacheLineSize-1) == 0 ); // I has to be nature align.
          // First Block
          if ((m_pDmaBufferList[0].physicalAddress.LowPart & (dwDCacheLineSize-1)) != 0) { // Not cache align. we have to do something.
            m_StartBuffer.dwBufferOffset = (m_pDmaBufferList[0].physicalAddress.LowPart & PAGE_MASK);
            m_StartBuffer.pSrcSize = m_pDmaBufferList[0].dwLength;
            m_StartBuffer.pSrcVirtualAddr = m_pDmaBufferList[0].virtualAddress;
            m_pDmaBufferList[0].physicalAddress.QuadPart = m_StartBuffer.physicalAddress.QuadPart + m_StartBuffer.dwBufferOffset;
            //m_pDmaBufferList[0].virtualAddress = (PBYTE)m_StartBuffer.pBufferedVirtualAddr + m_StartBuffer.dwBufferOffset;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品美女久久久久久久久 | 国产亚洲精品7777| 亚洲欧洲99久久| 日韩激情av在线| 成人97人人超碰人人99| 日韩午夜激情视频| 亚洲午夜羞羞片| 93久久精品日日躁夜夜躁欧美| 日韩欧美在线影院| 亚洲资源在线观看| av在线一区二区三区| 久久婷婷色综合| 日本 国产 欧美色综合| 在线一区二区三区做爰视频网站| 国产日产亚洲精品系列| 久久精品理论片| 777午夜精品视频在线播放| 一区二区三区欧美在线观看| 福利电影一区二区| 日韩免费看的电影| 人禽交欧美网站| 欧美精品乱码久久久久久| 亚洲一区二区三区在线| 91亚洲国产成人精品一区二三| 久久久久久亚洲综合| 麻豆高清免费国产一区| 日韩免费视频一区| 日韩福利电影在线| 制服丝袜日韩国产| 日韩国产高清影视| 538在线一区二区精品国产| 亚洲综合色噜噜狠狠| 在线精品亚洲一区二区不卡| 亚洲人成在线播放网站岛国| av在线播放不卡| 亚洲欧美日韩中文播放| 91美女在线视频| 一个色综合网站| 欧美午夜精品免费| 日韩影院免费视频| 欧美不卡激情三级在线观看| 久久精品免费观看| 国产亚洲精品中文字幕| 成人18视频在线播放| 日韩一区在线看| 欧美性猛交xxxx乱大交退制版| 亚洲国产综合色| 日韩三级.com| 国产精品主播直播| 亚洲欧美国产高清| 6080午夜不卡| 国产寡妇亲子伦一区二区| 国产精品高潮呻吟久久| 欧美性大战久久久久久久| 日本美女一区二区三区视频| 欧美xxxxxxxxx| 波多野结衣的一区二区三区| 亚洲一区在线免费观看| 欧美一卡二卡三卡四卡| 国产久卡久卡久卡久卡视频精品| 亚洲欧洲国产日韩| 欧美三日本三级三级在线播放| 日本在线不卡视频| 国产欧美久久久精品影院| 在线免费不卡电影| 国产一区二区三区| 一区二区三区鲁丝不卡| 精品欧美黑人一区二区三区| 99久久99久久精品免费观看| 午夜国产不卡在线观看视频| 国产午夜精品理论片a级大结局| 色综合久久久久网| 国产一区二区在线免费观看| 亚洲精品欧美综合四区| 精品国产乱码久久久久久夜甘婷婷| 99热精品国产| 麻豆国产精品视频| 亚洲一区二区五区| 国产精品国产三级国产aⅴ入口| 69堂成人精品免费视频| 99精品国产视频| 狠狠色丁香婷综合久久| 亚洲国产精品一区二区尤物区| 久久免费电影网| 91精品国产综合久久精品性色| 成人免费视频视频| 裸体歌舞表演一区二区| 亚洲国产成人av好男人在线观看| 欧美经典一区二区三区| 日韩视频在线一区二区| 欧亚一区二区三区| 不卡电影一区二区三区| 奇米影视一区二区三区小说| 一区二区三区四区av| 国产精品天美传媒| 久久久久久久久久久久电影| 欧美一区二区三区色| 日本道精品一区二区三区| 成人午夜免费电影| 国产精品99久久久| 国产美女在线精品| 激情小说欧美图片| 日本少妇一区二区| 亚洲成人一二三| 亚洲最大成人网4388xx| 亚洲欧美日韩国产综合| 中文字幕精品综合| 国产日韩亚洲欧美综合| 久久综合久久久久88| 亚洲精品一区在线观看| 精品sm在线观看| 久久综合久久久久88| 2024国产精品视频| 国产亚洲综合在线| 日本一区二区成人| 国产欧美一区二区三区在线老狼| www久久久久| 国产欧美日韩视频一区二区| 国产三级精品三级在线专区| 久久无码av三级| 国产女主播一区| 国产日产精品1区| 国产精品免费丝袜| 亚洲色图视频免费播放| 伊人一区二区三区| 午夜不卡在线视频| 免费成人美女在线观看.| 精品在线一区二区| 国产高清在线观看免费不卡| 成人黄色在线看| 91视频xxxx| 欧美日韩国产高清一区二区 | 91麻豆精品国产自产在线观看一区| 欧美日韩国产高清一区二区| 欧美久久久久久蜜桃| 91精品国产欧美一区二区| 日韩欧美亚洲一区二区| 久久综合狠狠综合| 亚洲人成伊人成综合网小说| 亚洲成人午夜影院| 精一区二区三区| 一本色道久久综合狠狠躁的推荐| 欧美在线观看视频一区二区三区| 日韩一级免费一区| 国产精品久久久一区麻豆最新章节| 亚洲人午夜精品天堂一二香蕉| 午夜不卡av在线| 成人自拍视频在线观看| 欧美性色综合网| 久久青草欧美一区二区三区| 亚洲另类色综合网站| 美女免费视频一区| 91在线视频免费91| 欧美一区二区三区成人| 丁香五精品蜜臀久久久久99网站 | 日韩精品亚洲专区| 狠狠狠色丁香婷婷综合激情| 成人中文字幕在线| 91精品国产一区二区| 国产精品无人区| 美女久久久精品| 91美女视频网站| 久久天堂av综合合色蜜桃网| 亚洲免费大片在线观看| 国产一区二区三区黄视频 | 国产很黄免费观看久久| 欧美唯美清纯偷拍| 亚洲国产精品精华液ab| 日韩精品一二区| 91激情五月电影| 国产亚洲精品福利| 蜜桃视频在线观看一区| 在线观看日产精品| 国产精品免费网站在线观看| 久久成人免费电影| 4438x亚洲最大成人网| 亚洲欧洲综合另类| 国产一区二区福利| 欧美一级日韩免费不卡| 亚洲最快最全在线视频| k8久久久一区二区三区| 久久久99精品免费观看不卡| 免费在线看成人av| 欧美三日本三级三级在线播放| 亚洲视频资源在线| 成人18视频在线播放| 久久亚洲精华国产精华液| 久久精品72免费观看| 91精品国产综合久久久久| 亚洲国产视频a| 欧美无乱码久久久免费午夜一区| 自拍偷拍国产精品| 99久久精品一区二区| 国产日韩欧美在线一区| 国产精品中文字幕欧美| 久久久久久久久久看片| 国产激情一区二区三区桃花岛亚洲| 精品剧情v国产在线观看在线| 久久99精品视频| 亚洲精品一区二区三区精华液 |