ROMローディングのスレッド化をライブラリ内で行うように修正

ROMローディングスレッド終了待ちのポーリング中処理を若干単純化
NANDアプリはリストの2番目から始まるように修正

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@191 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yoshida_teruhisa 2007-11-16 02:54:54 +00:00
parent 91b99f71a7
commit 96de8ec173
5 changed files with 154 additions and 143 deletions

View File

@ -55,7 +55,6 @@ SYSM_work *pSysm; //
// static variable------------------------------------------------------------- // static variable-------------------------------------------------------------
static BOOL s_isBanner = FALSE; static BOOL s_isBanner = FALSE;
static NTRBannerFile s_bannerBuf; static NTRBannerFile s_bannerBuf;
static NAMTitleId old_titleIdArray[ LAUNCHER_TITLE_LIST_NUM ];
// const data------------------------------------------------------------------ // const data------------------------------------------------------------------
@ -133,7 +132,6 @@ void SYSM_ReadParameters( void )
//NAMの初期化 //NAMの初期化
//NAM_Init(AllocForNAM,FreeForNAM); //NAM_Init(AllocForNAM,FreeForNAM);
MI_CpuClearFast(old_titleIdArray, sizeof(old_titleIdArray) );
} }
@ -182,17 +180,11 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size)
// とりあえずALL // とりあえずALL
int l; int l;
int gotten; int gotten;
NAMTitleId titleIdArray[ LAUNCHER_TITLE_LIST_NUM ]; NAMTitleId titleIdArray[ LAUNCHER_TITLE_LIST_NUM - 1 ];
static TWLBannerFile bannerBuf[ LAUNCHER_TITLE_LIST_NUM ]; static TWLBannerFile bannerBuf[ LAUNCHER_TITLE_LIST_NUM ];
gotten = NAM_GetTitleList(titleIdArray, LAUNCHER_TITLE_LIST_NUM ); gotten = NAM_GetTitleList( titleIdArray, LAUNCHER_TITLE_LIST_NUM-1 );
// バナーの読み込み……別の関数に移すべきかも。
// 毎フレーム変化を見る必要がある。
// 前のフレームのNAMTitleIdの配列を残しておき、比較。
// IDが変化していたら問答無用でバナーを読み込む。
for(l=0;l<gotten;l++) for(l=0;l<gotten;l++)
{
if(titleIdArray[l] != old_titleIdArray[l])
{ {
//ヘッダからバナーを読み込む //ヘッダからバナーを読み込む
FSFile file[1]; FSFile file[1];
@ -249,15 +241,12 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size)
} }
FS_CloseFile(file); FS_CloseFile(file);
}
} }
for(l=gotten;l<LAUNCHER_TITLE_LIST_NUM;l++) for(l=gotten;l<LAUNCHER_TITLE_LIST_NUM;l++)
{ {
// 念のため0にクリア // 念のため0にクリア
titleIdArray[l] = 0; titleIdArray[l] = 0;
} }
MI_CpuCopyFast(titleIdArray,old_titleIdArray,sizeof(old_titleIdArray));
for(l=0;l<size;l++) for(l=0;l<size;l++)
{ {
@ -269,8 +258,8 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size)
for(l=0;l<size;l++) for(l=0;l<size;l++)
{ {
pTitleList_Nand[l].titleID = titleIdArray[l]; pTitleList_Nand[l+1].titleID = titleIdArray[l];
pTitleList_Nand[l].pBanner = &bannerBuf[l]; pTitleList_Nand[l+1].pBanner = &bannerBuf[l];
} }
// return : *TitleProperty Array // return : *TitleProperty Array
return size; return size;
@ -342,10 +331,10 @@ BOOL SYSM_IsTPReadable( void )
// //
// ============================================================================ // ============================================================================
// 指定タイトルをロードするだけ static BOOL s_load_success = FALSE;
AuthResult SYSM_LoadTitle( TitleProperty *pBootTitle )
{ static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle )
enum { enum
{ {
region_header, region_header,
region_arm9_ntr, region_arm9_ntr,
@ -373,7 +362,7 @@ AuthResult SYSM_LoadTitle( TitleProperty *pBootTitle )
if( ! bSuccess ) if( ! bSuccess )
{ {
OS_TPrintf("RebootSystem failed: cant open file\n"); OS_TPrintf("RebootSystem failed: cant open file\n");
return AUTH_RESULT_TITLE_POINTER_ERROR; return;
} }
{ {
@ -392,7 +381,7 @@ OS_TPrintf("RebootSystem failed: cant open file\n");
{ {
OS_TPrintf("RebootSystem failed: cant seek file(0)\n"); OS_TPrintf("RebootSystem failed: cant seek file(0)\n");
FS_CloseFile(file); FS_CloseFile(file);
return AUTH_RESULT_TITLE_POINTER_ERROR; return;
} }
readLen = ReadFile(file, header, (s32)sizeof(header)); readLen = ReadFile(file, header, (s32)sizeof(header));
@ -401,7 +390,7 @@ OS_TPrintf("RebootSystem failed: cant seek file(0)\n");
{ {
OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", header, 0, sizeof(header), readLen); OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", header, 0, sizeof(header), readLen);
FS_CloseFile(file); FS_CloseFile(file);
return AUTH_RESULT_TITLE_POINTER_ERROR; return;
} }
if( header[0x15C] != 0x56 || header[0x15D] != 0xCF ) if( header[0x15C] != 0x56 || header[0x15D] != 0xCF )
@ -417,7 +406,7 @@ OS_TPrintf("\n");
} }
OS_TPrintf("RebootSystem failed: logo CRC error\n"); OS_TPrintf("RebootSystem failed: logo CRC error\n");
FS_CloseFile(file); FS_CloseFile(file);
return AUTH_RESULT_TITLE_POINTER_ERROR; return;
} }
// 各領域を読み込む // 各領域を読み込む
@ -451,7 +440,7 @@ OS_TPrintf("RebootSystem failed: logo CRC error\n");
{ {
OS_TPrintf("RebootSystem failed: cant seek file(%d)\n", source[i]); OS_TPrintf("RebootSystem failed: cant seek file(%d)\n", source[i]);
FS_CloseFile(file); FS_CloseFile(file);
return AUTH_RESULT_TITLE_POINTER_ERROR; return;
} }
readLen = ReadFile(file, (void *)destaddr[i], (s32)len); readLen = ReadFile(file, (void *)destaddr[i], (s32)len);
@ -460,7 +449,7 @@ OS_TPrintf("RebootSystem failed: cant seek file(%d)\n", source[i]);
{ {
OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len); OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len);
FS_CloseFile(file); FS_CloseFile(file);
return AUTH_RESULT_TITLE_POINTER_ERROR; return;
} }
} }
@ -470,12 +459,34 @@ OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len);
// ROMヘッダバッファをコピー // ROMヘッダバッファをコピー
MI_CpuCopy32( (void *)HW_TWL_ROM_HEADER_BUF, (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); MI_CpuCopy32( (void *)HW_TWL_ROM_HEADER_BUF, (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF );
return AUTH_RESULT_SUCCEEDED; s_load_success = TRUE;
}
// スタック用
#define THREAD_PRIO 17
#define STACK_SIZE 5120 // 適当
static OSThread thread;
static u64 stack[ STACK_SIZE / sizeof(u64) ];
// 指定タイトルを別スレッドでロードする
OSThread* SYSM_LoadTitle( TitleProperty *pBootTitle )
{
s_load_success = FALSE;
OS_InitThread();
OS_CreateThread( &thread, (void (*)(void *))SYSMi_LoadTitleThreadFunc, (void*)pBootTitle, stack+STACK_SIZE/sizeof(u64), STACK_SIZE,THREAD_PRIO );
OS_WakeupThreadDirect( &thread );
return &thread;
} }
// ロード済みの指定タイトルの認証とブートを行う // ロード済みの指定タイトルの認証とブートを行う
AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle ) AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle )
{ {
// ロード成功しているか
if(s_load_success == FALSE)
{
return AUTH_RESULT_TITLE_POINTER_ERROR;
}
// パラメータチェック // パラメータチェック
if( !SYSMi_CheckTitlePointer( pBootTitle ) ) { if( !SYSMi_CheckTitlePointer( pBootTitle ) ) {
return AUTH_RESULT_TITLE_POINTER_ERROR; return AUTH_RESULT_TITLE_POINTER_ERROR;
@ -500,11 +511,11 @@ AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle )
// もしかすると使わないかも // もしかすると使わないかも
AuthResult SYSM_LoadAndAuthenticateTitle( TitleProperty *pBootTitle ) AuthResult SYSM_LoadAndAuthenticateTitle( TitleProperty *pBootTitle )
{ {
AuthResult result; OSThread *t;
// 指定タイトルのロード // 指定タイトルのロード
result = SYSM_LoadTitle( pBootTitle ); t = SYSM_LoadTitle( pBootTitle );
if (result != AUTH_RESULT_SUCCEEDED) return result; OS_JoinThread(t);
// 認証 // 認証
return SYSM_AuthenticateTitle( pBootTitle ); return SYSM_AuthenticateTitle( pBootTitle );

View File

@ -295,15 +295,37 @@ void LauncherInit( TitleProperty *pTitleList )
} }
static int selected = 0;
// ROMのローディング中
void LauncherLoading( TitleProperty *pTitleList )
{
static int fadecount = 0;
// RTC情報の取得表示
GetAndDrawRTCData( &g_rtcDraw, FALSE );
// 描画関係
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_NULL );
PrintfSJIS( 0, 0, TXT_COLOR_BLUE, "TWL-SYSTEM MENU ver.%06x", SYSMENU_VER );
DrawBackLightSwitch();
#ifdef DBGBNR
NTRBannerDraw( s_csr, selected, pTitleList );
#endif
// これだと93フレームでフェードアウト終わる
G2_ChangeBlendAlpha( fadecount/3, 31-(fadecount/3) );
if(fadecount < 93) fadecount++;
}
// ランチャーメイン // ランチャーメイン
TitleProperty *LauncherMain( TitleProperty *pTitleList ) TitleProperty *LauncherMain( TitleProperty *pTitleList )
{ {
static BOOL touch_bl_bak = FALSE; static BOOL touch_bl_bak = FALSE;
BOOL touch_bl_trg = FALSE; BOOL touch_bl_trg = FALSE;
BOOL tp_select = FALSE;
static int csr_v = 0; static int csr_v = 0;
static int selected = 0; BOOL tp_select = FALSE;
static int fadecount = 0;
TitleProperty *ret = NULL; TitleProperty *ret = NULL;
// RTC情報の取得表示 // RTC情報の取得表示
@ -328,8 +350,6 @@ TitleProperty *LauncherMain( TitleProperty *pTitleList )
//-------------------------------------- //--------------------------------------
// キー入力処理 // キー入力処理
//-------------------------------------- //--------------------------------------
if(fadecount == 0)
{
if(pad.cont & PAD_KEY_RIGHT){ // バナー選択 if(pad.cont & PAD_KEY_RIGHT){ // バナー選択
if(csr_v == 0) csr_v = 1; if(csr_v == 0) csr_v = 1;
} }
@ -347,11 +367,9 @@ TitleProperty *LauncherMain( TitleProperty *pTitleList )
if( ( pad.trg & PAD_BUTTON_A ) || ( tp_select ) ) { // メニュー項目への分岐 if( ( pad.trg & PAD_BUTTON_A ) || ( tp_select ) ) { // メニュー項目への分岐
if(pTitleList[selected].titleID != 0) if(pTitleList[selected].titleID != 0)
{ {
fadecount = 1;
ret = &pTitleList[selected]; ret = &pTitleList[selected];
} }
} }
}
// 描画関係 // 描画関係
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_NULL ); NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_NULL );
@ -362,13 +380,6 @@ TitleProperty *LauncherMain( TitleProperty *pTitleList )
NTRBannerDraw( s_csr, selected, pTitleList ); NTRBannerDraw( s_csr, selected, pTitleList );
#endif #endif
if(fadecount>0)
{
// これだと93フレームでフェードアウト終わる
G2_ChangeBlendAlpha( fadecount/3, 31-(fadecount/3) );
if(fadecount < 93) fadecount++;
};// ロード開始&フェードアウト用描画
return ret; return ret;
} }

