vidime.cpp
来自「基于4个mips核的noc设计」· C++ 代码 · 共 137 行
CPP
137 行
/*
** (c) Nallatech Ltd 2000-2001
** 100-108 Teleford Road, Cumbernauld, Glasgow, UK, G67 2NJ
** www.nallatech.com
**
**
** $Id: vidime.cpp,v 1.1 2003/10/31 11:45:10 aslusarc Exp $
**
** 08/02/2000
**
** This is the interface library for the PCI Fpga to Virtex interface core example
**
** 1.0 Initial Release
** 1.1 Added code on viDIME_DMAWrite to check that FPGA buffers are finish
**
*/
#include "vidime.h"
DWORD viDIMEError;
char viDIMEErrorText[200];
/*
** This function writes the Data word 'Data' to the register at address 'Address' (31
bits)
** A non-zero return value indicates and error
*/
DWORD viDIME_WriteRegister(DIME_HANDLE handle,DWORD Address,DWORD Data,DWORD Timeout)
{
DWORD Result;
if( (Result=DIME_AddressWriteSingle(handle,&Address,NULL,Timeout)) != (DWORD)NULL
)
return(Result);
Result=DIME_DataWrite(handle,&Data,1,NULL,NULL,Timeout);
return(Result);
}
/*
** This function reads a data word from the register at address 'Address' (31 bits)
*/
DWORD viDIME_ReadRegister(DIME_HANDLE handle, DWORD Address,DWORD Timeout)
{
DWORD TempAddr;
DWORD Result;
TempAddr = Address | 0x80000000;
// Set MSB of Address to '1' and Write as an Address
if( (Result=DIME_AddressWriteSingle(handle,&TempAddr,NULL,Timeout)) !=
(DWORD)NULL)
return(Result);
// Read back Data from Virtex
TempAddr = 0;
Result = DIME_DataRead(handle,&TempAddr,1,NULL,NULL,Timeout);
return(TempAddr);
}
/* This terminates any transactions on the DMA Channels */
DWORD viDIME_DMAAbort(DIME_HANDLE handle)
{
DWORD Result;
// Disable the DMA
Result = viDIME_WriteRegister(handle,viDMACSRREG,viDMADISABLE,2000);
// Reset PCI FIFOs
DIME_PCIReset(handle);
return(Result);
}
/* This reads Data from the Virtex */
DWORD viDIME_DMARead(DIME_HANDLE handle,DWORD *Data,DWORD WordCount,DWORD DMAChannel,
volatile DWORD *Terminate, DWORD *Currcount, DWORD Timeout)
{
DWORD Result;
//Stop Any transactions in progress
//viDIME_DMAAbort(handle);
// Set up DMA on Virtex
if( (Result = viDIME_WriteRegister(handle,viDMACOUNTREG,WordCount,Timeout)) != 0 )
return(Result);
if( (Result = viDIME_WriteRegister(handle,viDMACSRREG,((DMAChannel & 0xf) << 2)|viDMAREADDIRECTION|viDMAENABLE,Timeout)) != 0)
return(Result);
// Pump the data from the Virtex
if( (Result = DIME_DataRead(handle,Data,WordCount,Terminate,Currcount,Timeout)) !=
0)
return(Result);
// Disable the DMA
Result = viDIME_WriteRegister(handle,viDMACSRREG,viDMADISABLE,Timeout);
return(Result);
}
/* This Writes Data to the Virtex */
DWORD viDIME_DMAWrite(DIME_HANDLE handle,DWORD *Data,DWORD WordCount,DWORD DMAChannel, volatile DWORD *Terminate, DWORD *Currcount, DWORD Timeout)
{
DWORD Result;
//Stop Any transactions in progress
//viDIME_DMAAbort(handle);
// Set up DMA on Virtex
if( (Result = viDIME_WriteRegister(handle,viDMACOUNTREG,WordCount,Timeout)) != 0 )
return(Result);
if( (Result = viDIME_WriteRegister(handle,viDMACSRREG,((DMAChannel & 0xf) << 2)|viDMAWRITEDIRECTION|viDMAENABLE,Timeout)) != 0)
return(Result);
// Pump the data to the Virtex
if( (Result = DIME_DataWrite(handle,Data,WordCount,Terminate,Currcount,Timeout))
!= 0)
return(Result);
// This checks that the DMA is flushed on the FPGA otherwise some data could get left in the FPGA DMA buffers when the DMA is disabled
while( viDIME_ReadRegister(handle,viDMACOUNTREG,Timeout) )
;
// Disable the DMA
Result = viDIME_WriteRegister(handle,viDMACSRREG,viDMADISABLE,Timeout);
return(Result);
}
/* This handles extra protocol associated with the P-link core */
DWORD viDIME_PLink(DIME_HANDLE handle,DWORD *WriteData, DWORD WriteWords,DWORD *ReadData,
DWORD ReadWords,DWORD PLinkChannel, volatile DWORD *Terminate, DWORD *WCurrcount, DWORD
*RCurrcount, DWORD Timeout)
{
DWORD Result;
DWORD Header[3];
//Stop Any transactions in progress
//viDIME_DMAAbort(handle);
// Send the initial header
Header[0] = 0xfec8137f;
Header[1] = WriteWords;
Header[2] = ReadWords;
if( (Result =
viDIME_DMAWrite(handle,Header,3,PLinkChannel,Terminate,NULL,Timeout)) != 0 )
return(Result);
// Now send the data itself
if( (Result =
viDIME_DMAWrite(handle,WriteData,WriteWords,PLinkChannel,Terminate,WCurrcount,Timeout))
!= 0 )
return(Result);
// read data if necesssary
if( ReadWords > 0 )
if( (Result =
viDIME_DMARead(handle,ReadData,ReadWords,PLinkChannel,Terminate,RCurrcount,Timeout)) != 0
)
return(Result);
// If we get here then everything must have gone OK!
return(0);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?