twl_wrapsdk/build/tests/aes/_ARM7-aes-1/src/main.c
nakasima ab4936531a move HW_PRV_WRAM_SYSRV.
add interrupt test into aes test.

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/twl_wrapsdk/trunk@54 4ee2a332-4b2b-5046-8439-1ba90f034370
2007-04-28 05:52:28 +00:00

316 lines
9.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*---------------------------------------------------------------------------*
Project: NitroSDK - AES - demos - _ARM7-aes-1
File: main.c
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: main.c,v $
$NoKeywords: $
*---------------------------------------------------------------------------*/
#include <twl.h>
#define ENABLE_INTERRUPT_TEST
#define PRIORITY 5
#define INPUT_DMA 4
#define OUTPUT_DMA 5
#define ADATA_LENGTH 320
#define PDATA_LENGTH (sizeof(gs_data) - ADATA_LENGTH)
static const u128 key = {
0x01234567,
0x89abcdef,
0x01234567,
0x89abcdef
};
static const u128 key2 = {
0x00112233,
0x44556677,
0x8899aabb,
0xccddeeff
};
static const u96 nonce = {
0x01234567,
0x89abcdef,
0x01234567
};
static const u32 gs_data[] ATTRIBUTE_ALIGN(32) = {
// ADATA
0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef,
0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef,
0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef,
0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef,
0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef,
0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef,
0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef,
0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef,
0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef,
0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef,
// PDATA
0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567,
0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567,
0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567,
0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567,
0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567,
0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567,
0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567,
0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567, 0x89abcdef, 0x01234567
};
static u32 dataA[(sizeof(gs_data) + sizeof(u128)) / sizeof(u32)] ATTRIBUTE_ALIGN(32);
static u32 dataB[(sizeof(gs_data) + sizeof(u128)) / sizeof(u32)] ATTRIBUTE_ALIGN(32);
//================================================================================
static void dump(const char *str, void *ptr, u32 length)
{
u8 *data = (u8*)ptr;
int i;
OS_TPrintf("\n[%s]:\n\t", str);
for (i = 0; i < length; i++) {
OS_TPrintf("%02X", *data++);
if ((i & 0xF) == 0xF) OS_TPrintf("\n\t");
else OS_TPrintf(" ");
}
OS_TPrintf("\n");
}
#define TEST0_USE_DMA_INPUT
//#define TEST0_USE_DMA_OUTPUT
static void test0(void)
{
OSTick begin;
OS_TPrintf("\n%s() is starting.\n\n", __func__);
// <20>Ƃ肠<C682><E882A0><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><41><EFBFBD>Z<EFBFBD>b<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD> (<28><><EFBFBD>֌W<D68C>͉<EFBFBD><CD89><EFBFBD><EFBFBD>ς<EFBFBD><CF82><EFBFBD><EFBFBD>Ȃ<EFBFBD> (KEY_SEL<45><4C><EFBFBD>W<EFBFBD>X<EFBFBD>^<5E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӗ<EFBFBD><D396>͖<EFBFBD><CD96><EFBFBD>))
AES_Reset();
// <20><><EFBFBD><EFBFBD>0<EFBFBD>Ԗڂ<D496><DA82>g<EFBFBD><67>
AES_SelectKey(0);
#ifdef TEST0_USE_DMA_INPUT
// <20><><EFBFBD><EFBFBD>DMA<4D>ݒ<EFBFBD>
AES_DmaSendAsync(INPUT_DMA, gs_data, sizeof(gs_data)); // adata + pdata
#endif
#ifdef TEST0_USE_DMA_OUTPUT
// <20>o<EFBFBD><6F>DMA<4D>ݒ<EFBFBD>
MI_CpuClear32(dataA, sizeof(dataA));
AES_DmaRecvAsync(OUTPUT_DMA, dataA, sizeof(gs_data) + sizeof(u128)); // adata + pdata + mac
#endif
begin = OS_GetTick();
// AES-CCM<43>G<EFBFBD><47><EFBFBD>R<EFBFBD>[<5B>h<EFBFBD><68><EFBFBD>J<EFBFBD>n<EFBFBD><6E><EFBFBD><EFBFBD>
AES_StartCcmEnc(&nonce, ADATA_LENGTH, PDATA_LENGTH, TRUE);
#ifdef TEST0_USE_DMA_INPUT
#ifdef TEST0_USE_DMA_OUTPUT
// DMA<4D><41><EFBFBD><EFBFBD><EFBFBD>҂<EFBFBD> (AES<45><53><EFBFBD><EFBFBD><EFBFBD>҂<EFBFBD><D282>ł<EFBFBD><C582>ǂ<EFBFBD><C782>ł<EFBFBD><C582>傤)
MIi_WaitExDma(OUTPUT_DMA);
#else
// CPU<50>ŏo<C58F>͂<EFBFBD><CD82>Ă݂<C482>
AES_CpuRecv(dataA, sizeof(gs_data) + sizeof(u128)); // adata + pdata + mac
#endif
#else
#ifdef TEST0_USE_DMA_OUTPUT
// CPU<50>œ<EFBFBD><C593>͂<EFBFBD><CD82>Ă݂<C482>
AES_CpuSend(gs_data, sizeof(gs_data)); // adata + pdata
#else
#error "Does not support CPU input and CPU output at same time."
#endif
#endif
OS_TPrintf("%s: %d usec.\n", __func__, (u32)OS_TicksToMicroSeconds(OS_GetTick()-begin));
// <20>o<EFBFBD>͌<EFBFBD><CD8C>ʂ̕\<5C><>
dump(__func__, dataA, sizeof(gs_data));
}
static void test1(void)
{
OSTick begin;
OS_TPrintf("\n%s() is starting.\n\n", __func__);
// <20>Ƃ肠<C682><E882A0><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><41><EFBFBD>Z<EFBFBD>b<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD> (<28><><EFBFBD>֌W<D68C>͉<EFBFBD><CD89><EFBFBD><EFBFBD>ς<EFBFBD><CF82><EFBFBD><EFBFBD>Ȃ<EFBFBD> (KEY_SEL<45><4C><EFBFBD>W<EFBFBD>X<EFBFBD>^<5E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӗ<EFBFBD><D396>͖<EFBFBD><CD96><EFBFBD>))
AES_Reset();
// <20><><EFBFBD><EFBFBD><EFBFBD>ݒ肵<DD92>Ȃ<EFBFBD> (<28>O<EFBFBD><4F><EFBFBD>̒l<CC92><6C><EFBFBD>g<EFBFBD><67><EFBFBD>܂킷)
// <20><><EFBFBD><EFBFBD>DMA<4D>ݒ<EFBFBD>
AES_DmaSendAsync(INPUT_DMA, dataA, sizeof(gs_data) + sizeof(u128)); // adata + pdata + mac
// <20>o<EFBFBD>̓o<CD83>b<EFBFBD>t<EFBFBD>@<40>̃N<CC83><4E><EFBFBD>A
MI_CpuClear32(dataB, sizeof(dataB));
begin = OS_GetTick();
// AES-CCM<43>f<EFBFBD>R<EFBFBD>[<5B>h<EFBFBD><68><EFBFBD>J<EFBFBD>n<EFBFBD><6E><EFBFBD><EFBFBD> (MAC<41><43>FIFO<46><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͂<EFBFBD><CD82><EFBFBD>(pdata<74><61><EFBFBD>Ɋ܂߂Ȃ<DF82><C882><EFBFBD><EFBFBD><EFBFBD>))
AES_StartCcmDec(&nonce, NULL, ADATA_LENGTH, PDATA_LENGTH, TRUE);
// CPU<50>ŏo<C58F>͂<EFBFBD><CD82>Ă݂<C482>
AES_CpuRecv(dataB, sizeof(gs_data)); // adata + pdata
OS_TPrintf("%s: %d usec.\n", __func__, (u32)OS_TicksToMicroSeconds(OS_GetTick()-begin));
// <20>o<EFBFBD>͌<EFBFBD><CD8C>ʂ̕\<5C><>
dump(__func__, dataB, sizeof(gs_data));
OS_TPrintf("Result: %s\n", AES_IsValid() ? "Success" : "Failed");
}
static void test2(void)
{
OSTick begin;
OS_TPrintf("\n%s() is starting.\n\n", __func__);
// <20>Ƃ肠<C682><E882A0><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><41><EFBFBD>Z<EFBFBD>b<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD> (<28><><EFBFBD>֌W<D68C>͉<EFBFBD><CD89><EFBFBD><EFBFBD>ς<EFBFBD><CF82><EFBFBD><EFBFBD>Ȃ<EFBFBD> (KEY_SEL<45><4C><EFBFBD>W<EFBFBD>X<EFBFBD>^<5E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӗ<EFBFBD><D396>͖<EFBFBD><CD96><EFBFBD>))
AES_Reset();
// <20><><EFBFBD><EFBFBD><EFBFBD>ݒ肷<DD92><E882B7>
AES_SelectKey(1);
// <20>o<EFBFBD><6F>DMA<4D>ݒ<EFBFBD>
MI_CpuClear32(dataB, sizeof(dataB));
AES_DmaRecvAsync(OUTPUT_DMA, dataB, sizeof(gs_data)); // adata + pdata
begin = OS_GetTick();
// AES-CCM<43>f<EFBFBD>R<EFBFBD>[<5B>h<EFBFBD><68><EFBFBD>J<EFBFBD>n<EFBFBD><6E><EFBFBD><EFBFBD> (MAC<41><43>FIFO<46><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͂<EFBFBD><CD82><EFBFBD>(pdata<74><61><EFBFBD>Ɋ܂߂Ȃ<DF82><C882><EFBFBD><EFBFBD><EFBFBD>))
AES_StartCcmDec(&nonce, NULL, ADATA_LENGTH, PDATA_LENGTH, TRUE);
// CPU<50>œ<EFBFBD><C593>͂<EFBFBD><CD82>Ă݂<C482>
AES_CpuSend(dataA, sizeof(gs_data) + sizeof(u128)); // adata + pdata + mac
OS_TPrintf("%s: %d usec.\n", __func__, (u32)OS_TicksToMicroSeconds(OS_GetTick()-begin));
// <20>o<EFBFBD>͌<EFBFBD><CD8C>ʂ̕\<5C><>
dump(__func__, dataB, sizeof(gs_data));
OS_TPrintf("Result: %s\n", AES_IsValid() ? "Success" : "Failed");
}
static u32 intrCounter[3];
static u8 aesID;
static u8 inputDmaID;
static u8 outputDmaID;
static void AesIntr(void)
{
intrCounter[aesID]++;
//---- check interrupt flag
OS_SetIrqCheckFlag( OS_IE_AES );
}
static void InputDmaIntr(void)
{
u32 ofs = INPUT_DMA - MI_EXDMA_CH_MIN;
OSIrqMask mask = OS_IE_DMA4 << ofs;
intrCounter[inputDmaID]++;
//---- check interrupt flag
OS_SetIrqCheckFlag( mask );
}
static void OutputDmaIntr(void)
{
u32 ofs = OUTPUT_DMA - MI_EXDMA_CH_MIN;
OSIrqMask mask = OS_IE_DMA4 << ofs;
intrCounter[outputDmaID]++;
//---- check interrupt flag
OS_SetIrqCheckFlag( mask );
}
static void InitAesDmaIntr(void)
{
u32 i_ofs = INPUT_DMA - MI_EXDMA_CH_MIN;
u32 o_ofs = OUTPUT_DMA - MI_EXDMA_CH_MIN;
OSIrqMask i_mask = OS_IE_DMA4 << i_ofs;
OSIrqMask o_mask = OS_IE_DMA4 << o_ofs;
u8 id_alloc = 0;
BOOL ime = OS_DisableIrq();
aesID = id_alloc++;
inputDmaID = id_alloc++;
outputDmaID = id_alloc++;
(void)OS_DisableIrqMask( OS_IE_AES | i_mask | o_mask );
(void)OS_ResetRequestIrqMask( OS_IE_AES | i_mask | o_mask );
(void)OS_SetIrqFunction( OS_IE_AES, AesIntr );
(void)OS_SetIrqFunction( i_mask, InputDmaIntr );
(void)OS_SetIrqFunction( o_mask, OutputDmaIntr );
(void)OS_EnableIrqMask( OS_IE_AES | i_mask | o_mask );
(void)OS_RestoreIrq( ime );
}
static void PrintIntrCount(void)
{
OS_TPrintf( "\ninterrupt count: aes = %d, input_dma = %d, output_dma = %d.\n",
intrCounter[aesID], intrCounter[inputDmaID], intrCounter[outputDmaID]);
}
/*---------------------------------------------------------------------------*
Name: TwlMain
Description: main
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
void TwlMain()
{
OS_Init();
OS_Printf("ARM7 starts.\n");
OS_InitTick();
#ifdef ENABLE_INTERRUPT_TEST
InitAesDmaIntr();
#endif
OS_TPrintf("Debug Info:\n");
OS_TPrintf("\tdataA = 0x%08X\n", dataA);
OS_TPrintf("\tdataB = 0x%08X\n", dataB);
AES_Init(PRIORITY); // ARM9<4D><39><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>p<EFBFBD><70><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>̂ݕK<DD95>v
AES_Lock(); // ARM9<4D><39><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>p<EFBFBD><70><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>̂ݕK<DD95>v
OS_EnableIrq(); // ARM9<4D><39><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>p<EFBFBD><70><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>̂ݕK<DD95>v
// <20><><EFBFBD><EFBFBD><EFBFBD>ݒ肵<DD92>Ă<EFBFBD><C482><EFBFBD>
AES_SetKey(0, &key);
AES_SetKey2(1, &key, &key2);
test0();
test1();
test2();
AES_Unlock(); // ARM9<4D><39><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>p<EFBFBD><70><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>̂ݕK<DD95>v
#ifdef ENABLE_INTERRUPT_TEST
PrintIntrCount();
#endif
// done
OS_TPrintf("\nARM7 ends.\n");
OS_Terminate();
}