⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dmatest.c

📁 OMAP1030 处理器的ARM 侧硬件测试代码 OMAP1030 是TI的双核处理器
💻 C
📖 第 1 页 / 共 3 页
字号:
/* 
===============================================================================
            TEXAS INSTRUMENTS INCORPORATED PROPRIETARY INFORMATION           
                                                                             
   Property of Texas Instruments 
   For  Unrestricted  Internal  Use  Only 
   Unauthorized reproduction and/or distribution is strictly prohibited.  
   This product is protected under copyright law and trade secret law 
   as an unpublished work.  
   Created 1999, (C) Copyright 1999 Texas Instruments.  All rights reserved.
   Filename       	: dmatest.c

   Description    	: Body file for the test of DMA test

   Project        	: ARM925ST

   Author         	: Francis Huguenin fhugueni@tif.ti.fr

===============================================================================
*/
#include "rheatest.h"
#include "dmatest.h"
#include "result.h"
#include "mem.h"
#include "dma.h"
#include "intvecs.h"
#include "global_types.h"
#include "locbustest.h"


#define  COMPLETE_DMA_BLOCK  0x01111111



void  DMAT_InitDataToTransfer(const UWORD32 sourceaddress,
									 const UWORD16 size_in_bytes,  
		  							 const RHEA_Access_Size_t	memory_rhea_width)
{
UWORD16 i;
switch (memory_rhea_width)
	{
   case RHEA_BITS32_SIZE :
		  /* Init data to be transfered */
		  for (i = 0; i < (size_in_bytes / 4) ; i++)
   		 {
   		 *( (UWORD32*) (sourceaddress + (4*i))) = (UWORD32) (sourceaddress + (COMPLETE_DMA_BLOCK * i));
   		 }
		  break;

   case RHEA_BITS16_SIZE :
	     /* Init data to be transfered */
		  for (i = 0; i < (size_in_bytes / 2) ; i++)
			   {
			   *( (UWORD16*) (sourceaddress + (2*i))) = (UWORD16) (sourceaddress + (COMPLETE_DMA_BLOCK * i));
			   }
		  break;
   case RHEA_BITS8_SIZE :
	     /* Init data to be transfered */
		  for (i = 0; i < (size_in_bytes ) ; i++)
			   {
			   *( (UWORD8*) (sourceaddress + i)) = (UWORD8) (sourceaddress + (COMPLETE_DMA_BLOCK * i));
			   }
		  break;
	}

}


void  DMAT_MarkData(const UWORD32 destinationaddress,
					 const UWORD16 size_in_bytes,  
		  			 const RHEA_Access_Size_t	memory_rhea_width)

{
switch (memory_rhea_width)
	{
   case RHEA_BITS32_SIZE :
		  *( (UWORD32*) (destinationaddress + size_in_bytes)) = 0xFEFEFEFE;
		  break;
   case RHEA_BITS16_SIZE :
		  *( (UWORD16*) (destinationaddress + size_in_bytes)) = 0xFEFE;
		  break;
   case RHEA_BITS8_SIZE :
		  *( (UWORD8*) (destinationaddress + size_in_bytes)) = 0xFE;
		  break;
	}
}


boolean_t DMAT_CheckMarkData(const UWORD32 destinationaddress,
								  const UWORD16 size_in_bytes,  
		  						  const RHEA_Access_Size_t	memory_rhea_width)
{
boolean_t ok=False;
switch (memory_rhea_width)
	{
   case RHEA_BITS32_SIZE :
		  if (*( (UWORD32*) (destinationaddress + size_in_bytes)) == 0xFEFEFEFE)
		     ok=True; 
		  break;
   case RHEA_BITS16_SIZE :
		  if (*( (UWORD16*) (destinationaddress + size_in_bytes)) == 0xFEFE)
		     ok=True; 
		  break;
   case RHEA_BITS8_SIZE :
		  if (*( (UWORD8*) (destinationaddress + size_in_bytes)) == 0xFE)
		     ok=True; 
		  break;
	}
return(ok);
}



boolean_t  DMAT_CompareDataToTransfer(const UWORD32 sourceaddress,
									 			const UWORD32 destinationaddress, 
									 			const UWORD16 size_in_bytes,  
		  							 			const RHEA_Access_Size_t	memory_rhea_width)

