/*---------------------------------------------------------------------------* Project: TwlSDK - NandInitializer File: process_hw_info.c Copyright 2008 Nintendo. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Date:: $ $Rev$ $Author$ *---------------------------------------------------------------------------*/ #include #include #include #include #include #include "kami_font.h" #include "kami_pxi.h" #include "process_topmenu.h" #include "process_hw_info.h" #include "process_auto.h" #include "process_fade.h" #include "cursor.h" #include "keypad.h" #include "hwi.h" // #include "TWLHWInfo_api.h" #include "TWLSettings_api.h" // /*---------------------------------------------------------------------------* 型定義 *---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------* 定数定義 *---------------------------------------------------------------------------*/ #define NUM_OF_MENU_SELECT 8 #define DOT_OF_MENU_SPACE 16 #define CHAR_OF_MENU_SPACE 2 #define CURSOR_ORIGIN_X 32 #define CURSOR_ORIGIN_Y 56 static const u32 s_langBitmapList[ LCFG_TWL_REGION_MAX ] = { LCFG_TWL_LANG_BITMAP_JAPAN, LCFG_TWL_LANG_BITMAP_AMERICA, LCFG_TWL_LANG_BITMAP_EUROPE, LCFG_TWL_LANG_BITMAP_AUSTRALIA, LCFG_TWL_LANG_BITMAP_CHINA, LCFG_TWL_LANG_BITMAP_KOREA, }; static char *strLanguage[] = { (char *)"LANG_JAPANESE", (char *)"LANG_ENGLISH", (char *)"LANG_FRENCH", (char *)"LANG_GERMAN", (char *)"LANG_ITALIAN", (char *)"LANG_SPANISH", (char *)"LANG_CHINESE", (char *)"LANG_KOREAN", }; static const char *strRegion[] = { "JAPAN", "AMERICA", "EUROPE", "AUSTRALIA", "CHINA", "KOREA", }; static const char *strLauncherGameCode[] = { "LNCJ", "LNCE", "LNCP", "LNCO", "LNCC", "LNCK", }; /*---------------------------------------------------------------------------* 内部変数定義 *---------------------------------------------------------------------------*/ static s8 sMenuSelectNo; static u8 *s_pPrivKeyBuffer = NULL; static LCFGReadResult (*s_pReadSecureInfoFunc)( void ); static BOOL s_isReadTSD; /*---------------------------------------------------------------------------* 内部関数宣言 *---------------------------------------------------------------------------*/ void HWInfoWriterInit( void ); static void ReadTWLSettings( void ); static void ModifyLanguage( u8 region ); static void ReadPrivateKey( void ); static void ReadHWInfoFile( void ); static void VerifyHWInfo( void ); static BOOL WriteHWInfoFile( u8 region ); static BOOL WriteHWNormalInfoFile( void ); static BOOL WriteHWSecureInfoFile( u8 region ); static BOOL DeleteHWInfoFile( void ); const LCFGTWLHWNormalInfo *LCFG_THW_GetDefaultNormalInfo( void ); const LCFGTWLHWSecureInfo *LCFG_THW_GetDefaultSecureInfo( void ); const LCFGTWLHWNormalInfo *LCFG_THW_GetNormalInfo( void ); const LCFGTWLHWSecureInfo *LCFG_THW_GetSecureInfo( void ); /*---------------------------------------------------------------------------* プロセス関数定義 *---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------* Name: HWInfo プロセス0 Description: Arguments: None. Returns: next sequence *---------------------------------------------------------------------------*/ void* HWInfoProcess0(void) { HwiInitResult initResult; int i; // 文字列全クリア kamiFontClear(); // バージョン表示 kamiFontPrintf(2, 1, FONT_COLOR_BLACK, "Write Hardware Information "); kamiFontPrintf(0, 2, FONT_COLOR_BLACK, "--------------------------------"); // メニュー一覧 kamiFontPrintf(3, 6, FONT_COLOR_BLACK, "+--------------------+----+"); kamiFontPrintf(3, 7, FONT_COLOR_BLACK, "l REGION JAPAN l l"); kamiFontPrintf(3, 8, FONT_COLOR_BLACK, "+--------------------+----+"); kamiFontPrintf(3, 9, FONT_COLOR_BLACK, "l REGION AMERICA l l"); kamiFontPrintf(3, 10, FONT_COLOR_BLACK, "+--------------------+----+"); kamiFontPrintf(3, 11, FONT_COLOR_BLACK, "l REGION EUROPE l l"); kamiFontPrintf(3, 12, FONT_COLOR_BLACK, "+--------------------+----+"); kamiFontPrintf(3, 13, FONT_COLOR_BLACK, "l REGION AUSTRALIA l l"); kamiFontPrintf(3, 14, FONT_COLOR_BLACK, "+--------------------+----+"); kamiFontPrintf(3, 15, FONT_COLOR_BLACK, "l REGION CHINA l l"); kamiFontPrintf(3, 16, FONT_COLOR_BLACK, "+--------------------+----+"); kamiFontPrintf(3, 17, FONT_COLOR_BLACK, "l REGION KOREA l l"); kamiFontPrintf(3, 18, FONT_COLOR_BLACK, "+--------------------+----+"); kamiFontPrintf(3, 19, FONT_COLOR_BLACK, "l DELETE l l"); kamiFontPrintf(3, 20, FONT_COLOR_BLACK, "+--------------------+----+"); kamiFontPrintf(3, 21, FONT_COLOR_BLACK, "l RETURN l l"); kamiFontPrintf(3, 22, FONT_COLOR_BLACK, "+--------------------+----+"); // 背景全クリア for (i=0;i<24;i++) { kamiFontFillChar( i, BG_COLOR_TRANS, BG_COLOR_TRANS ); } // 背景上部 kamiFontFillChar( 0, BG_COLOR_PURPLE, BG_COLOR_PURPLE ); kamiFontFillChar( 1, BG_COLOR_PURPLE, BG_COLOR_PURPLE ); kamiFontFillChar( 2, BG_COLOR_PURPLE, BG_COLOR_TRANS ); // カーソル除外 SetCursorPos((u16)200, (u16)200); // 前準備 initResult = HWI_Init( OS_AllocFromMain, OS_FreeToMain ); switch (initResult) { case HWI_INIT_FAILURE: kamiFontPrintfConsoleEx(CONSOLE_RED, "HWI_INIT() Failure!\n" ); break; case HWI_INIT_SUCCESS_SIGNATURE_MODE: kamiFontPrintfConsoleEx(CONSOLE_ORANGE, "[Signature MODE]\n" ); break; case HWI_INIT_SUCCESS_NO_SIGNATRUE_MODE: kamiFontPrintfConsoleEx(CONSOLE_RED, "[No Signature MODE]\n" ); break; } FADE_IN_RETURN( HWInfoProcess1 ); } /*---------------------------------------------------------------------------* Name: HWInfo プロセス1 Description: Arguments: None. Returns: next sequence *---------------------------------------------------------------------------*/ void* HWInfoProcess1(void) { // オート実行用 if (gAutoFlag) { sMenuSelectNo = 0; return HWInfoProcess2; } // 選択メニューの変更 if ( kamiPadIsRepeatTrigger(PAD_KEY_UP) ) { if (--sMenuSelectNo < 0) sMenuSelectNo = NUM_OF_MENU_SELECT -1; } else if ( kamiPadIsRepeatTrigger(PAD_KEY_DOWN) ) { if (++sMenuSelectNo >= NUM_OF_MENU_SELECT) sMenuSelectNo = 0; } // カーソル配置 SetCursorPos((u16)CURSOR_ORIGIN_X, (u16)(CURSOR_ORIGIN_Y + sMenuSelectNo * DOT_OF_MENU_SPACE)); // 決定 if (kamiPadIsTrigger(PAD_BUTTON_A)) { return HWInfoProcess2; } // トップメニューへ戻る else if (kamiPadIsTrigger(PAD_BUTTON_B)) { FADE_OUT_RETURN( TopmenuProcess0 ); } return HWInfoProcess1; } /*---------------------------------------------------------------------------* Name: HWInfo プロセス2 Description: Arguments: None. Returns: next sequence *---------------------------------------------------------------------------*/ void* HWInfoProcess2(void) { int i; BOOL result; switch( sMenuSelectNo ) { case 0: case 1: case 2: case 3: case 4: case 5: OS_TPrintf( "Write Start.\n" ); result = WriteHWInfoFile( (u8)sMenuSelectNo ); break; case 6: OS_TPrintf( "Delete start.\n" ); result = DeleteHWInfoFile(); break; case 7: FADE_OUT_RETURN( TopmenuProcess0 ); } // 全結果をクリア for (i=0;i