mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
993 lines
32 KiB
C
993 lines
32 KiB
C
/*---------------------------------------------------------------------------*
|
||
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ƒh‹xŽ~
|
||
‚·‚éˆ×<CB86>A‹xŽ~’†“®<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>[ƒv‚̃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>[ƒv‚̃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>[ƒv‚̃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>V‚̃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>AsaveCount’l‚ª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>V‚̃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();
|
||
}
|
||
}
|