{
boolean_t ok;
UWORD16 i;
switch (memory_rhea_width)
	{
   case RHEA_BITS32_SIZE :
		  /* Check that data transfered into rhea is correct */
		  //ok = TRUE;
                  ok = True;
		  i=0;
		  while ((ok == TRUE ) && (i < (size_in_bytes / 4)))
  				{
				if (*(UWORD32*)(sourceaddress+(4*i)) != *(UWORD32*)(destinationaddress+(4*i)))
					//ok=FALSE;
                                        ok = False;
				else
					i++;
				}
		  break;
			
   case RHEA_BITS16_SIZE :
		  /* Check that data transfered into rhea is correct */
		  //ok = TRUE;
                  ok = True;
		  i=0;
		  while ((ok == TRUE ) && (i < (size_in_bytes / 2)))
  				{
				if (*(UWORD16*)(sourceaddress+(2*i)) != *(UWORD16*)(destinationaddress+(2*i)))
					//ok=FALSE;
                                        ok = False;
				else
					i++;
				}
		  break;
   case RHEA_BITS8_SIZE :
		  /* Check that data transfered into rhea is correct */
		  //ok = TRUE;
                  ok = True;
		  i=0;
		  while ((ok == TRUE ) && (i < size_in_bytes ))
  				{
				if (*(UWORD8*)(sourceaddress+i) != *(UWORD8*)(destinationaddress+i))
					//ok=FALSE;
                                        ok = False;
				else
					i++;
				}
		  break;
	 default:
	 	ok=False;
		break; 
    }
return(ok);
}




/*
---------------------------------------------------------------------
               DMAT_RheaPriority
---------------------------------------------------------------------
*/
UWORD16 DMAT_RheaPriority (const UWORD32 				     emif_src_address,
                               const RHEA_Strobe0ChipSelect_t rhea_dst_chipselect,
									    const UWORD32 			        rhea_dst_address,
									    const UWORD16 					  size_in_bytes)    
{
//UWORD16 i;
//BOOL ok;
#define TIMEOUT_RHEA 0xFF

//------------------------------------------------------------
//  INITIALIZE THE RHEA BUS
//------------------------------------------------------------
  RHEA_InitCtrolReg(RHEA_FACTOR2_STROBE, RHEA_FACTOR2_STROBE, TIMEOUT_RHEA);

  /* No Posted Write */ 
  RHEA_SetPostedWrite(RHEA_DISABLE_WRITE_BUFFER_STROBE0,
                      RHEA_DISABLE_WRITE_BUFFER_STROBE1);
  /* Set DMA Prior over ARM even though in exception mode */
  RHEA_InitBusAllocReg(RHEA_PRIORITY_TO_DMA_ACCESS_7, 
                         RHEA_USE_PRIORITY_BITS);

//------------------------------------------------------------
//  DMA  SEND TO RHEA BUS
//------------------------------------------------------------
  // Init data to be transfered 
  DMAT_InitDataToTransfer(emif_src_address,size_in_bytes,RHEA_BITS32_SIZE);

  // Thanks to ARM DMA Controller transfer data from EMIF to Rhea Bus 
  DMA_SendEmifToRhea(DMA_CHANNEL_0,
                     DMA_LOW_PRIORITY,
                     emif_src_address,/* Srce address */
                     rhea_dst_address, /*Dest Rhea Address */
                     rhea_dst_chipselect , /* Dest Rhea Chip Select */ 
                     size_in_bytes,
							RHEA_BITS32_SIZE,
                     DMA_AUTOINIT_DISABLE,
                     DMA_DISABLE_HALF_BLOCK_TRANSFER_IT);



//------------------------------------------------------------
//  Check that DMA data transfered into RHEA bus is correct 
//     while dma transfert is in progress
//	  due to priority 
//-----------------------------------------------------------
if (DMAT_CompareDataToTransfer(emif_src_address,rhea_dst_address,size_in_bytes,RHEA_BITS32_SIZE))
	return(RES_OK);
else
   return(RES_BAD);

}



/*
-------------------------------------------------------------------------
--               DMAT_RheaToRhea                             --
-------------------------------------------------------------------------
*/
UWORD16 DMAT_RheaToRhea(const DMA_ChannelId_t    		channel_id,
                             const RHEA_Strobe0ChipSelect_t rhea_src_chipselect,
									  const UWORD32 			         rhea_src_address,
                             const RHEA_Strobe0ChipSelect_t rhea_dst_chipselect,
									  const UWORD32 			         rhea_dst_address,
									  const UWORD16 		   			size_in_bytes,
		  							  const RHEA_Access_Size_t			memory_rhea_width,
									  volatile boolean_t *const  dmaendblock)
										 
