From 45ec74a6c426b0ec6ff060fff264ef83cc90fdf7 Mon Sep 17 00:00:00 2001 From: nakasima Date: Tue, 19 Feb 2008 05:49:50 +0000 Subject: [PATCH] =?UTF-8?q?DS=E7=84=A1=E7=B7=9A=E3=83=91=E3=83=83=E3=83=81?= =?UTF-8?q?=E6=9A=AB=E5=AE=9A=E5=AF=BE=E5=BF=9C=EF=BC=88=E3=82=AF=E3=83=AD?= =?UTF-8?q?=E3=83=BC=E3=83=B3=E3=83=96=E3=83=BC=E3=83=88=E3=81=AFHOTSW?= =?UTF-8?q?=E3=81=AB=E3=82=88=E3=82=8B=E7=BD=B2=E5=90=8D=E3=83=87=E3=83=BC?= =?UTF-8?q?=E3=82=BF=E3=83=AD=E3=83=BC=E3=83=89=E5=BE=85=E3=81=A1=EF=BC=89?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@695 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- build/buildtools/commondefs.sysmenu | 2 + build/libraries_sysmenu/Makefile | 2 +- build/libraries_sysmenu/boot/ARM7/Makefile | 2 +- .../libraries_sysmenu/boot/ARM7/src/bootAPI.c | 17 +- .../libraries_sysmenu/boot/ARM9/src/bootAPI.c | 8 + build/libraries_sysmenu/ds/ARM7/Makefile | 52 +++ build/libraries_sysmenu/ds/ARM9/Makefile | 52 +++ .../ds/common/src/ds_wlpatch.c | 358 ++++++++++++++++++ .../sysmenu/ARM9/src/device.c | 1 - build/systemMenu_RED/Launcher/ARM9/Makefile | 1 + include/sysmenu/ds.h | 32 ++ include/sysmenu/ds/common/ds.h | 43 +++ .../sysmenu/sysmenu_lib/common/sysmenu_work.h | 2 +- 13 files changed, 555 insertions(+), 17 deletions(-) create mode 100644 build/libraries_sysmenu/ds/ARM7/Makefile create mode 100644 build/libraries_sysmenu/ds/ARM9/Makefile create mode 100644 build/libraries_sysmenu/ds/common/src/ds_wlpatch.c create mode 100644 include/sysmenu/ds.h create mode 100644 include/sysmenu/ds/common/ds.h diff --git a/build/buildtools/commondefs.sysmenu b/build/buildtools/commondefs.sysmenu index 54cdb8fb..9a0d6c15 100644 --- a/build/buildtools/commondefs.sysmenu +++ b/build/buildtools/commondefs.sysmenu @@ -70,6 +70,7 @@ SYSMENU_LIBS ?= \ libmbloader$(TWL_LIBSUFFIX).a \ libacsign$(TWL_LIBSUFFIX).a \ libboot$(TWL_LIBSUFFIX).a \ + libds$(TWL_LIBSUFFIX).a \ else # ($(CODEGEN_PROC),ARM7) @@ -78,6 +79,7 @@ SYSMENU_LIBS ?= \ libsysmmcu_sp$(TWL_LIBSUFFIX).a \ libmbloader_sp$(TWL_LIBSUFFIX).a \ libboot_sp$(TWL_LIBSUFFIX).a \ + libds_sp$(TWL_LIBSUFFIX).a \ libhotsw_sp$(TWL_LIBSUFFIX).a \ endif diff --git a/build/libraries_sysmenu/Makefile b/build/libraries_sysmenu/Makefile index 7070ea9a..cdd6bc51 100644 --- a/build/libraries_sysmenu/Makefile +++ b/build/libraries_sysmenu/Makefile @@ -22,7 +22,7 @@ include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs #---------------------------------------------------------------------------- -SUBDIRS_P = reloc_info sysmenu mb_loader acsign boot hotsw namut mcu +SUBDIRS_P = reloc_info sysmenu mb_loader acsign boot hotsw namut mcu ds #---------------------------------------------------------------------------- diff --git a/build/libraries_sysmenu/boot/ARM7/Makefile b/build/libraries_sysmenu/boot/ARM7/Makefile index 2ab4fbc0..82214a1f 100644 --- a/build/libraries_sysmenu/boot/ARM7/Makefile +++ b/build/libraries_sysmenu/boot/ARM7/Makefile @@ -32,7 +32,7 @@ INCDIR = ../common/include \ $(ROOT)/build/libraries/fatfs/ARM7.TWL/include \ $(ROOT)/build/libraries/fatfs/ARM7.TWL/include/twl/fatfs/ARM7 \ -SRCS = bootAPI.c +SRCS = bootAPI.c \ TARGET_LIB = libboot_sp$(TWL_LIBSUFFIX).a diff --git a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c index d5d7ec9e..812cdfd8 100644 --- a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c +++ b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "reboot.h" @@ -35,8 +36,6 @@ #define COPY_NUM_MAX (4*3) #define POST_CLEAR_NUM_MAX (12 + 4*2) -#define SYSMi_ARM9_BOOT_CODE_BUF 0x023fee00 - // extern data------------------------------------------------------- // function's prototype---------------------------------------------- @@ -51,8 +50,8 @@ static void BOOTi_CutAwayRegionList( u32 *regionlist, u32 start, u32 end ); static u32 twl_post_clear_list[POST_CLEAR_NUM_MAX + 1] = { HW_PARAM_RESERVED_END, SYSM_OWN_ARM7_MMEM_ADDR, - SYSM_OWN_ARM7_MMEM_ADDR_END, SYSMi_ARM9_BOOT_CODE_BUF, - SYSMi_ARM9_BOOT_CODE_BUF + OS_BOOT_CODE_SIZE, SYSM_OWN_ARM9_MMEM_ADDR, + SYSM_OWN_ARM7_MMEM_ADDR_END, OS_BOOT_A9CODE_BUF, + OS_BOOT_A9CODE_BUF + OS_BOOT_CODE_SIZE, SYSM_OWN_ARM9_MMEM_ADDR, SYSM_OWN_ARM9_MMEM_ADDR_END, HW_TWL_MAIN_MEM_SHARED, NULL, }; @@ -61,7 +60,7 @@ static u32 nitro_post_clear_list[POST_CLEAR_NUM_MAX + 1] = { HW_PARAM_DELIVER_ARG, HW_PARAM_DELIVER_ARG_END, HW_PARAM_RESERVED_END, SYSM_OWN_ARM7_MMEM_ADDR, - SYSM_OWN_ARM7_MMEM_ADDR_END, SYSMi_ARM9_BOOT_CODE_BUF, + SYSM_OWN_ARM7_MMEM_ADDR_END, OS_BOOT_A9CODE_BUF, SYSM_TWL_ARM9_LTD_LOAD_MMEM, SYSM_DBG_NTR_SYSTEM_BUF, SYSM_OWN_ARM9_MMEM_ADDR_END, HW_TWL_MAIN_MEM_SHARED, NULL, @@ -81,14 +80,6 @@ BOOL BOOT_WaitStart( void ) (void)OS_DisableIrq(); // ここで割り込み禁止にしないとダメ。 (void)OS_SetIrqMask(0); // SDKバージョンのサーチに時間がかかると、ARM9がHALTにかかってしまい、ARM7のサウンドスレッドがARM9にFIFOでデータ送信しようとしてもFIFOが一杯で送信できない状態で無限ループに入ってしまう。 (void)OS_SetIrqMaskEx(0); -/* -#ifdef ISDBG_MB_CHILD_ - if( ( GetIpl2WorkAddr()->ipl2_type != 0xff ) && ( GetIpl2WorkAddr()->ipl2_type & 0x28 ) ) -#endif // ISDBG_MB_CHILD_ // USG or NATなら無線パッチを当てる - { - InsertWLPatch(); - } -*/ BOOTi_ClearREG_RAM(); // ARM7側のメモリ&レジスタクリア。 reg_MI_MBK9 = 0; // 全WRAMのロック解除 diff --git a/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c b/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c index 3e665874..bd21d956 100644 --- a/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c +++ b/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include "reboot.h" @@ -147,6 +148,13 @@ void BOOT_Ready( void ) } #endif // FIRM_USE_SDK_KEYS || SYSMENU_DISABLE_RETAIL_BOOT + // USG以前のDSアプリには無線パッチを適用 + // (キャッシュ領域の排他制御簡略化のためARM9で行う) + if ( ds ) + { + DS_InsertWLPatch(); + } + // デバッガによるROMエミュレーション時はNTR-ROMヘッダバッファの // ゲームコマンドパラメータをスクランブルOFF設定に書き換える dh->s.game_cmd_param = SYSMi_GetWork()->gameCommondParam; diff --git a/build/libraries_sysmenu/ds/ARM7/Makefile b/build/libraries_sysmenu/ds/ARM7/Makefile new file mode 100644 index 00000000..65e08736 --- /dev/null +++ b/build/libraries_sysmenu/ds/ARM7/Makefile @@ -0,0 +1,52 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: TwlIPL +# File: Makefile +# +# 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:: 2008-02-07#$ +# $Rev: 612 $ +# $Author: yutaka $ +#---------------------------------------------------------------------------- + +SUBDIRS = + +#---------------------------------------------------------------------------- +TARGET_FIRM = SYSTEMMENU +TARGET_PLATFORM = TWL +TWL_ARCHGEN = LIMITED +TWL_PROC = ARM7 + +#---------------------------------------------------------------------------- + +SRCDIR = ../common/src + +INCDIR = ../common/include \ + $(ROOT)/build/libraries/mb/common/include \ + +SRCS = ds_wlpatch.c \ + +TARGET_LIB = libds_sp$(TWL_LIBSUFFIX).a + + +include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs + +INSTALL_TARGETS = $(TARGETS) +INSTALL_DIR = $(SYSMENU_INSTALL_LIBDIR) + +#---------------------------------------------------------------------------- + +do-build: $(TARGETS) + +include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== + diff --git a/build/libraries_sysmenu/ds/ARM9/Makefile b/build/libraries_sysmenu/ds/ARM9/Makefile new file mode 100644 index 00000000..9bd1bd72 --- /dev/null +++ b/build/libraries_sysmenu/ds/ARM9/Makefile @@ -0,0 +1,52 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: TwlIPL +# File: Makefile +# +# 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:: 2008-02-07#$ +# $Rev: 612 $ +# $Author: yutaka $ +#---------------------------------------------------------------------------- + +SUBDIRS = + +#---------------------------------------------------------------------------- +TARGET_FIRM = SYSTEMMENU +TARGET_PLATFORM = TWL +TWL_ARCHGEN = LIMITED +TWL_PROC = ARM9 + +#---------------------------------------------------------------------------- + +SRCDIR = ../common/src + +INCDIR = ../common/include \ + $(ROOT)/build/libraries/mb/common/include \ + +SRCS = ds_wlpatch.c \ + +TARGET_LIB = libds$(TWL_LIBSUFFIX).a + + +include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs + +INSTALL_TARGETS = $(TARGETS) +INSTALL_DIR = $(SYSMENU_INSTALL_LIBDIR) + +#---------------------------------------------------------------------------- + +do-build: $(TARGETS) + +include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== + diff --git a/build/libraries_sysmenu/ds/common/src/ds_wlpatch.c b/build/libraries_sysmenu/ds/common/src/ds_wlpatch.c new file mode 100644 index 00000000..9e538da9 --- /dev/null +++ b/build/libraries_sysmenu/ds/common/src/ds_wlpatch.c @@ -0,0 +1,358 @@ +/*---------------------------------------------------------------------------* + Project: TwlIPL + File: ds_wlpatch.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 "mb_fileinfo.h" + +// define data---------------------------------------------------------- +#define _PATCH3_SHORT_ // パッチ3のサーチパターン削減スイッチ + +#define SWI_NO_CPU_SET_FAST ( 12 << 16 ) // SVC_CpuSetFast() +#define WL_PATCH_SIZE 20 +#define RED_RSV_PATCH_FUNC_ADDR ( HW_RED_RESERVED + 0x1c ) + +#define SDK_VER_30 0x03000000 +#define SDK_VER_22_RELEASE_PLUS_3 0x02027533 +#define SDK_VER_30_RC3 0x03004f4c + +#define SDKVER_OFFSET_IN_PATTERN -4 +#define PATCH1_OFFSET_IN_PATTERN 0x18 +#ifdef _PATCH3_SHORT_ +#define PATCH3_OFFSET_IN_PATTERN 0x04 +#else +#define PATCH3_OFFSET_IN_PATTERN 0x40 +#endif + +// function's prototype------------------------------------------------- +void DS_InsertWLPatch( void ); +static int DSi_ExistNitroCard(void); +static void* DSi_GetPatchBaseAddr( void ); +static BOOL DSi_IsPatchedSDKVersion( void ); +static u32 DSi_SearchBinaryCore( const u32 *patp, int pat_word_size, int patch_offset ); +static void DSi_SetPatchCodeToREDRsvArea( u32 patch_addr, const u32 *patchp ); +void DSi_WLPatchCore( void ); + +// extern data---------------------------------------------------------- + +// const data----------------------------------------------------------- + +// SDKバージョン検出用マジックコード +static const u32 sdk_ver_magic_code[] = { + 0xdec00621, + 0x2106c0de, +}; + +// パッチ1対象コード +static const u32 patch1_org[] = { + 0xe59f1028, 0xe59f2028, 0xe1d200b0, 0xe2100001, + 0x1afffffc, 0xe1d100b0, 0xe3500006, 0x0afffff9, + 0xe1d100b0, 0xe3500005, 0x0afffff6, 0xe12fff1e, + 0x04808214, 0x0480819c, +}; + +// パッチ3対象コード +static const u32 patch3_org[] = { +#ifndef _PATCH3_SHORT_ + 0xE92D4000, 0xE24DD004, 0xE3A02000, 0xE59F10A8, + 0xE5910000, 0xE2800C03, 0xE1C0FFFF, 0xE5910000, + 0xE2800B01, 0xE1C0FFFF, 0xE59F1090, 0xE59F2090, + 0xE1D200B0, 0xE2100001, 0x1AFFFFFC, +#endif + 0xE1D100B0, + 0xE3500006, 0x0AFFFFF9, 0xE1D100B0, 0xE3500005, // patch target( top 20bytes ) + 0x0AFFFFF6, 0xE3A01000, 0xE59F0068, 0xE1C010B0, + 0xE59F0064, 0xE1C010B0, 0xE59F004C, 0xE5900000, + 0xE2800C03, +#ifndef _PATCH3_SHORT_ + 0xE1D0FFFF, 0xE3500000, 0x0A00000B, + 0xEB00FFFF, 0xE59F0030, 0xE5900000, 0xE2800C03, + 0xE1D0FFFF, 0xE3A01020, 0xEB00FFFF, 0xE3A01000, + 0xE59F0014, 0xE5900000, 0xE2800C03, 0xE1C0FFFF, + 0xE28DD004, 0xE8BD4000, 0xE12FFF1E, 0x0380FFF4, + 0x04808214, 0x0480819C, 0x04808028, 0x0480802A, +#endif +}; + +// パッチ1コード +static const u32 patch1_code[] = { + 0xe3500005, + 0x312fff1e, + 0xe1d100b0, + 0xe3500008, + 0x9afffff6, +}; + +// パッチ3コード +static const u32 patch3_code[] = { + 0xE3500005, + 0x3A000002, + 0xE1D100B0, + 0xE3500008, + 0x9AFFFFF6, +}; + +// static variables----------------------------------------------------- +static u32 mbSignBuf[MB_AUTHCODE_SIZE / sizeof(u32)] __attribute__ ((aligned(32))); + +// function's description----------------------------------------------- + + +//---------------------------------------------------------------------- +// +// USG-CPU以降におけるARM7コード無線不具合へのパッチ処理 +// ※ゲームのロードが完了した後に本関数をコールして下さい。 +// +//---------------------------------------------------------------------- + +// パッチコードの挿入 +void DS_InsertWLPatch( void ) +{ + // SDKバージョンがパッチ対象? + if( DSi_IsPatchedSDKVersion() ) { + // patch1, patch3をサーチ + const u32 *patchp = patch1_code; + u32 patch_addr = DSi_SearchBinaryCore( patch1_org, sizeof( patch1_org ) / sizeof( u32 ), PATCH1_OFFSET_IN_PATTERN ); + + if( patch_addr == 0 ) { + patchp = patch3_code; + patch_addr = DSi_SearchBinaryCore( patch3_org, sizeof( patch3_org ) / sizeof( u32 ), PATCH3_OFFSET_IN_PATTERN ); + } + // パッチ対象コードが見つかったら、パッチコードをセット。 + if( patch_addr ) { + ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ + if( SYSMi_GetWork()->cloneBootMode == IPL2_CLONE_BOOT_MODE ) { // ※クローンブートかどうかは、ARM9側で事前に調査。 + // クローンブートならば、直パッチ + SVC_CpuCopyFast( patchp, patch_addr, WL_PATCH_SIZE ); + }else { + // それ以外ならば、RED_RSVにパッチコードを挿入。 + // ※パッチアドレスをIPL2の一時格納バッファアドレスから実際のARM7ロードアドレスに変換。 + patch_addr = patch_addr + ((u32)dh->s.sub_entry_address - (u32)DSi_GetPatchBaseAddr()); + DSi_SetPatchCodeToREDRsvArea( patch_addr, patchp ); + dh->s.sub_entry_address = (void *)RED_RSV_PATCH_FUNC_ADDR; + } + } + } +} + + +// パッチベースアドレスの取得 +static void* DSi_GetPatchBaseAddr( void ) +{ + ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ + void* p = (void*)SYSMi_GetWork()->romRelocateInfo[1].src; + + if ( ! p ) + { + void* h = dh->s.sub_ram_address; + if ( h >= (void*)SYSM_NTR_ARM7_LOAD_MMEM && h < (void*)(SYSM_NTR_ARM7_LOAD_MMEM_END - WL_PATCH_SIZE) ) + { + p = h; + } + } + + return p; +} + + +// パッチ対象のSDKバージョンかどうか判定 +static BOOL DSi_IsPatchedSDKVersion( void ) +{ + u32 addr; + u32 sdk_ver; + + // SDKバージョンのサーチ + addr = DSi_SearchBinaryCore( sdk_ver_magic_code, sizeof( sdk_ver_magic_code ) / sizeof( u32 ), SDKVER_OFFSET_IN_PATTERN ); + if( addr == 0 ) { + return FALSE; + } + + // SDKバージョンの判定 + sdk_ver = *(u32 *)addr; + + if( sdk_ver >= SDK_VER_30 ) { + if( sdk_ver >= SDK_VER_30_RC3 ) { + return FALSE; + } + }else if( sdk_ver >= SDK_VER_22_RELEASE_PLUS_3 ) { + return FALSE; + } + return TRUE; +} + + +// バイナリサーチ +static u32 DSi_SearchBinaryCore( const u32 *patp, int pat_word_size, int patch_offset ) +{ + ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ + u32 *tgtp; + int tgt_word_size; + + if( patp == sdk_ver_magic_code ) { + tgtp = dh->s.main_entry_address; + tgt_word_size = (int)( dh->s.main_size + - ( (int)dh->s.main_entry_address - (int)dh->s.main_ram_address ) ) >> 2; + }else { + tgtp = DSi_GetPatchBaseAddr(); + tgt_word_size = (int)dh->s.sub_size >> 2; + } + + while( tgt_word_size-- ) { + if( *tgtp++ == *patp ) { + const u32 *srcp = patp + 1; + u32 *checkp = tgtp; + int i = pat_word_size - 1; + + if( tgt_word_size < i ) { + break; + } + + while( i-- ) { +#ifndef _PATCH3_SHORT_ + if( ( *srcp & 0x0000ffff ) == 0x0000ffff ) { + *checkp |= 0x0000ffff; + } +#endif + if( *srcp++ != *checkp++ ) break; + } + + if( i < 0 ) { + return (u32)( (u32)( tgtp - 1 ) + patch_offset ); + } + } + } + return 0; +} + + +//---------------------------------------------------------------------- +// +// パッチコードのセットおよびパッチ処理の実体 +// +//---------------------------------------------------------------------- + +// パッチコードをシステムのRED予約領域にセット +static void DSi_SetPatchCodeToREDRsvArea( u32 patch_addr, const u32 *patchp ) +{ +#define PATCH_WORD_NUM 5 +#define WL_PATCH_CORE_WORD_NUM 10 + + ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ + u32 *dstp = (u32 *)HW_RED_RESERVED; + u32 *srcp = (u32 *)&DSi_WLPatchCore; + int i; + + for( i = 0; i < PATCH_WORD_NUM; i++ ) { + *dstp++ = *patchp++; + } + *dstp++ = patch_addr; + *dstp++ = (u32)dh->s.sub_entry_address; + + for( i = 0; i < WL_PATCH_CORE_WORD_NUM; i++ ) { + *dstp++ = *srcp++; + } +} + + +#include + + +#if 0 +#define SWI_NO_CPU_SET_FAST (12<<16) +// 他プログラムへ組み込んでテストする時のダミーパッド +asm void WLPatch_Dummy( void ) +{ + nop // patch code (20bytes) + nop + nop + nop + nop + nop // target addr + nop // ARM7 entry addr +} +#endif + + +// WLへパッチを当てるコード実体 +asm void DSi_WLPatchCore( void ) +{ + add r0, pc, #-0x24 // R0 <- patch1 code addr + ldr r1, [ pc, #-0x14 ] // R1 <- target addr + mov r2, #( 20 / 4 ) // R2 <- copy size / sizeof(u32) + swi SWI_NO_CPU_SET_FAST // SVC_CpuSetFast + ldr r12, [ pc, #-0x1c ] // ARM7 entry address + mov lr, r12 + mov r0, #0 + mov r1, r0 + mov r2, r0 + bx r12 +} + +#include + +/* +#define DMA_SRC_INC 0x00000000 // 転送元 インクリメント 選択 +#define SVC_CpuCopyFast(srcp, destp, size) \ + \ + SVC_CpuSetFast( (u8 *)(srcp), \ + (u8 *)(destp), \ + ( DMA_SRC_INC | ( (size)/(32/8) & 0x1fffff ) ) ) +*/ + +// クローンブート判定 +void DS_CheckROMCloneBoot( void ) +{ + ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ + s32 lockCardID; + u8 *buffp = (u8 *)&mbSignBuf; + u32 auth_offset = dh->s.rom_valid_size ? dh->s.rom_valid_size : 0x01000000; + u32 page_offset = auth_offset & 0xFFFFFE00; + + if( !DSi_ExistNitroCard() ) { + return; + } + + if ((lockCardID = OS_GetLockID()) > 0) { + (void)OS_LockCard( (u16 )lockCardID ); +// DC_FlushRange( buffp, sizeof(mbSignBuf) ); +// IPL2_ReadCard( (void *)page_offset, buffp, sizeof(mbSignBuf) ); + (void)OS_UnLockCard( (u16 )lockCardID ); + OS_ReleaseLockID( (u16 )lockCardID ); + } + + buffp += auth_offset & 0x000001FF; + if( *buffp++ == 'a' && *buffp == 'c' ) { + SYSMi_GetWork()->cloneBootMode = CLONE_BOOT_MODE; + }else { + SYSMi_GetWork()->cloneBootMode = OTHER_BOOT_MODE; + } +} + +// NITROカード存在チェック 「リターン 1:カード認識 0:カードなし」 +static int DSi_ExistNitroCard(void) +{ + ROM_Header *dh = (ROM_Header *)HW_ROM_HEADER_BUF; // DS互換ROMヘッダ + if((dh->s.nintendo_logo_crc16 == 0xcf56) + &&(dh->s.header_crc16 == SYSMi_GetWork()->cardHeaderCrc16)) { + return TRUE; // NITROカードあり(NintendoロゴCRC、カードヘッダCRCが正しい場合) + // ※Nintendoロゴデータのチェックは、特許の都合上、ロゴ表示ルーチン起動後に行います。 + }else { + return FALSE; // NITROカードなし + } +} + diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/device.c b/build/libraries_sysmenu/sysmenu/ARM9/src/device.c index 54f0cd63..800fef30 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/device.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/device.c @@ -58,7 +58,6 @@ void SYSM_SetBackLightBrightness( u8 brightness ) { ( void )SYSM_WriteMcuRegisterAsync( MCU_REG_BL_ADDR, brightness, NULL, NULL ); } -// ( void )SYSMi_SendPXICommand( SYSM_PXI_COMM_BL_BRIGHT, brightness ); LCFG_TSD_SetBacklightBrightness( brightness ); diff --git a/build/systemMenu_RED/Launcher/ARM9/Makefile b/build/systemMenu_RED/Launcher/ARM9/Makefile index 2f06fc6b..b6b60c82 100644 --- a/build/systemMenu_RED/Launcher/ARM9/Makefile +++ b/build/systemMenu_RED/Launcher/ARM9/Makefile @@ -23,6 +23,7 @@ SUBDIRS = \ # ../../../libraries_sysmenu/reloc_info \ # ../../../libraries_sysmenu/boot \ # ../../../libraries_sysmenu/mcu \ +# ../../../libraries_sysmenu/ds \ # $(TWLSDK_ROOT)/build/libraries/reboot \ #---------------------------------------------------------------------------- diff --git a/include/sysmenu/ds.h b/include/sysmenu/ds.h new file mode 100644 index 00000000..907c5a13 --- /dev/null +++ b/include/sysmenu/ds.h @@ -0,0 +1,32 @@ +/*---------------------------------------------------------------------------* + Project: TwlIPL - DS + File: ds.h + + 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: $ + *---------------------------------------------------------------------------*/ + +#ifndef SYSM_DS_H_ +#define SYSM_DS_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/* SYSM_DS_H_ */ +#endif diff --git a/include/sysmenu/ds/common/ds.h b/include/sysmenu/ds/common/ds.h new file mode 100644 index 00000000..7947932f --- /dev/null +++ b/include/sysmenu/ds/common/ds.h @@ -0,0 +1,43 @@ +/*---------------------------------------------------------------------------* + Project: TwlFirm - DS - include + File: dsemu.h + + Copyright 2007 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. + + $Log: $ + $NoKeywords: $ + *---------------------------------------------------------------------------*/ + +#ifndef FIRM_DS_COMMON_DS_H_ +#define FIRM_DS_COMMON_DS_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +#define IPL2_CLONE_BOOT_MODE 1 +#define IPL2_OTHER_BOOT_MODE 2 + + +void DS_CheckROMCloneBoot( void ); +void DS_InsertWLPatch( void ); +void DSi_SetEntry( void* entry ); +void DSi_SetComponentSize( size_t size ); + + +#ifdef __cplusplus +} /* extern "C" */ + +#endif + +/* FIRM_DS_COMMON_DS_H_ */ +#endif diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h index a1759b6c..8d329361 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h @@ -115,9 +115,9 @@ typedef struct SYSM_work { u16 cardHeaderCrc16_bak; // カード検出時に算出したROMヘッダCRC16(ARM7側ライブラリでダイレクトに書き換わる側) OSLockWord lockCardRsc; // カードリソース排他制御用 OSLockWord lockHotSW; // カードリソース排他制御用 - int cloneBootMode; u32 nCardID; // カードID u32 gameCommondParam; // NTRのゲームコマンドパラメータ(NTRのROMヘッダのゲームコマンドパラメータに上書きする) + u8 cloneBootMode; LauncherParam launcherParam; ISD_RomEmuInfo romEmuInfo;