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 + -
显示快捷键?