デバッグコード少し追加

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@584 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yutaka 2008-02-05 07:46:15 +00:00
parent ea8e8d89db
commit 77e47d46f3

View File

@ -43,123 +43,129 @@ static StreamInfo strm; // stream info
const char filename[] = "data/fanfare.32.wav"; const char filename[] = "data/fanfare.32.wav";
//#define DEBUG_LAUNCHER_DUMP
#ifdef DEBUG_LAUNCHER_DUMP #ifdef DEBUG_LAUNCHER_DUMP
// デバグ用。SDに0x02ffc000から0x02ffe000までdump.datというダンプを吐く // デバグ用。SDに0x02ffc000から0x02ffe000までdump.datというダンプを吐く
static void debugWriteToSD( void ) static void debugWriteToSD( void )
{ {
FSFile dest; FSFile dest;
FS_InitFile( &dest ); FS_InitFile( &dest );
(void)FS_CreateFile("sdmc:/dump.dat", FS_PERMIT_W | FS_PERMIT_R); (void)FS_CreateFile("sdmc:/dump.dat", FS_PERMIT_W | FS_PERMIT_R);
if ( !FS_OpenFileEx( &dest, "sdmc:/dump.dat", FS_FILEMODE_W ) ) return; if ( !FS_OpenFileEx( &dest, "sdmc:/dump.dat", FS_FILEMODE_W ) ) return;
FS_WriteFile( &dest, (void *)0x02ffc000, 0x2000 ); FS_WriteFile( &dest, (void *)0x02ffc000, 0x2000 );
if ( !FS_CloseFile( &dest ) ) return; if ( !FS_CloseFile( &dest ) ) return;
OS_TPrintf( "debugWriteToSD:ok\n"); OS_TPrintf( "debugWriteToSD:ok\n");
} }
#endif #endif
// メイン // メイン
void TwlMain( void ) void TwlMain( void )
{ {
enum { enum {
LOGODEMO_INIT = 0, LOGODEMO_INIT = 0,
LOGODEMO = 1, LOGODEMO = 1,
LAUNCHER_INIT = 2, LAUNCHER_INIT = 2,
LAUNCHER = 3, LAUNCHER = 3,
LOAD_START = 4, LOAD_START = 4,
LOADING = 5, LOADING = 5,
AUTHENTICATE = 6, AUTHENTICATE = 6,
BOOT = 7, BOOT = 7,
STOP = 8 STOP = 8
}; };
u32 state = LOGODEMO_INIT; u32 state = LOGODEMO_INIT;
TitleProperty *pBootTitle = NULL; TitleProperty *pBootTitle = NULL;
OSTick start, end = 0; OSTick start, end = 0;
BOOL direct_boot = FALSE; BOOL direct_boot = FALSE;
// システムメニュー初期化----------
SYSM_Init( Alloc, Free ); // OS_Initの前でコールする必要あり。
OS_Init();
SYSM_SetArena(); // OS_Initの後でコールする必要あり。
// OS初期化------------------------
OS_InitTick();
PM_Init();
(void)OS_EnableIrq();
(void)OS_EnableInterrupts();
FS_Init( FS_DMA_NOT_USE );
#ifdef DEBUG_LAUNCHER_DUMP #ifdef DEBUG_LAUNCHER_DUMP
// debug // you should comment out to clear GX/G2/DMA/TM/PAD register in reboot.c to retreive valid boot time
debugWriteToSD(); STD_TSPrintf((char*)0x02FFCFD0, "\nLauncher Boot Time: %lld usec\n", OS_TicksToMicroSeconds(OS_GetTick()));
STD_TSPrintf((char*)0x02FFCFF0, "HOTSTART(0x%08x): %02x\n", HW_NAND_FIRM_HOTSTART_FLAG, *(u8 *)HW_NAND_FIRM_HOTSTART_FLAG);
#endif #endif
// システムメニュー初期化----------
SYSM_Init( Alloc, Free ); // OS_Initの前でコールする必要あり。
OS_Init();
SYSM_SetArena(); // OS_Initの後でコールする必要あり。
// OS初期化------------------------
OS_InitTick();
PM_Init();
(void)OS_EnableIrq();
(void)OS_EnableInterrupts();
FS_Init( FS_DMA_NOT_USE );
#ifdef DEBUG_LAUNCHER_DUMP
// debug
debugWriteToSD();
#endif
GX_Init(); GX_Init();
PM_Init(); PM_Init();
TP_Init(); TP_Init();
RTC_Init(); RTC_Init();
SND_Init();// sound init SND_Init();// sound init
OS_TPrintf( "SYSM_work size = 0x%x\n", sizeof(SYSM_work) ); OS_TPrintf( "SYSM_work size = 0x%x\n", sizeof(SYSM_work) );
// 割り込み許可-------------------- // 割り込み許可--------------------
(void)OS_SetIrqFunction(OS_IE_V_BLANK, INTR_VBlank); (void)OS_SetIrqFunction(OS_IE_V_BLANK, INTR_VBlank);
(void)OS_EnableIrqMask(OS_IE_V_BLANK); (void)OS_EnableIrqMask(OS_IE_V_BLANK);
(void)GX_VBlankIntr(TRUE); (void)GX_VBlankIntr(TRUE);
// システムの初期化---------------- // システムの初期化----------------
InitAllocator(); // ※SYSM_Init以外のSYSMライブラリ関数を呼ぶ前に InitAllocator(); // ※SYSM_Init以外のSYSMライブラリ関数を呼ぶ前に
// Alloc, Freeで登録したメモリアロケータを初期化してください。 // Alloc, Freeで登録したメモリアロケータを初期化してください。
// 各種パラメータの取得------------ // 各種パラメータの取得------------
pBootTitle = SYSM_ReadParameters(); // 本体設定データ、リセットパラメータ、 pBootTitle = SYSM_ReadParameters(); // 本体設定データ、リセットパラメータ、
// 初回起動シーケンス判定、 // 初回起動シーケンス判定、
// 検査用オート起動カード判定、量産ライン用キーショートカット起動判定等のリード // 検査用オート起動カード判定、量産ライン用キーショートカット起動判定等のリード
(void)SYSM_GetCardTitleList( s_titleList ); // カードアプリリストの取得カードアプリはs_titleList[0]に格納される) (void)SYSM_GetCardTitleList( s_titleList ); // カードアプリリストの取得カードアプリはs_titleList[0]に格納される)
// bootTypeがLAUNCHER_BOOTTYPE_TEMPでない場合、tmpフォルダ内のデータを消す // bootTypeがLAUNCHER_BOOTTYPE_TEMPでない場合、tmpフォルダ内のデータを消す
if( !pBootTitle || pBootTitle->flags.bootType != LAUNCHER_BOOTTYPE_TEMP ) if( !pBootTitle || pBootTitle->flags.bootType != LAUNCHER_BOOTTYPE_TEMP )
{ {
deleteTmp(); deleteTmp();
} }
// 「ダイレクトブートでない」なら // 「ダイレクトブートでない」なら
if( !pBootTitle ) { if( !pBootTitle ) {
// アプリ間パラメタをクリア // アプリ間パラメタをクリア
// TODO:あらかじめNTRカードのセキュア領域を退避せずに直接0x2000000からロードしている場合も容赦なく消すので注意 // TODO:あらかじめNTRカードのセキュア領域を退避せずに直接0x2000000からロードしている場合も容赦なく消すので注意
MI_CpuClearFast((void *)HW_PARAM_DELIVER_ARG, HW_PARAM_DELIVER_ARG_SIZE); MI_CpuClearFast((void *)HW_PARAM_DELIVER_ARG, HW_PARAM_DELIVER_ARG_SIZE);
// NAND & カードアプリリスト取得 // NAND & カードアプリリスト取得
(void)SYSM_GetNandTitleList( s_titleList, LAUNCHER_TITLE_LIST_NUM ); // NANDアプリリストの取得内蔵アプリはs_titleList[1]から格納される) (void)SYSM_GetNandTitleList( s_titleList, LAUNCHER_TITLE_LIST_NUM ); // NANDアプリリストの取得内蔵アプリはs_titleList[1]から格納される)
} }
// 「ダイレクトブートでない」もしくは // 「ダイレクトブートでない」もしくは
// 「ダイレクトブートだが、ロゴデモ表示」の時、各種リソースのロード------------ // 「ダイレクトブートだが、ロゴデモ表示」の時、各種リソースのロード------------
if( !pBootTitle || if( !pBootTitle ||
( pBootTitle && !SYSM_IsLogoDemoSkip() ) ) { ( pBootTitle && !SYSM_IsLogoDemoSkip() ) ) {
// FS_ReadContentFile( ContentID ); // タイトル内リソースファイルのリード // FS_ReadContentFile( ContentID ); // タイトル内リソースファイルのリード
// FS_ReadSharedContentFile( ContentID ); // 共有コンテントファイルのリード // FS_ReadSharedContentFile( ContentID ); // 共有コンテントファイルのリード
} }
// 開始ステートの判定-------------- // 開始ステートの判定--------------
if( pBootTitle ) { if( pBootTitle ) {
// ダイレクトブートなら、ロゴ、ランチャーを飛ばしてロード開始 // ダイレクトブートなら、ロゴ、ランチャーを飛ばしてロード開始
if( pBootTitle->flags.isLogoSkip ) { if( pBootTitle->flags.isLogoSkip ) {
state = LOAD_START; state = LOAD_START;
}else { }else {
state = LOGODEMO_INIT; state = LOGODEMO_INIT;
} }
direct_boot = TRUE; direct_boot = TRUE;
}else if( SYSM_IsLogoDemoSkip() ) { }else if( SYSM_IsLogoDemoSkip() ) {
// ロゴデモスキップが指定されていたら、ランチャー起動 // ロゴデモスキップが指定されていたら、ランチャー起動
state = LAUNCHER_INIT; state = LAUNCHER_INIT;
}else { }else {
// 何もないなら、ロゴデモ起動 // 何もないなら、ロゴデモ起動
state = LOGODEMO_INIT; state = LOGODEMO_INIT;
} }
// チャンネルをロックする // チャンネルをロックする
SND_LockChannel((1 << L_CHANNEL) | (1 << R_CHANNEL), 0); SND_LockChannel((1 << L_CHANNEL) | (1 << R_CHANNEL), 0);
@ -170,87 +176,87 @@ void TwlMain( void )
strmThreadStack + THREAD_STACK_SIZE / sizeof(u64), strmThreadStack + THREAD_STACK_SIZE / sizeof(u64),
THREAD_STACK_SIZE, STREAM_THREAD_PRIO); THREAD_STACK_SIZE, STREAM_THREAD_PRIO);
OS_WakeupThreadDirect(&strmThread); OS_WakeupThreadDirect(&strmThread);
// メインループ-------------------- // メインループ--------------------
while( 1 ) { while( 1 ) {
OS_WaitIrq(1, OS_IE_V_BLANK); // Vブランク割り込み待ち OS_WaitIrq(1, OS_IE_V_BLANK); // Vブランク割り込み待ち
// ARM7コマンド応答受信 // ARM7コマンド応答受信
while (SND_RecvCommandReply(SND_COMMAND_NOBLOCK) != NULL) while (SND_RecvCommandReply(SND_COMMAND_NOBLOCK) != NULL)
{ {
} }
ReadKeyPad(); // キー入力の取得
ReadTP(); // TP入力の取得
switch( state ) {
case LOGODEMO_INIT:
LogoInit();
// 音鳴らすテスト
FS_InitFile(&strm.file);
strm.isPlay = FALSE;
PlayStream(&strm, filename);
state = LOGODEMO; ReadKeyPad(); // キー入力の取得
break; ReadTP(); // TP入力の取得
case LOGODEMO:
if( LogoMain() ) { switch( state ) {
if( !direct_boot ) { case LOGODEMO_INIT:
state = LAUNCHER_INIT; LogoInit();
}else { // 音鳴らすテスト
state = LOAD_START; FS_InitFile(&strm.file);
} strm.isPlay = FALSE;
} PlayStream(&strm, filename);
break;
case LAUNCHER_INIT: state = LOGODEMO;
LauncherInit( s_titleList ); break;
state = LAUNCHER; case LOGODEMO:
break; if( LogoMain() ) {
case LAUNCHER: if( !direct_boot ) {
pBootTitle = LauncherMain( s_titleList ); state = LAUNCHER_INIT;
if( pBootTitle ) { }else {
state = LOAD_START; state = LOAD_START;
} }
break; }
case LOAD_START: break;
SYSM_StartLoadTitle( pBootTitle ); case LAUNCHER_INIT:
state = LOADING; LauncherInit( s_titleList );
state = LAUNCHER;
start = OS_GetTick(); break;
case LAUNCHER:
break; pBootTitle = LauncherMain( s_titleList );
case LOADING: if( pBootTitle ) {
if( ( direct_boot || ( !direct_boot && LauncherFadeout( s_titleList ) ) ) && state = LOAD_START;
SYSM_IsLoadTitleFinished( pBootTitle ) ) { }
state = AUTHENTICATE; break;
} case LOAD_START:
SYSM_StartLoadTitle( pBootTitle );
if( ( end == 0 ) && state = LOADING;
SYSM_IsLoadTitleFinished( pBootTitle ) ) {
end = OS_GetTick(); start = OS_GetTick();
OS_TPrintf( "Load Time : %dms\n", OS_TicksToMilliSeconds( end - start ) );
} break;
break; case LOADING:
case AUTHENTICATE: if( ( direct_boot || ( !direct_boot && LauncherFadeout( s_titleList ) ) ) &&
switch ( SYSM_AuthenticateTitle( pBootTitle ) ) { // アプリ認証&ブート 成功時never return SYSM_IsLoadTitleFinished( pBootTitle ) ) {
case AUTH_RESULT_TITLE_LOAD_FAILED: state = AUTHENTICATE;
case AUTH_RESULT_TITLE_POINTER_ERROR: }
case AUTH_RESULT_AUTHENTICATE_FAILED:
case AUTH_RESULT_ENTRY_ADDRESS_ERROR: if( ( end == 0 ) &&
state = STOP; SYSM_IsLoadTitleFinished( pBootTitle ) ) {
break; end = OS_GetTick();
} OS_TPrintf( "Load Time : %dms\n", OS_TicksToMilliSeconds( end - start ) );
break; }
case STOP: // 停止 break;
break; case AUTHENTICATE:
} switch ( SYSM_AuthenticateTitle( pBootTitle ) ) { // アプリ認証&ブート 成功時never return
case AUTH_RESULT_TITLE_LOAD_FAILED:
// カードアプリリストの取得(スレッドで随時カード挿抜を通知されるものをメインループで取得) case AUTH_RESULT_TITLE_POINTER_ERROR:
(void)SYSM_GetCardTitleList( s_titleList ); case AUTH_RESULT_AUTHENTICATE_FAILED:
case AUTH_RESULT_ENTRY_ADDRESS_ERROR:
state = STOP;
break;
}
break;
case STOP: // 停止
break;
}
// カードアプリリストの取得(スレッドで随時カード挿抜を通知されるものをメインループで取得)
(void)SYSM_GetCardTitleList( s_titleList );
// コマンドフラッシュ // コマンドフラッシュ
(void)SND_FlushCommand(SND_COMMAND_NOBLOCK); (void)SND_FlushCommand(SND_COMMAND_NOBLOCK);
} }
} }
@ -261,7 +267,7 @@ void TwlMain( void )
// Vブランク割り込み // Vブランク割り込み
static void INTR_VBlank(void) static void INTR_VBlank(void)
{ {
OS_SetIrqCheckFlag(OS_IE_V_BLANK); // Vブランク割込チェックのセット OS_SetIrqCheckFlag(OS_IE_V_BLANK); // Vブランク割込チェックのセット
} }
// ============================================================================ // ============================================================================
@ -271,34 +277,34 @@ static void INTR_VBlank(void)
// nandのtmpディレクトリの中身を消す // nandのtmpディレクトリの中身を消す
static void deleteTmp() static void deleteTmp()
{ {
FSFile dir; FSFile dir;
FSDirectoryEntryInfo info; FSDirectoryEntryInfo info;
FS_InitFile(&dir); FS_InitFile(&dir);
if(!FS_OpenDirectory(&dir, "nand:/tmp", FS_FILEMODE_R | FS_FILEMODE_W)) if(!FS_OpenDirectory(&dir, "nand:/tmp", FS_FILEMODE_R | FS_FILEMODE_W))
{ {
OS_TPrintf( "ERROR deleteTmp: open nand:/tmp failed!\n" ); OS_TPrintf( "ERROR deleteTmp: open nand:/tmp failed!\n" );
return; return;
} }
while(FS_ReadDirectory(&dir, &info)) while(FS_ReadDirectory(&dir, &info))
{ {
if(info.attributes & FS_ATTRIBUTE_IS_DIRECTORY) if(info.attributes & FS_ATTRIBUTE_IS_DIRECTORY)
{ {
//ディレクトリは今のところ削除しない //ディレクトリは今のところ削除しない
}else }else
{ {
//ファイルは今のところsrlのみ削除 //ファイルは今のところsrlのみ削除
char buf[512]; char buf[512];
u32 end = info.longname_length; u32 end = info.longname_length;
if( (info.longname[end-1]=='l' || info.longname[end-1]=='L') && if( (info.longname[end-1]=='l' || info.longname[end-1]=='L') &&
(info.longname[end-2]=='r' || info.longname[end-2]=='R') && (info.longname[end-2]=='r' || info.longname[end-2]=='R') &&
(info.longname[end-3]=='s' || info.longname[end-3]=='S') && (info.longname[end-3]=='s' || info.longname[end-3]=='S') &&
(info.longname[end-4]=='.') ) (info.longname[end-4]=='.') )
{ {
STD_TSNPrintf( buf, 512, "nand:/tmp/%s",info.longname); STD_TSNPrintf( buf, 512, "nand:/tmp/%s",info.longname);
FS_DeleteFile( buf ); FS_DeleteFile( buf );
OS_TPrintf( "deleteTmp: deleted File '%s' \n", buf ); OS_TPrintf( "deleteTmp: deleted File '%s' \n", buf );
} }
} }
} }
FS_CloseDirectory(&dir); FS_CloseDirectory(&dir);
} }