DataOnlyのファイルはDisableDebugCheckを行わないように修正。

その他微調整。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2899 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2009-08-18 10:23:51 +00:00
parent 3cf05463ec
commit 7c0e014f27
3 changed files with 102 additions and 22 deletions

View File

@ -28,7 +28,7 @@ TWL_ARCHGEN = LIMITED
TITLEID_LO = 0NRA
#TARGET_TAD =
TARGET_BIN = NandFirmWriter.srl
TARGET_BIN = TitleHashChecker.srl
LCFILE_SPEC = ARM9-TS.lsf
ROM_SPEC = main.rsf

View File

@ -45,6 +45,30 @@ typedef struct KeyInfo
u16 rep; // 押し維持リピート入力
} KeyInfo;
// DS-IPL2ƒwƒbƒ_
typedef struct
{
u16 reserved_0h[4];
u32 ds_key;
u16 ds_arm9_romAdr;
u16 ds_arm9_ramAdr;
u16 ds_arm7_romAdr;
u16 ds_arm7_ramAdr;
u16 ds_arm9_romOffsetUnit:3;
u16 ds_arm9_ramOffsetUnit:3;
u16 ds_arm7_romOffsetUnit:3;
u16 ds_arm7_ramOffsetUnit:3;
u16 :2;
u16 ds_header_ver:2;
u16 ds_data_romAdr;
u64 card_key;
u16 ncd_romAdr;
u16 reserved_24h[2];
u16 ds_data_crc16;
}
NORHeaderDS;
/*---------------------------------------------------------------------------*
Prototype
*---------------------------------------------------------------------------*/

View File

@ -20,6 +20,8 @@
#include <twl/nam.h>
#include <twl/os/common/banner.h>
#include <nitro/math/rand.h>
#include <nitro/nvram.h>
#include <twl/lcfg.h>
#include "common.h"
#include "screen.h"
@ -48,6 +50,8 @@
#define NAND_FIRM_START_OFFSET 0x200
#define NAND_FIRM_START_OFFSET_IN_FILE 0x200
#define TITLE_ID_DATA_ONLY_MASK 0x00000008
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
@ -120,6 +124,7 @@ static void inittable(unsigned short *table);
void* MyNAMUT_Alloc(u32 size);
void MyNAMUT_Free(void* buffer);
static BOOL ReadTWLSettings( void );
/*---------------------------------------------------------------------------*/
@ -157,6 +162,8 @@ void TwlMain(void)
ClearScreen();
ReadTWLSettings();
// hash Check
ProcessTitleHashCheck();
@ -341,7 +348,7 @@ static void DrawScene(DataStruct* list)
{
ConvertInitialCode(init_code, NAM_GetTitleIdLo(p->id));
color = (list[i].DisableDebugFlg == '1') ? OK_COLOR : NG_COLOR;
color = (list[i].DisableDebugFlg == '1' || list[i].DisableDebugFlg == '-') ? OK_COLOR : NG_COLOR;
// ゲームコード表示
PutMainScreen( GAME_CODE_BASE_X, TITLE_SHOW_BASE_Y+tmp_i, color, "%2d:%s %d.%d (%c)",
@ -414,13 +421,6 @@ BOOL ProcessTitleHashCheck( void )
// srlのHash値とcrc16を求める
for ( i=0; i < gNandAppNum; i++, list++ )
{
PutMainScreen( 7, 10, 0xf6, "--- Now Loading ---");
PutMainScreen( 7, 14, 0xf6, " %2d / %2d compleate", i+1, gNandAppNum);
PutSubScreen( 7, 10, 0xf6, "--- Now Loading ---");
PutSubScreen( 7, 14, 0xf6, " %2d / %2d compleate", i+1, gNandAppNum);
// バッファのクリア
MI_CpuClear8(full_path, sizeof(full_path));
@ -435,6 +435,12 @@ BOOL ProcessTitleHashCheck( void )
{
gErrorFlg = TRUE;
}
PutMainScreen( 7, 10, 0xf6, "--- Now Loading ---");
PutMainScreen( 7, 14, 0xf6, " %2d / %2d compleate", i+1, gNandAppNum);
PutSubScreen( 7, 10, 0xf6, "--- Now Loading ---");
PutSubScreen( 7, 14, 0xf6, " %2d / %2d compleate", i+1, gNandAppNum);
}
// SharedフォントとNandファームの値用の2つ
@ -652,13 +658,20 @@ BOOL CulcuNandAppHash(DataStruct* list, char* full_path)
// ついでにDisableDebugFlgの状態を見ておく
if(i == 1)
{
if(((ROM_Header *)pTempBuf)->s.disable_debug)
if( (u32)( list->id >> 32 ) & TITLE_ID_DATA_ONLY_MASK )
{
list->DisableDebugFlg = '1';
list->DisableDebugFlg = '-';
}
else
{
list->DisableDebugFlg = '0';
if(((ROM_Header *)pTempBuf)->s.disable_debug)
{
list->DisableDebugFlg = '1';
}
else
{
list->DisableDebugFlg = '0';
}
}
}
@ -795,15 +808,19 @@ BOOL CulcuFontDataHash(DataStruct* list)
Returns:
*---------------------------------------------------------------------------*/
#define NAND_HEADER_SIZE 0x800
#define NAND_FIRM_REV_SIZE 0x9
#define READ_NAND_FIRM_SIZE 0x100000
#define NAND_BLOCK_BYTE 0x200
#define NAND_HEADER_SIZE 0x800
#define NAND_FIRM_REV_SIZE 0x9
#define NAND_FIRM_START_OFFSET 0x200
#define TEMP_BUFFER_SIZE 0x100000
#define READ_NAND_FIRM_SIZE (TEMP_BUFFER_SIZE - NAND_FIRM_START_OFFSET)
BOOL CulcuNandFirmHash(DataStruct* list)
{
u8* pTempBuf;
u32 write_block;
u32 read_block;
u32 culcu_size;
u32 alloc_size;
BOOL ret = TRUE;
u8* p;
@ -813,23 +830,37 @@ BOOL CulcuNandFirmHash(DataStruct* list)
// バッファ確保
// 書き込みがブロック単位(512byte)であることを考慮し512アライメントを確保
pTempBuf = spAllocFunc( READ_NAND_FIRM_SIZE );
alloc_size = MATH_ROUNDUP(TEMP_BUFFER_SIZE, 512);
pTempBuf = spAllocFunc( alloc_size ); //pTempBuf = spAllocFunc( READ_NAND_FIRM_SIZE );
if (pTempBuf == NULL)
{
OS_Warning("Failure! Alloc Buffer");
return FALSE;
}
MI_CpuClear8( pTempBuf, TEMP_BUFFER_SIZE ); //MI_CpuClear8( pTempBuf, READ_NAND_FIRM_SIZE );
MI_CpuClear8( pTempBuf, READ_NAND_FIRM_SIZE );
// ------ Nvramからリード ------
DC_FlushRange(pTempBuf, sizeof(NORHeaderDS));
if (NVRAMi_Read(0, sizeof(NORHeaderDS), pTempBuf) != NVRAM_RESULT_SUCCESS)
{
OS_PutString("Fail NVRAMi_Read()!\n");
}
DC_FlushRange(pTempBuf, sizeof(NORHeaderDS));
// Nand©çƒŠ<C692>[ƒh
write_block = READ_NAND_FIRM_SIZE / NAND_BLOCK_BYTE + (READ_NAND_FIRM_SIZE % NAND_BLOCK_BYTE != 0);
if (kamiNandRead(0, pTempBuf, write_block ) == KAMI_RESULT_SEND_ERROR)
// ------ NANDからリード ------
DC_FlushRange( pTempBuf, TEMP_BUFFER_SIZE );
read_block = READ_NAND_FIRM_SIZE / NAND_BLOCK_BYTE + (READ_NAND_FIRM_SIZE % NAND_BLOCK_BYTE != 0);
if (kamiNandRead(NAND_FIRM_START_OFFSET/NAND_BLOCK_BYTE, pTempBuf+NAND_FIRM_START_OFFSET, read_block ) == KAMI_RESULT_SEND_ERROR)
{
OS_Warning("Failure! Read NandFirm");
}
DC_FlushRange(pTempBuf, READ_NAND_FIRM_SIZE);
DC_FlushRange( pTempBuf, TEMP_BUFFER_SIZE );
// ------ Hashの計算 ------
// Hash計算するサイズを求める
culcu_size = MATH_ROUNDUP((*(u32 *)(pTempBuf+0x22c)) + (*(u32 *)(pTempBuf+0x23c)) , 256) + NAND_HEADER_SIZE + NAND_FIRM_REV_SIZE;
OS_TPrintf("NandFirm main Size : 0x%08x\n", (*(u32 *)(pTempBuf+0x22c)));
@ -1018,6 +1049,31 @@ void VBlankIntr(void)
}
// TWL設定データのリード
static BOOL ReadTWLSettings( void )
{
u8 *pBuffer = OS_AllocFromMain( LCFG_READ_TEMP );
BOOL result;
if( pBuffer ) {
result = LCFG_ReadTWLSettings( (u8 (*)[ LCFG_READ_TEMP ] )pBuffer );
// Readに失敗した場合ファイルのリカバリ生成を試みる
if (!result)
{
OS_TPrintf( "TSD read failed. Retry onece more.\n" );
result = LCFG_RecoveryTWLSettings();
}
OS_FreeToMain( pBuffer );
}
if( result ) {
OS_TPrintf( "TSD read succeeded.\n" );
}else {
OS_TPrintf( "TSD read failed.\n" );
}
return result;
}
/*---------------------------------------------------------------------------*
End of file
*---------------------------------------------------------------------------*/