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