{

//UWORD16 i;
//BOOL ok;

	*dmaendblock = False;
  /* Init data to be transfered */
  DMAT_InitDataToTransfer(rhea_src_address,size_in_bytes,memory_rhea_width);


  /* Thanks to ARM DMA Controller transfer data from RHEA to RHEA */
  //INT_SetSupervisor();

  DMA_SendRheaToRhea(channel_id,
                     DMA_LOW_PRIORITY,
                     rhea_src_address,   /* Source Rhea offset into the Chip Select */
                     rhea_src_chipselect,/* Source Rhea Chip Select */ 
                     rhea_dst_address,   /* Dst Rhea offset into the Chip Select */
                     rhea_dst_chipselect,/* Dst Rhea Chip Select */ 
                     size_in_bytes,
							memory_rhea_width,
                     DMA_AUTOINIT_DISABLE,
                     DMA_DISABLE_HALF_BLOCK_TRANSFER_IT);


  //INT_SetUser();
  // wait the end of transfert
  while (*dmaendblock == False) ;

if (DMAT_CompareDataToTransfer(rhea_src_address,rhea_dst_address,size_in_bytes,memory_rhea_width))
	return(RES_OK);
else
   return(RES_BAD);

}





/*
-------------------------------------------------------------------------
--               DMAT_EmifToRhea                             --
-------------------------------------------------------------------------
*/
UWORD16 DMAT_EmifToRhea(const DMA_ChannelId_t    		channel_id,
									  const UWORD32 				      emif_src_address,
                             const RHEA_Strobe0ChipSelect_t rhea_dst_chipselect,
									  const UWORD32 			         rhea_dst_address,
									  const UWORD16 		   			size_in_bytes,
		  							  const RHEA_Access_Size_t			memory_rhea_width,
									  volatile boolean_t *const  dmaendblock)
										 
{

//UWORD16 i;
BOOL ok;
/*
--------------------------------------------------------------------
--      1st Test :                                                --
--  accesses From EMIF to Rhea via DMA Controller                --
--------------------------------------------------------------------
*/

  /* Init data to be transfered */
  DMAT_InitDataToTransfer(emif_src_address,size_in_bytes,memory_rhea_width);

  DMAT_MarkData(rhea_dst_address,size_in_bytes, memory_rhea_width);


	*dmaendblock = False;

  /* Thanks to ARM DMA Controller transfer data from RHEA to EMIF */
  //INT_SetSupervisor();

  DMA_SendEmifToRhea(channel_id,
                     DMA_LOW_PRIORITY,
                     emif_src_address,
                     rhea_dst_address,      /* Source Rhea offset into the Chip Select */
                     rhea_dst_chipselect, /* Source Rhea Chip Select */ 
                     size_in_bytes,
							memory_rhea_width,
                     DMA_AUTOINIT_DISABLE,
                     DMA_DISABLE_HALF_BLOCK_TRANSFER_IT);


  //INT_SetUser();
  // wait the end of transfert
  while (	*dmaendblock == False) ;

  /* Check that transfer is correct */
  ok = DMAT_CheckMarkData(rhea_dst_address,size_in_bytes, memory_rhea_width );
  ok &= DMAT_CompareDataToTransfer(emif_src_address,rhea_dst_address,size_in_bytes,memory_rhea_width);

if (ok)
	return(RES_OK);
else
   return(RES_BAD);

}



//-------------------------------------------------------------------------
//               DMAT_RheaToEmif
//-------------------------------------------------------------------------
UWORD16 DMAT_RheaToEmif ( const DMA_ChannelId_t    		  channel_id,
                            	 const RHEA_Strobe0ChipSelect_t rhea_src_chipselect,
									 	 const UWORD32 			     	  rhea_src_address,
										 const UWORD32 				     emif_dst_address,
									 	 const UWORD16 					  size_in_bytes,
		  							    const RHEA_Access_Size_t		  memory_rhea_width,
										 volatile boolean_t *const  dmaendblock)
										 
{
//UWORD16 i;
BOOL ok;

*dmaendblock = False;

/* Init data to be transfered */
DMAT_InitDataToTransfer(rhea_src_address,size_in_bytes,memory_rhea_width);

// mark the latest destination address for checking overflow of dma write 
DMAT_MarkData(emif_dst_address,size_in_bytes, memory_rhea_width);

/* Thanks to ARM DMA Controller transfer data from RHEA to EMIF */
//INT_SetSupervisor();
                     

DMA_SendRheaToEmif(channel_id,
                     	DMA_LOW_PRIORITY,
                     	rhea_src_address,      /* Source Rhea offset into the Chip Select */
                     	rhea_src_chipselect, /* Source Rhea Chip Select */ 
		     					emif_dst_address,
                     	size_in_bytes,
								memory_rhea_width,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -