mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
hwi.c関連以外はacsignライブラリをリンクしないように修正、
hwi.c関連はcryptoライブラリをリンクしないように修正 (TWLHWInfo.cでcryptoの方を使うようにすべき) git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@976 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
fc8597b10a
commit
6005d7e993
@ -69,7 +69,6 @@ SYSMENU_LIBS ?= \
|
|||||||
libsysmenu$(TWL_LIBSUFFIX).a \
|
libsysmenu$(TWL_LIBSUFFIX).a \
|
||||||
libsysmmcu$(TWL_LIBSUFFIX).a \
|
libsysmmcu$(TWL_LIBSUFFIX).a \
|
||||||
libmbloader$(TWL_LIBSUFFIX).a \
|
libmbloader$(TWL_LIBSUFFIX).a \
|
||||||
libacsign$(TWL_LIBSUFFIX).a \
|
|
||||||
libboot$(TWL_LIBSUFFIX).a \
|
libboot$(TWL_LIBSUFFIX).a \
|
||||||
libds$(TWL_LIBSUFFIX).a \
|
libds$(TWL_LIBSUFFIX).a \
|
||||||
|
|
||||||
|
|||||||
@ -44,7 +44,8 @@ SRCS = main.c HWInfoWriter.c hwi.c \
|
|||||||
|
|
||||||
LINCLUDES = $(MISC_DIR)/include \
|
LINCLUDES = $(MISC_DIR)/include \
|
||||||
$(ROOT)/build/libraries/lcfg/ARM9.TWL/include
|
$(ROOT)/build/libraries/lcfg/ARM9.TWL/include
|
||||||
LLIBRARIES = libacsign_enc$(TWL_LIBSUFFIX).a
|
LLIBRARIES = libacsign$(TWL_LIBSUFFIX).a \
|
||||||
|
libacsign_enc$(TWL_LIBSUFFIX).a
|
||||||
|
|
||||||
ifneq ($(TWL_IPL_RED_PRIVATE_ROOT),)
|
ifneq ($(TWL_IPL_RED_PRIVATE_ROOT),)
|
||||||
ifdef USE_PRODUCT_KEY
|
ifdef USE_PRODUCT_KEY
|
||||||
@ -65,6 +66,8 @@ include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
|
|||||||
|
|
||||||
MAKEROM = $(TWL_TOOLSDIR)/bin/makerom.TWL.secure.exe
|
MAKEROM = $(TWL_TOOLSDIR)/bin/makerom.TWL.secure.exe
|
||||||
|
|
||||||
|
GLIBRARIES := $(filter-out libcrypto$(TWL_LIBSUFFIX).a,$(GLIBRARIES))
|
||||||
|
|
||||||
LDIRT_CLEAN = $(TARGET_TAD)
|
LDIRT_CLEAN = $(TARGET_TAD)
|
||||||
INSTALL_TARGETS = $(TARGET_TAD)
|
INSTALL_TARGETS = $(TARGET_TAD)
|
||||||
INSTALL_DIR = $(SDK_NMENU_DATADIR)
|
INSTALL_DIR = $(SDK_NMENU_DATADIR)
|
||||||
|
|||||||
@ -17,15 +17,16 @@
|
|||||||
|
|
||||||
#include <twl.h>
|
#include <twl.h>
|
||||||
#include <sysmenu.h>
|
#include <sysmenu.h>
|
||||||
|
#include <sysmenu/acsign.h>
|
||||||
#include "TWLHWInfo_api.h"
|
#include "TWLHWInfo_api.h"
|
||||||
#include "TWLSettings_api.h"
|
#include "TWLSettings_api.h"
|
||||||
#include "hwi.h"
|
#include "hwi.h"
|
||||||
|
|
||||||
// define data------------------------------------------
|
// define data------------------------------------------
|
||||||
#ifdef USE_PRODUCT_KEY // 鍵選択スイッチ
|
#ifdef USE_PRODUCT_KEY // 鍵選択スイッチ
|
||||||
#define HWINFO_PRIVKEY_PATH "rom:key/private_HWInfo.der" // 製品用秘密鍵
|
#define HWINFO_PRIVKEY_PATH "rom:key/private_HWInfo.der" // 製品用秘密鍵
|
||||||
#else
|
#else
|
||||||
#define HWINFO_PRIVKEY_PATH "rom:key/private_HWInfo_dev.der" // 開発用秘密鍵
|
#define HWINFO_PRIVKEY_PATH "rom:key/private_HWInfo_dev.der" // 開発用秘密鍵
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// extern data------------------------------------------
|
// extern data------------------------------------------
|
||||||
@ -52,32 +53,32 @@ static void (*spFree)( void *ptr );
|
|||||||
// const data -----------------------------------------
|
// const data -----------------------------------------
|
||||||
|
|
||||||
static const u32 s_langBitmapList[ OS_TWL_REGION_MAX ] = {
|
static const u32 s_langBitmapList[ OS_TWL_REGION_MAX ] = {
|
||||||
LCFG_TWL_LANG_BITMAP_JAPAN,
|
LCFG_TWL_LANG_BITMAP_JAPAN,
|
||||||
LCFG_TWL_LANG_BITMAP_AMERICA,
|
LCFG_TWL_LANG_BITMAP_AMERICA,
|
||||||
LCFG_TWL_LANG_BITMAP_EUROPE,
|
LCFG_TWL_LANG_BITMAP_EUROPE,
|
||||||
LCFG_TWL_LANG_BITMAP_AUSTRALIA,
|
LCFG_TWL_LANG_BITMAP_AUSTRALIA,
|
||||||
LCFG_TWL_LANG_BITMAP_CHINA,
|
LCFG_TWL_LANG_BITMAP_CHINA,
|
||||||
LCFG_TWL_LANG_BITMAP_KOREA,
|
LCFG_TWL_LANG_BITMAP_KOREA,
|
||||||
};
|
};
|
||||||
|
|
||||||
static char *strLanguage[] = {
|
static char *strLanguage[] = {
|
||||||
(char *)"LANG_JAPANESE",
|
(char *)"LANG_JAPANESE",
|
||||||
(char *)"LANG_ENGLISH",
|
(char *)"LANG_ENGLISH",
|
||||||
(char *)"LANG_FRENCH",
|
(char *)"LANG_FRENCH",
|
||||||
(char *)"LANG_GERMAN",
|
(char *)"LANG_GERMAN",
|
||||||
(char *)"LANG_ITALIAN",
|
(char *)"LANG_ITALIAN",
|
||||||
(char *)"LANG_SPANISH",
|
(char *)"LANG_SPANISH",
|
||||||
(char *)"LANG_CHINESE",
|
(char *)"LANG_CHINESE",
|
||||||
(char *)"LANG_KOREAN",
|
(char *)"LANG_KOREAN",
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *strLauncherGameCode[] = {
|
static const char *strLauncherGameCode[] = {
|
||||||
"LNCJ",
|
"LNCJ",
|
||||||
"LNCE",
|
"LNCE",
|
||||||
"LNCP",
|
"LNCP",
|
||||||
"LNCO",
|
"LNCO",
|
||||||
"LNCC",
|
"LNCC",
|
||||||
"LNCK",
|
"LNCK",
|
||||||
};
|
};
|
||||||
|
|
||||||
//======================================================
|
//======================================================
|
||||||
@ -95,143 +96,143 @@ static const char *strLauncherGameCode[] = {
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
HwiInitResult HWI_Init( void *(*pAlloc)( u32 ), void (*pFree)( void * ) )
|
HwiInitResult HWI_Init( void *(*pAlloc)( u32 ), void (*pFree)( void * ) )
|
||||||
{
|
{
|
||||||
HwiInitResult result;
|
HwiInitResult result;
|
||||||
|
|
||||||
spAlloc = pAlloc;
|
spAlloc = pAlloc;
|
||||||
spFree = pFree;
|
spFree = pFree;
|
||||||
|
|
||||||
ACSign_SetAllocFunc( pAlloc, pFree );
|
ACSign_SetAllocFunc( pAlloc, pFree );
|
||||||
result = ReadPrivateKey();
|
result = ReadPrivateKey();
|
||||||
ReadHWInfoFile();
|
ReadHWInfoFile();
|
||||||
// VerifyHWInfo();
|
// VerifyHWInfo();
|
||||||
if( 1 ) {
|
if( 1 ) {
|
||||||
u8 sign[ RSA_KEY_LENGTH ];
|
u8 sign[ RSA_KEY_LENGTH ];
|
||||||
if( !LCFG_ReadHWID_Signature( sign ) ||
|
if( !LCFG_ReadHWID_Signature( sign ) ||
|
||||||
!LCFG_CheckHWID_Signature( sign )
|
!LCFG_CheckHWID_Signature( sign )
|
||||||
) {
|
) {
|
||||||
OS_TPrintf( "HWID Signature check failed.\n" );
|
OS_TPrintf( "HWID Signature check failed.\n" );
|
||||||
}else {
|
}else {
|
||||||
OS_TPrintf( "HWID Signature check succeeded.\n" );
|
OS_TPrintf( "HWID Signature check succeeded.\n" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ※LanguageBitmapを判定で使用するので、必ずReadHWInfoの後で実行する必要がある。
|
// ※LanguageBitmapを判定で使用するので、必ずReadHWInfoの後で実行する必要がある。
|
||||||
ReadTWLSettings();
|
ReadTWLSettings();
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// TWL設定データのリード
|
// TWL設定データのリード
|
||||||
static void ReadTWLSettings( void )
|
static void ReadTWLSettings( void )
|
||||||
{
|
{
|
||||||
u8 *pBuffer = spAlloc( LCFG_READ_TEMP );
|
u8 *pBuffer = spAlloc( LCFG_READ_TEMP );
|
||||||
s_isReadTSD = FALSE;
|
s_isReadTSD = FALSE;
|
||||||
if( pBuffer ) {
|
if( pBuffer ) {
|
||||||
s_isReadTSD = LCFG_ReadTWLSettings( (u8 (*)[ LCFG_READ_TEMP ] )pBuffer );
|
s_isReadTSD = LCFG_ReadTWLSettings( (u8 (*)[ LCFG_READ_TEMP ] )pBuffer );
|
||||||
spFree( pBuffer );
|
spFree( pBuffer );
|
||||||
}
|
}
|
||||||
if( s_isReadTSD ) {
|
if( s_isReadTSD ) {
|
||||||
OS_TPrintf( "TSD read succeeded.\n" );
|
OS_TPrintf( "TSD read succeeded.\n" );
|
||||||
}else {
|
}else {
|
||||||
OS_TPrintf( "TSD read failed.\n" );
|
OS_TPrintf( "TSD read failed.\n" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 秘密鍵のリード
|
// 秘密鍵のリード
|
||||||
HwiInitResult ReadPrivateKey( void )
|
HwiInitResult ReadPrivateKey( void )
|
||||||
{
|
{
|
||||||
BOOL result = FALSE;
|
BOOL result = FALSE;
|
||||||
u32 keyLength;
|
u32 keyLength;
|
||||||
FSFile file;
|
FSFile file;
|
||||||
OSTick start = OS_GetTick();
|
OSTick start = OS_GetTick();
|
||||||
|
|
||||||
FS_InitFile( &file );
|
FS_InitFile( &file );
|
||||||
if( !FS_OpenFileEx( &file, HWINFO_PRIVKEY_PATH, FS_FILEMODE_R ) )
|
if( !FS_OpenFileEx( &file, HWINFO_PRIVKEY_PATH, FS_FILEMODE_R ) )
|
||||||
{
|
{
|
||||||
OS_TPrintf( "PrivateKey read failed.\n" );
|
OS_TPrintf( "PrivateKey read failed.\n" );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
keyLength = FS_GetFileLength( &file );
|
keyLength = FS_GetFileLength( &file );
|
||||||
if( keyLength > 0 ) {
|
if( keyLength > 0 ) {
|
||||||
s_pPrivKeyBuffer = spAlloc( keyLength );
|
s_pPrivKeyBuffer = spAlloc( keyLength );
|
||||||
if( FS_ReadFile( &file, s_pPrivKeyBuffer, (s32)keyLength ) == keyLength ) {
|
if( FS_ReadFile( &file, s_pPrivKeyBuffer, (s32)keyLength ) == keyLength ) {
|
||||||
OS_TPrintf( "PrivateKey read succeeded.\n" );
|
OS_TPrintf( "PrivateKey read succeeded.\n" );
|
||||||
result = TRUE;
|
result = TRUE;
|
||||||
}else {
|
}else {
|
||||||
OS_TPrintf( "PrivateKey read failed.\n" );
|
OS_TPrintf( "PrivateKey read failed.\n" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FS_CloseFile( &file );
|
FS_CloseFile( &file );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !result && s_pPrivKeyBuffer ) {
|
if( !result && s_pPrivKeyBuffer ) {
|
||||||
spFree( s_pPrivKeyBuffer );
|
spFree( s_pPrivKeyBuffer );
|
||||||
s_pPrivKeyBuffer = NULL;
|
s_pPrivKeyBuffer = NULL;
|
||||||
}
|
}
|
||||||
OS_TPrintf( "PrivKey read time = %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
|
OS_TPrintf( "PrivKey read time = %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
|
||||||
|
|
||||||
if (result) {
|
if (result) {
|
||||||
#ifdef USE_PRODUCT_KEY
|
#ifdef USE_PRODUCT_KEY
|
||||||
return HWI_INIT_SUCCESS_PRO_SIGNATURE_MODE;
|
return HWI_INIT_SUCCESS_PRO_SIGNATURE_MODE;
|
||||||
#else
|
#else
|
||||||
return HWI_INIT_SUCCESS_DEV_SIGNATURE_MODE;
|
return HWI_INIT_SUCCESS_DEV_SIGNATURE_MODE;
|
||||||
#endif
|
#endif
|
||||||
}else {
|
}else {
|
||||||
return HWI_INIT_SUCCESS_NO_SIGNATRUE_MODE;
|
return HWI_INIT_SUCCESS_NO_SIGNATRUE_MODE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// HW情報全体のリード
|
// HW情報全体のリード
|
||||||
static void ReadHWInfoFile( void )
|
static void ReadHWInfoFile( void )
|
||||||
{
|
{
|
||||||
LCFGReadResult retval;
|
LCFGReadResult retval;
|
||||||
OSTick start = OS_GetTick();
|
OSTick start = OS_GetTick();
|
||||||
|
|
||||||
retval = LCFGi_THW_ReadNormalInfo();
|
retval = LCFGi_THW_ReadNormalInfo();
|
||||||
if( retval == LCFG_TSF_READ_RESULT_SUCCEEDED ) {
|
if( retval == LCFG_TSF_READ_RESULT_SUCCEEDED ) {
|
||||||
OS_TPrintf( "HW Normal Info read succeeded.\n" );
|
OS_TPrintf( "HW Normal Info read succeeded.\n" );
|
||||||
}else {
|
}else {
|
||||||
OS_TPrintf( "HW Normal Info read failed.\n" );
|
OS_TPrintf( "HW Normal Info read failed.\n" );
|
||||||
}
|
}
|
||||||
|
|
||||||
OS_TPrintf( "HW Normal Info read time = %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
|
OS_TPrintf( "HW Normal Info read time = %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
|
||||||
|
|
||||||
start = OS_GetTick();
|
start = OS_GetTick();
|
||||||
retval = LCFGi_THW_ReadSecureInfo();
|
retval = LCFGi_THW_ReadSecureInfo();
|
||||||
if( retval == LCFG_TSF_READ_RESULT_SUCCEEDED ) {
|
if( retval == LCFG_TSF_READ_RESULT_SUCCEEDED ) {
|
||||||
OS_TPrintf( "HW Secure Info read succeeded.\n" );
|
OS_TPrintf( "HW Secure Info read succeeded.\n" );
|
||||||
}else {
|
}else {
|
||||||
OS_TPrintf( "HW Secure Info read failed.\n" );
|
OS_TPrintf( "HW Secure Info read failed.\n" );
|
||||||
}
|
}
|
||||||
OS_TPrintf( "HW Secure Info read time = %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
|
OS_TPrintf( "HW Secure Info read time = %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// HWInfoファイルのベリファイ
|
// HWInfoファイルのベリファイ
|
||||||
static void VerifyHWInfo( void )
|
static void VerifyHWInfo( void )
|
||||||
{
|
{
|
||||||
if( VerifyData( (const u8 *)LCFG_THW_GetNormalInfo(), (const u8 *)LCFG_THW_GetDefaultNormalInfo(), sizeof(LCFGTWLHWNormalInfo) ) ) {
|
if( VerifyData( (const u8 *)LCFG_THW_GetNormalInfo(), (const u8 *)LCFG_THW_GetDefaultNormalInfo(), sizeof(LCFGTWLHWNormalInfo) ) ) {
|
||||||
OS_TPrintf( "HW normal Info verify succeeded.\n" );
|
OS_TPrintf( "HW normal Info verify succeeded.\n" );
|
||||||
}else {
|
}else {
|
||||||
OS_TPrintf( "HW normal Info verify failed.\n" );
|
OS_TPrintf( "HW normal Info verify failed.\n" );
|
||||||
}
|
}
|
||||||
if( VerifyData( (const u8 *)LCFG_THW_GetSecureInfo(), (const u8 *)LCFG_THW_GetDefaultSecureInfo(), sizeof(LCFGTWLHWSecureInfo) ) ) {
|
if( VerifyData( (const u8 *)LCFG_THW_GetSecureInfo(), (const u8 *)LCFG_THW_GetDefaultSecureInfo(), sizeof(LCFGTWLHWSecureInfo) ) ) {
|
||||||
OS_TPrintf( "HW secure Info verify succeeded.\n" );
|
OS_TPrintf( "HW secure Info verify succeeded.\n" );
|
||||||
}else {
|
}else {
|
||||||
OS_TPrintf( "HW secure Info verify failed.\n" );
|
OS_TPrintf( "HW secure Info verify failed.\n" );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// メモリ上のデータベリファイ
|
// メモリ上のデータベリファイ
|
||||||
static BOOL VerifyData( const u8 *pTgt, const u8 *pOrg, u32 len )
|
static BOOL VerifyData( const u8 *pTgt, const u8 *pOrg, u32 len )
|
||||||
{
|
{
|
||||||
while( len-- ) {
|
while( len-- ) {
|
||||||
if( *pTgt++ != *pOrg++ ) {
|
if( *pTgt++ != *pOrg++ ) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
@ -246,42 +247,42 @@ static BOOL VerifyData( const u8 *pTgt, const u8 *pOrg, u32 len )
|
|||||||
void HWI_ModifyLanguage( u8 region )
|
void HWI_ModifyLanguage( u8 region )
|
||||||
{
|
{
|
||||||
#pragma unused( region )
|
#pragma unused( region )
|
||||||
u32 langBitmap = LCFG_THW_GetValidLanguageBitmap();
|
u32 langBitmap = LCFG_THW_GetValidLanguageBitmap();
|
||||||
u8 nowLanguage = LCFG_TSD_GetLanguage();
|
u8 nowLanguage = LCFG_TSD_GetLanguage();
|
||||||
|
|
||||||
// TSDが読み込めていないなら、何もせずリターン
|
// TSDが読み込めていないなら、何もせずリターン
|
||||||
if( !s_isReadTSD ) {
|
if( !s_isReadTSD ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( langBitmap & ( 0x0001 << nowLanguage ) ) {
|
if( langBitmap & ( 0x0001 << nowLanguage ) ) {
|
||||||
OS_TPrintf( "Language no change.\n" );
|
OS_TPrintf( "Language no change.\n" );
|
||||||
}else {
|
}else {
|
||||||
int i;
|
int i;
|
||||||
for( i = 0; i < LCFG_TWL_LANG_CODE_MAX; i++ ) {
|
for( i = 0; i < LCFG_TWL_LANG_CODE_MAX; i++ ) {
|
||||||
if( langBitmap & ( 0x0001 << i ) ) {
|
if( langBitmap & ( 0x0001 << i ) ) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LCFG_TSD_SetLanguage( (LCFGTWLLangCode)i );
|
LCFG_TSD_SetLanguage( (LCFGTWLLangCode)i );
|
||||||
OS_TPrintf( "Language Change \"%s\" -> \"%s\"\n",
|
OS_TPrintf( "Language Change \"%s\" -> \"%s\"\n",
|
||||||
strLanguage[ nowLanguage ], strLanguage[ LCFG_TSD_GetLanguage() ] );
|
strLanguage[ nowLanguage ], strLanguage[ LCFG_TSD_GetLanguage() ] );
|
||||||
}
|
}
|
||||||
|
|
||||||
// 国コードもクリアしておく。
|
// 国コードもクリアしておく。
|
||||||
LCFG_TSD_SetCountry( LCFG_TWL_COUNTRY_UNDEFINED );
|
LCFG_TSD_SetCountry( LCFG_TWL_COUNTRY_UNDEFINED );
|
||||||
|
|
||||||
// ペアレンタルコントロール情報もクリアしておく
|
// ペアレンタルコントロール情報もクリアしておく
|
||||||
MI_CpuClearFast( (void *)LCFG_TSD_GetPCTLPtr(), sizeof(LCFGTWLParentalControl) );
|
MI_CpuClearFast( (void *)LCFG_TSD_GetPCTLPtr(), sizeof(LCFGTWLParentalControl) );
|
||||||
|
|
||||||
// regionが変わった場合は、LANGUAGE_BITMAPも必ず変わるので、それをNTR側に反映させるために必ずTWL設定データの書き込みも行う。
|
// regionが変わった場合は、LANGUAGE_BITMAPも必ず変わるので、それをNTR側に反映させるために必ずTWL設定データの書き込みも行う。
|
||||||
{
|
{
|
||||||
u8 *pBuffer = spAlloc( LCFG_WRITE_TEMP );
|
u8 *pBuffer = spAlloc( LCFG_WRITE_TEMP );
|
||||||
if( pBuffer ) {
|
if( pBuffer ) {
|
||||||
(void)LCFG_WriteTWLSettings( (u8 (*)[ LCFG_WRITE_TEMP ] )pBuffer );
|
(void)LCFG_WriteTWLSettings( (u8 (*)[ LCFG_WRITE_TEMP ] )pBuffer );
|
||||||
spFree( pBuffer );
|
spFree( pBuffer );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
@ -296,52 +297,52 @@ void HWI_ModifyLanguage( u8 region )
|
|||||||
BOOL HWI_WriteHWNormalInfoFile( void )
|
BOOL HWI_WriteHWNormalInfoFile( void )
|
||||||
{
|
{
|
||||||
const char* CAMERA_VOLATILE_INFO_PATH = "rom:/data/camera_volatile_info.bin";
|
const char* CAMERA_VOLATILE_INFO_PATH = "rom:/data/camera_volatile_info.bin";
|
||||||
LCFGTWLHWNormalInfo Info;
|
LCFGTWLHWNormalInfo Info;
|
||||||
FSFile file;
|
FSFile file;
|
||||||
LCFGReadResult result;
|
LCFGReadResult result;
|
||||||
BOOL open_is_ok;
|
BOOL open_is_ok;
|
||||||
BOOL read_is_ok;
|
BOOL read_is_ok;
|
||||||
|
|
||||||
result = LCFGi_THW_ReadNormalInfo();
|
result = LCFGi_THW_ReadNormalInfo();
|
||||||
if( result != LCFG_TSF_READ_RESULT_SUCCEEDED ) {
|
if( result != LCFG_TSF_READ_RESULT_SUCCEEDED ) {
|
||||||
if( !LCFGi_THW_RecoveryNormalInfo( result ) ) {
|
if( !LCFGi_THW_RecoveryNormalInfo( result ) ) {
|
||||||
OS_TPrintf( "HW Normal Info Recovery failed.\n" );
|
OS_TPrintf( "HW Normal Info Recovery failed.\n" );
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Info.rtcAdjust = LCFG_THW_GetRTCAdjust();
|
Info.rtcAdjust = LCFG_THW_GetRTCAdjust();
|
||||||
|
|
||||||
// ROMファイルオープン(カメラ情報)
|
// ROMファイルオープン(カメラ情報)
|
||||||
FS_InitFile(&file);
|
FS_InitFile(&file);
|
||||||
open_is_ok = FS_OpenFile(&file, CAMERA_VOLATILE_INFO_PATH);
|
open_is_ok = FS_OpenFile(&file, CAMERA_VOLATILE_INFO_PATH);
|
||||||
if (!open_is_ok)
|
if (!open_is_ok)
|
||||||
{
|
{
|
||||||
OS_Printf("FS_OpenFile(\"%s\") ... ERROR!\n", CAMERA_VOLATILE_INFO_PATH);
|
OS_Printf("FS_OpenFile(\"%s\") ... ERROR!\n", CAMERA_VOLATILE_INFO_PATH);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ROMファイルリード
|
// ROMファイルリード
|
||||||
read_is_ok = FS_ReadFile( &file, Info.camera, (s32)sizeof( Info.camera ) );
|
read_is_ok = FS_ReadFile( &file, Info.camera, (s32)sizeof( Info.camera ) );
|
||||||
if (!read_is_ok)
|
if (!read_is_ok)
|
||||||
{
|
{
|
||||||
OS_Printf("FS_ReadFile(\"%s\") ... ERROR!\n", CAMERA_VOLATILE_INFO_PATH);
|
OS_Printf("FS_ReadFile(\"%s\") ... ERROR!\n", CAMERA_VOLATILE_INFO_PATH);
|
||||||
FS_CloseFile(&file);
|
FS_CloseFile(&file);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
FS_FlushFile(&file);
|
FS_FlushFile(&file);
|
||||||
|
|
||||||
// ROMファイルクローズ
|
// ROMファイルクローズ
|
||||||
FS_CloseFile(&file);
|
FS_CloseFile(&file);
|
||||||
|
|
||||||
if (!LCFGi_THW_WriteNormalInfoDirect( &Info ))
|
if (!LCFGi_THW_WriteNormalInfoDirect( &Info ))
|
||||||
{
|
{
|
||||||
OS_TPrintf( "HW Normal Info Write failed.\n" );
|
OS_TPrintf( "HW Normal Info Write failed.\n" );
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
@ -355,64 +356,64 @@ BOOL HWI_WriteHWNormalInfoFile( void )
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
BOOL HWI_WriteHWSecureInfoFile( u8 region, const u8 *pSerialNo, BOOL isDisableWireless )
|
BOOL HWI_WriteHWSecureInfoFile( u8 region, const u8 *pSerialNo, BOOL isDisableWireless )
|
||||||
{
|
{
|
||||||
BOOL isWrite = TRUE;
|
BOOL isWrite = TRUE;
|
||||||
LCFGReadResult result;
|
LCFGReadResult result;
|
||||||
|
|
||||||
// ファイルのリード
|
// ファイルのリード
|
||||||
result = LCFGi_THW_ReadSecureInfo();
|
result = LCFGi_THW_ReadSecureInfo();
|
||||||
|
|
||||||
// リードに失敗したらリカバリ
|
// リードに失敗したらリカバリ
|
||||||
if( result != LCFG_TSF_READ_RESULT_SUCCEEDED ) {
|
if( result != LCFG_TSF_READ_RESULT_SUCCEEDED ) {
|
||||||
if( !LCFGi_THW_RecoverySecureInfo( result ) ) {
|
if( !LCFGi_THW_RecoverySecureInfo( result ) ) {
|
||||||
OS_TPrintf( "HW Secure Info Recovery failed.\n" );
|
OS_TPrintf( "HW Secure Info Recovery failed.\n" );
|
||||||
isWrite = FALSE;
|
isWrite = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LCFG_THW_SetFlagForceDisableWireless( isDisableWireless );
|
LCFG_THW_SetFlagForceDisableWireless( isDisableWireless );
|
||||||
// リージョンのセット
|
// リージョンのセット
|
||||||
LCFG_THW_SetRegion( region );
|
LCFG_THW_SetRegion( region );
|
||||||
|
|
||||||
// 対応言語ビットマップのセット
|
// 対応言語ビットマップのセット
|
||||||
LCFG_THW_SetValidLanguageBitmap( s_langBitmapList[ region ] );
|
LCFG_THW_SetValidLanguageBitmap( s_langBitmapList[ region ] );
|
||||||
|
|
||||||
// シリアルNo.のセット
|
// シリアルNo.のセット
|
||||||
if( pSerialNo == NULL ) {
|
if( pSerialNo == NULL ) {
|
||||||
// 量産工程でないとシリアルNo.は用意できないので、ここではMACアドレスをもとに適当な値をセットする。
|
// 量産工程でないとシリアルNo.は用意できないので、ここではMACアドレスをもとに適当な値をセットする。
|
||||||
u8 buffer[ 12 ] = "SERIAL"; // 適当な文字列をMACアドレスと結合してSHA1を取り、仮SerialNoとする。
|
u8 buffer[ 12 ] = "SERIAL"; // 適当な文字列をMACアドレスと結合してSHA1を取り、仮SerialNoとする。
|
||||||
u8 serialNo[ SVC_SHA1_DIGEST_SIZE ];
|
u8 serialNo[ SVC_SHA1_DIGEST_SIZE ];
|
||||||
int i;
|
int i;
|
||||||
int len = ( LCFG_THW_GetRegion() == OS_TWL_REGION_AMERICA ) ?
|
int len = ( LCFG_THW_GetRegion() == OS_TWL_REGION_AMERICA ) ?
|
||||||
LCFG_TWL_HWINFO_SERIALNO_LEN_AMERICA : LCFG_TWL_HWINFO_SERIALNO_LEN_OTHERS;
|
LCFG_TWL_HWINFO_SERIALNO_LEN_AMERICA : LCFG_TWL_HWINFO_SERIALNO_LEN_OTHERS;
|
||||||
OS_GetMacAddress( buffer + 6 );
|
OS_GetMacAddress( buffer + 6 );
|
||||||
SVC_CalcSHA1( serialNo, buffer, sizeof(buffer) );
|
SVC_CalcSHA1( serialNo, buffer, sizeof(buffer) );
|
||||||
for( i = 3; i < SVC_SHA1_DIGEST_SIZE; i++ ) {
|
for( i = 3; i < SVC_SHA1_DIGEST_SIZE; i++ ) {
|
||||||
serialNo[ i ] = (u8)( ( serialNo[ i ] % 10 ) + 0x30 );
|
serialNo[ i ] = (u8)( ( serialNo[ i ] % 10 ) + 0x30 );
|
||||||
}
|
}
|
||||||
MI_CpuCopy8( "SRN", serialNo, 3 );
|
MI_CpuCopy8( "SRN", serialNo, 3 );
|
||||||
MI_CpuClear8( &serialNo[ len ], sizeof(serialNo) - len );
|
MI_CpuClear8( &serialNo[ len ], sizeof(serialNo) - len );
|
||||||
// OS_TPrintf( "serialNo : %s\n", serialNo );
|
// OS_TPrintf( "serialNo : %s\n", serialNo );
|
||||||
LCFG_THW_SetSerialNo( serialNo );
|
LCFG_THW_SetSerialNo( serialNo );
|
||||||
}else {
|
}else {
|
||||||
LCFG_THW_SetSerialNo( pSerialNo );
|
LCFG_THW_SetSerialNo( pSerialNo );
|
||||||
}
|
}
|
||||||
|
|
||||||
// ランチャーTitleID_Loのセット
|
// ランチャーTitleID_Loのセット
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
u8 titleID_Lo[4];
|
u8 titleID_Lo[4];
|
||||||
for( i = 0; i < 4; i++ ) titleID_Lo[ i ] = (u8)strLauncherGameCode[ region ][ 4 - i - 1 ];
|
for( i = 0; i < 4; i++ ) titleID_Lo[ i ] = (u8)strLauncherGameCode[ region ][ 4 - i - 1 ];
|
||||||
LCFG_THW_SetLauncherTitleID_Lo( (const u8 *)titleID_Lo );
|
LCFG_THW_SetLauncherTitleID_Lo( (const u8 *)titleID_Lo );
|
||||||
}
|
}
|
||||||
|
|
||||||
// ライト
|
// ライト
|
||||||
if( isWrite &&
|
if( isWrite &&
|
||||||
!LCFGi_THW_WriteSecureInfo( s_pPrivKeyBuffer ) ) {
|
!LCFGi_THW_WriteSecureInfo( s_pPrivKeyBuffer ) ) {
|
||||||
isWrite = FALSE;
|
isWrite = FALSE;
|
||||||
OS_TPrintf( "HW Secure Info Write failed.\n" );
|
OS_TPrintf( "HW Secure Info Write failed.\n" );
|
||||||
}
|
}
|
||||||
|
|
||||||
return isWrite;
|
return isWrite;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -427,17 +428,17 @@ BOOL HWI_WriteHWSecureInfoFile( u8 region, const u8 *pSerialNo, BOOL isDisableWi
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
BOOL HWI_WriteHWIDSignFile( void )
|
BOOL HWI_WriteHWIDSignFile( void )
|
||||||
{
|
{
|
||||||
BOOL retval;
|
BOOL retval;
|
||||||
|
|
||||||
(void)FS_DeleteFile( (char *)LCFG_TWL_HWID_SIGN_PATH );
|
(void)FS_DeleteFile( (char *)LCFG_TWL_HWID_SIGN_PATH );
|
||||||
if( !FS_CreateFile( LCFG_TWL_HWID_SIGN_PATH, FS_PERMIT_R | FS_PERMIT_W ) ) {
|
if( !FS_CreateFile( LCFG_TWL_HWID_SIGN_PATH, FS_PERMIT_R | FS_PERMIT_W ) ) {
|
||||||
OS_TPrintf( "file create error. %s\n", LCFG_TWL_HWID_SIGN_PATH );
|
OS_TPrintf( "file create error. %s\n", LCFG_TWL_HWID_SIGN_PATH );
|
||||||
}
|
}
|
||||||
retval = LCFG_WriteHWID_Signature( s_pPrivKeyBuffer );
|
retval = LCFG_WriteHWID_Signature( s_pPrivKeyBuffer );
|
||||||
if( !retval ) {
|
if( !retval ) {
|
||||||
OS_TPrintf( "HWID Signature Write failed.\n" );
|
OS_TPrintf( "HWID Signature Write failed.\n" );
|
||||||
}
|
}
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
@ -451,16 +452,16 @@ BOOL HWI_WriteHWIDSignFile( void )
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
BOOL HWI_DeleteHWNormalInfoFile( void )
|
BOOL HWI_DeleteHWNormalInfoFile( void )
|
||||||
{
|
{
|
||||||
if (FS_DeleteFile( (char *)LCFG_TWL_HWINFO_NORMAL_PATH ))
|
if (FS_DeleteFile( (char *)LCFG_TWL_HWINFO_NORMAL_PATH ))
|
||||||
{
|
{
|
||||||
OS_TPrintf( "%s delete succeeded.\n", (char *)LCFG_TWL_HWINFO_NORMAL_PATH );
|
OS_TPrintf( "%s delete succeeded.\n", (char *)LCFG_TWL_HWINFO_NORMAL_PATH );
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
OS_TPrintf( "%s delete failed.\n", (char *)LCFG_TWL_HWINFO_NORMAL_PATH );
|
OS_TPrintf( "%s delete failed.\n", (char *)LCFG_TWL_HWINFO_NORMAL_PATH );
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
@ -474,16 +475,16 @@ BOOL HWI_DeleteHWNormalInfoFile( void )
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
BOOL HWI_DeleteHWSecureInfoFile( void )
|
BOOL HWI_DeleteHWSecureInfoFile( void )
|
||||||
{
|
{
|
||||||
if (FS_DeleteFile( (char *)LCFG_TWL_HWINFO_SECURE_PATH ))
|
if (FS_DeleteFile( (char *)LCFG_TWL_HWINFO_SECURE_PATH ))
|
||||||
{
|
{
|
||||||
OS_TPrintf( "%s delete succeeded.\n", (char *)LCFG_TWL_HWINFO_SECURE_PATH );
|
OS_TPrintf( "%s delete succeeded.\n", (char *)LCFG_TWL_HWINFO_SECURE_PATH );
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
OS_TPrintf( "%s delete failed.\n", (char *)LCFG_TWL_HWINFO_SECURE_PATH );
|
OS_TPrintf( "%s delete failed.\n", (char *)LCFG_TWL_HWINFO_SECURE_PATH );
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
@ -497,14 +498,14 @@ BOOL HWI_DeleteHWSecureInfoFile( void )
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
BOOL HWI_DeleteHWIDSignFile( void )
|
BOOL HWI_DeleteHWIDSignFile( void )
|
||||||
{
|
{
|
||||||
if (FS_DeleteFile( (char *)LCFG_TWL_HWID_SIGN_PATH ))
|
if (FS_DeleteFile( (char *)LCFG_TWL_HWID_SIGN_PATH ))
|
||||||
{
|
{
|
||||||
OS_TPrintf( "%s delete succeeded.\n", (char *)LCFG_TWL_HWID_SIGN_PATH );
|
OS_TPrintf( "%s delete succeeded.\n", (char *)LCFG_TWL_HWID_SIGN_PATH );
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
OS_TPrintf( "%s delete failed.\n", (char *)LCFG_TWL_HWID_SIGN_PATH );
|
OS_TPrintf( "%s delete failed.\n", (char *)LCFG_TWL_HWID_SIGN_PATH );
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -88,6 +88,7 @@ LLIBRARIES += libes$(TWL_LIBSUFFIX).a \
|
|||||||
libboc$(TWL_LIBSUFFIX).a \
|
libboc$(TWL_LIBSUFFIX).a \
|
||||||
libnam$(TWL_LIBSUFFIX).a \
|
libnam$(TWL_LIBSUFFIX).a \
|
||||||
libsea$(TWL_LIBSUFFIX).a \
|
libsea$(TWL_LIBSUFFIX).a \
|
||||||
|
libacsign$(TWL_LIBSUFFIX).a \
|
||||||
libacsign_enc$(TWL_LIBSUFFIX).a \
|
libacsign_enc$(TWL_LIBSUFFIX).a \
|
||||||
libnamut$(TWL_LIBSUFFIX).a
|
libnamut$(TWL_LIBSUFFIX).a
|
||||||
|
|
||||||
@ -96,6 +97,8 @@ include $(TWLSDK_ROOT)/build/buildtools/commondefs.gx.demolib
|
|||||||
|
|
||||||
MAKEROM = $(TWL_TOOLSDIR)/bin/makerom.TWL.secure.exe
|
MAKEROM = $(TWL_TOOLSDIR)/bin/makerom.TWL.secure.exe
|
||||||
|
|
||||||
|
GLIBRARIES := $(filter-out libcrypto$(TWL_LIBSUFFIX).a,$(GLIBRARIES))
|
||||||
|
|
||||||
LDIRT_CLEAN = $(TARGET_TAD)
|
LDIRT_CLEAN = $(TARGET_TAD)
|
||||||
#INSTALL_TARGETS = $(TARGET_TAD)
|
#INSTALL_TARGETS = $(TARGET_TAD)
|
||||||
#INSTALL_DIR = $(SDK_NMENU_DATADIR)
|
#INSTALL_DIR = $(SDK_NMENU_DATADIR)
|
||||||
|
|||||||
@ -86,6 +86,7 @@ LLIBRARIES += libes$(TWL_LIBSUFFIX).a \
|
|||||||
libboc$(TWL_LIBSUFFIX).a \
|
libboc$(TWL_LIBSUFFIX).a \
|
||||||
libnam$(TWL_LIBSUFFIX).a \
|
libnam$(TWL_LIBSUFFIX).a \
|
||||||
libsea$(TWL_LIBSUFFIX).a \
|
libsea$(TWL_LIBSUFFIX).a \
|
||||||
|
libacsign$(TWL_LIBSUFFIX).a \
|
||||||
libacsign_enc$(TWL_LIBSUFFIX).a \
|
libacsign_enc$(TWL_LIBSUFFIX).a \
|
||||||
libnamut$(TWL_LIBSUFFIX).a
|
libnamut$(TWL_LIBSUFFIX).a
|
||||||
|
|
||||||
@ -94,6 +95,7 @@ include $(TWLSDK_ROOT)/build/buildtools/commondefs.gx.demolib
|
|||||||
|
|
||||||
MAKEROM = $(TWL_TOOLSDIR)/bin/makerom.TWL.secure.exe
|
MAKEROM = $(TWL_TOOLSDIR)/bin/makerom.TWL.secure.exe
|
||||||
|
|
||||||
|
GLIBRARIES := $(filter-out libcrypto$(TWL_LIBSUFFIX).a,$(GLIBRARIES))
|
||||||
|
|
||||||
LDIRT_CLEAN = $(TARGET_TAD)
|
LDIRT_CLEAN = $(TARGET_TAD)
|
||||||
#INSTALL_TARGETS = $(TARGET_TAD)
|
#INSTALL_TARGETS = $(TARGET_TAD)
|
||||||
|
|||||||
@ -39,7 +39,7 @@ TWL_ARCHGEN = LIMITED
|
|||||||
TITLEID_LO = NINA
|
TITLEID_LO = NINA
|
||||||
TARGET_TAD = $(BINDIR)/$(TITLEID_LO).$(TWL_BUILD_DIR)$(CODEGEN_ARCH).tad
|
TARGET_TAD = $(BINDIR)/$(TITLEID_LO).$(TWL_BUILD_DIR)$(CODEGEN_ARCH).tad
|
||||||
|
|
||||||
TARGET_BIN = NandFormatterAuto.srl
|
TARGET_BIN = NandInitializerAuto.srl
|
||||||
LCFILE_SPEC = ../../NandInitializer/ARM9.TWL/ARM9-TS.lsf
|
LCFILE_SPEC = ../../NandInitializer/ARM9.TWL/ARM9-TS.lsf
|
||||||
ROM_SPEC = ../../NandInitializer/ARM9.TWL/main.rsf
|
ROM_SPEC = ../../NandInitializer/ARM9.TWL/main.rsf
|
||||||
|
|
||||||
@ -93,6 +93,7 @@ LLIBRARIES += libes$(TWL_LIBSUFFIX).a \
|
|||||||
libboc$(TWL_LIBSUFFIX).a \
|
libboc$(TWL_LIBSUFFIX).a \
|
||||||
libnam$(TWL_LIBSUFFIX).a \
|
libnam$(TWL_LIBSUFFIX).a \
|
||||||
libsea$(TWL_LIBSUFFIX).a \
|
libsea$(TWL_LIBSUFFIX).a \
|
||||||
|
libacsign$(TWL_LIBSUFFIX).a \
|
||||||
libacsign_enc$(TWL_LIBSUFFIX).a \
|
libacsign_enc$(TWL_LIBSUFFIX).a \
|
||||||
libnamut$(TWL_LIBSUFFIX).a
|
libnamut$(TWL_LIBSUFFIX).a
|
||||||
|
|
||||||
@ -101,6 +102,8 @@ include $(TWLSDK_ROOT)/build/buildtools/commondefs.gx.demolib
|
|||||||
|
|
||||||
MAKEROM = $(TWL_TOOLSDIR)/bin/makerom.TWL.secure.exe
|
MAKEROM = $(TWL_TOOLSDIR)/bin/makerom.TWL.secure.exe
|
||||||
|
|
||||||
|
GLIBRARIES := $(filter-out libcrypto$(TWL_LIBSUFFIX).a,$(GLIBRARIES))
|
||||||
|
|
||||||
LDIRT_CLEAN = $(TARGET_TAD)
|
LDIRT_CLEAN = $(TARGET_TAD)
|
||||||
#INSTALL_TARGETS = $(TARGET_TAD)
|
#INSTALL_TARGETS = $(TARGET_TAD)
|
||||||
#INSTALL_DIR = $(SDK_NMENU_DATADIR)
|
#INSTALL_DIR = $(SDK_NMENU_DATADIR)
|
||||||
|
|||||||
@ -18,7 +18,7 @@
|
|||||||
#define SYSMENU_H_
|
#define SYSMENU_H_
|
||||||
|
|
||||||
// Compile switch----------------------
|
// Compile switch----------------------
|
||||||
//#define DEBUG_USED_CARD_SLOT_B_ // デバッグ用でカードスロットBを使用する場合に有効にする。
|
//#define DEBUG_USED_CARD_SLOT_B_ // デバッグ用でカードスロットBを使用する場合に有効にする。
|
||||||
|
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
|
|
||||||
@ -32,7 +32,6 @@
|
|||||||
#include <sysmenu/boot.h>
|
#include <sysmenu/boot.h>
|
||||||
#include <sysmenu/memorymap.h>
|
#include <sysmenu/memorymap.h>
|
||||||
#include <sysmenu/hotsw.h>
|
#include <sysmenu/hotsw.h>
|
||||||
#include <sysmenu/acsign.h>
|
|
||||||
#include <sysmenu/mb_loader.h>
|
#include <sysmenu/mb_loader.h>
|
||||||
|
|
||||||
/* SYSMENU_H_ */
|
/* SYSMENU_H_ */
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user