TwlIPL/build/tests/DisplaySystemInformation/ARM7_racoon/src/main.c

993 lines
32 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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: TwlIPL - tests - DisplaySystemInformation
File: main.c
Copyright **** 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.
$Date:: $
$Rev:$
$Author:$
*---------------------------------------------------------------------------*/
#include <nitro/types.h>
#include <twl/init/crt0.h>
#include <twl/memorymap_sp.h>
#include <twl/os.h>
#include <twl/spi.h>
#include <twl/fatfs.h>
#include <nitro/pad.h>
#include <nitro/std.h>
#include <nitro/snd.h>
#include <nitro/wvr.h>
#include <twl/nwm.h>
#include <twl/camera.h>
#include <twl/rtc.h>
#include <nitro/hw/common/lcd.h>
#include <nitro/gx.h>
#include <twl/os/common/codecmode.h>
#include <twl/cdc.h>
#include <twl/snd/ARM7/sndex_api.h>
#include <twl/aes.h>
#include <twl/mcu.h>
#include "nvram_sp.h"
#include "address.h"
#ifdef SDK_SEA
#include <twl/sea.h>
#endif // ifdef SDK_SEA
/*---------------------------------------------------------------------------*
è<E28099>è`
*---------------------------------------------------------------------------*/
#define WM_WL_HEAP_SIZE 0x2100
#define ATH_DRV_HEAP_SIZE 0x5800
#define WPA_HEAP_SIZE 0x1C00
#define MEM_TYPE_WRAM 0
#define MEM_TYPE_MAIN 1
/* Priorities of each threads */
#define THREAD_PRIO_SPI 2
#define THREAD_PRIO_MCU 4 // Žbè
#define THREAD_PRIO_SND 6
#define THREAD_PRIO_FATFS 8
#define THREAD_PRIO_AES 12
#define THREAD_PRIO_SEA 12
#define THREAD_PRIO_RTC 12
#define THREAD_PRIO_SNDEX 14
#define THREAD_PRIO_FS 15
/* OS_THREAD_LAUNCHER_PRIORITY 16 */
/* [TODO] ˆÈ‰º‚Í New WM ¤ÉˆÚ<CB86>s·éÙ¤ª<E2809A>Dܵ¢? */
#define NWM_DMANO NWMSP_DMA_7
#define THREAD_PRIO_NWM_COMMMAND 9
#define THREAD_PRIO_NWM_EVENT 7
#define THREAD_PRIO_NWM_SDIO 8
#define THREAD_PRIO_NWM_WPA 10
// ROM “à“o˜^ƒGƒŠƒAÌŠg£Œ¾ŒêƒR<C692>[ƒh
#define ROMHEADER_FOR_CHINA_BIT 0x80
#define ROMHEADER_FOR_KOREA_BIT 0x40
/*---------------------------------------------------------------------------*
“à•”ŠÖ<C5A0>è`
*---------------------------------------------------------------------------*/
static void PrintDebugInfo(void);
static OSHeapHandle InitializeAllocateSystem(u8 memType);
static OSHeapHandle InitializeAllocateSystemCore(u8 memType);
#ifdef SDK_TWLHYB
static OSHeapHandle InitializeAllocateSystemCoreEx(u8 memType);
#endif
static void DummyThread(void* arg);
static void ReadUserInfo(void);
#ifdef NVRAM_CONFIG_DATA_EX_VERSION
static BOOL IsValidConfigEx(void);
static u16 GetRomValidLanguage(void);
static s32 CheckCorrectNCDEx(NVRAMConfigEx * ncdsp);
#else
static s32 CheckCorrectNCD(NVRAMConfig *ncdsp);
#endif
static void VBlankIntr(void);
static void InitializeFatfs(void);
static void InitializeNwm(OSHeapHandle drvHeapHandle, OSHeapHandle wpaHeapHandle);
/*---------------------------------------------------------------------------*
ŠO•”ƒVƒ“ƒ{ƒŽQ<C5BD>Æ
*---------------------------------------------------------------------------*/
#ifdef SDK_TWLHYB
extern void SDK_LTDAUTOLOAD_LTDWRAM_BSS_END(void);
extern void SDK_LTDAUTOLOAD_LTDMAIN_BSS_END(void);
#endif
/*---------------------------------------------------------------------------*
Name: TwlSpMain
Description: N“®ƒxƒNƒ^<5E>B
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
void TwlSpMain(void)
{
OSHeapHandle wramHeapHandle, mainHeapHandle;
// OS<4F>‰Šú‰»ÅARM9Æ“¯Šú·éOÉSCFGÌ<E2809A>î•ñð¤—Lƒ<4C>ƒƒŠÉ<E2809A>«<E2809A>o·
// ƒŒƒWƒXƒ^<5E>î•ñðƒRƒs<C692>[
MI_CpuMove16( (void*)REG_ROM_ADDR, DISPINFO_SHARED_SCFG_REG_ADDR, DISPINFO_SHARED_SCFG_REG_SIZE );
// WRAMÉÞ”ð³êÄ镪àƒRƒs<C692>[
MI_CpuMove16( (void*)HWi_WSYS04_ADDR, DISPINFO_SHARED_SCFG_WRAM_ADDR, DISPINFO_SHARED_SCFG_WRAM_SIZE );
// OS <20>‰Šú‰»
OS_Init();
PrintDebugInfo();
// NVRAM ©çƒ†<C692>[ƒU<C692>[<5B>î•ñ“ÇÝ<E2809A>oµ
ReadUserInfo();
// ƒq<C692>[ƒv—̈æ<CB86>Ýè
wramHeapHandle = InitializeAllocateSystem(MEM_TYPE_WRAM);
mainHeapHandle = InitializeAllocateSystem(MEM_TYPE_MAIN);
// ƒ{ƒ^ƒ““ü—̓T<C692>[ƒ`<60>‰Šú‰»
(void)PAD_InitXYButton();
// Š„è<E2809A>žÝ‰Â
(void)OS_SetIrqFunction(OS_IE_V_BLANK, VBlankIntr);
(void)OS_EnableIrqMask(OS_IE_V_BLANK);
(void)GX_VBlankIntr(TRUE);
(void)OS_EnableIrq();
(void)OS_EnableInterrupts();
// ƒtƒ@ƒCƒƒVƒXƒeƒ€<C692>‰Šú‰»
FS_Init(FS_DMA_NOT_USE);
FS_CreateReadServerThread(THREAD_PRIO_FS);
if (OS_IsRunOnTwl() == TRUE)
{
InitializeFatfs(); // FATFS <20>‰Šú‰»
#ifndef SDK_SEA // <20>IŽbè<E28099>ˆu<E28099>I
// NWM <20>‰Šú‰»
#ifdef SDK_TWLLTD
InitializeNwm(mainHeapHandle, mainHeapHandle); // LIMITED ƒ<C692>[ƒhÅÍ ³<E28093>ü̃q<C692>[ƒvð MAIN ©çŠm•Û
#else
InitializeNwm(wramHeapHandle, mainHeapHandle); // HYBRID ƒ<C692>[ƒhÅÍ ³<E28093>ü̃q<C692>[ƒvð WRAM ©çŠm•Û
#endif
#endif // ifndef SDK_SEA
AES_Init(THREAD_PRIO_AES); // AES <20>‰Šú‰»
#ifdef SDK_SEA
SEA_Init(THREAD_PRIO_SEA);
#endif // ifdef SDK_SEA
MCU_InitIrq(THREAD_PRIO_MCU); // MCU <20>‰Šú‰»
CDC_InitLib(); // CODECƒ‰ƒCƒuƒ‰ƒŠ<C692>‰Šú‰»
}
if (OSi_IsCodecTwlMode() == TRUE)
{
// ƒJƒ<4A>ƒ‰<C692>‰Šú‰»
CAMERA_Init();
/* CODEC ‚ª TWL ƒ<C692>[ƒhÅȢƃVƒƒƒbƒ^<5E>[‰¹ð­<E280B9>§“IÉÂç·
@”\ªŽg—pūܹñ<E2809A>B±Ìˆ×<CB86>ACODEC ‚ª TWL ƒ<C692>[ƒhÌ<E2809A>ê<EFBFBD>
ÉÌ݃Jƒ<4A>ƒ‰ƒ‰ƒCƒuƒ‰ƒŠðŽg—p‰Â”\È<E2809A>óÔɵܷ<E2809A>B */
}
// ƒTƒEƒ“ƒh<C692>‰Šú‰»
SND_Init(THREAD_PRIO_SND);
if (OS_IsRunOnTwl() == TRUE)
{
SNDEX_Init(THREAD_PRIO_SNDEX);
}
// RTC <20>‰Šú‰»
RTC_Init(THREAD_PRIO_RTC);
// Œ³<E28093>ü<EFBFBD>‰Šú‰»
#ifndef SDK_SEA // <20>IŽbè<E28099>ˆu<E28099>I
WVR_Begin(wramHeapHandle);
#endif // ifdef SDK_SEA
// SPI <20>‰Šú‰»
SPI_Init(THREAD_PRIO_SPI);
while (TRUE)
{
OS_Halt();
//---- check reset
if (OS_IsResetOccurred())
{
//VIB_STOP
CTRDG_VibPulseEdgeUpdate(NULL);
OS_ResetSystem();
}
//---- check pull out cartridge
CTRDG_CheckPullOut_Polling();
#ifndef SDK_SMALL_BUILD
//---- check pull out card
CARD_CheckPullOut_Polling();
#endif
}
}
/*---------------------------------------------------------------------------*
Name: PrintDebugInfo
Description: ARM7 ƒRƒ“ƒ|<7C>[ƒlƒ“ƒgÌ<E2809A>î•ñðƒfƒoƒbƒO<C692>o—Í·é<E2809A>B
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
static void
PrintDebugInfo(void)
{
if(OS_IsRunOnTwl())
{
OS_TPrintf("ARM7: This component is running on TWL.\n");
}
else
{
OS_TPrintf("ARM7: This component is running on NITRO.\n");
}
#ifdef SDK_SEA
#ifdef SDK_TWLLTD
OS_TPrintf("ARM7: This component is \"armadillo.TWL\"\n");
#else /* ifdef SDK_TWLLTD */
#error invalid parameter combination
#endif /* ifdef SDK_TWLLTD else */
#else /* ifdef SDK_SEA */
#ifdef SDK_TWLLTD
OS_TPrintf("ARM7: This component is \"racoon.TWL\"\n");
#else /* ifdef SDK_TWLLTD */
#ifdef SDK_WIRELESS_IN_VRAM
OS_TPrintf("ARM7: This component is \"ichneumon.TWL\"\n");
#else /* ifdef SDK_WIRELESS_IN_VRAM */
OS_TPrintf("ARM7: This component is \"mongoose.TWL\"\n");
#endif /* ifdef SDK_WIRELESS_IN_VRAM else */
#endif /* ifdef SDK_TWLLTD else */
#endif /* ifdef SDK_SEA else */
}
#include <twl/ltdwram_begin.h>
/*---------------------------------------------------------------------------*
Name: InitializeFatfs
Description: FATFSƒ‰ƒCƒuƒ‰ƒŠð<E2809A>‰Šú‰»·é<E2809A>BFATFS<46>‰Šú‰»ŠÖ<C5A0>”“àŃXƒŒƒbƒhxŽ~
·éˆ×<CB86>AxŽ~†“®<E2809C>ì·éƒ_ƒ~<7E>[̃XƒŒƒbƒhð—§Äé<E2809A>B
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
static void
InitializeFatfs(void)
{
OSThread thread;
u32 stack[18];
// ƒ_ƒ~<7E>[ƒXƒŒƒbƒh<C692>ì<EFBFBD>¬
OS_CreateThread(&thread, DummyThread, NULL,
(void*)((u32)stack + (sizeof(u32) * 18)), sizeof(u32) * 18, OS_THREAD_PRIORITY_MAX);
OS_WakeupThreadDirect(&thread);
// FATFSƒ‰ƒCƒuƒ‰ƒŠÌ<E2809A>‰Šú‰»
if(!FATFS_Init( FATFS_DMA_4, FATFS_DMA_5, THREAD_PRIO_FATFS))
{
// do nothing
}
// ƒ_ƒ~<7E>[ƒXƒŒƒbƒh”jŠü
OS_KillThread(&thread, NULL);
}
#include <twl/ltdwram_end.h>
#include <twl/ltdwram_begin.h>
/*---------------------------------------------------------------------------*
Name: InitializeNwm
Description: NWMƒ‰ƒCƒuƒ‰ƒŠð<E2809A>‰Šú‰»·é<E2809A>B
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
static void
InitializeNwm(OSHeapHandle drvHeapHandle, OSHeapHandle wpaHeapHandle)
{
NwmspInit nwmInit;
nwmInit.dmaNo = NWM_DMANO;
nwmInit.cmdPrio = THREAD_PRIO_NWM_COMMMAND;
nwmInit.evtPrio = THREAD_PRIO_NWM_EVENT;
nwmInit.sdioPrio = THREAD_PRIO_NWM_SDIO;
#ifdef SDK_TWLLTD
nwmInit.drvHeap.id = OS_ARENA_MAIN_SUBPRIV; /* [TODO] */
#else
nwmInit.drvHeap.id = OS_ARENA_WRAM_SUBPRIV; /* [TODO] */
#endif
nwmInit.drvHeap.handle = drvHeapHandle;
nwmInit.wpaPrio = THREAD_PRIO_NWM_WPA;
nwmInit.wpaHeap.id = OS_ARENA_MAIN_SUBPRIV; /* [TODO] */
nwmInit.wpaHeap.handle = wpaHeapHandle;
NWMSP_Init(&nwmInit);
}
#include <twl/ltdwram_end.h>
#include <twl/ltdwram_begin.h>
/*---------------------------------------------------------------------------*
Name: DummyThread
Description: FATFSƒ‰ƒCƒuƒ‰ƒŠ<C692>ACDCƒ‰ƒCƒuƒ‰ƒŠð<E2809A>‰Šú‰»·é<E2809A>ÛÉ—§Äéƒ_ƒ~<7E>[‚Ì
ƒXƒŒƒbƒh<C692>B
Arguments: arg - Žg—pµÈ¢<E2809A>B
Returns: None.
*---------------------------------------------------------------------------*/
static void
DummyThread(void* arg)
{
#pragma unused(arg)
while (TRUE)
{
}
}
#include <twl/ltdwram_end.h>
/*---------------------------------------------------------------------------*
Name: InitializeAllocateSystem
Description: ƒ<>ƒƒŠŠ„“ăVƒXƒeƒ€ð<E2809A>‰Šú‰»·é<E2809A>B
Arguments: None.
Returns: OSHeapHandle - WRAM ƒAƒŠ<C692>[ƒi<C692>ãÉŠm•۳꽃q<C692>[ƒṽnƒ“ƒhƒð•Ô·<E2809A>B
*---------------------------------------------------------------------------*/
static OSHeapHandle InitializeAllocateSystem(u8 memType)
{
OSHeapHandle hh;
#ifdef SDK_TWLHYB
if( OS_IsRunOnTwl() == TRUE)
{
hh = InitializeAllocateSystemCoreEx(memType); /* Hybrid ‚ð TWL Å“®<E2809C>ì³¹é */
}
else
#endif
{
hh = InitializeAllocateSystemCore(memType); /* Hybrid ‚ð DS Å“®<E2809C>ì³¹é or Limited */
}
return hh;
}
/*---------------------------------------------------------------------------*
Name: InitializeAllocateSystemCore
Description: ƒ<>ƒƒŠŠ„“ăVƒXƒeƒ€ð<E2809A>‰Šú‰»·é<E2809A>B
Hybrid ‚ð DS Å“®<E2809C>ì³¹½<E2809A>ê<EFBFBD><EFBFBD>ALimited ‚ð TWL Å“®<E2809C>ì³¹½<E2809A>ê<EFBFBD>É“®<E2809C>ì
Arguments: None.
Returns: OSHeapHandle - WRAM ƒAƒŠ<C692>[ƒi<C692>ãÉŠm•۳꽃q<C692>[ƒṽnƒ“ƒhƒð•Ô·<E2809A>B
*---------------------------------------------------------------------------*/
static OSHeapHandle InitializeAllocateSystemCore(u8 memType)
{
OSHeapHandle hh;
/* MAIN */
if(memType == MEM_TYPE_MAIN)
{
{
void* lo = (void*)OS_GetSubPrivArenaLo();
void* hi = (void*)OS_GetSubPrivArenaHi();
// ƒAƒŠ<C692>[ƒið 0 ƒNƒŠƒA
MI_CpuClear8(lo, (u32)hi - (u32)lo);
// ƒ<>ƒƒŠŠ„è“Ä<E2809A>‰Šú‰»
lo = OS_InitAlloc(OS_ARENA_MAIN_SUBPRIV, lo, hi, 1);
// ƒAƒŠ<C692>[ƒi‰ºˆÊƒAƒhƒŒƒXð<E2809A>Ýè
OS_SetArenaLo(OS_ARENA_MAIN_SUBPRIV, lo);
// ƒq<C692>[ƒv<C692>ì<EFBFBD>¬
hh = OS_CreateHeap(OS_ARENA_MAIN_SUBPRIV, lo, hi);
if (hh < 0)
{
OS_Panic("ARM7: Failed to MAIN create heap.\n");
}
}
// ƒJƒŒƒ“ƒgƒq<C692>[ƒvÉ<E2809A>Ýè
(void)OS_SetCurrentHeap(OS_ARENA_MAIN_SUBPRIV, hh);
// ƒq<C692>[ƒvƒTƒCƒYÌŠm”F
{
u32 heapSize;
heapSize = (u32)OS_CheckHeap(OS_ARENA_MAIN_SUBPRIV, hh);
if( heapSize <= 0) /* ƒq<C692>[ƒv—̈æÌŠm•ÛÉŽ¸”s */
{
OS_Panic("ARM7: Failed to MAIN create heap.\n");
}
#ifdef SDK_TWLLTD
{
if ((ATH_DRV_HEAP_SIZE + WPA_HEAP_SIZE) > heapSize)
{
OS_Panic("Insufficient heap size. (0x%x < 0x%x)\n", heapSize, ATH_DRV_HEAP_SIZE + WPA_HEAP_SIZE);
}
}
#endif
OS_TPrintf("ARM7: MAIN heap size is %d\n", heapSize);
}
}
/* WRAM */
if( memType == MEM_TYPE_WRAM)
{
{
void* lo = (void*)OS_GetWramSubPrivArenaLo();
void* hi = (void*)OS_GetWramSubPrivArenaHi();
// ƒAƒŠ<C692>[ƒið 0 ƒNƒŠƒA
MI_CpuClear8(lo, (u32)hi - (u32)lo);
// ƒ<>ƒƒŠŠ„è“Ä<E2809A>‰Šú‰»
lo = OS_InitAlloc(OS_ARENA_WRAM_SUBPRIV, lo, hi, 1);
// ƒAƒŠ<C692>[ƒi‰ºˆÊƒAƒhƒŒƒXð<E2809A>Ýè
OS_SetArenaLo(OS_ARENA_WRAM_SUBPRIV, lo);
// ƒq<C692>[ƒv<C692>ì<EFBFBD>¬
hh = OS_CreateHeap(OS_ARENA_WRAM_SUBPRIV, lo, hi);
if (hh < 0)
{
OS_Panic("ARM7: Failed to WRAM create heap.\n");
}
}
// ƒJƒŒƒ“ƒgƒq<C692>[ƒvÉ<E2809A>Ýè
(void)OS_SetCurrentHeap(OS_ARENA_WRAM_SUBPRIV, hh);
// ƒq<C692>[ƒvƒTƒCƒYÌŠm”F
{
u32 heapSize;
heapSize = (u32)OS_CheckHeap(OS_ARENA_WRAM_SUBPRIV, hh);
if( heapSize <= 0) /* ƒq<C692>[ƒv—̈æÌŠm•ÛÉŽ¸”s */
{
OS_Panic("ARM7: Failed to MAIN create heap.\n");
}
if (WM_WL_HEAP_SIZE > heapSize)
{
OS_Panic("Insufficient heap size. (0x%x < 0x%x)\n", heapSize, WM_WL_HEAP_SIZE);
}
OS_TPrintf("ARM7: WRAM heap size is %d\n", heapSize);
}
}
return hh;
}
#ifdef SDK_TWLHYB
#include <twl/ltdwram_begin.h>
/*---------------------------------------------------------------------------*
Name: InitializeAllocateSystemCoreEx
Description: ƒ<>ƒƒŠŠ„“ăVƒXƒeƒ€ð<E2809A>‰Šú‰»·é<E2809A>B
Hybrid ‚ð TWL Å“®<E2809C>ì³¹½<E2809A>ê<EFBFBD>É“®<E2809C>ì
Arguments: None.
Returns: OSHeapHandle - WRAM ƒAƒŠ<C692>[ƒi<C692>ãÉŠm•۳꽃q<C692>[ƒṽnƒ“ƒhƒð•Ô·<E2809A>B
*---------------------------------------------------------------------------*/
static OSHeapHandle InitializeAllocateSystemCoreEx(u8 memType)
{
OSHeapHandle hh;
if(memType == MEM_TYPE_MAIN)
{
{
void* basicLo = (void*)OS_GetSubPrivArenaLo();
void* basicHi = (void*)OS_GetSubPrivArenaHi();
void* extraLo = (void*)MATH_ROUNDUP((u32)SDK_LTDAUTOLOAD_LTDMAIN_BSS_END, 32);
void* extraHi = (void*)MATH_ROUNDDOWN(HW_MAIN_MEM_SUB, 32);
#if SDK_DEBUG
// debug information
OS_TPrintf("ARM7: MAIN arena basicLo = %p\n", basicLo);
OS_TPrintf("ARM7: MAIN arena basicHi = %p\n", basicHi);
OS_TPrintf("ARM7: MAIN arena extraLo = %p\n", extraLo);
OS_TPrintf("ARM7: MAIN arena extraHi = %p\n", extraHi);
#endif
// ƒAƒŠ<C692>[ƒið 0 ƒNƒŠƒA
MI_CpuClear8(basicLo, (u32)basicHi - (u32)basicLo);
MI_CpuClear8(extraLo, (u32)extraHi - (u32)extraLo);
// ƒ<>ƒƒŠŠ„è“Ä<E2809A>‰Šú‰»
if ((u32)basicLo < (u32)extraLo)
{
basicLo = OS_InitAlloc(OS_ARENA_MAIN_SUBPRIV, basicLo, extraHi, 1);
// ƒAƒŠ<C692>[ƒi‰ºˆÊƒAƒhƒŒƒXð<E2809A>Ýè
OS_SetArenaLo(OS_ARENA_MAIN_SUBPRIV, basicLo);
}
else
{
extraLo = OS_InitAlloc(OS_ARENA_MAIN_SUBPRIV, extraLo, basicHi, 1);
}
// ƒq<C692>[ƒv<C692>ì<EFBFBD>¬
hh = OS_CreateHeap(OS_ARENA_MAIN_SUBPRIV, basicLo, basicHi);
if (hh < 0)
{
OS_Panic("ARM7: Failed to create MAIN heap.\n");
}
// ƒq<C692>[ƒvƒTƒCƒYÌŠm”F
{
u32 heapSize;
heapSize = (u32)OS_CheckHeap(OS_ARENA_MAIN_SUBPRIV, hh);
if( heapSize <= 0) /* ƒq<C692>[ƒv—̈æÌŠm•ÛÉŽ¸”s */
{
OS_Panic("ARM7: Failed to MAIN create heap.\n");
}
OS_TPrintf("ARM7: MAIN heap size is %d (before AddToHead)\n", heapSize);
}
// ƒq<C692>[ƒvÉŠg£ƒuƒ<75>ƒbƒNðljÁ
OS_AddToHeap(OS_ARENA_MAIN_SUBPRIV, hh, extraLo, extraHi);
}
// ƒJƒŒƒ“ƒgƒq<C692>[ƒvÉ<E2809A>Ýè
(void)OS_SetCurrentHeap(OS_ARENA_MAIN_SUBPRIV, hh);
// ƒq<C692>[ƒvƒTƒCƒYÌŠm”F
{
u32 heapSize;
heapSize = (u32)OS_CheckHeap(OS_ARENA_MAIN_SUBPRIV, hh);
if( heapSize <= 0) /* ƒq<C692>[ƒv—̈æÌŠm•ÛÉŽ¸”s */
{
OS_Panic("ARM7: Failed to MAIN create heap.\n");
}
if ((WPA_HEAP_SIZE) > heapSize)
{
OS_Panic("Insufficient heap size. (0x%x < 0x%x)\n", heapSize, WPA_HEAP_SIZE);
}
OS_TPrintf("ARM7: MAIN heap size is %d\n", heapSize);
}
}
if(memType == MEM_TYPE_WRAM)
{
{
void* basicLo = (void*)OS_GetWramSubPrivArenaLo();
void* basicHi = (void*)OS_GetWramSubPrivArenaHi();
void* extraLo = (void*)MATH_ROUNDUP((u32)SDK_LTDAUTOLOAD_LTDWRAM_BSS_END, 32);
void* extraHi = (void*)MATH_ROUNDDOWN(HW_WRAM_A_HYB_END, 32);
#if SDK_DEBUG
// debug information
OS_TPrintf("ARM7: WRAM arena basicLo = %p\n", basicLo);
OS_TPrintf("ARM7: WRAM arena basicHi = %p\n", basicHi);
OS_TPrintf("ARM7: WRAM arena extraLo = %p\n", extraLo);
OS_TPrintf("ARM7: WRAM arena extraHi = %p\n", extraHi);
#endif
// ƒAƒŠ<C692>[ƒið 0 ƒNƒŠƒA
MI_CpuClear8(basicLo, (u32)basicHi - (u32)basicLo);
MI_CpuClear8(extraLo, (u32)extraHi - (u32)extraLo);
// ƒ<>ƒƒŠŠ„è“Ä<E2809A>‰Šú‰»
if ((u32)basicLo < (u32)extraLo)
{
basicLo = OS_InitAlloc(OS_ARENA_WRAM_SUBPRIV, basicLo, extraHi, 1);
// ƒAƒŠ<C692>[ƒi‰ºˆÊƒAƒhƒŒƒXð<E2809A>Ýè
OS_SetArenaLo(OS_ARENA_WRAM_SUBPRIV, basicLo);
}
else
{
extraLo = OS_InitAlloc(OS_ARENA_WRAM_SUBPRIV, extraLo, basicHi, 1);
}
// ƒq<C692>[ƒv<C692>ì<EFBFBD>¬
hh = OS_CreateHeap(OS_ARENA_WRAM_SUBPRIV, basicLo, basicHi);
if (hh < 0)
{
OS_Panic("ARM7: Failed to WRAM create heap.\n");
}
// ƒq<C692>[ƒvƒTƒCƒYÌŠm”F
{
u32 heapSize;
heapSize = (u32)OS_CheckHeap(OS_ARENA_WRAM_SUBPRIV, hh);
if( heapSize <= 0) /* ƒq<C692>[ƒv—̈æÌŠm•ÛÉŽ¸”s */
{
OS_Panic("ARM7: Failed to WRAM create heap.\n");
}
if (WM_WL_HEAP_SIZE > heapSize)
{
OS_Panic("Insufficient heap size. (0x%x < 0x%x)\n", heapSize, WM_WL_HEAP_SIZE);
}
OS_TPrintf("ARM7: WRAM heap size is %d (before AddToHeap)\n", heapSize);
}
// ƒq<C692>[ƒvÉŠg£ƒuƒ<75>ƒbƒNðljÁ
OS_AddToHeap(OS_ARENA_WRAM_SUBPRIV, hh, extraLo, extraHi);
}
// ƒJƒŒƒ“ƒgƒq<C692>[ƒvÉ<E2809A>Ýè
(void)OS_SetCurrentHeap(OS_ARENA_WRAM_SUBPRIV, hh);
// ƒq<C692>[ƒvƒTƒCƒYÌŠm”F
{
u32 heapSize;
heapSize = (u32)OS_CheckHeap(OS_ARENA_WRAM_SUBPRIV, hh);
if( heapSize <= 0) /* ƒq<C692>[ƒv—̈æÌŠm•ÛÉŽ¸”s */
{
OS_Panic("ARM7: Failed to WRAM create heap.\n");
}
if (ATH_DRV_HEAP_SIZE + WM_WL_HEAP_SIZE > heapSize)
{
OS_Panic("Insufficient heap size. (0x%x < 0x%x)\n", heapSize, WM_WL_HEAP_SIZE + ATH_DRV_HEAP_SIZE );
}
OS_TPrintf("ARM7: WRAM heap size is %d\n", heapSize);
}
}
return hh;
}
#include <twl/ltdwram_end.h>
#endif
#ifdef WM_PRECALC_ALLOWEDCHANNEL
extern u16 WMSP_GetAllowedChannel(u16 bitField);
#endif
/*---------------------------------------------------------------------------*
Name: ReadUserInfo
Description: NVRAM©çƒ†<C692>[ƒU<C692>[<5B>î•ñð“ÇÝ<E2809A>oµ<E2809A>A¤—L—̈æÉ“WŠJ·é<E2809A>B
ƒ~ƒ‰<C692>[ƒŠƒ“ƒO³êÄ¢éƒoƒbƒtƒ@ª—¼•û‰óêÄ¢é<E2809A>ê<EFBFBD>Í<E2809A>A
¤—L—̈æÌƒ†<C692>[ƒU<C692>[<5B>î•ñŠi”[<5B>ê<EFBFBD>ŠðƒNƒŠƒA·é<E2809A>B
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
static void ReadUserInfo(void)
{
s32 offset;
#ifdef NVRAM_CONFIG_DATA_EX_VERSION
NVRAMConfigEx temp[2];
#else
NVRAMConfig temp[2];
#endif
s32 check;
u8 *p = OS_GetSystemWork()->nvramUserInfo;
// ƒIƒtƒZƒbƒg“ÇÝ<E2809A>oµ
#ifdef NVRAM_CONFIG_CONST_ADDRESS
offset = NVRAM_CONFIG_DATA_ADDRESS_DUMMY;
#else
NVRAM_ReadDataBytes(NVRAM_CONFIG_DATA_OFFSET_ADDRESS, NVRAM_CONFIG_DATA_OFFSET_SIZE,
(u8 *)(&offset));
offset <<= NVRAM_CONFIG_DATA_OFFSET_SHIFT;
#endif
#ifdef NVRAM_CONFIG_DATA_EX_VERSION
// ƒ~ƒ‰<C692>[³ê½QẪf<C692>[ƒ^ð“ÇÝ<E2809A>oµ
NVRAM_ReadDataBytes((u32)offset, sizeof(NVRAMConfigEx), (u8 *)(&temp[0]));
NVRAM_ReadDataBytes((u32)(offset + SPI_NVRAM_PAGE_SIZE), sizeof(NVRAMConfigEx),
(u8 *)(&temp[1]));
// QÂÌ“àÇ¿çðŽg¤©”»f
check = CheckCorrectNCDEx(temp);
#else
// ƒ~ƒ‰<C692>[³ê½QẪf<C692>[ƒ^ð“ÇÝ<E2809A>oµ
NVRAM_ReadDataBytes((u32)offset, sizeof(NVRAMConfig), (u8 *)(&temp[0]));
NVRAM_ReadDataBytes((u32)(offset + SPI_NVRAM_PAGE_SIZE), sizeof(NVRAMConfig), (u8 *)(&temp[1]));
// QÂÌ“àÇ¿çðŽg¤©”»f
check = CheckCorrectNCD(temp);
#endif
if (check >= 3)
{
// ƒAƒvƒŠƒP<C692>[ƒVƒ‡ƒ“ÌN“®ð—}<7D>§
MI_CpuFill32(p, 0xffffffff, sizeof(NVRAMConfig));
}
else if (check)
{
s32 i;
// ƒjƒbƒNƒl<C692>[ƒ€ð•â<E280A2>³
if (temp[check - 1].ncd.owner.nickname.length < NVRAM_CONFIG_NICKNAME_LENGTH)
{
for (i = NVRAM_CONFIG_NICKNAME_LENGTH;
i > temp[check - 1].ncd.owner.nickname.length; i--)
{
temp[check - 1].ncd.owner.nickname.str[i - 1] = 0x0000;
}
}
// ƒRƒ<52>ƒ“ƒgð•â<E280A2>³
if (temp[check - 1].ncd.owner.comment.length < NVRAM_CONFIG_COMMENT_LENGTH)
{
for (i = NVRAM_CONFIG_COMMENT_LENGTH; i > temp[check - 1].ncd.owner.comment.length;
i--)
{
temp[check - 1].ncd.owner.comment.str[i - 1] = 0x0000;
}
}
// ¤—L—̈æÉƒXƒgƒA
MI_CpuCopy32(&temp[check - 1], p, sizeof(NVRAMConfig));
}
else
{
// ¤—L—̈æðƒNƒŠƒA
MI_CpuClear32(p, sizeof(NVRAMConfig));
}
// ³<E28093>üMACƒAƒhƒŒƒXðƒ†<C692>[ƒU<C692>[<5B>î•ñÌŒãëÉ“WŠJ
{
u8 wMac[6];
// NVRAM©çMACƒAƒhƒŒƒXð“ÇÝ<E2809A>oµ
NVRAM_ReadDataBytes(NVRAM_CONFIG_MACADDRESS_ADDRESS, 6, wMac);
// “WŠJ<C5A0>æƒAƒhƒŒƒXðŒvŽZ
p = (u8 *)((u32)p + ((sizeof(NVRAMConfig) + 3) & ~0x00000003));
// ¤—L—̈æÉ“WŠJ
MI_CpuCopy8(wMac, p, 6);
}
#ifdef WM_PRECALC_ALLOWEDCHANNEL
// Žg—p‰Â”\ƒ`ƒƒƒ“ƒlƒ©çŽg—p‰Âƒ`ƒƒƒ“ƒlƒðŒvŽZ
{
u16 enableChannel;
u16 allowedChannel;
// Žg—p‰Â”\ƒ`ƒƒƒ“ƒlƒð“ÇÝ<E2809A>oµ
NVRAM_ReadDataBytes(NVRAM_CONFIG_ENABLECHANNEL_ADDRESS, 2, (u8 *)(&enableChannel));
// Žg—p‰Âƒ`ƒƒƒ“ƒlƒðŒvŽZ
allowedChannel = WMSP_GetAllowedChannel((u16)(enableChannel >> 1));
// “WŠJ<C5A0>æƒAƒhƒŒƒXðŒvŽZ(MACƒAƒhƒŒƒXÌŒãëÌ2ƒoƒCƒg)
p = (u8 *)((u32)p + 6);
// ¤—L—̈æÉ“WŠJ
*((u16 *)p) = allowedChannel;
}
#endif
}
#ifdef NVRAM_CONFIG_DATA_EX_VERSION
/*---------------------------------------------------------------------------*
Name: IsValidConfigEx
Description: ƒ†<C692>[ƒU<C692>[<5B>î•ñªŠg£ƒRƒ“ƒtƒBƒOÉΉžµÄ¢é©Ç¤©ð²<E28099>¸·é<E2809A>B
Arguments: None.
Returns: BOOL - Šg£ƒ†<C692>[ƒU<C692>[<5B>î•ñª—LŒøÈ<E2809A>ê<EFBFBD>ÉTRUEð•Ô·<E2809A>B
³ŒøÅ é<E2809A>ê<EFBFBD>ÍFALSEð•Ô·<E2809A>B
*---------------------------------------------------------------------------*/
static BOOL IsValidConfigEx(void)
{
u8 ipl2_type;
NVRAM_ReadDataBytes(NVRAM_CONFIG_IPL2_TYPE_ADDRESS, NVRAM_CONFIG_IPL2_TYPE_SIZE, &ipl2_type);
if (ipl2_type == NVRAM_CONFIG_IPL2_TYPE_NORMAL)
{
return FALSE;
}
if (ipl2_type & NVRAM_CONFIG_IPL2_TYPE_EX_MASK)
{
return TRUE;
}
return FALSE;
}
/*---------------------------------------------------------------------------*
Name: GetRomValidLanguage
Description: ROM“à“o˜^ƒGƒŠƒAÌ<E2809A>î•ñ©ç<E2809A>AŠg£Œ¾ŒêƒR<C692>[ƒhÌΉžŒ¾Œêƒrƒbƒgƒ}ƒbƒv
ÉŠÖ·é<E2809A>î•ñðŠ<E28099>o·é<E2809A>B
Arguments: None.
Returns: u16 - DSƒJ<C692>[ƒh<C692>Aàµ­Í ƒ}ƒ‹ƒ`ƒu<C692>[ƒgƒoƒCƒiƒŠªÎ‰žµÄ¢é
Œ¾ŒêƒR<C692>[ƒh̃rƒbƒgƒ}ƒbƒvð•Ô·<E2809A>BDSƒJ<C692>[ƒhªŠg£Œ¾Œê
ƒR<C692>[ƒhÉΉžµÄ¢È¢<E2809A>ê<EFBFBD>Í 0 ð•Ô·<E2809A>B
*---------------------------------------------------------------------------*/
static u16 GetRomValidLanguage(void)
{
u16 ret = 0x0000;
u8 langBit = OS_GetSystemWork()->rom_header[0x1d];
// ROM“à“o˜^ƒGƒŠƒAÌŠg£Œ¾ŒêƒR<C692>[ƒhðŠm”F
if (langBit == ROMHEADER_FOR_CHINA_BIT)
{
// for CHINA
ret |= (0x0001 << NVRAM_CONFIG_LANG_CHINESE);
}
else if (langBit == ROMHEADER_FOR_KOREA_BIT)
{
// for KOREA
ret |= (0x0001 << NVRAM_CONFIG_LANG_HANGUL);
}
return ret;
}
/*---------------------------------------------------------------------------*
Name: CheckCorrectNCDEx
Description: ƒ~ƒ‰<C692>[ƒŠƒ“ƒO³êĢ郆<C692>[ƒU<C692>[<5B>î•ñÌÇ¿çðŽg¤×«©”»è·é<E2809A>B
Arguments: nvdsp - ”äŠr·éƒRƒ“ƒtƒBƒOƒf<C692>[ƒ^QÂÌ”z—ñ<E28094>B
Returns: s32 - 0: —¼•û•s“K<E2809C>Ø<EFBFBD>B
1: ”z—ñ[ 0 ]ª“K<E2809C>Ø<EFBFBD>B
2: ”z—ñ[ 1 ]ª“K<E2809C>Ø<EFBFBD>B
3: ƒAƒvƒŠÌN“®ð—}<7D>§·×«<E2809A>B
*---------------------------------------------------------------------------*/
static s32 CheckCorrectNCDEx(NVRAMConfigEx * ncdsp)
{
u16 i;
u16 calc_crc;
s32 crc_flag = 0;
u16 saveCount;
// IPLªŠg£Œ¾ŒêƒR<C692>[ƒhÉΉžµÄ¢é©
if (IsValidConfigEx())
{
// IPLªŠg£Œ¾ŒêƒR<C692>[ƒhÉΉžµÄ¢é<E2809A>ê<EFBFBD>
u16 rom_valid_language = GetRomValidLanguage();
for (i = 0; i < 2; i++)
{
calc_crc = SVC_GetCRC16(0xffff, (void *)(&ncdsp[i].ncd), sizeof(NVRAMConfigData));
if ((ncdsp[i].crc16 == calc_crc) && (ncdsp[i].saveCount < NVRAM_CONFIG_SAVE_COUNT_MAX))
{
// CRC ª<E2809A>³µ­ saveCount lª 0x80 ¢žÌƒf<C692>[ƒ^ð<E2809A>³“Æ”»f
calc_crc =
SVC_GetCRC16(0xffff, (void *)(&ncdsp[i].ncd_ex), sizeof(NVRAMConfigDataEx));
if ((ncdsp[i].crc16_ex == calc_crc)
&& ((0x0001 << ncdsp[i].ncd_ex.language) &
(ncdsp[i].ncd_ex.valid_language_bitmap)))
{
// Šg£ƒf<C692>[ƒ^—p CRC ª<E2809A>³µ­<E2809A>A<EFBFBD>Ý茾ŒêƒR<C692>[ƒhªÎ‰žŒ¾ŒêƒR<C692>[ƒhÉŠÜÜêé<E2809A>ê<EFBFBD>É<E2809A>³“Æ”»f
if (rom_valid_language & ncdsp[i].ncd_ex.valid_language_bitmap)
{
// Šg£Œ¾ŒêƒR<C692>[ƒhÅÊ<E28099>팾ŒêƒR<C692>[ƒhð<E2809A>ã<EFBFBD>«
ncdsp[i].ncd.option.language = ncdsp[i].ncd_ex.language;
}
if (rom_valid_language & (0x0001 << NVRAM_CONFIG_LANG_CHINESE) & ~ncdsp[i].
ncd_ex.valid_language_bitmap)
{
// ROM “à“o˜^ƒGƒŠƒAÉ"<E28099>Œê"Šg£Œ¾ŒêƒR<C692>[ƒhª<E2809A>Ýè³êÄ¢éª<E2809A>A
// IPL2ÌΉžŒ¾ŒêƒR<C692>[ƒhÉ"<E28099>Œê"Šg£Œ¾ŒêƒR<C692>[ƒhªŠÜÜêÈ¢<E2809A>ê<EFBFBD>ÍN“®ð—}<7D>§
return 3;
}
crc_flag |= (1 << i);
}
}
}
}
else
{
// IPLªŠg£Œ¾ŒêƒR<C692>[ƒhÉΉžµÄ¢È¢<E2809A>ê<EFBFBD>
u16 rom_valid_language = GetRomValidLanguage();
if (rom_valid_language & (0x0001 << NVRAM_CONFIG_LANG_CHINESE))
{
// ROM “à“o˜^ƒGƒŠƒAÉ"<E28099>Œê"Šg£Œ¾ŒêƒR<C692>[ƒhª<E2809A>Ýè³êÄ¢é<E2809A>ê<EFBFBD>ÍN“®ð—}<7D>§
return 3;
}
for (i = 0; i < 2; i++)
{
calc_crc = SVC_GetCRC16(0xffff, (void *)(&ncdsp[i].ncd), sizeof(NVRAMConfigData));
if ((ncdsp[i].crc16 == calc_crc) && (ncdsp[i].saveCount < NVRAM_CONFIG_SAVE_COUNT_MAX))
{
// CRC ª<E2809A>³µ­ saveCount lª 0x80 ¢žÌƒf<C692>[ƒ^ð<E2809A>³“Æ”»f
crc_flag |= (1 << i);
}
}
}
// <20>³“ȃf<C692>[ƒ^̤¿Ç̃f<C692>[ƒ^ª—LŒø©ð”»è·é<E2809A>B
switch (crc_flag)
{
case 1:
case 2:
// •ЕûÌCRC¾¯<E2809A>³<EFBFBD>í
return crc_flag;
case 3:
// —¼•ûÆàCRCª<E2809A>³µ¯êÎÇ¿çª<E2809A>Å<EFBFBD>Ṽf<C692>[ƒ^©”»f·é<E2809A>B
saveCount = (u8)((ncdsp[0].saveCount + 1) & NVRAM_CONFIG_SAVE_COUNT_MASK);
if (saveCount == ncdsp[1].saveCount)
{
return 2;
}
return 1;
}
// —¼•ûÆàCRCª•s<E280A2>³
return 0;
}
#else
/*---------------------------------------------------------------------------*
Name: CheckCorrectNCD
Description: ƒ~ƒ‰<C692>[ƒŠƒ“ƒO³êĢ郆<C692>[ƒU<C692>[<5B>î•ñÌÇ¿çðŽg¤×«©”»è·é<E2809A>B
Arguments: nvdsp - ”äŠr·éƒRƒ“ƒtƒBƒOƒf<C692>[ƒ^QÂÌ”z—ñ<E28094>B
Returns: s32 - 0: —¼•û•s“K<E2809C>Ø<EFBFBD>B
1: ”z—ñ[ 0 ]ª“K<E2809C>Ø<EFBFBD>B
2: ”z—ñ[ 1 ]ª“K<E2809C>Ø<EFBFBD>B
*---------------------------------------------------------------------------*/
static s32 CheckCorrectNCD(NVRAMConfig *ncdsp)
{
u16 i;
u16 calc_crc;
s32 crc_flag = 0;
u16 saveCount;
// Šeƒ~ƒ‰<C692>[ƒf<C692>[ƒ^ÌCRC & saveCount<6E>³“<E2809C>«ƒ`ƒFƒbƒN
for (i = 0; i < 2; i++)
{
calc_crc = SVC_GetCRC16(0xffff, (void *)(&ncdsp[i].ncd), sizeof(NVRAMConfigData));
if ((ncdsp[i].crc16 == calc_crc) && (ncdsp[i].saveCount < NVRAM_CONFIG_SAVE_COUNT_MAX))
{
// CRCª<E2809A>³µ­<E2809A>AsaveCountlª0x80¢žÌƒf<C692>[ƒ^ð<E2809A>³“Æ”»f<E28099>B
crc_flag |= (1 << i);
}
}
// <20>³“ȃf<C692>[ƒ^̤¿Ç̃f<C692>[ƒ^ª—LŒø©ð”»è·é<E2809A>B
switch (crc_flag)
{
case 1:
case 2:
// •ЕûÌCRC¾¯<E2809A>³<EFBFBD>í
return crc_flag;
case 3:
// —¼•ûÆàCRCª<E2809A>³µ¯êÎÇ¿çª<E2809A>Å<EFBFBD>Ṽf<C692>[ƒ^©”»f·é<E2809A>B
saveCount = (u8)((ncdsp[0].saveCount + 1) & NVRAM_CONFIG_SAVE_COUNT_MASK);
if (saveCount == ncdsp[1].saveCount)
{
return 2;
}
return 1;
}
// —¼•ûÆàCRCª•s<E280A2>³
return 0;
}
#endif
/*---------------------------------------------------------------------------*
Name: VBlankIntr
Description: V ƒuƒ‰ƒ“ƒNŠ„è<E2809A>žÝƒxƒNƒ^<5E>B
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
extern BOOL PMi_Initialized;
void PM_SelfBlinkProc(void);
static void
VBlankIntr(void)
{
if (PMi_Initialized)
{
PM_SelfBlinkProc();
}
}