mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
デバッグコード少し追加
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@584 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
ea8e8d89db
commit
77e47d46f3
@ -43,122 +43,128 @@ static StreamInfo strm; // stream info
|
|||||||
|
|
||||||
const char filename[] = "data/fanfare.32.wav";
|
const char filename[] = "data/fanfare.32.wav";
|
||||||
|
|
||||||
|
//#define DEBUG_LAUNCHER_DUMP
|
||||||
#ifdef DEBUG_LAUNCHER_DUMP
|
#ifdef DEBUG_LAUNCHER_DUMP
|
||||||
// デバグ用。SDに0x02ffc000から0x02ffe000までdump.datというダンプを吐く
|
// デバグ用。SDに0x02ffc000から0x02ffe000までdump.datというダンプを吐く
|
||||||
static void debugWriteToSD( void )
|
static void debugWriteToSD( void )
|
||||||
{
|
{
|
||||||
FSFile dest;
|
FSFile dest;
|
||||||
FS_InitFile( &dest );
|
FS_InitFile( &dest );
|
||||||
(void)FS_CreateFile("sdmc:/dump.dat", FS_PERMIT_W | FS_PERMIT_R);
|
(void)FS_CreateFile("sdmc:/dump.dat", FS_PERMIT_W | FS_PERMIT_R);
|
||||||
if ( !FS_OpenFileEx( &dest, "sdmc:/dump.dat", FS_FILEMODE_W ) ) return;
|
if ( !FS_OpenFileEx( &dest, "sdmc:/dump.dat", FS_FILEMODE_W ) ) return;
|
||||||
FS_WriteFile( &dest, (void *)0x02ffc000, 0x2000 );
|
FS_WriteFile( &dest, (void *)0x02ffc000, 0x2000 );
|
||||||
if ( !FS_CloseFile( &dest ) ) return;
|
if ( !FS_CloseFile( &dest ) ) return;
|
||||||
OS_TPrintf( "debugWriteToSD:ok\n");
|
OS_TPrintf( "debugWriteToSD:ok\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// メイン
|
// メイン
|
||||||
void TwlMain( void )
|
void TwlMain( void )
|
||||||
{
|
{
|
||||||
enum {
|
enum {
|
||||||
LOGODEMO_INIT = 0,
|
LOGODEMO_INIT = 0,
|
||||||
LOGODEMO = 1,
|
LOGODEMO = 1,
|
||||||
LAUNCHER_INIT = 2,
|
LAUNCHER_INIT = 2,
|
||||||
LAUNCHER = 3,
|
LAUNCHER = 3,
|
||||||
LOAD_START = 4,
|
LOAD_START = 4,
|
||||||
LOADING = 5,
|
LOADING = 5,
|
||||||
AUTHENTICATE = 6,
|
AUTHENTICATE = 6,
|
||||||
BOOT = 7,
|
BOOT = 7,
|
||||||
STOP = 8
|
STOP = 8
|
||||||
};
|
};
|
||||||
u32 state = LOGODEMO_INIT;
|
u32 state = LOGODEMO_INIT;
|
||||||
TitleProperty *pBootTitle = NULL;
|
TitleProperty *pBootTitle = NULL;
|
||||||
OSTick start, end = 0;
|
OSTick start, end = 0;
|
||||||
BOOL direct_boot = FALSE;
|
BOOL direct_boot = FALSE;
|
||||||
|
|
||||||
// システムメニュー初期化----------
|
|
||||||
SYSM_Init( Alloc, Free ); // OS_Initの前でコールする必要あり。
|
|
||||||
OS_Init();
|
|
||||||
SYSM_SetArena(); // OS_Initの後でコールする必要あり。
|
|
||||||
|
|
||||||
// OS初期化------------------------
|
|
||||||
OS_InitTick();
|
|
||||||
PM_Init();
|
|
||||||
|
|
||||||
(void)OS_EnableIrq();
|
|
||||||
(void)OS_EnableInterrupts();
|
|
||||||
|
|
||||||
FS_Init( FS_DMA_NOT_USE );
|
|
||||||
|
|
||||||
#ifdef DEBUG_LAUNCHER_DUMP
|
#ifdef DEBUG_LAUNCHER_DUMP
|
||||||
// debug
|
// you should comment out to clear GX/G2/DMA/TM/PAD register in reboot.c to retreive valid boot time
|
||||||
debugWriteToSD();
|
STD_TSPrintf((char*)0x02FFCFD0, "\nLauncher Boot Time: %lld usec\n", OS_TicksToMicroSeconds(OS_GetTick()));
|
||||||
|
STD_TSPrintf((char*)0x02FFCFF0, "HOTSTART(0x%08x): %02x\n", HW_NAND_FIRM_HOTSTART_FLAG, *(u8 *)HW_NAND_FIRM_HOTSTART_FLAG);
|
||||||
|
#endif
|
||||||
|
// システムメニュー初期化----------
|
||||||
|
SYSM_Init( Alloc, Free ); // OS_Initの前でコールする必要あり。
|
||||||
|
OS_Init();
|
||||||
|
SYSM_SetArena(); // OS_Initの後でコールする必要あり。
|
||||||
|
|
||||||
|
// OS初期化------------------------
|
||||||
|
OS_InitTick();
|
||||||
|
PM_Init();
|
||||||
|
|
||||||
|
(void)OS_EnableIrq();
|
||||||
|
(void)OS_EnableInterrupts();
|
||||||
|
|
||||||
|
FS_Init( FS_DMA_NOT_USE );
|
||||||
|
|
||||||
|
#ifdef DEBUG_LAUNCHER_DUMP
|
||||||
|
// debug
|
||||||
|
debugWriteToSD();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
GX_Init();
|
GX_Init();
|
||||||
PM_Init();
|
PM_Init();
|
||||||
TP_Init();
|
TP_Init();
|
||||||
RTC_Init();
|
RTC_Init();
|
||||||
SND_Init();// sound init
|
SND_Init();// sound init
|
||||||
|
|
||||||
OS_TPrintf( "SYSM_work size = 0x%x\n", sizeof(SYSM_work) );
|
OS_TPrintf( "SYSM_work size = 0x%x\n", sizeof(SYSM_work) );
|
||||||
|
|
||||||
// 割り込み許可--------------------
|
// 割り込み許可--------------------
|
||||||
(void)OS_SetIrqFunction(OS_IE_V_BLANK, INTR_VBlank);
|
(void)OS_SetIrqFunction(OS_IE_V_BLANK, INTR_VBlank);
|
||||||
(void)OS_EnableIrqMask(OS_IE_V_BLANK);
|
(void)OS_EnableIrqMask(OS_IE_V_BLANK);
|
||||||
(void)GX_VBlankIntr(TRUE);
|
(void)GX_VBlankIntr(TRUE);
|
||||||
|
|
||||||
// システムの初期化----------------
|
// システムの初期化----------------
|
||||||
InitAllocator(); // ※SYSM_Init以外のSYSMライブラリ関数を呼ぶ前に
|
InitAllocator(); // ※SYSM_Init以外のSYSMライブラリ関数を呼ぶ前に
|
||||||
// Alloc, Freeで登録したメモリアロケータを初期化してください。
|
// Alloc, Freeで登録したメモリアロケータを初期化してください。
|
||||||
// 各種パラメータの取得------------
|
// 各種パラメータの取得------------
|
||||||
pBootTitle = SYSM_ReadParameters(); // 本体設定データ、リセットパラメータ、
|
pBootTitle = SYSM_ReadParameters(); // 本体設定データ、リセットパラメータ、
|
||||||
// 初回起動シーケンス判定、
|
// 初回起動シーケンス判定、
|
||||||
// 検査用オート起動カード判定、量産ライン用キーショートカット起動判定等のリード
|
// 検査用オート起動カード判定、量産ライン用キーショートカット起動判定等のリード
|
||||||
|
|
||||||
(void)SYSM_GetCardTitleList( s_titleList ); // カードアプリリストの取得(カードアプリはs_titleList[0]に格納される)
|
(void)SYSM_GetCardTitleList( s_titleList ); // カードアプリリストの取得(カードアプリはs_titleList[0]に格納される)
|
||||||
|
|
||||||
// bootTypeがLAUNCHER_BOOTTYPE_TEMPでない場合、tmpフォルダ内のデータを消す
|
// bootTypeがLAUNCHER_BOOTTYPE_TEMPでない場合、tmpフォルダ内のデータを消す
|
||||||
if( !pBootTitle || pBootTitle->flags.bootType != LAUNCHER_BOOTTYPE_TEMP )
|
if( !pBootTitle || pBootTitle->flags.bootType != LAUNCHER_BOOTTYPE_TEMP )
|
||||||
{
|
{
|
||||||
deleteTmp();
|
deleteTmp();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 「ダイレクトブートでない」なら
|
// 「ダイレクトブートでない」なら
|
||||||
if( !pBootTitle ) {
|
if( !pBootTitle ) {
|
||||||
// アプリ間パラメタをクリア
|
// アプリ間パラメタをクリア
|
||||||
// TODO:あらかじめNTRカードのセキュア領域を退避せずに直接0x2000000からロードしている場合も容赦なく消すので注意
|
// TODO:あらかじめNTRカードのセキュア領域を退避せずに直接0x2000000からロードしている場合も容赦なく消すので注意
|
||||||
MI_CpuClearFast((void *)HW_PARAM_DELIVER_ARG, HW_PARAM_DELIVER_ARG_SIZE);
|
MI_CpuClearFast((void *)HW_PARAM_DELIVER_ARG, HW_PARAM_DELIVER_ARG_SIZE);
|
||||||
|
|
||||||
// NAND & カードアプリリスト取得
|
// NAND & カードアプリリスト取得
|
||||||
(void)SYSM_GetNandTitleList( s_titleList, LAUNCHER_TITLE_LIST_NUM ); // NANDアプリリストの取得(内蔵アプリはs_titleList[1]から格納される)
|
(void)SYSM_GetNandTitleList( s_titleList, LAUNCHER_TITLE_LIST_NUM ); // NANDアプリリストの取得(内蔵アプリはs_titleList[1]から格納される)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 「ダイレクトブートでない」もしくは
|
// 「ダイレクトブートでない」もしくは
|
||||||
// 「ダイレクトブートだが、ロゴデモ表示」の時、各種リソースのロード------------
|
// 「ダイレクトブートだが、ロゴデモ表示」の時、各種リソースのロード------------
|
||||||
if( !pBootTitle ||
|
if( !pBootTitle ||
|
||||||
( pBootTitle && !SYSM_IsLogoDemoSkip() ) ) {
|
( pBootTitle && !SYSM_IsLogoDemoSkip() ) ) {
|
||||||
// FS_ReadContentFile( ContentID ); // タイトル内リソースファイルのリード
|
// FS_ReadContentFile( ContentID ); // タイトル内リソースファイルのリード
|
||||||
// FS_ReadSharedContentFile( ContentID ); // 共有コンテントファイルのリード
|
// FS_ReadSharedContentFile( ContentID ); // 共有コンテントファイルのリード
|
||||||
}
|
}
|
||||||
|
|
||||||
// 開始ステートの判定--------------
|
// 開始ステートの判定--------------
|
||||||
|
|
||||||
if( pBootTitle ) {
|
if( pBootTitle ) {
|
||||||
// ダイレクトブートなら、ロゴ、ランチャーを飛ばしてロード開始
|
// ダイレクトブートなら、ロゴ、ランチャーを飛ばしてロード開始
|
||||||
if( pBootTitle->flags.isLogoSkip ) {
|
if( pBootTitle->flags.isLogoSkip ) {
|
||||||
state = LOAD_START;
|
state = LOAD_START;
|
||||||
}else {
|
}else {
|
||||||
state = LOGODEMO_INIT;
|
state = LOGODEMO_INIT;
|
||||||
}
|
}
|
||||||
direct_boot = TRUE;
|
direct_boot = TRUE;
|
||||||
}else if( SYSM_IsLogoDemoSkip() ) {
|
}else if( SYSM_IsLogoDemoSkip() ) {
|
||||||
// ロゴデモスキップが指定されていたら、ランチャー起動
|
// ロゴデモスキップが指定されていたら、ランチャー起動
|
||||||
state = LAUNCHER_INIT;
|
state = LAUNCHER_INIT;
|
||||||
}else {
|
}else {
|
||||||
// 何もないなら、ロゴデモ起動
|
// 何もないなら、ロゴデモ起動
|
||||||
state = LOGODEMO_INIT;
|
state = LOGODEMO_INIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
// チャンネルをロックする
|
// チャンネルをロックする
|
||||||
SND_LockChannel((1 << L_CHANNEL) | (1 << R_CHANNEL), 0);
|
SND_LockChannel((1 << L_CHANNEL) | (1 << R_CHANNEL), 0);
|
||||||
@ -171,86 +177,86 @@ void TwlMain( void )
|
|||||||
THREAD_STACK_SIZE, STREAM_THREAD_PRIO);
|
THREAD_STACK_SIZE, STREAM_THREAD_PRIO);
|
||||||
OS_WakeupThreadDirect(&strmThread);
|
OS_WakeupThreadDirect(&strmThread);
|
||||||
|
|
||||||
// メインループ--------------------
|
// メインループ--------------------
|
||||||
while( 1 ) {
|
while( 1 ) {
|
||||||
OS_WaitIrq(1, OS_IE_V_BLANK); // Vブランク割り込み待ち
|
OS_WaitIrq(1, OS_IE_V_BLANK); // Vブランク割り込み待ち
|
||||||
|
|
||||||
// ARM7コマンド応答受信
|
// ARM7コマンド応答受信
|
||||||
while (SND_RecvCommandReply(SND_COMMAND_NOBLOCK) != NULL)
|
while (SND_RecvCommandReply(SND_COMMAND_NOBLOCK) != NULL)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
ReadKeyPad(); // キー入力の取得
|
ReadKeyPad(); // キー入力の取得
|
||||||
ReadTP(); // TP入力の取得
|
ReadTP(); // TP入力の取得
|
||||||
|
|
||||||
switch( state ) {
|
switch( state ) {
|
||||||
case LOGODEMO_INIT:
|
case LOGODEMO_INIT:
|
||||||
LogoInit();
|
LogoInit();
|
||||||
// 音鳴らすテスト
|
// 音鳴らすテスト
|
||||||
FS_InitFile(&strm.file);
|
FS_InitFile(&strm.file);
|
||||||
strm.isPlay = FALSE;
|
strm.isPlay = FALSE;
|
||||||
PlayStream(&strm, filename);
|
PlayStream(&strm, filename);
|
||||||
|
|
||||||
state = LOGODEMO;
|
state = LOGODEMO;
|
||||||
break;
|
break;
|
||||||
case LOGODEMO:
|
case LOGODEMO:
|
||||||
if( LogoMain() ) {
|
if( LogoMain() ) {
|
||||||
if( !direct_boot ) {
|
if( !direct_boot ) {
|
||||||
state = LAUNCHER_INIT;
|
state = LAUNCHER_INIT;
|
||||||
}else {
|
}else {
|
||||||
state = LOAD_START;
|
state = LOAD_START;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case LAUNCHER_INIT:
|
case LAUNCHER_INIT:
|
||||||
LauncherInit( s_titleList );
|
LauncherInit( s_titleList );
|
||||||
state = LAUNCHER;
|
state = LAUNCHER;
|
||||||
break;
|
break;
|
||||||
case LAUNCHER:
|
case LAUNCHER:
|
||||||
pBootTitle = LauncherMain( s_titleList );
|
pBootTitle = LauncherMain( s_titleList );
|
||||||
if( pBootTitle ) {
|
if( pBootTitle ) {
|
||||||
state = LOAD_START;
|
state = LOAD_START;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case LOAD_START:
|
case LOAD_START:
|
||||||
SYSM_StartLoadTitle( pBootTitle );
|
SYSM_StartLoadTitle( pBootTitle );
|
||||||
state = LOADING;
|
state = LOADING;
|
||||||
|
|
||||||
start = OS_GetTick();
|
start = OS_GetTick();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case LOADING:
|
case LOADING:
|
||||||
if( ( direct_boot || ( !direct_boot && LauncherFadeout( s_titleList ) ) ) &&
|
if( ( direct_boot || ( !direct_boot && LauncherFadeout( s_titleList ) ) ) &&
|
||||||
SYSM_IsLoadTitleFinished( pBootTitle ) ) {
|
SYSM_IsLoadTitleFinished( pBootTitle ) ) {
|
||||||
state = AUTHENTICATE;
|
state = AUTHENTICATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( ( end == 0 ) &&
|
if( ( end == 0 ) &&
|
||||||
SYSM_IsLoadTitleFinished( pBootTitle ) ) {
|
SYSM_IsLoadTitleFinished( pBootTitle ) ) {
|
||||||
end = OS_GetTick();
|
end = OS_GetTick();
|
||||||
OS_TPrintf( "Load Time : %dms\n", OS_TicksToMilliSeconds( end - start ) );
|
OS_TPrintf( "Load Time : %dms\n", OS_TicksToMilliSeconds( end - start ) );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case AUTHENTICATE:
|
case AUTHENTICATE:
|
||||||
switch ( SYSM_AuthenticateTitle( pBootTitle ) ) { // アプリ認証&ブート 成功時:never return
|
switch ( SYSM_AuthenticateTitle( pBootTitle ) ) { // アプリ認証&ブート 成功時:never return
|
||||||
case AUTH_RESULT_TITLE_LOAD_FAILED:
|
case AUTH_RESULT_TITLE_LOAD_FAILED:
|
||||||
case AUTH_RESULT_TITLE_POINTER_ERROR:
|
case AUTH_RESULT_TITLE_POINTER_ERROR:
|
||||||
case AUTH_RESULT_AUTHENTICATE_FAILED:
|
case AUTH_RESULT_AUTHENTICATE_FAILED:
|
||||||
case AUTH_RESULT_ENTRY_ADDRESS_ERROR:
|
case AUTH_RESULT_ENTRY_ADDRESS_ERROR:
|
||||||
state = STOP;
|
state = STOP;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case STOP: // 停止
|
case STOP: // 停止
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// カードアプリリストの取得(スレッドで随時カード挿抜を通知されるものをメインループで取得)
|
// カードアプリリストの取得(スレッドで随時カード挿抜を通知されるものをメインループで取得)
|
||||||
(void)SYSM_GetCardTitleList( s_titleList );
|
(void)SYSM_GetCardTitleList( s_titleList );
|
||||||
|
|
||||||
// コマンドフラッシュ
|
// コマンドフラッシュ
|
||||||
(void)SND_FlushCommand(SND_COMMAND_NOBLOCK);
|
(void)SND_FlushCommand(SND_COMMAND_NOBLOCK);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -261,7 +267,7 @@ void TwlMain( void )
|
|||||||
// Vブランク割り込み
|
// Vブランク割り込み
|
||||||
static void INTR_VBlank(void)
|
static void INTR_VBlank(void)
|
||||||
{
|
{
|
||||||
OS_SetIrqCheckFlag(OS_IE_V_BLANK); // Vブランク割込チェックのセット
|
OS_SetIrqCheckFlag(OS_IE_V_BLANK); // Vブランク割込チェックのセット
|
||||||
}
|
}
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
@ -271,34 +277,34 @@ static void INTR_VBlank(void)
|
|||||||
// nandのtmpディレクトリの中身を消す
|
// nandのtmpディレクトリの中身を消す
|
||||||
static void deleteTmp()
|
static void deleteTmp()
|
||||||
{
|
{
|
||||||
FSFile dir;
|
FSFile dir;
|
||||||
FSDirectoryEntryInfo info;
|
FSDirectoryEntryInfo info;
|
||||||
FS_InitFile(&dir);
|
FS_InitFile(&dir);
|
||||||
if(!FS_OpenDirectory(&dir, "nand:/tmp", FS_FILEMODE_R | FS_FILEMODE_W))
|
if(!FS_OpenDirectory(&dir, "nand:/tmp", FS_FILEMODE_R | FS_FILEMODE_W))
|
||||||
{
|
{
|
||||||
OS_TPrintf( "ERROR deleteTmp: open nand:/tmp failed!\n" );
|
OS_TPrintf( "ERROR deleteTmp: open nand:/tmp failed!\n" );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
while(FS_ReadDirectory(&dir, &info))
|
while(FS_ReadDirectory(&dir, &info))
|
||||||
{
|
{
|
||||||
if(info.attributes & FS_ATTRIBUTE_IS_DIRECTORY)
|
if(info.attributes & FS_ATTRIBUTE_IS_DIRECTORY)
|
||||||
{
|
{
|
||||||
//ディレクトリは今のところ削除しない
|
//ディレクトリは今のところ削除しない
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
//ファイルは今のところsrlのみ削除
|
//ファイルは今のところsrlのみ削除
|
||||||
char buf[512];
|
char buf[512];
|
||||||
u32 end = info.longname_length;
|
u32 end = info.longname_length;
|
||||||
if( (info.longname[end-1]=='l' || info.longname[end-1]=='L') &&
|
if( (info.longname[end-1]=='l' || info.longname[end-1]=='L') &&
|
||||||
(info.longname[end-2]=='r' || info.longname[end-2]=='R') &&
|
(info.longname[end-2]=='r' || info.longname[end-2]=='R') &&
|
||||||
(info.longname[end-3]=='s' || info.longname[end-3]=='S') &&
|
(info.longname[end-3]=='s' || info.longname[end-3]=='S') &&
|
||||||
(info.longname[end-4]=='.') )
|
(info.longname[end-4]=='.') )
|
||||||
{
|
{
|
||||||
STD_TSNPrintf( buf, 512, "nand:/tmp/%s",info.longname);
|
STD_TSNPrintf( buf, 512, "nand:/tmp/%s",info.longname);
|
||||||
FS_DeleteFile( buf );
|
FS_DeleteFile( buf );
|
||||||
OS_TPrintf( "deleteTmp: deleted File '%s' \n", buf );
|
OS_TPrintf( "deleteTmp: deleted File '%s' \n", buf );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FS_CloseDirectory(&dir);
|
FS_CloseDirectory(&dir);
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue
Block a user