mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
FCRAMリセット時フリーズ対策。
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2373 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
af5209da9a
commit
39c5a465bd
@ -23,6 +23,7 @@
|
||||
#include <sysmenu/hotsw.h>
|
||||
#include <sysmenu/ds.h>
|
||||
#include <firm/hw/ARM7/mmap_firm.h>
|
||||
#include <firm/mi/mainMemory.h>
|
||||
#include <firm/format/from_firm.h>
|
||||
#include <firm/aes/ARM7/aes_init.h>
|
||||
#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_
|
||||
|
||||
@ -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" );
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user