FATALエラー処理をUTLライブラリにまとめる。

初回起動シーケンス処理の実装。(デフォルトOFF)
フラッシュ壊れシーケンス処理の実装。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1682 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2008-06-24 13:13:16 +00:00
parent 135e621bea
commit fb932ac222
11 changed files with 148 additions and 93 deletions

View File

@ -52,11 +52,8 @@ void SYSMi_CheckRTC( void )
// RTCのリセット or おかしい値を検出した場合は初回起動シーケンスへ。
( void )RTC_GetDateTime( &date, &time );
if( !UTL_CheckRTCDate( &date ) ||
!UTL_CheckRTCTime( &time )
#ifndef __IS_DEBUGGER_BUILD // 青デバッガではRTCの電池がないので、毎回ここにひっかかって設定データが片方クリアされてしまう。これを防ぐスイッチ。
||
!UTL_CheckRTCTime( &time ) ||
SYSMi_GetWork()->flags.common.isResetRTC
#endif
) { // RTCの異常を検出したら、rtc入力フラグrtcOffsetを0にしてNVRAMに書き込み。
OS_TPrintf("\"RTC reset\" or \"Illegal RTC data\" detect!\n");
LCFG_TSD_SetRTCOffset( 0 );

View File

@ -152,6 +152,13 @@ void SYSM_DeleteTmpDirectory( TitleProperty *pBootTitle )
TitleProperty *SYSM_ReadParameters( void )
{
TitleProperty *pBootTitle = NULL;
//-----------------------------------------------------
// FATALエラーチェック
//-----------------------------------------------------
if( SYSMi_GetWork()->flags.common.isNANDFatalError ) {
UTL_SetFatalError( FATAL_ERROR_NAND );
}
//-----------------------------------------------------
// HW情報のリード
@ -159,14 +166,12 @@ TitleProperty *SYSM_ReadParameters( void )
// ノーマル情報リード
if( !LCFG_ReadHWNormalInfo() ) {
OS_TPrintf( "HW Normal Info Broken!\n" );
SYSMi_GetWork()->flags.common.isBrokenHWNormalInfo = TRUE;
SYSM_SetFatalError( TRUE );
UTL_SetFatalError( FATAL_ERROR_HWINFO_NORMAL );
}
// セキュア情報リード
if( !LCFG_ReadHWSecureInfo() ) {
OS_TPrintf( "HW Secure Info Broken!\n" );
SYSMi_GetWork()->flags.common.isBrokenHWSecureInfo = TRUE;
SYSM_SetFatalError( TRUE );
UTL_SetFatalError( FATAL_ERROR_HWINFO_SECURE );
}
//-----------------------------------------------------
@ -175,10 +180,20 @@ TitleProperty *SYSM_ReadParameters( void )
{
u8 *pBuffer = SYSM_Alloc( LCFG_READ_TEMP );
if( pBuffer ) {
LCFG_ReadTWLSettings( (u8 (*)[LCFG_READ_TEMP])pBuffer ); // NANDからTWL本体設定データをリード
if( !LCFG_ReadTWLSettings( (u8 (*)[LCFG_READ_TEMP])pBuffer ) ) { // NANDからTWL本体設定データをリード
// リード失敗時は、ファイルをリカバリ
if( LCFG_RecoveryTWLSettings() ) {
// リカバリ成功時は、フラッシュ壊れシーケンスへ
SYSMi_GetWork()->flags.common.isBrokenTWLSettings = TRUE;
}else {
// リカバリ失敗時は、FALTALエラー
UTL_SetFatalError( FATAL_ERROR_TWLSETTINGS );
}
}
SYSM_Free( pBuffer );
}else {
SYSM_SetFatalError( TRUE );
// メモリ確保ができなかった時は、FATALエラー
UTL_SetFatalError( FATAL_ERROR_TWLSETTINGS );
}
LCFG_VerifyAndRecoveryNTRSettings(); // NTR設定データを読み出して、TWL設定データとベリファイし、必要ならリカバリ
}
@ -266,7 +281,7 @@ TitleProperty *SYSM_ReadParameters( void )
}
// アプリジャンプでないときには、アプリ間パラメタをクリア
// [TODO:]あらかじめNTRカードのセキュア領域を退避せずに直接0x2000000からロードしている場合も容赦なく消すので注意
// あらかじめNTRカードのセキュア領域を退避せずに直接0x2000000からロードしている場合も容赦なく消すので注意
if( !pBootTitle )
{
MI_CpuClearFast((void *)HW_PARAM_DELIVER_ARG, HW_PARAM_DELIVER_ARG_SIZE);
@ -284,10 +299,8 @@ TitleProperty *SYSM_ReadParameters( void )
// 量産工程用ショートカットキー or
// 検査カード起動
//-----------------------------------------------------
if( pBootTitle == NULL && // ココまでダイレクトブートが設定されていない場合のみ判定
!( SYSMi_GetWork()->flags.common.isValidLauncherParam && SYSM_GetLauncherParamBody()->v1.flags.isLogoSkip ) )
// 「ランチャー再起動指定(直接起動指定無し 且つ ランチャパラメタ有効 且つ ロゴスキップ指定)でない」
{
if( pBootTitle == NULL ) {
// ココまでダイレクトブートが設定されていない場合のみ判定
pBootTitle = SYSMi_CheckShortcutBoot1();
}
@ -403,54 +416,47 @@ static TitleProperty *SYSMi_CheckShortcutBoot1( void )
// ショートカット起動のチェックその2
static TitleProperty *SYSMi_CheckShortcutBoot2( void )
{
BOOL isSetArgument = FALSE;
BOOL isBootMSET = FALSE;
u16 argument = 0;
MI_CpuClear8( &s_bootTitleBuf, sizeof(TitleProperty) );
//-----------------------------------------------------
// TWL設定データ破損時のフラッシュ壊れシーケンス起動
//-----------------------------------------------------
if( SYSMi_GetWork()->flags.common.isBrokenTWLSettings ) {
argument = 100; // フラッシュ壊れシーケンス起動
isSetArgument = TRUE;
isBootMSET = TRUE;
}
//-----------------------------------------------------
// TWL設定データ未入力時の初回起動シーケンス起動
// TWL設定データ未設定時の初回起動シーケンス起動
//-----------------------------------------------------
#if 0
#ifdef ENABLE_INITIAL_SETTINGS_
#ifndef DISABLE_INITIAL_SETTINGS
if( !LCFG_TSD_IsFinishedInitialSetting() ) {
s_bootTitleBuf.titleID = SYSMi_getTitleIdOfMachineSettings();
if(s_bootTitleBuf.titleID != 0)
{
s_bootTitleBuf.flags.isLogoSkip = TRUE; // 本体設定を起動できる時だけロゴデモを飛ばす
}
s_bootTitleBuf.flags.bootType = LAUNCHER_BOOTTYPE_NAND;
s_bootTitleBuf.flags.isValid = TRUE;
s_bootTitleBuf.flags.isAppRelocate = FALSE;
s_bootTitleBuf.flags.isAppLoadCompleted = FALSE;
return &s_bootTitleBuf;
argument = 0;
isSetArgument = FALSE;
isBootMSET = TRUE;
}
#endif // ENABLE_INITIAL_SETTINGS_
#endif
//-----------------------------------------------------
// スタンドアロン起動時、ショートカットキー(select)
// を押しながらの起動で本体設定の直接起動
// [TODO:]最終的にはL+R+Start起動でタッチパネル設定のショートカット起動になる予定
// L+R+Startボタン押下起動で、本体設定のタッチパネル設定を起動
//-----------------------------------------------------
if( ( PAD_Read() & SYSM_PAD_SHORTCUT_MACHINE_SETTINGS ) ==
SYSM_PAD_SHORTCUT_MACHINE_SETTINGS )
{
s_bootTitleBuf.titleID = SYSMi_getTitleIdOfMachineSettings();
if(s_bootTitleBuf.titleID != 0)
{
s_bootTitleBuf.flags.isLogoSkip = TRUE; // 本体設定を起動できる時だけロゴデモを飛ばす
}
s_bootTitleBuf.flags.bootType = LAUNCHER_BOOTTYPE_NAND;
s_bootTitleBuf.flags.isValid = TRUE;
s_bootTitleBuf.flags.isAppRelocate = FALSE;
s_bootTitleBuf.flags.isAppLoadCompleted = FALSE;
return &s_bootTitleBuf;
SYSM_PAD_SHORTCUT_TP_CALIBRATION ) {
argument = OS_TWL_MACHINE_SETTING_TP_CALIBRATION;
isSetArgument = TRUE;
isBootMSET = TRUE;
}
// スタンドアロン起動時
//-----------------------------------------------------
// ランチャー画面を表示しないバージョンの場合
// カードがささっていたらカードを起動する
// ささっていない場合は本体設定を起動
//-----------------------------------------------------
#ifdef DO_NOT_SHOW_LAUNCHER
if( SYSM_IsExistCard() )
{
@ -473,17 +479,44 @@ static TitleProperty *SYSMi_CheckShortcutBoot2( void )
return &s_bootTitleBuf;
}else
{
s_bootTitleBuf.flags.isLogoSkip = TRUE; // ロゴデモを飛ばす
argument = 0;
isSetArgument = FALSE;
isBootMSET = TRUE;
}
#endif
// 「アプリ間パラメータセット」有効時は、パラメータをセット
if( isSetArgument ) {
OSDeliverArgInfo argInfo;
int result;
OS_InitDeliverArgInfo(&argInfo, 0);
OS_DecodeDeliverArg();
OSi_SetDeliverArgState( OS_DELIVER_ARG_BUF_ACCESSIBLE | OS_DELIVER_ARG_BUF_WRITABLE );
result = OS_SetSysParamToDeliverArg( (u16)argument );
if(result != OS_DELIVER_ARG_SUCCESS )
{
OS_Warning("Failed to Set DeliverArgument.");
return FALSE;
}
OS_EncodeDeliverArg();
}
// 「本体設定ブート」有効時は、本体設定プート決定
if( isBootMSET ) {
s_bootTitleBuf.titleID = SYSMi_getTitleIdOfMachineSettings();
if(s_bootTitleBuf.titleID != 0)
{
s_bootTitleBuf.flags.isLogoSkip = TRUE; // 本体設定を起動できる時だけロゴデモを飛ばす
}
s_bootTitleBuf.flags.bootType = LAUNCHER_BOOTTYPE_NAND;
s_bootTitleBuf.flags.isValid = TRUE;
s_bootTitleBuf.flags.isAppRelocate = FALSE;
s_bootTitleBuf.flags.isAppLoadCompleted = FALSE;
return &s_bootTitleBuf;
}
#endif
return NULL; // 「ブート内容未定」でリターン
}

View File

@ -42,20 +42,6 @@ BOOL SYSM_IsHotStart( void )
}
// 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 )
{
@ -80,13 +66,13 @@ BOOL SYSM_IsRunOnDebugger( void )
// ISデバッガのバナービューモード起動かどうか
BOOL SYSMi_IsDebuggerBannerViewMode( void )
{
#ifdef __IS_DEBUGGER_BUILD
#if 0
return ( SYSM_IsRunOnDebugger() &&
SYSMi_IsValidCard() &&
SYSM_GetCardRomHeader()->dbgRomSize == 0 ) ? TRUE : FALSE;
#else
return FALSE;
#endif // __IS_DEBUGGER_BUILD
#endif
}

View File

@ -25,6 +25,7 @@
// extern data------------------------------------------
// function's prototype declaration---------------------
static s64 UTLi_CalcRTCSecOffset( RTCDate *datep, RTCTime *timep );
static u32 s_fatalError = 0;
// global variable -------------------------------------
// static variable -------------------------------------
@ -259,3 +260,28 @@ BOOL UTL_CheckRTCTime( RTCTime *timep )
return TRUE;
}
//======================================================================
// FATALエラー処理
//======================================================================
// FATALエラーをセット
void UTL_SetFatalError( FatalErrorCode error )
{
s_fatalError |= 1 << error;
}
// FATALエラーか
BOOL UTL_IsFatalError( void )
{
return s_fatalError ? TRUE : FALSE;
}
// FATALエラーコード取得
u32 UTL_GetFatalError( void )
{
return s_fatalError ? TRUE : FALSE;
}

View File

@ -68,7 +68,7 @@ BOOL LoadSharedFontInit( void )
return FALSE;
}
pBuffer = Alloc( (u32)size );
pBuffer = SYSM_Alloc( (u32)size );
if( pBuffer == NULL ) {
OS_TPrintf( "malloc failed.\n" );
return FALSE;
@ -106,7 +106,7 @@ void LoadSharedFontThread( void *arg )
// FSのキャッシュが怪しそうなので、とりあえずアラインメントをとっておく。
size = MATH_ROUNDUP( size, SYSM_ALIGNMENT_LOAD_MODULE );
s_pFontBuffer[ i ] = Alloc( (u32)size );
s_pFontBuffer[ i ] = SYSM_Alloc( (u32)size );
if( s_pFontBuffer[ i ] == NULL ) {
OS_TPrintf( "malloc failed.\n" );
retval = FALSE;
@ -125,7 +125,7 @@ void LoadSharedFontThread( void *arg )
OS_TPrintf( "Shared Font load succeeded.\n" );
}else {
OS_TPrintf( "Shared Font load failed.\n" );
SYSM_SetFatalError( TRUE );
UTL_SetFatalError( FATAL_ERROR_SHARED_FONT );
}
}

View File

@ -628,7 +628,7 @@ instfirm_error:
PMi_SetWirelessLED( PM_WIRELESS_LED_OFF );
#endif
s_isFinished = TRUE;
SYSM_SetFatalError( TRUE );
UTL_SetFatalError( FATAL_ERROR_WLANFIRM_AUTH );
return FALSE;
}
@ -669,7 +669,7 @@ BOOL PollingInstallWlanFirmware( BOOL isStartScanWDS )
// ロード失敗
if( !s_isHotStartWLFirm ) {
// ColdStartの無線ファームロードなら、FATALエラー
SYSM_SetFatalError( TRUE );
UTL_SetFatalError( FATAL_ERROR_WLANFIRM_LOAD );
#ifdef SDK_RELEASE
PMi_SetWirelessLED( PM_WIRELESS_LED_OFF );
#endif

View File

@ -25,7 +25,6 @@
#include "sound.h"
#include "loadWlanFirm.h"
#include "loadSharedFont.h"
#include "loadSysmVersion.h"
// extern data-----------------------------------------------------------------
@ -245,7 +244,8 @@ void TwlMain( void )
#endif
// 各種パラメータの取得------------
pBootTitle = SYSM_ReadParameters(); // 本体設定データ、リセットパラメータのリード、検査用オート起動カード判定、量産ライン用キーショートカット起動判定等のリード
pBootTitle = SYSM_ReadParameters(); // 本体設定データ、HW情報リード
// アプリジャンプ、検査用カード起動、生産工程用ショートカット、デバッガ起動、初回起動シーケンス、TP設定ショートカットの判定
// end時間計測-c
#if (MEASURE_TIME == 1)
@ -260,11 +260,12 @@ void TwlMain( void )
// TPキャリブレーション
UTL_CaribrateTP( LCFG_TSD_GetTPCalibrationPtr() );
if( SYSM_IsFatalError() ) {
if( UTL_IsFatalError() ) {
// FATALエラー処理
}
if( !LCFG_TSD_IsFinishedInitialSetting() ) {
// 初回起動シーケンス判定
if( !LCFG_TSD_IsFinishedInitialSetting_Launcher() ) {
// ランチャー内での初回起動シーケンス中なら、写真撮影を実行するようにする。
// ※本体設定内での初会起動シーケンス中の場合は、SYSM_ReadParameters 内のチェックで検出されて、本体設定が起動されるようになっています。
}
(void)SYSM_GetCardTitleList( s_titleList ); // カードアプリリストの取得カードアプリはs_titleList[0]に格納される)
@ -322,7 +323,7 @@ void TwlMain( void )
( pBootTitle && !SYSM_IsLogoDemoSkip() ) ) {
u32 timestamp;
if( !LoadSharedFontInit() ) { // 共有フォントのロード
SYSM_SetFatalError( TRUE );
UTL_SetFatalError( FATAL_ERROR_SHARED_FONT );
}
timestamp = OS_GetSharedFontTimestamp();
if( timestamp > 0 ) OS_TPrintf( "SharedFont timestamp : %08x\n", timestamp );
@ -332,10 +333,6 @@ void TwlMain( void )
OS_TPrintf( "GetSharedFont : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
#endif
// バージョン情報のロード
LoadSysmVersion();
OS_TPrintf( "Launcher Version = %d", GetSysmVersion() );
// 開始ステートの判定--------------
// start時間計測7
@ -401,7 +398,7 @@ void TwlMain( void )
OS_TPrintf( "Load WlanFirm Time : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
#endif
if( SYSM_IsFatalError() ) {
if( UTL_IsFatalError() ) {
// FATALエラー処理
}
@ -436,7 +433,7 @@ void TwlMain( void )
if( LogoMain() &&
IsFinishedLoadSharedFont() ) { // フォントロード終了をここでチェック
#if 0
if( SYSM_IsFatalError() ) {
if( UTL_IsFatalError() ) {
state = STOP;
}else
#endif
@ -502,7 +499,7 @@ void TwlMain( void )
SYSM_IsAuthenticateTitleFinished() )
{
AuthResult res;
if( SYSM_IsFatalError() ) {
if( UTL_IsFatalError() ) {
// FATALエラー処理
}

View File

@ -48,6 +48,7 @@ export DO_NOT_SHOW_LAUNCHER = TRUE
export DISABLE_WDS_SCAN = TRUE
export IGNORE_WLFIRM_SIGNCHECK = FALSE
export DISABLE_WLFIRM_LOAD = FALSE
export DISABLE_INITIAL_SETTINGS = TRUE
export SYSM_OUTSIDE_UI = TRUE
# MAKEROM SWITCH for build SystemMenu

View File

@ -22,6 +22,7 @@
#include <twl/nam.h>
#include <twl/os/common/format_rom.h>
#include <twl/os/common/banner.h>
#include <twl/os/common/msJump.h>
#include <sysmenu/reloc_info/common/reloc_info.h>
#include <application_jump_private.h>
@ -39,7 +40,7 @@ extern "C" {
#define CARD_SLOT_NUM 1 // カードスロット数
#define LAUNCHER_TITLE_LIST_NUM ( LCFG_TWL_FREE_SOFT_BOX_COUNT_MAX + 1 ) // ランチャーのタイトルリスト数
#define SYSM_PAD_SHORTCUT_TP ( PAD_BUTTON_X )
#define SYSM_PAD_SHORTCUT_TP_CALIBRATION ( PAD_BUTTON_L | PAD_BUTTON_R | PAD_BUTTON_START )
#define SYSM_PAD_SHORTCUT_MACHINE_SETTINGS ( PAD_BUTTON_SELECT )
#define SYSM_PAD_PRODUCTION_SHORTCUT_CARD_BOOT ( PAD_BUTTON_A | PAD_BUTTON_B \
| PAD_BUTTON_X | PAD_BUTTON_Y | PAD_BUTTON_R )
@ -160,8 +161,6 @@ extern BOOL SYSM_MakeTitleListMakerInfoFromHeader( TitleListMakerInfo *info, ROM
extern BOOL SYSM_IsExistCard( void ); // TWL/NTRカードが差さっているかアプリは未認証状態
extern BOOL SYSM_IsInspectCard( void ); // 検査カードが差さっているか?
extern BOOL SYSM_IsHotStart( void ); // ホットスタートか?
extern BOOL SYSM_IsFatalError( void ); // FATALエラーか
extern void SYSM_SetFatalError( BOOL isFatalError ); // FATALエラーのセット
extern BOOL SYSM_IsLogoDemoSkip( void ); // ロゴデモ飛ばし状態か?
extern void SYSM_SetLogoDemoSkip( BOOL skip ); // ロゴデモ飛ばし状態フラグを設定する。
extern BOOL SYSM_IsValidTSD( void ); // TWL設定データは有効か

View File

@ -98,7 +98,6 @@ typedef struct SYSM_work {
Relocate_Info romRelocateInfo[RELOCATE_INFO_NUM]; // ROM再配置情報arm9,arm7それぞれltdとflxで最大4つ
struct {
struct {
vu32 isFatalError :1; // FATALエラー
vu32 isARM9Start :1; // ARM9スタートフラグ
vu32 isHotStart :1; // Hot/Coldスタート判定
vu32 isValidLauncherParam :1; // ランチャーパラメータ有効
@ -108,10 +107,9 @@ typedef struct SYSM_work {
vu32 isLoadFinished :1; // アプリロード完了?
vu32 isLoadSucceeded :1; // アプリロード成功?
vu32 isCardBoot :1; // カードブートか?
vu32 isInitialSettings :1; // 初回起動シーケンスか?
vu32 isBrokenHWNormalInfo :1; // HWーマル情報が破損している。
vu32 isBrokenHWSecureInfo :1; // HWセキュア情報が破損している。
vu32 isBrokenTWLSettings :1; // TWL本体設定データが破損している。
vu32 isResetRTC :1; // RTCリセット発生
vu32 isNANDFatalError :1; // NANDFATALエラー発生
vu32 :0;
}common;
struct {

View File

@ -28,6 +28,19 @@ extern "C" {
// define data----------------------------------------------------------
#define BACKLIGHT_BRIGHTNESS_MAX 4
typedef enum FatalErrorCode {
FATAL_ERROR_UNDEFINED = 0,
FATAL_ERROR_NAND = 1,
FATAL_ERROR_HWINFO_NORMAL = 2,
FATAL_ERROR_HWINFO_SECURE = 3,
FATAL_ERROR_TWLSETTINGS = 4,
FATAL_ERROR_SHARED_FONT = 5,
FATAL_ERROR_WLANFIRM_AUTH = 6,
FATAL_ERROR_WLANFIRM_LOAD = 7,
FATAL_ERROR_MAX = 8
}FatalErrorCode;
// global variable------------------------------------------------------
// function-------------------------------------------------------------
@ -61,9 +74,14 @@ static inline BOOL UTL_IsROMHeaderEULARequired( void )
return (BOOL)SYSM_GetAppRomHeader()->agree_EULA;
}
#endif
// FATALエラー
extern BOOL UTL_IsFatalError( void ); // FATALエラーか
extern void UTL_SetFatalError( FatalErrorCode error ); // FATALエラーのセット
extern u32 UTL_GetFatalError( void ); // FATALエラー状態の取得FatalErrorCodeをビットに割り当てて格納しています。
#ifdef __cplusplus
}
#endif