・チェック処理をスレッド化

・表示の修正

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlToolsRED@553 7061adef-622a-194b-ae81-725974e89856
This commit is contained in:
N2205 2011-04-28 06:29:06 +00:00
parent ef9b40d4c1
commit 60d2d29c13

View File

@ -20,7 +20,6 @@
#define NORMAL_CHECK_TOOL
// デバッグビルド切り替え(有効にする場合はどちらか片方に)
//#define DEBUG_MEM_DUMP // 現在使用禁止
//#define DEBUG_SHOW_SDK_INFO
@ -50,6 +49,9 @@
#define DUMP_SIZE 0x80
#endif
#define THREAD_PRIO 17
#define STACK_SIZE 0x2000
typedef enum DetectError
{
DETECT_ERROR_NONE = 0,
@ -60,7 +62,16 @@ typedef enum DetectError
}
DetectError;
#ifdef DEBUG_SHOW_SDK_INFO | DEBUG_MEM_DUMP
typedef enum RunningMode
{
MODE_NOCARD = 0,
MODE_PROC = 1,
MODE_RESULT = 2,
MODE_MAX
}
RunningMode;
#ifdef DEBUG_SHOW_SDK_INFO
typedef struct KeyInfo
{
u16 cnt; // 未加工入力値
@ -76,15 +87,15 @@ typedef struct KeyInfo
static void MenuScene( void );
static void SplitToken(void);
#ifdef DEBUG_SHOW_SDK_INFO | DEBUG_MEM_DUMP
static void CheckCard( void *arg );
#ifdef DEBUG_SHOW_SDK_INFO
void ReadKey(KeyInfo* pKey);
#endif
// global variable -------------------------------------
// static variable -------------------------------------
static char s_mode = 0;
static char s_mode;
static BOOL s_secret = FALSE;
static BOOL s_show_error = FALSE;
static u8 s_error = 0;
@ -92,7 +103,11 @@ static u8 s_digest[MATH_SHA1_DIGEST_SIZE];
static u32 s_hit = 0;
static char s_sdk_name[SHOW_SDK_INFO_NUM][SHOW_SDK_INFO_SIZE];
static int s_same_sdk_num;
#ifdef DEBUG_SHOW_SDK_INFO | DEBUG_MEM_DUMP
static OSThread s_thread;
static u64 s_stack[ STACK_SIZE / sizeof(u64) ];
#ifdef DEBUG_SHOW_SDK_INFO
static KeyInfo gKey;
static u32 gIndex;
static void *data_buf;
@ -151,35 +166,15 @@ static BOOL HOTSW_IsCardAccessible(void)
Description:
*---------------------------------------------------------------------------*/
#define CHANGE_INTERVAL 3
#define PROC_MARK_BASE_X 27
#define PROC_MARK_BASE_Y 20
static void DrawMainScene( void )
{
#ifdef DEBUG_MEM_DUMP
int i,j,idx;
u8 *buf = (u8 *)data_buf + gIndex*DUMP_SIZE;
if( s_mode == 0 )
{
myDp_Printf( 2, 1, TXT_COLOR_BLUE, SUB_SCREEN, "sub_rom_offset : 0x%08x", sp_header->sub_rom_offset);
myDp_Printf( 2, 2, TXT_COLOR_BLUE, SUB_SCREEN, "banner_offset : 0x%08x", sp_header->banner_offset);
myDp_Printf( 2, 3, TXT_COLOR_BLUE, SUB_SCREEN, "dump adr index : 0x%08x", DUMP_SIZE * gIndex );
idx = 0;
for ( i=0; i<0x10; i++ )
{
for ( j=0; j<8; j++ )
{
myDp_Printf( 2, 7 + i*1, TXT_COLOR_BLUE, SUB_SCREEN, "%02x #", i*0x8);
myDp_Printf( 7 + j*3, 7 + i*1, TXT_COLOR_BLUE, SUB_SCREEN, "%02x", buf[idx]);
idx++;
}
}
}
#endif
static u8 count = 0;
//int l;
myDp_Printf( 0, 7, TXT_COLOR_BLACK, SUB_SCREEN, "Component SDK Version Identifier");
#ifdef DEBUG_SHOW_SDK_INFO
myDp_Printf( 0, 1, TXT_COLOR_BLUE, MAIN_SCREEN, "s_same_sdk_num : %d", s_same_sdk_num);
myDp_Printf( 0, 2, TXT_COLOR_BLUE, MAIN_SCREEN, "s_hit : %d", s_hit);
@ -203,15 +198,73 @@ static void DrawMainScene( void )
}
#endif
switch( s_mode )
{
// カードなし状態
case MODE_NOCARD:
// カード無しモード
myDp_Printf( 1,11, TXT_COLOR_BLACK, SUB_SCREEN, "Please insert DS game card.");
break;
#ifdef DEBUG_MEM_DUMP
if( 1 )
#else
if( s_mode == 0 )
#endif
{
// 結果表示モード
if( s_error != DETECT_ERROR_NONE )
// 処理中状態
case MODE_PROC:
count++;
if( count >= 0 && count < CHANGE_INTERVAL )
{
myDp_Printf( PROC_MARK_BASE_X, PROC_MARK_BASE_Y , TXT_COLOR_LIGHTBLUE, SUB_SCREEN, "+++");
myDp_Printf( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+1, TXT_COLOR_LIGHTBLUE, SUB_SCREEN, "++");
myDp_Printf( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+2, TXT_COLOR_LIGHTBLUE, SUB_SCREEN, "+");
}
else if( count >= CHANGE_INTERVAL && count < CHANGE_INTERVAL*2 )
{
myDp_Printf( PROC_MARK_BASE_X, PROC_MARK_BASE_Y , TXT_COLOR_LIGHTBLUE, SUB_SCREEN, "+++");
myDp_Printf( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+1, TXT_COLOR_LIGHTBLUE, SUB_SCREEN, "+++");
}
else if( count >= CHANGE_INTERVAL*2 && count < CHANGE_INTERVAL*3 )
{
myDp_Printf( PROC_MARK_BASE_X, PROC_MARK_BASE_Y , TXT_COLOR_LIGHTBLUE, SUB_SCREEN, "+++");
myDp_Printf( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+1, TXT_COLOR_LIGHTBLUE, SUB_SCREEN, " ++");
myDp_Printf( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+2, TXT_COLOR_LIGHTBLUE, SUB_SCREEN, " +");
}
else if( count >= CHANGE_INTERVAL*3 && count < CHANGE_INTERVAL*4 )
{
myDp_Printf( PROC_MARK_BASE_X, PROC_MARK_BASE_Y , TXT_COLOR_LIGHTBLUE, SUB_SCREEN, " ++");
myDp_Printf( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+1, TXT_COLOR_LIGHTBLUE, SUB_SCREEN, " ++");
myDp_Printf( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+2, TXT_COLOR_LIGHTBLUE, SUB_SCREEN, " ++");
}
else if( count >= CHANGE_INTERVAL*4 && count < CHANGE_INTERVAL*5 )
{
myDp_Printf( PROC_MARK_BASE_X, PROC_MARK_BASE_Y , TXT_COLOR_LIGHTBLUE, SUB_SCREEN, " +");
myDp_Printf( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+1, TXT_COLOR_LIGHTBLUE, SUB_SCREEN, " ++");
myDp_Printf( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+2, TXT_COLOR_LIGHTBLUE, SUB_SCREEN, "+++");
}
else if( count >= CHANGE_INTERVAL*5 && count < CHANGE_INTERVAL*6 )
{
myDp_Printf( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+1, TXT_COLOR_LIGHTBLUE, SUB_SCREEN, "+++");
myDp_Printf( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+2, TXT_COLOR_LIGHTBLUE, SUB_SCREEN, "+++");
}
else if( count >= CHANGE_INTERVAL*6 && count < CHANGE_INTERVAL*7 )
{
myDp_Printf( PROC_MARK_BASE_X, PROC_MARK_BASE_Y , TXT_COLOR_LIGHTBLUE, SUB_SCREEN, "+");
myDp_Printf( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+1, TXT_COLOR_LIGHTBLUE, SUB_SCREEN, "++");
myDp_Printf( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+2, TXT_COLOR_LIGHTBLUE, SUB_SCREEN, "+++");
}
else if( count >= CHANGE_INTERVAL*7 && count < CHANGE_INTERVAL*8)
{
myDp_Printf( PROC_MARK_BASE_X, PROC_MARK_BASE_Y , TXT_COLOR_LIGHTBLUE, SUB_SCREEN, "++");
myDp_Printf( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+1, TXT_COLOR_LIGHTBLUE, SUB_SCREEN, "++");
myDp_Printf( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+2, TXT_COLOR_LIGHTBLUE, SUB_SCREEN, "++");
}
if( count == CHANGE_INTERVAL*8 - 1 )
{
count = 0;
}
break;
// 結果表示状態
case MODE_RESULT:
if( s_error != DETECT_ERROR_NONE )
{
// エラー表示
myDp_Printf( 1,10, TXT_COLOR_RED, SUB_SCREEN, "Registered ARM7 component");
@ -229,7 +282,6 @@ static void DrawMainScene( void )
myDp_Printf( 1, 3, TXT_COLOR_BLACK, MAIN_SCREEN, "TitleName :");
myDp_Printf(13, 3, TXT_COLOR_BLUE, MAIN_SCREEN, "%s", sp_header->title_name);
{
int i;
for( i = 0; i < s_same_sdk_num; i++ )
@ -248,21 +300,14 @@ static void DrawMainScene( void )
myDp_Printf( 1, 23, TXT_COLOR_RED, MAIN_SCREEN, "Error : Can Not Show SDK Info");
}
}
/*
myDp_Printf( 1, 10, TXT_COLOR_BLUE, MAIN_SCREEN, "Arm7FLXDigest :");
for(l=0;l<MATH_SHA1_DIGEST_SIZE;l++)
{
myDp_Printf( 2+3*(l%10), 11+l/10, TXT_COLOR_BLUE, MAIN_SCREEN, "%02x ", s_digest[l]);
}
*/
}
}else
{
// カード無しモード
myDp_Printf( 1,11, TXT_COLOR_BLACK, SUB_SCREEN, "Please insert DS game card.");
}
// 隠し ID 表示
break;
default:
break;
}
// 隠し ID 表示
if ( s_secret )
{
myDp_Printf( 1, 20, TXT_COLOR_BLUE, SUB_SCREEN, "ID : %d", ID_NUM);
@ -275,8 +320,10 @@ static void DrawMainScene( void )
Description:
*---------------------------------------------------------------------------*/
static void CheckCard( void )
static void CheckCard( void *arg )
{
#pragma unused( arg )
void *sp_arm7flx;
void *old_lo;
int m;
@ -305,23 +352,9 @@ static void CheckCard( void )
OS_SetMainArenaLo( (void *)((u32)sp_arm7flx + sp_header->sub_size) ); // アリーナLo修正
#ifdef DEBUG_MEM_DUMP
data_buf = sp_arm7flx;
#endif
// ARM9のSecure除いた部分を空読み出し
if( (sp_header->main_rom_offset + sp_header->main_size) > 0x8000 )
{
#ifdef DEBUG_MEM_DUMP
u32 auth_offset = sp_header->rom_valid_size ? sp_header->rom_valid_size : 0x01000000;
u32 page_offset = auth_offset & 0xFFFFFE00;
// バナーデータ分 ※ DEBUG_MODE有効時、ここの部分が実行時エラーになるかもしれないので、コメントアウトしておく。
// CARD_ReadRom( MI_DMA_NOT_USE, (void *)sp_header->banner_offset, sp_arm7flx, sizeof(TWLBannerFile) );
// 認証コード分 ※ DEBUG_MODE有効時、ここの部分が実行時エラーになるかもしれないので、コメントアウトしておく。
// CARD_ReadRom( MI_DMA_NOT_USE, (void *)page_offset, sp_arm7flx, MB_AUTHCODE_SIZE );
#endif
// Game領域のARM9常駐モジュール分
CARD_ReadRom( MI_DMA_NOT_USE, (void *)0x8000, sp_arm7flx, (sp_header->main_size - (0x8000 - sp_header->main_rom_offset)) );
}
@ -352,10 +385,8 @@ static void CheckCard( void )
SplitToken();
}
#ifndef DEBUG_MEM_DUMP
// もうバッファいらない
OS_SetMainArenaLo( old_lo );
#endif
s_error = 0;
return;
@ -413,32 +444,28 @@ void NitroArm7VerCheckerInit( void )
{
GX_DispOff();
GXS_DispOff();
myDp_Printf( 0, 0, TXT_COLOR_BLUE, MAIN_SCREEN, "Component SDK Version Identifier");
GXS_SetVisiblePlane( GX_PLANEMASK_BG0 );
GXS_SetVisiblePlane( GX_PLANEMASK_BG0 );
GX_DispOn();
GXS_DispOn();
FS_Init(3);
OS_InitTick();
s_mode = MODE_NOCARD;
// この時点でカードが存在していたらカードチェック開始
if( HOTSW_IsCardExist() && HOTSW_IsCardAccessible() )
{
s_mode = 0;
CheckCard();
}else
{
s_mode = 1;
OS_TPrintf("Card Exist\n");
OS_CreateThread( &s_thread, CheckCard, NULL, s_stack+STACK_SIZE/sizeof(u64), STACK_SIZE, THREAD_PRIO );
OS_WakeupThreadDirect( &s_thread );
s_mode = MODE_PROC;
}
// 表示
DrawMainScene();
OS_Printf("*** TWLBannerFile size : 0x%08x\n", sizeof(TWLBannerFile) );
}
#define PAD_SECRET ( PAD_BUTTON_START | PAD_BUTTON_X | PAD_BUTTON_Y )
@ -454,7 +481,6 @@ void NitroArm7VerCheckerMain(void)
//--------------------------------------
// キー入力処理
//--------------------------------------
// SLEEP + X + Y + START で隠し ID 表示
if( PAD_DetectFold() &&
( gKeyWork.press == PAD_SECRET )
@ -466,8 +492,6 @@ void NitroArm7VerCheckerMain(void)
s_secret = FALSE;
}
//myDp_Printf( 1, 16, TXT_COLOR_BLUE, MAIN_SCREEN, "slotmode : %d", HOTSW_IsCardAccessible());
//myDp_Printf( 1, 17, TXT_COLOR_BLUE, MAIN_SCREEN, "exist : %d", HOTSW_IsCardExist());
#ifdef DEBUG_SHOW_SDK_INFO
{
@ -508,86 +532,39 @@ void NitroArm7VerCheckerMain(void)
}
#endif
#ifdef DEBUG_MEM_DUMP
ReadKey(&gKey);
if (gKey.rep & PAD_KEY_DOWN || gKey.trg & PAD_KEY_DOWN)
{
if( (gIndex + 1) * DUMP_SIZE < sp_header->sub_size )
{
gIndex++;
}
}
if (gKey.rep & PAD_KEY_UP || gKey.trg & PAD_KEY_UP)
{
if( gIndex >= 1 )
{
gIndex--;
}
}
if (gKey.rep & PAD_BUTTON_R || gKey.trg & PAD_BUTTON_R)
{
if( (gIndex + 0x100) * DUMP_SIZE < sp_header->sub_size )
{
gIndex+=0x100;
}
}
if (gKey.rep & PAD_BUTTON_L || gKey.trg & PAD_BUTTON_L)
{
if( gIndex >= 0x100 )
{
gIndex-=0x100;
}
}
if (gKey.rep & PAD_KEY_LEFT || gKey.trg & PAD_KEY_LEFT)
{
if( s_hit - 1 >= 0 )
{
s_hit--;
}
}
if (gKey.rep & PAD_KEY_RIGHT || gKey.trg & PAD_KEY_RIGHT)
{
if( s_hit + 1 < SDK_INFO_NUM )
{
s_hit++;
}
}
if (gKey.trg & PAD_BUTTON_B)
{
if(s_error < DETECT_ERROR_MAX)
{
s_error++;
}
else
{
s_error=0;
}
}
#endif
// 再表示
DrawMainScene();
if( s_mode == 0)
{
// 結果表示モード
// カードが抜けたのを検出したらカード無しモードへ
if( HOTSW_IsCardExist() == FALSE )
{
s_mode = 1;
}
}else
{
// カード無しモード
// カードが刺さったのを検出したら再起動
switch( s_mode )
{
// カードなしモード
case MODE_NOCARD:
// カードが刺さったのを検出したら再起動
if( HOTSW_IsCardExist() == TRUE ) {
OS_DoApplicationJump( OS_GetTitleId(), OS_APP_JUMP_NORMAL );
}
}
break;
// 処理中モード
case MODE_PROC:
if( OS_IsThreadTerminated( &s_thread ) )
{
s_mode = MODE_RESULT;
}
break;
// 結果表示モード
case MODE_RESULT:
// カードが抜けたのを検出したらカード無しモードへ
if( HOTSW_IsCardExist() == FALSE )
{
s_mode = MODE_NOCARD;
}
break;
default:
break;
}
}
@ -601,7 +578,7 @@ void NitroArm7VerCheckerMain(void)
Returns: None.
*---------------------------------------------------------------------------*/
#ifdef DEBUG_SHOW_SDK_INFO | DEBUG_MEM_DUMP
#ifdef DEBUG_SHOW_SDK_INFO
void ReadKey(KeyInfo* pKey)
{
static u16 repeat_count[12];