無線ファームロード処理の修正。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 )
{
@ -69,13 +90,6 @@ BOOL SYSMi_IsDebuggerBannerViewMode( void )
}
// TPリード可能状態か
BOOL SYSM_IsTPReadable( void )
{
return TRUE;
}
// TSD有効/無効をセット
void SYSM_SetValidTSD( BOOL valid )
{

View File

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

View File

@ -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;
}

View File

@ -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
}

View File

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