From 39c5a465bda7aa768962a37eedb5778c422cc612 Mon Sep 17 00:00:00 2001 From: nakasima Date: Tue, 2 Sep 2008 11:41:35 +0000 Subject: [PATCH] =?UTF-8?q?FCRAM=E3=83=AA=E3=82=BB=E3=83=83=E3=83=88?= =?UTF-8?q?=E6=99=82=E3=83=95=E3=83=AA=E3=83=BC=E3=82=BA=E5=AF=BE=E7=AD=96?= =?UTF-8?q?=E3=80=82?= 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@2373 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../libraries_sysmenu/boot/ARM7/src/bootAPI.c | 42 +++++++++++++++++-- .../libraries_sysmenu/boot/ARM9/src/bootAPI.c | 9 ++-- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c index 70698de3..b0002439 100644 --- a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c +++ b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include "reboot.h" @@ -59,6 +60,8 @@ static void BOOTi_ClearREG_RAM( void ); static void BOOTi_CutAwayRegionList( u32 *regionlist, u32 start, u32 end ); static void BOOTi_CheckTitleBlackList( ROM_Header_Short *pROMH ); static void BOOTi_RebootCallback( void** entryp, void* mem_list, REBOOTTarget* target ); +static void BOOTi_SetMainMemModeForNTR( void ); +void BOOTi_SetMainMemModeForNTRCore( u32 addr ); // global variables-------------------------------------------------- @@ -150,6 +153,9 @@ static void BOOTi_RebootCallback( void** entryp, void* mem_list_v, REBOOTTarget* (void)OS_SetIrqMask(0); // SDKバージョンのサーチに時間がかかると、ARM9がHALTにかかってしまい、ARM7のサウンドスレッドがARM9にFIFOでデータ送信しようとしてもFIFOが一杯で送信できない状態で無限ループに入ってしまう。 (void)OS_SetIrqMaskEx(0); + MI_StopAllDma(); // 割り込み禁止状態でDMA停止 + MI_StopAllNDma(); + // 起動アプリNTR-ROMヘッダへのパッチ処理のためコピー MI_CpuCopyFast( th, dh, HW_CARD_ROM_HEADER_SIZE ); @@ -197,10 +203,6 @@ static void BOOTi_RebootCallback( void** entryp, void* mem_list_v, REBOOTTarget* HOTSW_DecryptObjectFile( addr ); } - BOOTi_ClearREG_RAM(); // ARM7側のメモリ&レジスタクリア。 - reg_MI_MBK9 = 0; // 全WRAMのロック解除 - reg_PXI_MAINPINTF = MAINP_SEND_IF | 0x0100; // ARM9に対してブートするようIRQで要求+ARM7のステートを1にする。 - // TWL/NTRモード判定 if ( ! dh->s.platform_code || (SYSM_IsRunOnDebugger() && ((SYSMRomEmuInfo*)HOTSW_GetRomEmulationBuffer())->isForceNTRMode) ) @@ -212,6 +214,18 @@ static void BOOTi_RebootCallback( void** entryp, void* mem_list_v, REBOOTTarget* isNtrMode = FALSE; } + // NTRモード時にはARM9やDMAがメインメモリをアクセスしていないタイミングでデータ非保持モードへ切り替え(フリーズ対策) + if ( isNtrMode ) + { + // ARM9がOS_Haltに達するまで待つ(0.1msec) + OS_SpinWait(HW_CPU_CLOCK_ARM7 / 10000); + BOOTi_SetMainMemModeForNTR(); + } + + BOOTi_ClearREG_RAM(); // ARM7側のメモリ&レジスタクリア。 + reg_MI_MBK9 = 0; // 全WRAMのロック解除 + reg_PXI_MAINPINTF = MAINP_SEND_IF | 0x0100; // ARM9に対してブートするようIRQで要求+ARM7のステートを1にする。 + // 鍵情報の引渡しを行う。 // ブートアプリのROMヘッダのaccessKeyControl情報を見て判定 SYSMi_SetAESKeysForAccessControl( isNtrMode, th ); @@ -357,6 +371,26 @@ static void BOOTi_RebootCallback( void** entryp, void* mem_list_v, REBOOTTarget* } } +static void BOOTi_SetMainMemModeForNTR( void ) +{ + BOOTi_SetMainMemModeForNTRCore(HW_TWL_MAIN_MEM_END - 2); + BOOTi_SetMainMemModeForNTRCore(HW_TWL_MAIN_MEM_EX_END - 2); +} + +asm void BOOTi_SetMainMemModeForNTRCore( u32 addr ) +{ + ldr r1, =MMEM_TCR0 + ldr r2, =MMEM_TCR1_DS + ldrh r3, [r0] + strh r3, [r0] + strh r3, [r0] + ldr r3, =MMEM_TCR2 + strh r1, [r0] + strh r2, [r0] + strh r3, [r0] + bx lr +} + static void BOOTi_ClearREG_RAM( void ) { #ifdef DEBUG_USED_CARD_SLOT_B_ diff --git a/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c b/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c index d1df29df..eddb17aa 100644 --- a/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c +++ b/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c @@ -99,7 +99,6 @@ static void BOOTi_RebootCallback( void** entryp, void* mem_list_v, REBOOTTarget* ROM_Header *th = (void*)REBOOTi_GetTwlRomHeaderAddr(); ROM_Header *dh = (void*)REBOOTi_GetRomHeaderAddr(); BOOL isNtrMode; - int i; // エントリアドレスの正当性をチェックし、無効な場合は無限ループに入る。 // SYSMi_CheckEntryAddress(); @@ -109,10 +108,8 @@ static void BOOTi_RebootCallback( void** entryp, void* mem_list_v, REBOOTTarget* (void)GX_VBlankIntr( FALSE ); DC_StoreAll(); - for( i = 0; i <= MI_DMA_MAX_NUM; i++ ) { // 割り込み禁止状態でDMA停止 - MI_StopDma( (u16)i ); - MI_StopNDma( (u16)i ); - } + MI_StopAllDma(); // 割り込み禁止状態でDMA停止 + MI_StopAllNDma(); (void)OS_SetIrqFunction( OS_IE_SUBP, ie_subphandler ); OS_EnableInterrupts(); @@ -122,7 +119,7 @@ static void BOOTi_RebootCallback( void** entryp, void* mem_list_v, REBOOTTarget* // ※もうFIFOはクリア済みなので、使わない。 // ARM7からの通知待ち // この時点でARM7によるdhへのNTR-ROMヘッダをコピーが保証される - OS_WaitIrq( 1, OS_IE_SUBP ); + OS_WaitInterrupt( 1, OS_IE_SUBP ); OS_TPrintf( "INTR SUBP passed!!\n" );