View File

@ -32,6 +32,8 @@ extern "C" {
// function---------------------------------------------------------- // function----------------------------------------------------------
void LauncherInit( TitleProperty *pTitleList ); void LauncherInit( TitleProperty *pTitleList );
void LauncherLoading( TitleProperty *pTitleList );
TitleProperty *LauncherMain( TitleProperty *pTitleList ); TitleProperty *LauncherMain( TitleProperty *pTitleList );

View File

@ -34,15 +34,6 @@ static void INTR_VBlank( void );
// const data------------------------------------------------------------------ // const data------------------------------------------------------------------
// スタック用
#define THREAD_PRIO 17
#define STACK_SIZE 5120 // 適当
static OSThread thread;
static u64 stack[ STACK_SIZE / sizeof(u64) ];
#define COUNT_JOIN_START 32 //2秒ぐらい
static BOOL s_loading = FALSE;
// メイン // メイン
void TwlMain( void ) void TwlMain( void )
{ {
@ -51,14 +42,15 @@ void TwlMain( void )
LOGODEMO = 1, LOGODEMO = 1,
LAUNCHER_INIT = 2, LAUNCHER_INIT = 2,
LAUNCHER = 3, LAUNCHER = 3,
AUTHENTICATE = 4, LOADING = 4,
BOOT = 5, AUTHENTICATE = 5,
STOP = 6 BOOT = 6,
STOP = 7
}; };
u32 state = START; u32 state = START;
TitleProperty *pBootTitle = NULL; TitleProperty *pBootTitle = NULL;
TitleProperty *pLoadTitle = NULL;
TitleProperty pTitleList[ LAUNCHER_TITLE_LIST_NUM ]; TitleProperty pTitleList[ LAUNCHER_TITLE_LIST_NUM ];
OSThread *thread;
// システムメニュー初期化---------- // システムメニュー初期化----------
SYSM_Init( Alloc, Free ); // OS_Initの前でコール。 SYSM_Init( Alloc, Free ); // OS_Initの前でコール。
@ -126,24 +118,19 @@ void TwlMain( void )
state = LAUNCHER; state = LAUNCHER;
break; break;
case LAUNCHER: case LAUNCHER:
pLoadTitle = LauncherMain( pTitleList ); pBootTitle = LauncherMain( pTitleList );
if(!s_loading){ if( pBootTitle ) {
if( pLoadTitle ) { thread = SYSM_LoadTitle( pBootTitle );
void (*func)(void*); state = LOADING;
func = (void (*)(void *))SYSM_LoadTitle;
OS_InitThread();
OS_CreateThread( &thread, func, (void*)pLoadTitle, stack+STACK_SIZE/sizeof(u64), STACK_SIZE,THREAD_PRIO );
OS_WakeupThreadDirect( &thread );
s_loading = TRUE;
pBootTitle = pLoadTitle;
} }
} break;
else if(OS_IsThreadTerminated( &thread )) case LOADING:
LauncherLoading( pTitleList );
if(OS_IsThreadTerminated( thread ))
{ {
GX_DispOff(); GX_DispOff();
GXS_DispOff(); GXS_DispOff();
state = AUTHENTICATE; state = AUTHENTICATE;
s_loading = FALSE;
} }
break; break;
case AUTHENTICATE: case AUTHENTICATE:

View File

@ -83,7 +83,7 @@ extern int SYSM_GetCardTitleList( TitleProperty *pTitleList_Card ); //
extern int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size ); // NAND アプリタイトルリストの取得 extern int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size ); // NAND アプリタイトルリストの取得
// アプリ起動 // アプリ起動
extern AuthResult SYSM_LoadTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyをロード extern OSThread* SYSM_LoadTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyを別スレッドでロード
extern AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyを認証してブート extern AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyを認証してブート
extern AuthResult SYSM_LoadAndAuthenticateTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyをロード認証してブート extern AuthResult SYSM_LoadAndAuthenticateTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyをロード認証してブート
// 成功時は、never return. // 成功時は、never return.