From f4a59e740c16676a0e3a8e862b70068e8db3f925 Mon Sep 17 00:00:00 2001 From: nakasima Date: Wed, 25 Apr 2007 03:11:34 +0000 Subject: [PATCH] update ex-dma test. fix MIi_StopExDma. git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/twl_wrapsdk/trunk@42 4ee2a332-4b2b-5046-8439-1ba90f034370 --- build/libraries/mi/common/mi_exDma.c | 20 +- build/libraries/mi/common/mi_init.c | 5 +- build/tests/mi/Makefile | 4 +- build/tests/mi/_ARM7_exDma-1/Makefile | 44 +++ build/tests/mi/_ARM7_exDma-1/src/main.c | 484 ++++++++++++++++++++++++ build/tests/mi/exDma-1/src/main.c | 201 ++++++++-- include/nitro/os/common/interrupt.h | 2 + include/twl/mi/exDma.h | 75 ++-- 8 files changed, 762 insertions(+), 73 deletions(-) create mode 100644 build/tests/mi/_ARM7_exDma-1/Makefile create mode 100644 build/tests/mi/_ARM7_exDma-1/src/main.c diff --git a/build/libraries/mi/common/mi_exDma.c b/build/libraries/mi/common/mi_exDma.c index d146399..f37fc27 100644 --- a/build/libraries/mi/common/mi_exDma.c +++ b/build/libraries/mi/common/mi_exDma.c @@ -14,13 +14,13 @@ $NoKeywords: $ *---------------------------------------------------------------------------*/ -#include +#include static BOOL isArbitrated = FALSE; static u32 intervalTable[] = { - 8, 8, 8, 8, + 1, 1, 1, 1, }; //================================================================================ @@ -632,6 +632,22 @@ void MIi_WaitExDma( u32 dmaNo ) Returns: None *---------------------------------------------------------------------------*/ void MIi_StopExDma( u32 dmaNo ) +{ + MIi_StopExDmaAsync( dmaNo ); + MIi_WaitExDma( dmaNo ); +} + +/*---------------------------------------------------------------------------* + Name: MIi_StopDmaAsync + + Description: stop extended DMA + async version + + Arguments: dmaNo : DMA channel No. + + Returns: None + *---------------------------------------------------------------------------*/ +void MIi_StopExDmaAsync( u32 dmaNo ) { OSIntrMode enabled = OS_DisableInterrupts(); diff --git a/build/libraries/mi/common/mi_init.c b/build/libraries/mi/common/mi_init.c index 2ea0753..928a062 100644 --- a/build/libraries/mi/common/mi_init.c +++ b/build/libraries/mi/common/mi_init.c @@ -23,7 +23,7 @@ $NoKeywords: $ *---------------------------------------------------------------------------*/ -#include +#include /*---------------------------------------------------------------------------* Name: MI_Init @@ -47,6 +47,5 @@ void MI_Init(void) //---- add for TWL //---- DMA arbitration - // this value depends on that the cache line read from the main memory is 20 cycles. - MIi_SetExDmaArbiter( MI_EXDMAGBL_ARB_ROUND_ROBIN, MI_EXDMAGBL_YLD_CYCLE_32 ); + MIi_SetExDmaArbiter( MI_EXDMAGBL_ARB_ROUND_ROBIN, MI_EXDMAGBL_YLD_CYCLE_DEFAULT ); } diff --git a/build/tests/mi/Makefile b/build/tests/mi/Makefile index 6fb357d..02f78d4 100644 --- a/build/tests/mi/Makefile +++ b/build/tests/mi/Makefile @@ -20,7 +20,9 @@ include $(TWLSDK_ROOT)/build/buildtools/commondefs #---------------------------------------------------------------------------- -SUBDIRS = exDma-1 +SUBDIRS = \ + exDma-1 \ + _ARM7_exDma-1 \ #---------------------------------------------------------------------------- diff --git a/build/tests/mi/_ARM7_exDma-1/Makefile b/build/tests/mi/_ARM7_exDma-1/Makefile new file mode 100644 index 0000000..daee1e1 --- /dev/null +++ b/build/tests/mi/_ARM7_exDma-1/Makefile @@ -0,0 +1,44 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: TwlSDK - OS - demos - _ARM7-exDma-1 +# File: Makefile +# +# Copyright 2007 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +SUBDIRS = + + +#---------------------------------------------------------------------------- + +#TWL_CODEGEN = THUMB +TWL_PROC = ARM7 + +TARGET_BIN = main.axf + +SRCS = main.c + +#SRCDIR = # using default +#LCFILE = # using default + +include $(TWLSDK_ROOT)/build/buildtools/commondefs + + +#---------------------------------------------------------------------------- + +do-build: $(TARGETS) + + +include $(TWLSDK_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== diff --git a/build/tests/mi/_ARM7_exDma-1/src/main.c b/build/tests/mi/_ARM7_exDma-1/src/main.c new file mode 100644 index 0000000..5af3f6e --- /dev/null +++ b/build/tests/mi/_ARM7_exDma-1/src/main.c @@ -0,0 +1,484 @@ +/*---------------------------------------------------------------------------* + Project: TwlSDK - MI - demos - exDma-1 + File: main.c + + Copyright 2003-2006 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Log: $ + $NoKeywords: $ + *---------------------------------------------------------------------------*/ +#include + + +#define ONE_BUF_SIZE 0x2004 + +typedef struct +{ + u32 prePad __attribute__ ((aligned (32))); + u16 src[4][ONE_BUF_SIZE/2] __attribute__ ((aligned (32))); + u16 dest[4][ONE_BUF_SIZE/2] __attribute__ ((aligned (32))); + u32 PostPad __attribute__ ((aligned (32))); +} +t_TestBuf; + +typedef struct +{ + u16 (*src)[ONE_BUF_SIZE/2]; + u16 (*dest)[ONE_BUF_SIZE/2]; + char *copyStr; + char *fillStr; +} +t_CommonArg; + + +t_TestBuf testBuf __attribute__ ((aligned (32))); + +t_CommonArg copyfillArg[] = +{ + { testBuf.src, testBuf.dest, "DmaCopy success.\n", "DmaFill success on WRAM.\n", }, +}; + +t_CommonArg stopArg[] = +{ + { testBuf.src, testBuf.dest, "Stopping DmaCopy success.\n", "Stopping DmaFill success on WRAM.\n", }, +}; + +t_CommonArg copyfillAsyncArg[] = +{ + { testBuf.src, testBuf.dest, "DmaCopyAsync success.\n", "DmaFillAsync success on WRAM.\n", }, +}; + +u32 exDmaIntrCount[MI_EXDMA_CH_NUM]; + +void InitExDmaIntr(void); +void ClearIntrCount(void); +void PrintIntrCount(void); +void ExDma4Intr(void); +void ExDma5Intr(void); +void ExDma6Intr(void); +void ExDma7Intr(void); + +static BOOL CheckDmaCopy( u32 dmaNo, void *src, void *dest, const char *str ) +{ + BOOL ercd = TRUE; + u8 *s = src; + u8 *d = dest; + int i; + + for (i=0; isrc; + u16 (*dest)[ONE_BUF_SIZE/2] = arg->dest; + char *copyStr = arg->copyStr; + char *fillStr = arg->fillStr; + BOOL c_ercd = TRUE, f_ercd = TRUE; + u32 i, ii; + + for (i=0; i<4; i++) + { + for (ii=0; iisrc; + u16 (*dest)[ONE_BUF_SIZE/2] = arg->dest; + char *copyStr = arg->copyStr; + char *fillStr = arg->fillStr; + BOOL c_ercd = TRUE, f_ercd = TRUE; + u32 i, ii; + + for (i=0; i<4; i++) + { + for (ii=0; iisrc; + u16 (*dest)[ONE_BUF_SIZE/2] = arg->dest; + char *copyStr = arg->copyStr; + char *fillStr = arg->fillStr; + BOOL c_ercd = TRUE, f_ercd = TRUE; + u32 i; + + for (i=0; i<4; i++) + { + u32 ch = i + MI_EXDMA_CH_MIN; + u16 *s = src[i]; + u16 *d = dest[i]; + + MIi_ExDmaCopyAsync( ch, s, d, ONE_BUF_SIZE ); + if ( MIi_IsExDmaBusy( ch ) == FALSE ) + { + OS_TPrintf( "warning: DmaCopyAsync isn't busy dmaNo = %d.\n", ch ); + } + MIi_StopExDma( ch ); + + if ( MIi_IsExDmaBusy( ch ) == TRUE ) + { + OS_TPrintf( "error: Stopping DmaCopy failed dmaNo = %d.\n", ch ); + c_ercd = FALSE; +// break; + } + } + if ( c_ercd == TRUE ) + { + OS_TPrintf( copyStr ); + } + + for (i=0; i<4; i++) + { + u32 ch = i + MI_EXDMA_CH_MIN; + u16 *d = dest[i]; + + MIi_ExDmaFillAsync( ch, d, i, ONE_BUF_SIZE ); + if ( MIi_IsExDmaBusy( ch ) == FALSE ) + { + OS_TPrintf( "warning: DmaFillAsync isn't busy dmaNo = %d.\n", ch ); + } + MIi_StopExDma( ch ); + + if ( MIi_IsExDmaBusy( ch ) == TRUE ) + { + OS_TPrintf( "error: Stopping DmaFill failed dmaNo = %d.\n", ch ); + f_ercd = FALSE; +// break; + } + } + if ( f_ercd == TRUE ) + { + OS_TPrintf( fillStr ); + } + + return c_ercd | f_ercd; +} + +static void TestDmaFuncs( void ) +{ + u32 i; + + ClearIntrCount(); + + // sync copy and fill test + OS_TPrintf( "\nChecking DmaCopy and DmaFill ....\n" ); + for (i=0; i<1; i++) + { + (void)CheckDmaCopyAndFill( ©fillArg[i], i ); + } + + // async copy and fill test + OS_TPrintf( "\nChecking DmaCopyAsync and DmaFillAsync ....\n" ); + for (i=0; i<1; i++) + { + (void)CheckDmaCopyAndFillAsync( ©fillAsyncArg[i], i ); + } + + // stop test + OS_TPrintf( "\nChecking DmaStop ....\n" ); + for (i=0; i<1; i++) + { + (void)CheckDmaStop( &stopArg[i] ); + } + + PrintIntrCount(); +} + +//================================================================================ +/*---------------------------------------------------------------------------* + Name: TwlMain + + Description: main + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ +void TwlMain() +{ + OS_Init(); + + InitExDmaIntr(); + + OS_TPrintf("\nARM7 starts.\n"); + + // priority dma test + OS_TPrintf( "\nTurn into Priority Mode.\n" ); + + MIi_SetExDmaArbiter( MI_EXDMAGBL_ARB_PRIORITY, MI_EXDMAGBL_YLD_CYCLE_DEFAULT ); + + TestDmaFuncs(); + + // round robin dma test + OS_TPrintf( "\nTurn into Round Robin Mode.\n" ); + + MIi_SetExDmaArbiter( MI_EXDMAGBL_ARB_ROUND_ROBIN, MI_EXDMAGBL_YLD_CYCLE_DEFAULT ); + + TestDmaFuncs(); + + OS_TPrintf("\nARM7 ends.\n"); + OS_Terminate(); +} + + +/*---------------------------------------------------------------------------* + Name: InitExDmaIntr + + Description: initialize extended dma interrupt handler + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ +void InitExDmaIntr(void) +{ + (void)OS_SetIrqFunction( OS_IE_DMA4, ExDma4Intr ); + (void)OS_SetIrqFunction( OS_IE_DMA5, ExDma5Intr ); + (void)OS_SetIrqFunction( OS_IE_DMA6, ExDma6Intr ); + (void)OS_SetIrqFunction( OS_IE_DMA7, ExDma7Intr ); + (void)OS_EnableIrqMask( OS_IE_DMA4 | OS_IE_DMA5 | OS_IE_DMA6 | OS_IE_DMA7 ); + (void)OS_EnableIrq(); +} + +/*---------------------------------------------------------------------------* + Name: ClearIntrCount + + Description: clear interrupt counter + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ +void ClearIntrCount(void) +{ + int i; + + OS_ResetRequestIrqMask( OS_IE_DMA4 | OS_IE_DMA5 | OS_IE_DMA6 | OS_IE_DMA7 ); + + for (i=0; i