無線ファームロード処理の修正。HotStart初期化に失敗した時は、その場でColdStartロードを再実行するようにする。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@951 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2008-03-26 02:59:50 +00:00
parent 5928ff205a
commit 3f548b7ba5
5 changed files with 80 additions and 24 deletions

View File

@ -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 ) void SYSM_SetLogoDemoSkip( BOOL skip )
{ {
@ -69,13 +90,6 @@ BOOL SYSMi_IsDebuggerBannerViewMode( void )
} }
// TPリード可能状態か
BOOL SYSM_IsTPReadable( void )
{
return TRUE;
}
// TSD有効/無効をセット // TSD有効/無効をセット
void SYSM_SetValidTSD( BOOL valid ) void SYSM_SetValidTSD( BOOL valid )
{ {

View File

@ -584,6 +584,8 @@ static TitleProperty *ProcessPads( TitleProperty *pTitleList )
{ {
//PlayStream(&strm, filename); //PlayStream(&strm, filename);
ret = &pTitleList[selected]; ret = &pTitleList[selected];
// ブートするアプリのindex番号を本体設定に保存する。実際の保存は、SYSMライブラリがブート時に行います。
LCFG_TSD_SetLastTimeBootSoftIndex( (u8)selected );
} }
} }
} }

View File

@ -54,7 +54,8 @@
/* /*
internal variables internal variables
*/ */
static BOOL s_isHotStartWLFirm;
static volatile BOOL s_isFinished;
static u32* pNwmBuf; static u32* pNwmBuf;
static u8* pFwBuffer = 0; static u8* pFwBuffer = 0;
#if (MEASURE_WIRELESS_INITTIME == 1) #if (MEASURE_WIRELESS_INITTIME == 1)
@ -339,12 +340,13 @@ void PrintDigest(u8 *digest)
#endif #endif
BOOL InstallWlanFirmware(void) BOOL InstallWlanFirmware( BOOL isHotStartWLFirm )
{ {
NWMRetCode err; NWMRetCode err;
BOOL isColdStart; BOOL isColdStart;
pNwmBuf = 0; s_isFinished = FALSE;
pNwmBuf = 0;
pFwBuffer = 0; pFwBuffer = 0;
OS_InitMessageQueue(&mesq, mesAry, sizeof(mesAry)/sizeof(mesAry[0])); OS_InitMessageQueue(&mesq, mesAry, sizeof(mesAry)/sizeof(mesAry[0]));
@ -357,7 +359,10 @@ BOOL InstallWlanFirmware(void)
TemporallyなWorkaroundとしてColdStart扱いにしています TemporallyなWorkaroundとしてColdStart扱いにしています
*/ */
if (TRUE == SYSMi_GetWork()->flags.common.isHotStart)
s_isHotStartWLFirm = isHotStartWLFirm;
if (TRUE == isHotStartWLFirm )
{ {
isColdStart = FALSE; isColdStart = FALSE;
@ -498,7 +503,7 @@ instfirm_error:
return FALSE; return FALSE;
} }
BOOL GetWlanFirmwareInstallResult(WLANFirmResult *pResult);
BOOL GetWlanFirmwareInstallResult(WLANFirmResult *pResult) BOOL GetWlanFirmwareInstallResult(WLANFirmResult *pResult)
{ {
OSMessage msg; OSMessage msg;
@ -510,3 +515,31 @@ BOOL GetWlanFirmwareInstallResult(WLANFirmResult *pResult)
return retval; 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;
}

View File

@ -33,23 +33,25 @@ typedef enum {
InstallWlanFirmware InstallWlanFirmware
   BOOL isForceLoad : TRUE->, FALSE->
TRUE TRUE
     FALSE      FALSE
*/ */
BOOL InstallWlanFirmware(void); BOOL InstallWlanFirmware( BOOL isHotStartWLFirm );
/* /*
GetWlanFirmwareInstallResult PollingInstallWlanFirmware
 pResult (WLANFirmResult)  
TRUE TRUE
FALSE FALSE
*/ */
BOOL GetWlanFirmwareInstallResult(WLANFirmResult *pResult); BOOL PollingInstallWlanFirmware( void );
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -100,10 +100,7 @@ void TwlMain( void )
(void)OS_EnableInterrupts(); (void)OS_EnableInterrupts();
SYSM_InitPXI(); // 割り込み許可後にコールする必要あり。 SYSM_InitPXI(); // 割り込み許可後にコールする必要あり。
while ( ! PXI_IsCallbackReady( PXI_FIFO_TAG_HOTSW, PXI_PROC_ARM7 ) )
{
}
FS_Init( FS_DMA_NOT_USE ); FS_Init( FS_DMA_NOT_USE );
#ifdef DEBUG_LAUNCHER_DUMP #ifdef DEBUG_LAUNCHER_DUMP
@ -132,10 +129,10 @@ void TwlMain( void )
// 各種パラメータの取得------------ // 各種パラメータの取得------------
pBootTitle = SYSM_ReadParameters(); // 本体設定データ、リセットパラメータのリード、検査用オート起動カード判定、量産ライン用キーショートカット起動判定等のリード pBootTitle = SYSM_ReadParameters(); // 本体設定データ、リセットパラメータのリード、検査用オート起動カード判定、量産ライン用キーショートカット起動判定等のリード
if( SYSMi_GetWork()->flags.common.isFatalError ) { if( SYSM_IsFatalError() ) {
// FATALエラー処理 // FATALエラー処理
} }
if( SYSMi_GetWork()->flags.common.isInitialSettings ) { if( !LCFG_TSD_IsFinishedInitialSetting() ) {
// 初回起動シーケンス判定 // 初回起動シーケンス判定
} }
@ -209,11 +206,14 @@ void TwlMain( void )
// 無線ファームウェアを無線モジュールにダウンロードする。 // 無線ファームウェアを無線モジュールにダウンロードする。
#if( WIRELESS_FIRM_LOADING == 1 ) #if( WIRELESS_FIRM_LOADING == 1 )
if( FALSE == InstallWlanFirmware() ) { if( FALSE == InstallWlanFirmware( SYSM_IsHotStart() ) ) {
OS_TPrintf( "ERROR: Wireless firmware download failed!\n" ); OS_TPrintf( "ERROR: Wireless firmware download failed!\n" );
} }
#endif #endif
if( SYSM_IsFatalError() ) {
// FATALエラー処理
}
// メインループ-------------------- // メインループ--------------------
while( 1 ) { while( 1 ) {
@ -280,6 +280,7 @@ void TwlMain( void )
break; break;
case AUTHENTICATE: case AUTHENTICATE:
if( ( direct_boot || ( !direct_boot && LauncherFadeout( s_titleList ) ) ) && if( ( direct_boot || ( !direct_boot && LauncherFadeout( s_titleList ) ) ) &&
PollingInstallWlanFirmware() && // アプリブート前に無線ファームのロードは完了しておく必要がある
SYSM_IsAuthenticateTitleFinished() ) SYSM_IsAuthenticateTitleFinished() )
{ {
switch ( SYSM_TryToBootTitle( pBootTitle, s_titleList ) ) { // アプリ認証結果取得orブート 成功時never return switch ( SYSM_TryToBootTitle( pBootTitle, s_titleList ) ) { // アプリ認証結果取得orブート 成功時never return
@ -300,8 +301,12 @@ void TwlMain( void )
// カードアプリリストの取得(スレッドで随時カード挿抜を通知されるものをメインループで取得) // カードアプリリストの取得(スレッドで随時カード挿抜を通知されるものをメインループで取得)
(void)SYSM_GetCardTitleList( s_titleList ); (void)SYSM_GetCardTitleList( s_titleList );
// 無線ファームロードのポーリング
(void)PollingInstallWlanFirmware();
// コマンドフラッシュ // コマンドフラッシュ
(void)SND_FlushCommand(SND_COMMAND_NOBLOCK); (void)SND_FlushCommand(SND_COMMAND_NOBLOCK);
} }
} }