From 3f548b7ba507cbb2f9ef7694d4e9777a2fb83586 Mon Sep 17 00:00:00 2001 From: yosiokat Date: Wed, 26 Mar 2008 02:59:50 +0000 Subject: [PATCH] =?UTF-8?q?=E7=84=A1=E7=B7=9A=E3=83=95=E3=82=A1=E3=83=BC?= =?UTF-8?q?=E3=83=A0=E3=83=AD=E3=83=BC=E3=83=89=E5=87=A6=E7=90=86=E3=81=AE?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=80=82HotStart=E5=88=9D=E6=9C=9F=E5=8C=96?= =?UTF-8?q?=E3=81=AB=E5=A4=B1=E6=95=97=E3=81=97=E3=81=9F=E6=99=82=E3=81=AF?= =?UTF-8?q?=E3=80=81=E3=81=9D=E3=81=AE=E5=A0=B4=E3=81=A7ColdStart=E3=83=AD?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=82=92=E5=86=8D=E5=AE=9F=E8=A1=8C=E3=81=99?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=99=E3=82=8B=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@951 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../sysmenu/common/src/status.c | 28 +++++++++--- .../Launcher/ARM9/src/launcher.c | 2 + .../Launcher/ARM9/src/loadWlanFirm.c | 43 ++++++++++++++++--- .../Launcher/ARM9/src/loadWlanFirm.h | 12 +++--- build/systemMenu_RED/Launcher/ARM9/src/main.c | 19 +++++--- 5 files changed, 80 insertions(+), 24 deletions(-) diff --git a/build/libraries_sysmenu/sysmenu/common/src/status.c b/build/libraries_sysmenu/sysmenu/common/src/status.c index 9d812583..5e1d5c8e 100644 --- a/build/libraries_sysmenu/sysmenu/common/src/status.c +++ b/build/libraries_sysmenu/sysmenu/common/src/status.c @@ -35,6 +35,27 @@ const LauncherParamBody *SYSM_GetLauncherParamBody( void ) } +// ホットスタートか? +BOOL SYSM_IsHotStart( void ) +{ + return (BOOL)SYSMi_GetWork()->flags.common.isHotStart; +} + + +// FATALエラーかどうかをセット +void SYSM_SetFatalError( BOOL isFatalError ) +{ + SYSMi_GetWork()->flags.common.isFatalError = isFatalError; +} + + +// FATALエラーか? +BOOL SYSM_IsFatalError( void ) +{ + return (BOOL)SYSMi_GetWork()->flags.common.isFatalError; +} + + // ロゴデモスキップかどうかをセット void SYSM_SetLogoDemoSkip( BOOL skip ) { @@ -69,13 +90,6 @@ BOOL SYSMi_IsDebuggerBannerViewMode( void ) } -// TPリード可能状態か? -BOOL SYSM_IsTPReadable( void ) -{ - return TRUE; -} - - // TSD有効/無効をセット void SYSM_SetValidTSD( BOOL valid ) { diff --git a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c index bc1e0534..7c50bdd9 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c @@ -584,6 +584,8 @@ static TitleProperty *ProcessPads( TitleProperty *pTitleList ) { //PlayStream(&strm, filename); ret = &pTitleList[selected]; + // ブートするアプリのindex番号を本体設定に保存する。(実際の保存は、SYSMライブラリがブート時に行います。) + LCFG_TSD_SetLastTimeBootSoftIndex( (u8)selected ); } } } diff --git a/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.c b/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.c index 44675602..5004cf6c 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.c @@ -54,7 +54,8 @@ /* internal variables */ - +static BOOL s_isHotStartWLFirm; +static volatile BOOL s_isFinished; static u32* pNwmBuf; static u8* pFwBuffer = 0; #if (MEASURE_WIRELESS_INITTIME == 1) @@ -339,12 +340,13 @@ void PrintDigest(u8 *digest) #endif -BOOL InstallWlanFirmware(void) +BOOL InstallWlanFirmware( BOOL isHotStartWLFirm ) { NWMRetCode err; BOOL isColdStart; - pNwmBuf = 0; + s_isFinished = FALSE; + pNwmBuf = 0; pFwBuffer = 0; OS_InitMessageQueue(&mesq, mesAry, sizeof(mesAry)/sizeof(mesAry[0])); @@ -357,7 +359,10 @@ BOOL InstallWlanFirmware(void) TemporallyなWorkaroundとして、この場合はColdStart扱いにしています。 初期化時間等の要因を鑑みて、本実装をどうするか検討します。 */ - if (TRUE == SYSMi_GetWork()->flags.common.isHotStart) + + s_isHotStartWLFirm = isHotStartWLFirm; + + if (TRUE == isHotStartWLFirm ) { isColdStart = FALSE; @@ -498,7 +503,7 @@ instfirm_error: return FALSE; } - +BOOL GetWlanFirmwareInstallResult(WLANFirmResult *pResult); BOOL GetWlanFirmwareInstallResult(WLANFirmResult *pResult) { OSMessage msg; @@ -510,3 +515,31 @@ BOOL GetWlanFirmwareInstallResult(WLANFirmResult *pResult) return retval; } + + +// 無線ファームロード完了? +BOOL PollingInstallWlanFirmware( void ) +{ + if ( !s_isFinished ) { + WLANFirmResult result; + if( GetWlanFirmwareInstallResult( &result ) ) { + if( result != WLANFIRM_RESULT_SUCCESS ) { + // ロード失敗 + if( !s_isHotStartWLFirm ) { + // ColdStartの無線ファームロードなら、FATALエラー + SYSM_SetFatalError( TRUE ); + }else { + // そうでない場合は、ColdStartロードで再度実行。 + if( !InstallWlanFirmware( FALSE ) ) { + SYSM_SetFatalError( TRUE ); + s_isFinished = TRUE; + } + } + } + s_isFinished = TRUE; + } + } + return s_isFinished; +} + + diff --git a/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.h b/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.h index 1c0cdf3e..d595675e 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.h +++ b/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.h @@ -33,23 +33,25 @@ typedef enum { InstallWlanFirmware - 引数 :なし + 引数 :BOOL isForceLoad : TRUE->強制ファームロード, FALSE->ファームロードせずリスタート 返り値:TRUE … 無線ファームウェアインストールの非同期処理中      FALSE … 無線ファームウェアインストールに失敗した */ -BOOL InstallWlanFirmware(void); +BOOL InstallWlanFirmware( BOOL isHotStartWLFirm ); + /* - GetWlanFirmwareInstallResult + PollingInstallWlanFirmware - 引数 :pResult 無線ファームウェアインストール結果コード(WLANFirmResult) + 引数 :なし 返り値:TRUE … 無線ファームウェアインストール処理が完了 FALSE … 無線ファームウェアインストール処理が未完了 */ -BOOL GetWlanFirmwareInstallResult(WLANFirmResult *pResult); +BOOL PollingInstallWlanFirmware( void ); + #ifdef __cplusplus } diff --git a/build/systemMenu_RED/Launcher/ARM9/src/main.c b/build/systemMenu_RED/Launcher/ARM9/src/main.c index 5de393a4..5a291a52 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/main.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/main.c @@ -100,10 +100,7 @@ void TwlMain( void ) (void)OS_EnableInterrupts(); SYSM_InitPXI(); // 割り込み許可後にコールする必要あり。 - while ( ! PXI_IsCallbackReady( PXI_FIFO_TAG_HOTSW, PXI_PROC_ARM7 ) ) - { - } - + FS_Init( FS_DMA_NOT_USE ); #ifdef DEBUG_LAUNCHER_DUMP @@ -132,10 +129,10 @@ void TwlMain( void ) // 各種パラメータの取得------------ pBootTitle = SYSM_ReadParameters(); // 本体設定データ、リセットパラメータのリード、検査用オート起動カード判定、量産ライン用キーショートカット起動判定等のリード - if( SYSMi_GetWork()->flags.common.isFatalError ) { + if( SYSM_IsFatalError() ) { // FATALエラー処理 } - if( SYSMi_GetWork()->flags.common.isInitialSettings ) { + if( !LCFG_TSD_IsFinishedInitialSetting() ) { // 初回起動シーケンス判定 } @@ -209,11 +206,14 @@ void TwlMain( void ) // 無線ファームウェアを無線モジュールにダウンロードする。 #if( WIRELESS_FIRM_LOADING == 1 ) - if( FALSE == InstallWlanFirmware() ) { + if( FALSE == InstallWlanFirmware( SYSM_IsHotStart() ) ) { OS_TPrintf( "ERROR: Wireless firmware download failed!\n" ); } #endif + if( SYSM_IsFatalError() ) { + // FATALエラー処理 + } // メインループ-------------------- while( 1 ) { @@ -280,6 +280,7 @@ void TwlMain( void ) break; case AUTHENTICATE: if( ( direct_boot || ( !direct_boot && LauncherFadeout( s_titleList ) ) ) && + PollingInstallWlanFirmware() && // アプリブート前に無線ファームのロードは完了しておく必要がある SYSM_IsAuthenticateTitleFinished() ) { switch ( SYSM_TryToBootTitle( pBootTitle, s_titleList ) ) { // アプリ認証結果取得orブート 成功時:never return @@ -300,8 +301,12 @@ void TwlMain( void ) // カードアプリリストの取得(スレッドで随時カード挿抜を通知されるものをメインループで取得) (void)SYSM_GetCardTitleList( s_titleList ); + // 無線ファームロードのポーリング + (void)PollingInstallWlanFirmware(); + // コマンドフラッシュ (void)SND_FlushCommand(SND_COMMAND_NOBLOCK); + } }