From 3a622b99af6ee755bd715dfb1d2e22a915a0370b Mon Sep 17 00:00:00 2001 From: yutaka Date: Wed, 14 Nov 2007 12:13:08 +0000 Subject: [PATCH] =?UTF-8?q?=E3=82=B3=E3=83=BC=E3=83=89=E6=95=B4=E7=90=86?= =?UTF-8?q?=20=E3=83=A1=E3=83=A2=E3=83=AA=E3=82=AF=E3=83=AA=E3=82=A2?= =?UTF-8?q?=E7=AF=84=E5=9B=B2=E3=81=AE=E5=A4=89=E6=9B=B4=20(TwlSDK?= =?UTF-8?q?=E5=BE=85=E3=81=A1=E3=81=A7=E5=86=8D=E5=A4=89=E6=9B=B4=E4=BA=88?= =?UTF-8?q?=E5=AE=9A)=20=E3=83=AA=E3=82=BB=E3=83=83=E3=83=88=E3=83=91?= =?UTF-8?q?=E3=83=A9=E3=83=A1=E3=83=BC=E3=82=BF=E3=81=AE=E8=A8=AD=E5=AE=9A?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@176 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- build/libraries/init/ARM9/crt0_firm.c | 26 ++- build/libraries/os/common/os_boot.c | 4 +- build/nandfirm/menu-launcher/ARM7/main.c | 165 +++++++++++------- build/nandfirm/menu-launcher/ARM9/main.c | 55 +++++- build/nandfirm/sdmc-launcher/ARM7/main.c | 209 +++++++++++++---------- build/nandfirm/sdmc-launcher/ARM9/main.c | 18 +- 6 files changed, 303 insertions(+), 174 deletions(-) diff --git a/build/libraries/init/ARM9/crt0_firm.c b/build/libraries/init/ARM9/crt0_firm.c index d82bd56d..c81ffcb8 100644 --- a/build/libraries/init/ARM9/crt0_firm.c +++ b/build/libraries/init/ARM9/crt0_firm.c @@ -324,8 +324,9 @@ INITi_InitCoprocessor(void) ; Region 0: IO_VRAM: Base = 0x04000000, Size = 64MB, I:NC NB / D:NC NB, I:RW / D:RW ; Region 1: MAIN_MEM: Base = 0x02000000, Size = 8MB*, I:Cach Buf / D:Cach Buf, I:RW / D:RW ; (* When hardware is not debugger, size will be reduced to 4MB in OS_InitArena() ) -; Region 2: ARM7_RESERVE: Base = 0x027e0000, Size = 128KB, I:NC NB / D:NC NB, I:NA / D:NA -; (* When hardware is not debugger, base will be moved to 0x023e0000 in OS_InitArena() ) +;// Region 2: ARM7_RESERVE: Base = 0x027e0000, Size = 128KB, I:NC NB / D:NC NB, I:NA / D:NA +;// (* When hardware is not debugger, base will be moved to 0x023e0000 in OS_InitArena() ) +; Region 2: SHARED_WORK: Base = 0x027ff000, Size = 4KB, I:NC NB / D:NC NB, I:NA / D:RW ; Region 3: CARTRIDGE: Base = 0x08000000, Size = 128MB, I:NC NB / D:NC NB, I:NA / D:RW ; Region 4: DTCM: Base = 0x02fe0000, Size = 16KB, I:NC NB / D:NC NB, I:NA / D:RW ; Region 5: ITCM: Base = 0x01000000, Size = 16MB, I:NC NB / D:NC NB, I:RW / D:RW @@ -411,8 +412,10 @@ INITi_InitRegion(void) @002: /* ハードウェアが NITRO の場合 */ /* (1) メインメモリ */ - SET_PROTECTION_A(c1, HW_MAIN_MEM_MAIN, 8MB) - SET_PROTECTION_B(c1, HW_MAIN_MEM_MAIN, 8MB) + //SET_PROTECTION_A(c1, HW_MAIN_MEM_MAIN, 8MB) + //SET_PROTECTION_B(c1, HW_MAIN_MEM_MAIN, 8MB) + SET_PROTECTION_A(c1, HW_MAIN_MEM_MAIN, 32MB) + SET_PROTECTION_B(c1, HW_MAIN_MEM_MAIN, 32MB) /* Size will be arranged in OS_InitArena(). */ /* (2) ARM7 専用メインメモリ空間 */ @@ -421,8 +424,10 @@ INITi_InitRegion(void) /* Base address will be moved in OS_InitArena(). */ /* (3) カートリッジ */ - SET_PROTECTION_A(c3, HW_CTRDG_ROM, 128MB) - SET_PROTECTION_B(c3, HW_CTRDG_ROM, 128MB) + //SET_PROTECTION_A(c3, HW_CTRDG_ROM, 128MB) + //SET_PROTECTION_B(c3, HW_CTRDG_ROM, 128MB) + SET_PROTECTION_A(c3, HW_CTRDG_ROM, 32MB) + SET_PROTECTION_B(c3, HW_CTRDG_ROM, 32MB) /* (7) ARM9/ARM7 共有メインメモリ空間 */ SET_PROTECTION_A(c7, HW_MAIN_MEM_SHARED, 4KB) @@ -433,15 +438,18 @@ INITi_InitRegion(void) mcr p15, 0, r0, c2, c0, 1 /* データキャッシュ許可 */ - mov r0, #REGION_BIT(0, 1, 0, 0, 0, 0, 1, 0) + //mov r0, #REGION_BIT(0, 1, 0, 0, 0, 0, 1, 0) + mov r0, #REGION_BIT(0, 1, 0, 1, 0, 0, 1, 0) mcr p15, 0, r0, c2, c0, 0 /* ライトバッファ許可 */ - mov r0, #REGION_BIT(0, 1, 0, 0, 0, 0, 0, 0) + //mov r0, #REGION_BIT(0, 1, 0, 0, 0, 0, 0, 0) + mov r0, #REGION_BIT(0, 1, 0, 1, 0, 0, 0, 0) mcr p15, 0, r0, c3, c0, 0 /* 命令アクセス許可 */ - ldr r0, =REGION_ACC(RW, RW, NA, NA, NA, RW, RO, NA) + //ldr r0, =REGION_ACC(RW, RW, NA, NA, NA, RW, RO, NA) + ldr r0, =REGION_ACC(RW, RW, NA, RW, NA, RW, RO, NA) mcr p15, 0, r0, c5, c0, 3 /* データアクセス許可 */ diff --git a/build/libraries/os/common/os_boot.c b/build/libraries/os/common/os_boot.c index ad26807d..1a0063bd 100644 --- a/build/libraries/os/common/os_boot.c +++ b/build/libraries/os/common/os_boot.c @@ -27,8 +27,8 @@ 課題: OSi_BootCoreのコピー先決定 - いろいろクリア (ITCM,DTCM,STACK,TEXT,RODATA,DATAなど (OSi_BootCoreは残す)) - なので、OSi_BootCoreは次のプログラムですぐに壊されそうなところを使う + いろいろクリア (ITCM,DTCM,STACK,STATICなど (OSBootCore, OSFromFirmBufは残す)) + なので、OSBootCoreはできれば次のプログラムですぐに壊されそうなところを使う #endif void OSi_BootCore( ROM_Header* rom_header ); diff --git a/build/nandfirm/menu-launcher/ARM7/main.c b/build/nandfirm/menu-launcher/ARM7/main.c index c9695e08..720d7871 100644 --- a/build/nandfirm/menu-launcher/ARM7/main.c +++ b/build/nandfirm/menu-launcher/ARM7/main.c @@ -15,6 +15,7 @@ $Author$ *---------------------------------------------------------------------------*/ #include +#include #include #define FATFS_HEAP_SIZE (64*1024) // FATFS用ヒープ (サイズ調整必要) @@ -32,11 +33,19 @@ static u8 step = 0x80; #endif /* - Profile + PROFILE_ENABLE を定義するとある程度のパフォーマンスチェックができます。 + 利用するためには、main.cかどこかに、u32 profile[256]; u32 pf_cnt = 0; を + 定義する必要があります。 */ -#ifndef SDK_FINALROM -#define PRFILE_MAX 128 -u32 profile[PRFILE_MAX]; +#define PROFILE_ENABLE + +#ifdef SDK_FINALROM // FINALROMで無効化 +#undef PROFILE_ENABLE +#endif + +#ifdef PROFILE_ENABLE +#define PROFILE_MAX 128 +u32 profile[PROFILE_MAX]; u32 pf_cnt = 0; #endif @@ -55,6 +64,14 @@ static void PreInit(void) { OS_Terminate(); } + + /* + リセットパラメータを共有領域にコピー (4バイト分) + */ + *(u32*)HW_RESET_PARAMETER_BUF = (u32)((MCUi_ReadRegister( MCU_REG_TEMP_ADDR + 0 ) << 0) + | (MCUi_ReadRegister( MCU_REG_TEMP_ADDR + 1 ) << 8) + | (MCUi_ReadRegister( MCU_REG_TEMP_ADDR + 2 ) << 16) + | (MCUi_ReadRegister( MCU_REG_TEMP_ADDR + 3 ) << 24)); } /*************************************************************** @@ -71,6 +88,57 @@ static void EraseAll(void) #endif } +/*************************************************************** + Fatfs4nandInit + + FATFS周りの初期化 for NAND +***************************************************************/ +static BOOL Fatfs4nandInit(void) +{ + /* FATFSライブラリ用にカレントヒープに設定 */ + /* WRAM上のfatfsHeapをメインメモリヒープとして登録している */ + { + OSHeapHandle hh; + u8 *lo = (u8*)fatfsHeap; + u8 *hi = (u8*)fatfsHeap + FATFS_HEAP_SIZE; + lo = OS_InitAlloc(OS_ARENA_MAIN_SUBPRIV, lo, hi, 1); + OS_SetArenaLo(OS_ARENA_MAIN_SUBPRIV, lo); + hh = OS_CreateHeap(OS_ARENA_MAIN_SUBPRIV, OS_GetSubPrivArenaLo(), hi); + OS_SetCurrentHeap(OS_ARENA_MAIN_SUBPRIV, hh); + } + + OS_SetDebugLED(++step); + + if ( !FATFS_InitFIRM( &(OSi_GetFromFirmAddr()->SDNandContext) ) ) + { + return FALSE; + } + +#ifdef PROFILE_ENABLE + // 3: after FATFS + profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); +#endif + OS_SetDebugLED(++step); + + if ( !FATFS_MountDriveFIRM( DRIVE_NO, BOOT_DEVICE, PARTITION_NO ) ) + { + return FALSE; + } + +#ifdef PROFILE_ENABLE + // 4: after Mount + profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); +#endif + OS_SetDebugLED(++step); + PM_BackLightOn( FALSE ); + + if ( !FATFS_OpenRecentMenu( DRIVE_NO ) ) + { + return FALSE; + } + return TRUE; +} + void TwlSpMain( void ) { // OS_InitDebugLED and OS_SetDebugLED are able to call after OS_Init @@ -83,14 +151,15 @@ void TwlSpMain( void ) #ifndef SDK_FINALROM I2Ci_WriteRegister(I2C_SLAVE_DEBUG_LED, 0x01, ++step); - +#endif +#ifdef PROFILE_ENABLE // 0: before PXI profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); #endif OS_InitFIRM(); -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 1: after PXI profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); #endif @@ -98,71 +167,53 @@ void TwlSpMain( void ) OS_SetDebugLED(++step); PM_InitFIRM(); + PM_BackLightOn( FALSE ); -#ifndef SDK_FINALROM +#ifdef PROFILE_ENABLE // 2: after PM profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); #endif - OS_SetDebugLED(++step); - - /* FATFSライブラリ用にカレントヒープに設定 */ + if ( !Fatfs4nandInit() ) { - { - OSHeapHandle hh; - u8 *lo = (u8*)fatfsHeap; - u8 *hi = (u8*)fatfsHeap + FATFS_HEAP_SIZE; - lo = OS_InitAlloc(OS_ARENA_MAIN_SUBPRIV, lo, hi, 1); - OS_SetArenaLo(OS_ARENA_MAIN_SUBPRIV, lo); - hh = OS_CreateHeap(OS_ARENA_MAIN_SUBPRIV, OS_GetSubPrivArenaLo(), hi); - OS_SetCurrentHeap(OS_ARENA_MAIN_SUBPRIV, hh); - } + goto end; } - OS_SetDebugLED(++step); - - if ( FATFS_InitFIRM( &(OSi_GetFromFirmAddr()->SDNandContext) ) ) - { -#ifndef SDK_FINALROM - // 3: after FATFS - profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); +#ifdef PROFILE_ENABLE + // 5: after Open + profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); #endif - OS_SetDebugLED(++step); + OS_SetDebugLED(++step); - if ( FATFS_MountDriveFIRM( DRIVE_NO, BOOT_DEVICE, PARTITION_NO ) ) + PM_BackLightOn( FALSE ); + + if ( !FATFS_LoadHeader() && !FATFS_LoadStatic() ) + { + goto end; + } + +#ifdef PROFILE_ENABLE + // 127: before Boot + pf_cnt = PROFILE_MAX-1; + profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); + { + int i; + PXI_RecvID(); + OS_TPrintf("\n[ARM7] Begin\n"); + for (i = 0; i < PROFILE_MAX; i++) { - BOOL result; -#ifndef SDK_FINALROM - // 4: after Mount - profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); -#endif - OS_SetDebugLED(++step); - - result = FATFS_OpenRecentMenu( DRIVE_NO ); - - if ( result ) - { -#ifndef SDK_FINALROM - // 5: after Open - profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); -#endif - OS_SetDebugLED(++step); - - if ( FATFS_LoadHeader() && FATFS_LoadStatic() ) - { -#ifndef SDK_FINALROM - // 127: before Boot - pf_cnt = PRFILE_MAX-1; - profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); -#endif - OS_SetDebugLED(++step); - - FATFS_Boot(); - } - } + OS_TPrintf("0x%08X\n", profile[i]); } + OS_TPrintf("\n[ARM7] End\n"); } +#endif + OS_SetDebugLED(++step); + PM_BackLightOn( TRUE ); // last chance + + FATFS_Boot(); + +end: OS_SetDebugLED( (u8)(0xF0 | step)); EraseAll(); diff --git a/build/nandfirm/menu-launcher/ARM9/main.c b/build/nandfirm/menu-launcher/ARM9/main.c index 1cb9eb25..dcb7580a 100644 --- a/build/nandfirm/menu-launcher/ARM9/main.c +++ b/build/nandfirm/menu-launcher/ARM9/main.c @@ -17,7 +17,23 @@ #include /* 鍵はどこへ? */ -#define RSA_KEY_ADDR OSi_GetFromBromAddr()->rsa_pubkey[7] +#if 0 +#define RSA_KEY_ADDR OSi_GetFromFirmAddr()->rsa_pubkey[7] +#else +#define RSA_KEY_ADDR rsa_key +static const u8 rsa_key[128] = +{ + 0xdf, 0x56, 0x30, + 0xc9, 0xae, 0x05, 0x55, 0xe8, 0xdf, 0xbe, 0xe6, 0xb9, 0x30, 0xb9, 0x76, 0x93, 0xb4, 0xc2, 0x20, + 0xe7, 0xae, 0x4c, 0x3e, 0xc3, 0xed, 0x27, 0xcf, 0x5d, 0x4f, 0xb5, 0x7d, 0xde, 0x38, 0xbc, 0xfe, + 0x25, 0x32, 0xd8, 0x23, 0x98, 0x52, 0xb5, 0xda, 0xf7, 0x39, 0xdc, 0xb3, 0x0a, 0x94, 0x7a, 0x2b, + 0x79, 0xe6, 0xe0, 0x4c, 0xbc, 0x21, 0xbd, 0x59, 0xb2, 0xc7, 0xf1, 0xc0, 0xf1, 0xfb, 0x29, 0x75, + 0xa1, 0x21, 0x93, 0x01, 0x29, 0x1c, 0x9a, 0xe1, 0x2d, 0x55, 0xfc, 0x7b, 0xb8, 0xcb, 0x07, 0x33, + 0xc5, 0x91, 0x0d, 0xc8, 0x45, 0x59, 0xef, 0xbe, 0x58, 0xc7, 0xc1, 0x1d, 0xd5, 0xf2, 0xcf, 0x1f, + 0xe0, 0x6d, 0x21, 0x00, 0xcd, 0x42, 0xd8, 0x84, 0x85, 0xe3, 0xb2, 0x02, 0x1a, 0xa5, 0x89, 0x02, + 0xa1, 0x96, 0xc6, 0xf7, 0x61, 0x68, 0x66, 0xe6, 0x65, 0x12, 0xb7, 0xf1, 0x49 +}; +#endif #define RSA_HEAP_SIZE (4*1024) // RSA用ヒープサイズ (サイズ調整必要) @@ -36,8 +52,8 @@ static SVCSignHeapContext acPool; #endif #ifdef PROFILE_ENABLE -#define PRFILE_MAX 128 -u32 profile[PRFILE_MAX]; +#define PROFILE_MAX 128 +u32 profile[PROFILE_MAX]; u32 pf_cnt = 0; #endif @@ -52,7 +68,7 @@ static void PreInit(void) メインメモリ関連 */ // SHARED領域クリア (ここだけでOK?) - MIi_CpuClearFast( 0, (void*)HW_PXI_SIGNAL_PARAM_ARM9, HW_MAIN_MEM_SHARED_END-HW_PXI_SIGNAL_PARAM_ARM9); + MIi_CpuClearFast( 0, (void*)HW_PXI_SIGNAL_PARAM_ARM9, HW_MMEMCHECKER_MAIN-HW_PXI_SIGNAL_PARAM_ARM9); /* FromBrom関連 @@ -76,10 +92,15 @@ static void PostInit(void) /* メインメモリ関連 */ - // (DTCMの手前までの領域を全クリア) - //MI_CpuClearFast( (void*)HW_DELIVER_ARG_BUF_END, SDK_SECTION_ARENA_DTCM_START-HW_DELIVER_ARG_BUF_END ); - // (ARM9領域を全クリア) - MI_CpuClearFast( (void*)HW_DELIVER_ARG_BUF_END, HW_MAIN_MEM_MAIN_END-HW_DELIVER_ARG_BUF_END ); + // ARM9領域を全クリア + if ( OS_GetResetParameter() ) + { + MI_CpuClearFast( (void*)HW_DELIVER_ARG_BUF_END, HW_MAIN_MEM_MAIN_END-HW_DELIVER_ARG_BUF_END ); + } + else + { + MI_CpuClearFast( (void*)HW_MAIN_MEM_MAIN, HW_MAIN_MEM_MAIN_SIZE ); + } DC_FlushAll(); } @@ -121,6 +142,7 @@ void TwlMain( void ) OS_InitFIRM(); #ifdef PROFILE_ENABLE + OS_EnableIrq(); OS_InitTick(); // 1: after PXI profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); @@ -130,13 +152,28 @@ void TwlMain( void ) PostInit(); +#ifdef PROFILE_ENABLE + // 2: after PostInit + profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); +#endif + // load menu if ( MI_LoadHeader( &acPool, RSA_KEY_ADDR ) && CheckHeader() && MI_LoadStatic() ) { #ifdef PROFILE_ENABLE // 127: before Boot - pf_cnt = PRFILE_MAX-1; + pf_cnt = PROFILE_MAX-1; profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); + { + int i; + OS_TPrintf("\n[ARM9] Begin\n"); + for (i = 0; i < PROFILE_MAX; i++) + { + OS_TPrintf("0x%08X\n", profile[i]); + } + OS_TPrintf("\n[ARM9] End\n"); + PXI_NotifyID( FIRM_PXI_ID_NULL ); + } #endif MI_Boot(); diff --git a/build/nandfirm/sdmc-launcher/ARM7/main.c b/build/nandfirm/sdmc-launcher/ARM7/main.c index 70e7f138..92702198 100644 --- a/build/nandfirm/sdmc-launcher/ARM7/main.c +++ b/build/nandfirm/sdmc-launcher/ARM7/main.c @@ -15,6 +15,7 @@ $Author$ *---------------------------------------------------------------------------*/ #include +#include #include #define FATFS_HEAP_SIZE (64*1024) // FATFS用ヒープ (サイズ調整必要) @@ -65,6 +66,13 @@ static void PreInit(void) { OS_Terminate(); } + /* + リセットパラメータを共有領域にコピー (4バイト分) + */ + *(u32*)HW_RESET_PARAMETER_BUF = (u32)((MCUi_ReadRegister( MCU_REG_TEMP_ADDR + 0 ) << 0) + | (MCUi_ReadRegister( MCU_REG_TEMP_ADDR + 1 ) << 8) + | (MCUi_ReadRegister( MCU_REG_TEMP_ADDR + 2 ) << 16) + | (MCUi_ReadRegister( MCU_REG_TEMP_ADDR + 3 ) << 24)); } /*************************************************************** @@ -81,6 +89,78 @@ static void EraseAll(void) #endif } +/*************************************************************** + Fatfs4sdmcInit + + FATFS周りの初期化 for SDカード +***************************************************************/ +static BOOL Fatfs4sdmcInit(void) +{ + BOOL result; + + /* FATFSライブラリ用にカレントヒープを設定 */ + /* WRAM上のfatfsHeapをメインメモリヒープとして登録している */ + OSHeapHandle hh; + u8 *lo = (u8*)fatfsHeap; + u8 *hi = (u8*)fatfsHeap + FATFS_HEAP_SIZE; + lo = OS_InitAlloc(OS_ARENA_MAIN_SUBPRIV, lo, hi, 1); + OS_SetArenaLo(OS_ARENA_MAIN_SUBPRIV, lo); + hh = OS_CreateHeap(OS_ARENA_MAIN_SUBPRIV, OS_GetSubPrivArenaLo(), hi); + OS_SetCurrentHeap(OS_ARENA_MAIN_SUBPRIV, hh); + + OS_SetDebugLED(++step); + + if ( !FATFS_InitFIRM( NULL ) ) + { + return FALSE; + } + +#ifndef SDK_FINALROM + // 3: after FATFS + profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); +#endif + OS_SetDebugLED(++step); + + PM_BackLightOn( FALSE ); + + if ( !FATFS_MountDriveFIRM( DRIVE_NO, BOOT_DEVICE, PARTITION_NO ) ) + { + return FALSE; + } + +#ifndef SDK_FINALROM + // 4: after Mount + profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); +#endif + OS_SetDebugLED(++step); + + PM_BackLightOn( FALSE ); + + switch ( PAD_Read() & PAD_KEYPORT_MASK ) + { + case 0: + result = FATFS_OpenSpecifiedSrl( MENU_FILE ); + break; + case PAD_BUTTON_A: + result = FATFS_OpenSpecifiedSrl( MENU_FILE_A ); + break; + case PAD_BUTTON_B: + result = FATFS_OpenSpecifiedSrl( MENU_FILE_B ); + break; + case PAD_BUTTON_L: + result = FATFS_OpenSpecifiedSrl( MENU_FILE_L ); + break; + case PAD_BUTTON_R: + result = FATFS_OpenSpecifiedSrl( MENU_FILE_R ); + break; + default: + OS_SetDebugLED( (u8)(PAD_Read() & PAD_KEYPORT_MASK) ); + result = FALSE; + break; + } + return result; +} + void TwlSpMain( void ) { // OS_InitDebugLED and OS_SetDebugLED are able to call after OS_Init @@ -100,7 +180,7 @@ void TwlSpMain( void ) OS_InitFIRM(); PRODUCTION_CHECK(); - OS_EnableIrq(); // PMでOS_InitTick()を使っているので (他でも使ってる?) + OS_EnableIrq(); #ifndef SDK_FINALROM //OS_EnableIrq(); @@ -117,100 +197,49 @@ void TwlSpMain( void ) // 2: after PM profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); #endif - - OS_SetDebugLED(++step); - - /* FATFSライブラリ用にカレントヒープを設定 */ - /* WRAM上のfatfsHeapをメインメモリヒープとして登録している */ - { - OSHeapHandle hh; - u8 *lo = (u8*)fatfsHeap; - u8 *hi = (u8*)fatfsHeap + FATFS_HEAP_SIZE; - lo = OS_InitAlloc(OS_ARENA_MAIN_SUBPRIV, lo, hi, 1); - OS_SetArenaLo(OS_ARENA_MAIN_SUBPRIV, lo); - hh = OS_CreateHeap(OS_ARENA_MAIN_SUBPRIV, OS_GetSubPrivArenaLo(), hi); - OS_SetCurrentHeap(OS_ARENA_MAIN_SUBPRIV, hh); - } - OS_SetDebugLED(++step); PRODUCTION_CHECK(); - if ( FATFS_InitFIRM( NULL ) ) + if ( !Fatfs4sdmcInit() ) { -#ifndef SDK_FINALROM - // 3: after FATFS - profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); -#endif - OS_SetDebugLED(++step); - PM_BackLightOn( FALSE ); - - if ( FATFS_MountDriveFIRM( DRIVE_NO, BOOT_DEVICE, PARTITION_NO ) ) - { - BOOL result; -#ifndef SDK_FINALROM - // 4: after Mount - profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); -#endif - OS_SetDebugLED(++step); - PM_BackLightOn( FALSE ); - - switch ( PAD_Read() & PAD_KEYPORT_MASK ) - { - case 0: - result = FATFS_OpenSpecifiedSrl( MENU_FILE ); - break; - case PAD_BUTTON_A: - result = FATFS_OpenSpecifiedSrl( MENU_FILE_A ); - break; - case PAD_BUTTON_B: - result = FATFS_OpenSpecifiedSrl( MENU_FILE_B ); - break; - case PAD_BUTTON_L: - result = FATFS_OpenSpecifiedSrl( MENU_FILE_L ); - break; - case PAD_BUTTON_R: - result = FATFS_OpenSpecifiedSrl( MENU_FILE_R ); - break; - default: - OS_SetDebugLED( (u8)(PAD_Read() & PAD_KEYPORT_MASK) ); - OS_Terminate(); - break; - } - - if ( result ) - { -#ifndef SDK_FINALROM - // 5: after Open - profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); -#endif - OS_SetDebugLED(++step); - PM_BackLightOn( FALSE ); - - if ( FATFS_LoadHeader() && FATFS_LoadStatic() ) - { -#ifndef SDK_FINALROM - // 127: before Boot - pf_cnt = PROFILE_MAX-1; - profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); - { - int i; - PXI_RecvID(); - OS_TPrintf("\n[ARM7] Begin\n"); - for (i = 0; i < PROFILE_MAX; i++) - { - OS_TPrintf("0x%08X\n", profile[i]); - } - OS_TPrintf("\n[ARM7] End\n"); - } -#endif - OS_SetDebugLED(++step); - PM_BackLightOn( TRUE ); // last chance - PRODUCTION_CHECK(); - FATFS_Boot(); - } - } - } + goto end; } + +#ifndef SDK_FINALROM + // 5: after Open + profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); +#endif + OS_SetDebugLED(++step); + + PM_BackLightOn( FALSE ); + + if ( !FATFS_LoadHeader() || !FATFS_LoadStatic() ) + { + goto end; + } + +#ifndef SDK_FINALROM + // 127: before Boot + pf_cnt = PROFILE_MAX-1; + profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); + { + int i; + PXI_RecvID(); + OS_TPrintf("\n[ARM7] Begin\n"); + for (i = 0; i < PROFILE_MAX; i++) + { + OS_TPrintf("0x%08X\n", profile[i]); + } + OS_TPrintf("\n[ARM7] End\n"); + } +#endif + OS_SetDebugLED(++step); + PRODUCTION_CHECK(); + + PM_BackLightOn( TRUE ); // last chance + + FATFS_Boot(); + end: OS_SetDebugLED( (u8)(0xF0 | step)); diff --git a/build/nandfirm/sdmc-launcher/ARM9/main.c b/build/nandfirm/sdmc-launcher/ARM9/main.c index b38d29af..98924a71 100644 --- a/build/nandfirm/sdmc-launcher/ARM9/main.c +++ b/build/nandfirm/sdmc-launcher/ARM9/main.c @@ -55,7 +55,7 @@ static void PreInit(void) メインメモリ関連 */ // SHARED領域クリア (ここだけでOK?) - MIi_CpuClearFast( 0, (void*)HW_PXI_SIGNAL_PARAM_ARM9, HW_MAIN_MEM_SHARED_END-HW_PXI_SIGNAL_PARAM_ARM9); + MIi_CpuClearFast( 0, (void*)HW_PXI_SIGNAL_PARAM_ARM9, HW_MMEMCHECKER_MAIN-HW_PXI_SIGNAL_PARAM_ARM9); /* FromBrom関連 @@ -79,10 +79,15 @@ static void PostInit(void) /* メインメモリ関連 */ - // (DTCMの手前までの領域を全クリア) - //MI_CpuClearFast( (void*)HW_DELIVER_ARG_BUF_END, SDK_SECTION_ARENA_DTCM_START-HW_DELIVER_ARG_BUF_END ); - // (ARM9領域を全クリア) - MI_CpuClearFast( (void*)HW_DELIVER_ARG_BUF_END, HW_MAIN_MEM_MAIN_END-HW_DELIVER_ARG_BUF_END ); + // ARM9領域を全クリア + if ( OS_GetResetParameter() ) + { + MI_CpuClearFast( (void*)HW_DELIVER_ARG_BUF_END, HW_MAIN_MEM_MAIN_END-HW_DELIVER_ARG_BUF_END ); + } + else + { + MI_CpuClearFast( (void*)HW_MAIN_MEM_MAIN, HW_MAIN_MEM_MAIN_SIZE ); + } DC_FlushAll(); } @@ -90,8 +95,7 @@ static void PostInit(void) /*************************************************************** CheckHeader - ヘッダがシステムメニューとして問題ないかチェック - 先頭32Bは固定値と思われ (リマスターバージョンは違うかな) + ヘッダの内容がTWLアプリとして問題ないかチェック ***************************************************************/ static BOOL CheckHeader(void) {