TwlIPL/build/components/hyena.TWL/src/main.c
yoshida_teruhisa fc590a417a Launcher起動時、コンポーネント側でLauncherバージョンを格納するように変更
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@896 b08762b0-b915-fc4b-9d8c-17b2551a87ff
2008-03-18 08:17:02 +00:00

679 lines
21 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: TwlSDK - components - mongoose.TWL
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.
$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/aes.h>
#include <twl/mcu.h>
#include <twl/hw/common/mmap_wramEnv.h>
#include <sysmenu.h>
#include <sysmenu/mcu.h>
#include <firm/memorymap.h>
#include "nvram_sp.h"
#include "pm_pmic.h"
#include "internal_api.h"
#include <twl/sea.h>
/*---------------------------------------------------------------------------*
è<E28099>è`
*---------------------------------------------------------------------------*/
/* [TODO] Work around. Should be defined in wm_sp.h */
#define WM_WL_HEAP_SIZE 0x2100
/* Priorities of each threads */
#define THREAD_PRIO_SPI 2
#define THREAD_PRIO_MCU 4 // Žbè
#define THREAD_PRIO_SYSMMCU 6
#define THREAD_PRIO_SND 6
#define THREAD_PRIO_FATFS 8
#define THREAD_PRIO_HOTSW 11
#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 3
#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 ResetRTC( void );
static void ReadLauncherParameter( void );
static void PrintDebugInfo(void);
static OSHeapHandle InitializeAllocateSystem(void);
static void InitializeFatfs(void);
static void InitializeNwm(void);
static void InitializeCdc(void);
static void DummyThread(void* arg);
static void ReadUserInfo(void);
static void VBlankIntr(void);
/*---------------------------------------------------------------------------*
Š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 heapHandle;
// SYSMƒ<4D><C692>[ƒÑNƒŠƒA
MI_CpuClear32( SYSMi_GetWork(), sizeof(SYSM_work) );
// ƒoƒbƒNƒ‰ƒCƒgON
while ( (reg_GX_DISPSTAT & REG_GX_DISPSTAT_INI_MASK) == FALSE )
{
}
PMi_SetControl( PMIC_CTL_BKLT1 | PMIC_CTL_BKLT2 );
// OS <20>‰Šú‰»
OS_Init();
OS_InitTick();
PrintDebugInfo();
// ƒ‰ƒ“ƒ`ƒƒ<C692>[ƒpƒ‰ƒ<E280B0>ƒ^<5E>[Žæ“¾<E2809C>iCold/HotƒXƒ^<5E>[ƒg”»èŠÜÞ<E2809A>j
ReadLauncherParameter();
// RTCƒŠƒZƒbƒg
ResetRTC(); // 330us­ç¢
// NVRAM ©çƒ†<C692>[ƒU<C692>[<5B>î•ñ“ÇÝ<E2809A>oµ
ReadUserInfo();
// [TODO:] ƒJ<C692>[ƒh“dŒ¹ONµÄ<E2809A>AROMƒwƒbƒ_Ì݃Š<C692>[ƒh<C692>•ƒ`ƒFƒbƒN­ç¢ÍâÁĨ«½¢
SYSMi_GetWork()->flags.common.isARM9Start = TRUE; // [TODO:] HW_RED_RESERVEDÍNANDƒtƒ@<40>[ƒ€ÅƒNƒŠƒAµÄ¨¢Ä—~‚µ‚¢
// ƒq<C692>[ƒv—̈æ<CB86>Ýè
{
void *wram = OS_GetWramSubPrivArenaHi();
void *mmem = OS_GetSubPrivArenaHi();
OS_SetSubPrivArenaHi( (void*)SYSM_OWN_ARM7_MMEM_ADDR_END ); // ƒ<>ƒƒŠ”zuð¢ÁÄ¢éÌÅ<E2809A>AƒAƒŠ<C692>[ƒiHià•Ï<E280A2>XµÈ¢Æƒ_ƒ<5F><C692>I<EFBFBD>I
OS_SetWramSubPrivArenaHi( (void*)(SYSM_OWN_ARM7_WRAM_ADDR_END - HW_FIRM_FROM_FIRM_BUF_SIZE) ); // ±ÌŽž“_ÅÍŒ®ðÂԳȢæ¤É
OS_TPrintf( "MMEM SUBPRV ARENA HI : %08x -> %08x\n", mmem, OS_GetSubPrivArenaHi() );
OS_TPrintf( "WRAM SUBPRV ARENA HI : %08x -> %08x\n", wram, OS_GetWramSubPrivArenaHi() );
}
heapHandle = InitializeAllocateSystem();
// ƒ{ƒ^ƒ““ü—̓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();
// ƒ‰ƒ“ƒ`ƒƒ<C692>[ƒo<C692>[ƒWƒ‡ƒ“ðŠi”[<5B>i<EFBFBD>¡ÌƱë<E2809A>A<EFBFBD>ÅáÅàƒ}ƒEƒ“ƒg<C692>î•ñ“o˜^OÉÍŠi”[·é•K—v è<E2809A>j
*(u8 *)HW_TWL_RED_LAUNCHER_VER = (u8)SYSM_LAUNCHER_VER;
// ƒ‰ƒ“ƒ`ƒƒ<C692>[‚̃}ƒEƒ“ƒg<C692>î•ñ“o˜^
SYSMi_SetLauncherMountInfo();
// PXIƒR<C692>ƒoƒbƒNÌ<E2809A>Ýè
SYSM_InitPXI(THREAD_PRIO_SYSMMCU);
// ƒtƒ@ƒCƒƒVƒXƒeƒ€<C692>‰Šú‰»
FS_Init(FS_DMA_NOT_USE);
FS_CreateReadServerThread(THREAD_PRIO_FS);
if (OS_IsRunOnTwl() == TRUE)
{
OSTick start = OS_GetTick();
InitializeFatfs(); // FATFS <20>‰Šú‰»
OS_TPrintf( "FATFS init time = %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
InitializeNwm(); // NWM <20>‰Šú‰»
#ifndef SDK_NOCRYPTO
AES_Init(); // AES <20>‰Šú‰»
#ifdef SDK_SEA
SEA_Init();
#endif // ifdef SDK_SEA
#endif
MCU_InitIrq(THREAD_PRIO_MCU); // MCU <20>‰Šú‰»
}
if (OSi_IsCodecTwlMode() == TRUE)
{
// CODEC <20>‰Šú‰»
InitializeCdc();
// ƒ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>‰Šú‰»
WVR_Begin(heapHandle);
// SPI <20>‰Šú‰»
SPI_Init(THREAD_PRIO_SPI);
BOOT_Init();
// Šˆ<C5A0>ð}”²‹@”\<5C>‰Šú‰»
if( ( SYSM_GetLauncherParamBody()->v1.flags.isValid ) &&
( SYSM_GetLauncherParamBody()->v1.flags.bootType != LAUNCHER_BOOTTYPE_ROM ) &&
( SYSM_GetLauncherParamBody()->v1.bootTitleID )
) {
// ƒ‰ƒ“ƒ`ƒƒ<C692>[ƒpƒ‰ƒ<E280B0><C692>[ƒ^Ń_ƒCƒŒƒNƒgƒJ<C692>[ƒhƒu<C692>[ƒgˆÈŠOÌŽw誠鎞Í<E2809A>ˆ<C5A0>ü}”²ðOFFÉ·é<E2809A>B
SYSMi_GetWork()->flags.hotsw.isEnableHotSW = 0;
}else {
// »êˆÈŠOÌŽžÍŠˆ<C5A0>ü}”²ON
SYSMi_GetWork()->flags.hotsw.isEnableHotSW = 1;
}
// [TODO]ƒAƒvƒŠƒWƒƒƒ“ƒv—LŒøÅ<E2809A>AƒJ<C692>[ƒhƒu<C692>[ƒgÅÈ¢ŽžÍ<E2809A>A<EFBFBD>Å<EFBFBD>©çHOTSW_InitðŒÄÎÈ¢æ¤Éµ½¢<E2809A>B
HOTSW_Init(THREAD_PRIO_HOTSW);
while (TRUE)
{
OS_Halt();
//---- check reset
if (OS_IsResetOccurred())
{
OS_ResetSystem();
}
BOOT_WaitStart();
}
}
// RTCÌƒŠƒZƒbƒgƒ`ƒFƒbƒN
static void ResetRTC( void )
{
// ƒ‰ƒ“ƒ`ƒƒ<C692>[ÅƒŠƒZƒbƒgðŒŸ<C592>o·é½ßɱÌ<E2809A>ˆ<CB86>ðµÄ¢éª<E2809A>ARTC_Init“àÅà“¯±ÆðµÄ¢éÌÅ<E2809A>A¿åÁƳÊ<E28098>B
RTCRawStatus1 stat1;
RTCRawStatus2 stat2;
RTC_ReadStatus1( &stat1 );
RTC_ReadStatus2( &stat2 );
// ƒŠƒZƒbƒg<C692>A“dŒ¹“Š“ü<E2809C>A“dŒ¹“dˆ³á‰º<E280B0>AICƒeƒXƒgÌŠeƒtƒ‰ƒOðŠm”F
if ( stat1.reset || stat1.poc || stat1.bld || stat2.test )
{
// ƒŠƒZƒbƒgŽÀ<C5BD>s
stat1.reset = 1;
RTC_WriteStatus1( &stat1 );
{
RTCRawFout fout;
fout.fout = RTC_FOUT_DUTY_32KHZ;
RTC_WriteFout(&fout);
}
SYSMi_GetWork()->flags.common.isResetRTC = TRUE;
}
}
// ƒ‰ƒ“ƒ`ƒƒ<C692>[ƒpƒ‰ƒ<E280B0><C692>[ƒ^̃Š<C692>[ƒh¨æÑHot/ColdƒXƒ^<5E>[ƒg”»è
void ReadLauncherParameter( void )
{
BOOL hot;
SYSMi_GetWork()->flags.common.isValidLauncherParam = OS_ReadLauncherParameter( (LauncherParam *)&(SYSMi_GetWork()->launcherParam), &hot );
SYSMi_GetWork()->flags.common.isHotStart = hot;
// ƒ<>ƒCƒ“ƒ<E2809C>ƒƒŠÌƒŠƒZƒbƒgƒpƒ‰ƒ<E280B0><C692>[ƒ^ðƒNƒŠƒAµÄ¨­
MI_CpuClear32( SYSMi_GetLauncherParamAddr(), 0x100 );
}
/*---------------------------------------------------------------------------*
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");
}
OS_TPrintf("ARM7: This component is \"hyena.TWL\"\n");
}
#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>‰Šú‰»
#ifndef SDK_NOCRYPTO
if(!FATFS_Init( FATFS_DMA_4, FATFS_DMA_NOT_USE, THREAD_PRIO_FATFS))
#else
if (FATFS_Init(FATFS_DMA_NOT_USE, FATFS_DMA_NOT_USE, THREAD_PRIO_FATFS))
#endif
{
// 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(void)
{
NwmspInit nwmInit;
OSHeapHandle heapHandle;
void* Lo = (void*)OS_GetSubPrivArenaLo();
void* Hi = (void*)OS_GetSubPrivArenaHi();
heapHandle = OS_CreateHeap(OS_ARENA_MAIN_SUBPRIV, Lo, Hi);
/* [TODO] Šm•Ûµ½ƒq<C692>[ƒv—̈æª<E2809A>V³<E28093>üˆêŽ®ª•K—vƵĢéƒ<C3A9>ƒƒŠ—ʈÈ<CB86>ã©Ìƒ`ƒFƒbƒNª•K—v */
nwmInit.dmaNo = NWM_DMANO;
nwmInit.cmdPrio = THREAD_PRIO_NWM_COMMMAND;
nwmInit.evtPrio = THREAD_PRIO_NWM_EVENT;
nwmInit.sdioPrio = THREAD_PRIO_NWM_SDIO;
nwmInit.drvHeap.id = OS_ARENA_MAIN_SUBPRIV; /* [TODO] */
nwmInit.drvHeap.handle = heapHandle;
#ifdef WPA_BUILT_IN /* WPA ªgÝ<E2809A>žÜêé<E2809A>ê<EFBFBD><EFBFBD>AˆÈ‰ºÌƒ<C38C>ƒ“ƒoªÇ‰Á³êé */
nwmInit.wpaPrio = THREAD_PRIO_NWM_WPA;
nwmInit.wpaHeap.id = OS_ARENA_MAIN_SUBPRIV; /* [TODO] */
nwmInit.wpaHeap.handle = heapHandle;
#endif
NWMSP_Init(&nwmInit);
}
#include <twl/ltdwram_end.h>
#include <twl/ltdwram_begin.h>
/*---------------------------------------------------------------------------*
Name: InitializeCdc
Description: CDCƒ‰ƒCƒuƒ‰ƒŠð<E2809A>‰Šú‰»·é<E2809A>BCDC<44>‰Šú‰»ŠÖ<C5A0>”“àŃXƒŒƒbƒhxŽ~‚·‚é
ˆ×<CB86>AxŽ~†“®<E2809C>ì·éƒ_ƒ~<7E>[̃XƒŒƒbƒhð—§Äé<E2809A>B
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
static void
InitializeCdc(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);
#if 1
// CODEC <20>‰Šú‰»
CDC_Init();
CDC_InitMic();
// CDCi_DumpRegisters();
#else
/* [Debug] CODEC ‚ð DS ƒ<C692>[ƒhÅ<E2809A>‰Šú‰» */
*((u8*)(HW_TWL_ROM_HEADER_BUF + 0x01bf)) &= ~(0x01);
CDC_Init();
CDC_GoDsMode();
OS_TPrintf("Codec mode changed to DS mode for debug.\n");
#endif
// ƒ_ƒ~<7E>[ƒXƒŒƒbƒh”jŠü
OS_KillThread(&thread, NULL);
}
/*---------------------------------------------------------------------------*
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(void)
{
OSHeapHandle hh;
#ifdef SDK_TWLHYB
if (OS_IsRunOnTwl() == TRUE)
{
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 ((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);
}
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);
}
else
#endif
{
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);
OS_TPrintf("ARM7: MAIN heap size is %d\n", heapSize);
}
#ifdef SDK_TWLHYB
if (OS_IsRunOnTwl() == TRUE)
{
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 (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);
}
else
#endif
{
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 (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 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)
{
u8 *p = OS_GetSystemWork()->nvramUserInfo;
// ³<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
}
/*---------------------------------------------------------------------------*
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();
}
}