📄 dmatest.c
字号:
/*
===============================================================================
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 + -