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

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

?? sdhcdma.cpp

?? 6410BSP3
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
          }
          if(m_dwNumOfAvailabe!=0 && (m_pDmaBufferList[m_dwNumOfAvailabe-1].dwLength & (dwDCacheLineSize-1))!=0) {
            m_EndBuffer.dwBufferOffset = 0 ;
            m_EndBuffer.pSrcSize = m_pDmaBufferList[m_dwNumOfAvailabe-1].dwLength;
            m_EndBuffer.pSrcVirtualAddr = m_pDmaBufferList[m_dwNumOfAvailabe-1].virtualAddress;
            m_pDmaBufferList[m_dwNumOfAvailabe-1].physicalAddress = m_EndBuffer.physicalAddress;
            //m_pDmaBufferList[m_dwNumOfAvailabe-1].virtualAddress = m_EndBuffer.pBufferedVirtualAddr;
          }
        }
      }
      else {
        fReturn = FALSE;
        if (m_fLocked) {
          UnlockPages(m_lpvLockedAddress, m_dwLockedSize);
        };
        m_fLocked = FALSE;
      }
      if (fReturn && fToDevice) {
        for (DWORD dwIndex = 0 ; dwIndex<m_dwNumOfAvailabe ; dwIndex++) {
          CacheRangeFlush(m_pDmaBufferList[dwIndex].virtualAddress,m_pDmaBufferList[dwIndex].dwLength, CACHE_SYNC_WRITEBACK );
        }
      }
    }
    ASSERT(fReturn);        
  }
  return fReturn;
}
BOOL CSDHCSlotBaseSDMA::ArmDMA(SD_BUS_REQUEST& Request,BOOL fToDevice )
{
  BOOL fResult = GetDMABuffer(Request,fToDevice);//CSDHCSlotBaseDMA::ArmDMA(Request,fToDevice);
  if (fResult) {
    m_fDMAProcessing = TRUE;
    m_dwDMACompletionCode = ERROR_IO_PENDING ;
    m_dwCurDMAListPos = 0;
    ASSERT(m_dwNumOfAvailabe!=0);
    // Arm Buffer Bound
    DWORD dwArmBit= 0;
    m_dwNextOffset = GetDMALengthBit(m_pDmaBufferList[m_dwCurDMAListPos].physicalAddress.LowPart, m_pDmaBufferList[m_dwCurDMAListPos].dwLength);
    ASSERT(m_dwNextOffset<= m_pDmaBufferList[m_dwCurDMAListPos].dwLength);

    // Arm the first buffer.
    m_SDHCSloteBase.WriteDword(SDHC_SYSTEMADDRESS_LO, m_pDmaBufferList[m_dwCurDMAListPos].physicalAddress.LowPart );
  }
  return fResult;
}
BOOL CSDHCSlotBaseSDMA::DMANotifyEvent(SD_BUS_REQUEST& Request, DMAEVENT dmaEvent)
{
  switch (dmaEvent) {
    case DMA_COMPLETE:
      if (m_fDMAProcessing && m_pDmaBufferList && m_dwCurDMAListPos<m_dwNumOfAvailabe) {
        if (m_dwNextOffset < m_pDmaBufferList[m_dwCurDMAListPos].dwLength) { // re-arm the same.
          DWORD dwNewAddr = m_pDmaBufferList[m_dwCurDMAListPos].physicalAddress.LowPart + m_dwNextOffset;
          DWORD dwLength = GetDMALengthBit(dwNewAddr, m_pDmaBufferList[m_dwCurDMAListPos].dwLength-m_dwNextOffset);
          ASSERT(dwLength + m_dwNextOffset <= m_pDmaBufferList[m_dwCurDMAListPos].dwLength);
          m_dwNextOffset +=  dwLength;
          m_SDHCSloteBase.WriteDword(SDHC_SYSTEMADDRESS_LO,dwNewAddr);
        }
        else { // next entry,
          // Update HCParam
          Request.HCParam += m_pDmaBufferList[m_dwCurDMAListPos].dwLength;
          m_dwNextOffset = 0;

          m_dwCurDMAListPos++;
          if (m_dwCurDMAListPos < m_dwNumOfAvailabe) { // Continue for next
            m_dwNextOffset = GetDMALengthBit(m_pDmaBufferList[m_dwCurDMAListPos].physicalAddress.LowPart, m_pDmaBufferList[m_dwCurDMAListPos].dwLength);
            ASSERT(m_dwNextOffset<= m_pDmaBufferList[m_dwCurDMAListPos].dwLength);
            m_SDHCSloteBase.WriteDword(SDHC_SYSTEMADDRESS_LO, m_pDmaBufferList[m_dwCurDMAListPos].physicalAddress.LowPart);
          }
          else {
            m_fDMAProcessing = FALSE;
            ASSERT(FALSE); // DMA has been completed.
          }
        }
      }
      else {
        ASSERT(m_dwNumOfAvailabe == m_dwCurDMAListPos);
        m_fDMAProcessing = FALSE;
      }
      break;
    case TRANSFER_COMPLETED:
      ASSERT(m_dwCurDMAListPos <= m_dwNumOfAvailabe);
      if (m_fDMAProcessing && m_pDmaBufferList && m_dwCurDMAListPos<m_dwNumOfAvailabe) {
        Request.HCParam += m_pDmaBufferList[m_dwCurDMAListPos].dwLength ;
        m_dwCurDMAListPos ++;
      }
      m_fDMAProcessing = FALSE;
      break;
    case DMA_ERROR_OCCOR:
    default:
      ASSERT(FALSE);
      m_dwDMACompletionCode = ERROR_NOT_READY;
      m_fDMAProcessing = FALSE;
      break;
  }
  if (!m_fDMAProcessing && m_hDma) {
    DMACloseBuffer(m_hDma);
    m_hDma = NULL;
  }
  else if (!m_fDMAProcessing && m_fLocked) {
    if (!TRANSFER_IS_WRITE(&Request)) {
      for (DWORD dwIndex = 0 ; dwIndex<m_dwNumOfAvailabe ; dwIndex++) 
      {
        CacheRangeFlush(m_pDmaBufferList[dwIndex].virtualAddress,m_pDmaBufferList[dwIndex].dwLength, CACHE_SYNC_DISCARD );
      }
      if (m_StartBuffer.pSrcVirtualAddr!=NULL && m_StartBuffer.pSrcSize!=0) {
        CeSafeCopyMemory (m_StartBuffer.pSrcVirtualAddr,
            (PBYTE)m_StartBuffer.pBufferedVirtualAddr+ m_StartBuffer.dwBufferOffset,
            m_StartBuffer.pSrcSize);
      }
      if (m_EndBuffer.pSrcVirtualAddr!=NULL && m_EndBuffer.pSrcSize!=0) {
        CeSafeCopyMemory (m_EndBuffer.pSrcVirtualAddr, m_EndBuffer.pBufferedVirtualAddr,m_EndBuffer.pSrcSize);
      }
    }
    if (m_fLocked )
      UnlockPages( m_lpvLockedAddress, m_dwLockedSize);
    m_fLocked = FALSE;
  }
  return TRUE;
}

CSDHCSlotBase32BitADMA2::CSDHCSlotBase32BitADMA2(CSDHCSlotBase& SDHCSloteBase)
:    CSDHCSlotBaseDMA(SDHCSloteBase)
{
    DEBUGMSG(SDCARD_ZONE_INIT, (_T("CSDHCSlotBase32BitADMA2:Create DMA Object for SDMA\r\n")));        
    m_dwNumOfTables =0;
    for (DWORD dwIndex=0; dwIndex < MAXIMUM_DESC_TABLES; dwIndex++) {
        m_pDmaDescTables[dwIndex] = NULL;
        m_dwDescTablePhysAddr[dwIndex] = 0 ;
    }
        
};
CSDHCSlotBase32BitADMA2::~CSDHCSlotBase32BitADMA2()
{
    for (DWORD dwIndex=0; dwIndex< m_dwNumOfTables; dwIndex++) {
        ASSERT(m_pDmaDescTables[dwIndex]);
        ASSERT(m_dwDescTablePhysAddr[dwIndex]);
        PHYSICAL_ADDRESS LogicalAddress = {m_dwDescTablePhysAddr[dwIndex],0};
        OALDMAFreeBuffer(&m_dmaAdapter,PAGE_SIZE,LogicalAddress,m_pDmaDescTables[dwIndex],FALSE);
    }
}
BOOL CSDHCSlotBase32BitADMA2::Init()
{
    if (CSDHCSlotBaseDMA::Init()) {
        PHYSICAL_ADDRESS LogicalAddress;
        ASSERT(m_dwNumOfTables==0);
        if (m_dwNumOfTables<MAXIMUM_DESC_TABLES) {
            m_pDmaDescTables[m_dwNumOfTables] = (PADMA2_32_DESC) OALDMAAllocBuffer(&m_dmaAdapter, PAGE_SIZE , &LogicalAddress, FALSE );
            if (m_pDmaDescTables[m_dwNumOfTables]) {
                m_dwDescTablePhysAddr[m_dwNumOfTables] = LogicalAddress.LowPart; // We are using 32 bit address.
                m_dwNumOfTables++;
            }
        }
        ASSERT(m_dwNumOfTables!=0);
        return (m_dwNumOfTables!=0);
    }
    return FALSE;
}
BOOL CSDHCSlotBase32BitADMA2::ArmDMA(SD_BUS_REQUEST& Request,BOOL fToDevice )
{
    BOOL fResult = FALSE ;
    if (CSDHCSlotBaseDMA::ArmDMA(Request,fToDevice) 
            && m_dwNumOfAvailabe 
            && IsEnoughDescTable(m_dwNumOfAvailabe) ) {

        DWORD dwCurTable = 0 ;
        DWORD dwCurEntry = 0 ;
        DWORD dwCurPhysicalPage = 0;
        while (dwCurPhysicalPage < m_dwNumOfAvailabe) {
            PADMA2_32_DESC pCurTable = m_pDmaDescTables[dwCurTable];
            PADMA2_32_DESC pCurEntry = pCurTable + dwCurEntry;
            // Setup Descriptor
            pCurEntry->Valid = 1 ;
            pCurEntry->End = 0 ;
            pCurEntry->Int = 0 ;
            pCurEntry->Act = 2 ; // Transfer.
            pCurEntry->Length = m_pDmaBufferList[dwCurPhysicalPage].dwLength;
            pCurEntry->Address = m_pDmaBufferList[dwCurPhysicalPage].physicalAddress.LowPart;

            dwCurPhysicalPage++;
            
            if (dwCurPhysicalPage < m_dwNumOfAvailabe) { // We have more
                dwCurEntry++;
                if (dwCurEntry>= DESC_ENTRY_PER_TABLE -1 ) { // We reserv last one for Link Descriptor.
                    pCurEntry = pCurTable+dwCurEntry;
                    // Setup link.
                    pCurEntry->Valid = 1 ;
                    pCurEntry->End = 0 ;
                    pCurEntry->Int = 0 ;
                    pCurEntry->Act = 3 ; // Link
                    pCurEntry->Length = 0;
                    pCurEntry->Address = m_dwDescTablePhysAddr[dwCurTable+1];
                    dwCurTable ++; 
                    dwCurEntry = 0;
                    
                    if (dwCurTable>=m_dwNumOfTables) { // For some reason we exceed.
                        ASSERT(FALSE);
                        break;
                    }
                }
            }
            else { // We finished here.
                // Change this link to end
                pCurEntry->End = 1;
                fResult = TRUE;
                break;
            }

        }
        // Arm the first buffer.
        if (fResult) {
            m_fDMAProcessing = TRUE;
            m_SDHCSloteBase.WriteDword(SDHC_ADMA_SYSTEMADDRESS_LO, m_dwDescTablePhysAddr[0] ); // 32-bit address.
            m_SDHCSloteBase.WriteDword(SDHC_ADMA_SYSTEMADDRESS_HI, 0 );
        }
        else {
            ASSERT(FALSE);
        }

    }
    return fResult;
}
BOOL CSDHCSlotBase32BitADMA2::IsEnoughDescTable(DWORD dwNumOfBlock)
{
    DWORD dwNumOfEntryPerTable = DESC_ENTRY_PER_TABLE -1; // we reserv one for the link.
    DWORD dwNumOfTable = (dwNumOfBlock+dwNumOfEntryPerTable-1)/dwNumOfEntryPerTable;
    if (dwNumOfTable> MAXIMUM_DESC_TABLES){
        return FALSE;
        }
    if (dwNumOfTable> m_dwNumOfTables) { // we need allocate more
        for (DWORD dwIndex = m_dwNumOfTables; dwIndex< dwNumOfTable; dwIndex++) {
            PHYSICAL_ADDRESS LogicalAddress;
            m_pDmaDescTables[m_dwNumOfTables] = (PADMA2_32_DESC) OALDMAAllocBuffer(&m_dmaAdapter, PAGE_SIZE , &LogicalAddress, FALSE );
            if (m_pDmaDescTables[m_dwNumOfTables]) {
                m_dwDescTablePhysAddr[m_dwNumOfTables] = LogicalAddress.LowPart; // We are using 32 bit address.
                m_dwNumOfTables++;
            }
            else
                break;
        }
        if (dwNumOfTable!=m_dwNumOfTables) {
            ASSERT(FALSE);
            return FALSE;
        }
    }
    return TRUE;
    
}

BOOL CSDHCSlotBase32BitADMA2::DMANotifyEvent(SD_BUS_REQUEST& Request, DMAEVENT dmaEvent)
{
    switch (dmaEvent) {
        ASSERT(FALSE);
        break;
      case TRANSFER_COMPLETED:
        ASSERT(m_dwCurDMAListPos <= m_dwNumOfAvailabe);
        if (m_fDMAProcessing && m_pDmaBufferList && m_dwCurDMAListPos<m_dwNumOfAvailabe) {
            Request.HCParam = Request.BlockSize*Request.NumBlocks;
        }
        m_fDMAProcessing = FALSE;
        break;
      case DMA_ERROR_OCCOR:
        m_fDMAProcessing = FALSE; {
        m_dwDMACompletionCode = ERROR_NOT_READY;
        
        BYTE ADMAErrorStatus = m_SDHCSloteBase.ReadByte(SDHC_ADMA_ERROR_STATUS);
        DEBUGMSG(SDCARD_ZONE_ERROR,(TEXT("ADMA Erorr Status 0x%x: Refer to 2.2.30"), ADMAErrorStatus));
        }
        break;
      default:
      case DMA_COMPLETE:
        ASSERT(FALSE);
        m_dwDMACompletionCode = ERROR_NOT_READY;
        m_fDMAProcessing = FALSE;
        break;
    }
    if (!m_fDMAProcessing && m_hDma) {
        DMACloseBuffer(m_hDma);
        m_hDma = NULL;
    }
    return TRUE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲网友自拍偷拍| 99在线热播精品免费| 五月天一区二区| 亚欧色一区w666天堂| 午夜在线电影亚洲一区| 亚洲成av人片在线观看| 午夜一区二区三区视频| 亚洲一区二区三区自拍| 亚洲国产精品久久人人爱| 亚洲一区二区三区四区的| 午夜精品久久久久久不卡8050| 日日嗨av一区二区三区四区| 蜜桃视频在线一区| 国内精品久久久久影院色| 国产精一品亚洲二区在线视频| 国产呦萝稀缺另类资源| 国产精品99久久久| av色综合久久天堂av综合| 国产精品乱子久久久久| 亚洲欧美另类在线| 午夜精品一区二区三区三上悠亚| 日韩精品成人一区二区三区| 久久国产精品色婷婷| 国产不卡视频在线观看| 99热精品一区二区| 日韩欧美一级片| 日韩精品在线一区| 日韩免费看的电影| 国产日韩精品久久久| 中文字幕一区二区三区四区 | 精品福利二区三区| 国产精品午夜电影| 亚洲成人tv网| 国产呦精品一区二区三区网站| aaa欧美日韩| 欧美疯狂做受xxxx富婆| 精品嫩草影院久久| 亚洲另类在线视频| 伦理电影国产精品| gogo大胆日本视频一区| 欧美男人的天堂一二区| 国产午夜精品一区二区三区视频 | 亚洲国产你懂的| 精品一区二区三区免费视频| 9色porny自拍视频一区二区| 欧美一区二区视频免费观看| 亚洲国产精品黑人久久久| 亚洲成人在线免费| 国产成人日日夜夜| 精品视频在线看| 国产精品蜜臀av| 日韩av一二三| 91无套直看片红桃| 欧美精品一区二区在线观看| 亚洲一区电影777| 国产精品亚洲午夜一区二区三区 | 亚洲黄一区二区三区| 激情文学综合插| 欧美影院一区二区三区| 欧美激情在线看| 石原莉奈在线亚洲二区| eeuss影院一区二区三区| 欧美不卡123| 婷婷综合在线观看| 99热99精品| 久久亚洲一区二区三区四区| 午夜视频在线观看一区二区| 成人av网站免费观看| 日韩三级电影网址| 五月天视频一区| 91久久国产最好的精华液| 国产人成亚洲第一网站在线播放 | 成人黄色av电影| 日韩你懂的在线观看| 一区二区免费在线播放| av一本久道久久综合久久鬼色| 精品999在线播放| 青草国产精品久久久久久| 欧美自拍丝袜亚洲| 亚洲女人****多毛耸耸8| 国产凹凸在线观看一区二区| 2024国产精品视频| 久久99精品视频| 日韩久久免费av| 麻豆免费看一区二区三区| 欧美二区三区91| 亚洲aaa精品| 欧美日韩一区 二区 三区 久久精品| 日韩一区中文字幕| 99视频在线观看一区三区| 国产精品久久99| www.亚洲在线| 国产精品久久久久久福利一牛影视| 国产一区二区导航在线播放| 欧美精品一区二区三区蜜臀| 久久97超碰国产精品超碰| 欧美一级午夜免费电影| 蜜臀av性久久久久蜜臀aⅴ| 日韩一级免费一区| 男人的j进女人的j一区| 日韩欧美国产不卡| 国产一区在线不卡| 久久久亚洲综合| 国产91精品露脸国语对白| 国产精品毛片高清在线完整版 | 2020国产成人综合网| 韩日av一区二区| 久久青草国产手机看片福利盒子 | 国产成人亚洲综合a∨猫咪 | 国产一区二区三区| 久久久久久电影| 成人免费观看视频| 亚洲欧美一区二区三区孕妇| 欧美艳星brazzers| 水野朝阳av一区二区三区| 91精品国产手机| 国精产品一区一区三区mba桃花| 久久久久9999亚洲精品| 成人午夜激情在线| 亚洲日本青草视频在线怡红院| 日本精品免费观看高清观看| 香港成人在线视频| 日韩免费福利电影在线观看| 国产精品996| 日韩一区中文字幕| 欧美日韩不卡一区| 国内久久精品视频| 国产精品二区一区二区aⅴ污介绍| 色婷婷久久综合| 日本怡春院一区二区| 国产日韩欧美a| 91精品1区2区| 奇米影视一区二区三区| 久久久99精品免费观看| 97精品视频在线观看自产线路二| 亚洲自拍偷拍九九九| 日韩你懂的在线观看| 成人黄色电影在线| 舔着乳尖日韩一区| 国产午夜精品一区二区三区嫩草| 色综合久久天天综合网| 日本不卡一二三区黄网| 国产欧美va欧美不卡在线| 欧美性色黄大片手机版| 国精产品一区一区三区mba桃花| 中文字幕一区二区三区在线播放| 欧美电影一区二区| av在线播放一区二区三区| 五月婷婷久久综合| 国产精品乱人伦中文| 3d成人动漫网站| 99久久久无码国产精品| 琪琪一区二区三区| 亚洲欧美偷拍另类a∨色屁股| 日韩一区二区免费在线观看| 91麻豆国产精品久久| 精品一区二区三区在线播放视频| 亚洲欧美日本在线| 久久久美女艺术照精彩视频福利播放| 91成人免费在线| 国产精品一级二级三级| 三级成人在线视频| 亚洲欧美在线视频观看| 精品国精品国产尤物美女| 欧美视频一二三区| 成人黄色777网| 韩国一区二区视频| 天天免费综合色| 亚洲视频精选在线| 国产亚洲精品aa午夜观看| 在线综合+亚洲+欧美中文字幕| 91免费在线播放| 岛国精品在线播放| 久久99精品久久久久久国产越南| 亚洲在线观看免费| 亚洲色图欧美偷拍| 国产亚洲一区二区三区| 欧美成人精品1314www| 欧美主播一区二区三区| jlzzjlzz亚洲日本少妇| 国产美女久久久久| 久久99精品国产麻豆婷婷| 天堂影院一区二区| 一区二区三区国产精品| 国产精品日韩成人| 国产人成一区二区三区影院| 精品久久久久久亚洲综合网 | 一区二区三区四区乱视频| 国产精品视频一二三区 | 性欧美疯狂xxxxbbbb| 亚洲欧洲综合另类在线| 日韩一区在线播放| 国产精品久久久久久久久果冻传媒| 久久色在线视频| 久久久久久久国产精品影院| 26uuu久久天堂性欧美| 26uuu亚洲综合色| www一区二区| 国产婷婷色一区二区三区在线| 精品99一区二区|