FCRAMリセット時フリーズ対策。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2373 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
nakasima 2008-09-02 11:41:35 +00:00
parent af5209da9a
commit 39c5a465bd
2 changed files with 41 additions and 10 deletions

View File

@ -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のステートをにする。
// 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のステートをにする。
// 鍵情報の引渡しを行う。
// ブートアプリの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_

View File

@ -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" );