ソース整理。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@141 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2007-11-12 02:12:42 +00:00
parent fc1b2bb85f
commit 09f6d98683
8 changed files with 79 additions and 626 deletions

View File

@ -21,7 +21,10 @@ include $(TWLIPL_ROOT)/build/buildtools/commondefs
#----------------------------------------------------------------------------
SUBDIRS = build
SUBDIRS = $(TWLSDK_ROOT)/build/libraries/ese \
$(TWLSDK_ROOT)/build/libraries/nam \
$(TWLSDK_ROOT)/build/tools/TwlNMenu \
build
#----------------------------------------------------------------------------

View File

@ -18,64 +18,29 @@
#include <twl.h>
#include <twl/nam.h>
#include <sysmenu.h>
#include <sysmenu/boot/common/boot.h>
#include "sysmenu_define.h"
#include "sysmenu_card.h"
#include "spi.h"
#include "mb_child.h"
#include <sysmenu/boot/common/boot.h>
// define data-----------------------------------------------------------------
#define SCREEN_RED 0
#define SCREEN_YELLOW 1
#define TITLE_ID_BUF_SIZE 40
typedef struct BannerCheckParam {
u8 *srcp;
u32 size;
}BannerCheckParam;
// extern data-----------------------------------------------------------------
extern void ReturnFromMain( void );
extern void BootFuncEnd( void );
FS_EXTERN_OVERLAY( ipl2_data );
FS_EXTERN_OVERLAY( bm_mainp );
// function's prototype-------------------------------------------------------
static void SYSMi_WaitInitARM7( void );
static BOOL SYSMi_IsDebuggerBannerViewMode( void );
static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle );
void SYSM_Finalize( void );
void SYSM_RebootLauncher( void );
void SYSM_RebootTitle( u64 titleID );
static void INTR_SubpIRQ( void );
static void LoadRomRegSizeAdjust( CARDRomRegion *romRegp, u32 load_limit_lo, u32 load_limit_hi );
static void SYSMi_ReadyBootNitroGame( void );
static void SYSMi_MainpRegisterAndRamClear( BOOL isPlatformTWL );
static void ClearMemory( int addr1, int addr2 );
static void SYSMi_CopyInfoFromIPL1( void );
static void SYSMi_WriteAdjustRTC( void );
static BOOL SYSMi_SendMessageToARM7( u32 msg );
static int SYSMi_ExistCard( void );
static u32 SYSMi_SelectBootType( void );
static void SYSMi_DispInitialDebugData( void );
static void SYSMi_DispDebugData( void );
static void DispSingleColorScreen( int mode );
static void SYSMi_ReadCardBannerFile( void );
static BOOL SYSMi_CheckEntryAddress( void );
static BOOL SYSMi_CheckARM7LoadNITROCard( void );
static void SYSMi_CheckCardCloneBoot( void );
static void SYSMi_CheckRTC( void );
@ -92,7 +57,7 @@ NitroConfigData *ncdp; //
// static variable-------------------------------------------------------------
static BOOL s_isBanner = FALSE;
static BannerFile s_bannerBuf;
static NAMTitleId old_titleIdArray[TITLE_ID_BUF_SIZE];
static NAMTitleId old_titleIdArray[ LAUNCHER_TITLE_LIST_NUM ];
// const data------------------------------------------------------------------
@ -102,18 +67,7 @@ static BannerCheckParam s_bannerCheckList[ BNR_VER_MAX ] = {
{ (u8 *)&s_bannerBuf.v3, sizeof( BannerFileV3 ) },
};
#ifdef __DEBUG_SECURITY_CODE
static GXRgb security_detection_color[] = { GX_RGB( 31, 0, 0 ),
GX_RGB( 31, 31, 0 ), };
#endif
// inline functions------------------------------------------------------------
static inline void DBG_SetRed(u32 y_pos)
{
*(u16 *)(HW_DB_BG_VRAM + 0xf000 + 0x20*2*y_pos) = (1<<12) | 0x100;
MI_CpuFill16(((u8 *)HW_DB_BG_VRAM + 0x20*0x100), 0x1111, 0x20);
}
// ============================================================================
// function's description
@ -129,13 +83,21 @@ static void FreeForNAM(void *p)
OS_FreeToHeap( OS_ARENA_MAIN, OS_CURRENT_HEAP_HANDLE, p);
}
// システムメニューライブラリ用メモリアロケータの設定
void SYSM_SetAllocFunc( void *(*pAlloc)(u32), void (*pFree)(void*) )
{
SYSM_Alloc = pAlloc;
SYSM_Free = pFree;
}
// SystemMenuの初期化
void SYSM_Init( void *(*pAlloc)(u32), void (*pFree)(void*) )
{
#ifdef __SYSM_DEBUG
pSysm = GetSYSMWork();
ncdp = GetTSD();
// SYSMi_DispInitialDebugData(); // 初期デバッグ情報表示
#endif /* __SYSM_DEBUG */
TP_Init();
@ -149,30 +111,7 @@ void SYSM_Init( void *(*pAlloc)(u32), void (*pFree)(void*) )
SVC_CpuClearFast(0x0000, (u16 *)GetSYSMWork(), sizeof(SYSM_work)); // SYSMワークのクリア
// ※ISデバッガかどうかの判定。 BootROMからのパラメータ引渡し
SYSMi_WaitInitARM7();
//NAMの初期化
//NAM_Init(AllocForNAM,FreeForNAM);
MI_CpuClearFast(old_titleIdArray, sizeof(old_titleIdArray) );
}
// システムメニューライブラリ用メモリアロケータの設定
void SYSM_SetAllocFunc( void *(*pAlloc)(u32), void (*pFree)(void*) )
{
SYSM_Alloc = pAlloc;
SYSM_Free = pFree;
}
// ARM7側の初期化待ち
static void SYSMi_WaitInitARM7( void )
{
/* while( !( SYSM_GetBootFlag() & BFLG_ARM7_INIT_COMPLETED ) ) {
SVC_WaitByLoop(0x1000); // ARM7の初期化が終了するのを待つ。
}
*/
reg_OS_PAUSE |= REG_OS_PAUSE_CHK_MASK; // PAUSEレジスタのチェックフラグのセット
// SYSM_ReadHWInfo(); // NANDからHW情報をリード
@ -185,32 +124,24 @@ static void SYSMi_WaitInitARM7( void )
SYSM_VerifyAndRecoveryNTRSettings(); // NTR設定データを読み出して、TWL設定データとベリファイし、必要ならリカバリ
SYSMi_CheckCardCloneBoot(); // カードがクローンブートかチェック
SYSMi_ReadCardBannerFile(); // カードバナーファイルの読み出し。
// SYSMi_CheckCardCloneBoot(); // カードがクローンブートかチェック
// SYSMi_ReadCardBannerFile(); // カードバナーファイルの読み出し。
// ==============================================================
// デバッガ対応コード
#ifdef __IS_DEBUGGER_BUILD
if( GetSYSMWork()->isOnDebugger ) {
if( SYSMi_ExistCard() &&
!SYSMi_IsDebuggerBannerViewMode() ){ // デバッガ上動作の場合は、この中でカードブートまでやってしまう。
SYSM_GetResetParam()->isLogoSkip = TRUE;
SYSM_GetResetParam()->bootTitleID = SYSM_GetCardTitleID();
}
}else {
while( 1 ) {} // ISデバッガビルドでISデバッガが検出できなかったら停止。
}
#endif // __IS_DEBUGGER_BUILD
// ==============================================================
//NAMの初期化
//NAM_Init(AllocForNAM,FreeForNAM);
MI_CpuClearFast(old_titleIdArray, sizeof(old_titleIdArray) );
}
// カードタイトルの取得
int SYSM_GetCardTitleList( TitleProperty *pTitleList_Card )
{
#pragma unused( pTitleList_Card )
return 0;
}
// 指定ファイルリード
static s32 ReadFile(FSFile* pf, void* buffer, s32 size)
{
u8* p = (u8*)buffer;
@ -240,15 +171,16 @@ static s32 ReadFile(FSFile* pf, void* buffer, s32 size)
#include <twl/ese.h>
ESTitleMeta dst[1];
// NANDタイトルリストの取得
int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size)
{
// filter_flag : ALL, ALL_APP, SYS_APP, USER_APP, Data only, 等の条件を指定してタイトルリストを取得する。
// とりあえずALL
int l;
int gotten;
NAMTitleId titleIdArray[TITLE_ID_BUF_SIZE];
static BannerFile bannerBuf[TITLE_ID_BUF_SIZE];
gotten = NAM_GetTitleList(titleIdArray, TITLE_ID_BUF_SIZE);
NAMTitleId titleIdArray[ LAUNCHER_TITLE_LIST_NUM ];
static BannerFile bannerBuf[ LAUNCHER_TITLE_LIST_NUM ];
gotten = NAM_GetTitleList(titleIdArray, LAUNCHER_TITLE_LIST_NUM );
// バナーの読み込み……別の関数に移すべきかも。
// 毎フレーム変化を見る必要がある。
@ -316,7 +248,7 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size)
}
}
for(l=gotten;l<TITLE_ID_BUF_SIZE;l++)
for(l=gotten;l<LAUNCHER_TITLE_LIST_NUM;l++)
{
// 念のため0にクリア
titleIdArray[l] = 0;
@ -428,20 +360,24 @@ OS_TPrintf("RebootSystem failed: logo CRC error\n");
}
// 各領域を読み込む
source[region_header] = 0x00000000;
length[region_header] = HW_TWL_ROM_HEADER_BUF_SIZE;
destaddr[region_header] = HW_TWL_ROM_HEADER_BUF;
source[region_arm9_ntr] = *(const u32*)&header[0x020];
length[region_arm9_ntr] = *(const u32*)&header[0x02C];
source [region_header ] = 0x00000000;
length [region_header ] = HW_TWL_ROM_HEADER_BUF_SIZE;
destaddr[region_header ] = HW_TWL_ROM_HEADER_BUF;
source [region_arm9_ntr] = *(const u32*)&header[0x020];
length [region_arm9_ntr] = *(const u32*)&header[0x02C];
destaddr[region_arm9_ntr] = *(const u32*)&header[0x028];
source[region_arm7_ntr] = *(const u32*)&header[0x030];
length[region_arm7_ntr] = *(const u32*)&header[0x03C];
source [region_arm7_ntr] = *(const u32*)&header[0x030];
length [region_arm7_ntr] = *(const u32*)&header[0x03C];
destaddr[region_arm7_ntr] = *(const u32*)&header[0x038];
source[region_arm9_twl] = *(const u32*)&header[0x1C0];
length[region_arm9_twl] = *(const u32*)&header[0x1CC];
source [region_arm9_twl] = *(const u32*)&header[0x1C0];
length [region_arm9_twl] = *(const u32*)&header[0x1CC];
destaddr[region_arm9_twl] = *(const u32*)&header[0x1C8];
source[region_arm7_twl] = *(const u32*)&header[0x1D0];
length[region_arm7_twl] = *(const u32*)&header[0x1DC];
source [region_arm7_twl] = *(const u32*)&header[0x1D0];
length [region_arm7_twl] = *(const u32*)&header[0x1DC];
destaddr[region_arm7_twl] = *(const u32*)&header[0x1D8];
for (i = region_header; i < region_max; ++i)
@ -473,90 +409,24 @@ OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len);
// ROMヘッダバッファをコピー
MI_CpuCopy32( (void *)HW_TWL_ROM_HEADER_BUF, (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF );
// 起動。
BOOT_Ready();
// パラメータチェック
if( !SYSMi_CheckTitlePointer( pBootTitle ) ) {
return AUTH_RESULT_TITLE_POINTER_ERROR;
}
#if 0
// エントリアドレスの正当性をチェック
if( !SYSMi_CheckEntryAddress() ) {
return AUTH_RESULT_ENTRY_ADDRESS_ERROR;
}
#endif
// 起動。
BOOT_Ready(); // never return;
return AUTH_RESULT_SUCCEEDED;
}
// ブートのための終了処理
void SYSM_Finalize( void )
{
// ARM7へのブート通知
// レジスタ・RAMクリア
// ※ブート時にプロテクションユニットをOFFにしなければ、不正なアドレスでの起動を防げるのでは
u32 i;
// ブートの前準備
MI_CpuCopyFast( (void *)ReturnFromMain, (void *)RETURN_FROM_MAIN_ARM9_FUNCP, (u32)( (u32)BootFuncEnd - (u32)ReturnFromMain ) );
DC_StoreRange ( (void *)ReturnFromMain, 0x200 ); // ゲームブート時の最終処理をメインメモリの後ろの方にコピー※SYSM実行時のスタック上昇で破壊されないように、このタイミングでコピーする。
for( i = 0; i <= MI_DMA_MAX_NUM; i++ ) { // DMAの停止
MI_StopDma( i );
}
SYSM_FinalizeCardPulledOut(); // カード抜け検出終了処理
SYSMi_MainpRegisterAndRamClear( TRUE ); // レジスタRAMクリア
( void )GX_VBlankIntr(FALSE);
( void )OS_SetIrqFunction(OS_IE_SUBP, INTR_SubpIRQ);
( void )OS_SetIrqMask(OS_IE_SUBP); // サブプロセッサ割り込みのみを許可。
reg_PXI_SUBPINTF = SUBP_RECV_IF_ENABLE | 0x0f00; // ARM9ステートを "0x0f" に
GetSYSMWork()->mainp_state = MAINP_STATE_WAIT_BOOT_REQ;
// ※もうFIFOはクリア済みなので、使わない。
// ARM7からの通知待ち
OS_WaitIrq(1, OS_IE_SUBP); // SVC_WaitIntr(0,OS_IE_SUBP);から変更。
// 割り込みをクリアして最終ブートシーケンスへ。
reg_PXI_SUBPINTF &= 0x0f00; // サブプロセッサ割り込み許可フラグをクリア
( void )OS_DisableIrq();
( void )OS_SetIrqMask(0);
( void )OS_ResetRequestIrqMask( (u32)~0 );
}
// ランチャーをリブート
void SYSM_RebootLauncher( void )
{
}
// 再起動タイトルを指定してのリブート
void SYSM_RebootTitle( u64 titleID )
{
#pragma unused( titleID )
}
#if 0
// NITRO起動をARM7に通知
BOOL SYSM_BootCard( void )
{ // Nintendoロゴチェックは、このタイミングで行う。
( void )SYSMi_SendMessageToARM7(MSG_BOOT_TYPE_CARD); // ARM7にカード起動を通知。
if( SYSM_CheckNinLogo( (u16 *)GetRomHeaderAddr()->nintendo_logo ) == FALSE
|| GetSYSMWork()->enableCardNormalOnly == TRUE ) { // NORMALカード非対応化
SYSM_SetBootFlag( BFLG_ILLEGAL_NITRO_CARD );
return FALSE;
}else {
SYSM_SetBootFlag( BFLG_BOOT_DECIDED | BFLG_BOOT_NITRO );
return TRUE;
}
}
#endif
#if 0
// TPリード可能かどうかを調べる。
BOOL SYSM_IsTPReadable( void )
@ -567,82 +437,6 @@ BOOL SYSM_IsTPReadable( void )
#endif
// ARM7-ARM9共有リソースのbootFlagへの値のセット
void SYSM_SetBootFlag( u32 value )
{
BOOL preIrq = OS_DisableIrq();
LockVariable *lockp = &GetSYSMWork()->boot_flag;
( void )OS_LockByWord( BOOTFLAG_LOCK_ID, &(lockp->lock), (void (*)( void ))0x00000000);
lockp->value |= value;
( void )OS_UnLockByWord(BOOTFLAG_LOCK_ID, &(lockp->lock), (void (*)( void ))0x00000000);
( void )OS_RestoreIrq( preIrq );
}
void SYSM_ClearBootFlag( u32 value )
{
BOOL preIrq = OS_DisableIrq();
LockVariable *lockp = &GetSYSMWork()->boot_flag;
( void )OS_LockByWord( BOOTFLAG_LOCK_ID, &(lockp->lock), (void (*)( void ))0x00000000);
lockp->value &= ~value;
( void )OS_UnLockByWord(BOOTFLAG_LOCK_ID, &(lockp->lock), (void (*)( void ))0x00000000);
( void )OS_RestoreIrq( preIrq );
}
// ============================================================================
// 割り込み処理
// ============================================================================
// サブプロセッサ割り込み
static void INTR_SubpIRQ( void )
{
OS_SetIrqCheckFlag( OS_IE_SUBP );
}
// ============================================================================
// アプリ起動処理
// ============================================================================
// SystemMenuで使用したレジスタメモリのクリア
static void SYSMi_MainpRegisterAndRamClear( BOOL isPlatformTWL )
{
// 最後がサブプロセッサ割り込み待ちなので、IMEはクリアしない。
( void )OS_SetIrqMask(0);
( void )OS_ResetRequestIrqMask( (u32)~0 );
// メモリクリア
GX_SetBankForLCDC(GX_VRAM_LCDC_ALL); // VRAM クリア
MI_CpuClearFast((void*)HW_LCDC_VRAM, HW_LCDC_VRAM_SIZE);
( void )GX_DisableBankForLCDC();
// MI_CpuClearFast((void *)HW_ITCM, HW_ITCM_SIZE); // ITCM クリア ※ITCMにはSDKのコードが入っているので、gameBoot.cでクリアする。
// MI_CpuClearFast((void *)HW_DTCM, HW_DTCM_SIZE-0x800); // DTCM クリア ※DTCMはスタック&SDK変数入りなので、最後にgameBoot.cでクリアしている。
MI_CpuClearFast((void *)HW_OAM, HW_OAM_SIZE); // OAM クリア
MI_CpuClearFast((void *)HW_PLTT, HW_PLTT_SIZE); // パレット クリア
MI_CpuClearFast((void *)HW_DB_OAM, HW_DB_OAM_SIZE); // OAM クリア
MI_CpuClearFast((void *)HW_DB_PLTT, HW_DB_PLTT_SIZE); // パレット クリア
// レジスタクリア
MI_CpuClearFast((void*)(HW_REG_BASE + 0x8), 0x12c); // BG0CNT KEYCNT
MI_CpuClearFast((void*)(HW_REG_BASE + 0x280), 0x40); // DIVCNT SQRTD3
MI_CpuClearFast((void*)(HW_REG_BASE + 0x1000), 0x6e); // DISP1CNT1 DISPBRTCNT1
CP_SetDiv32_32( 0, 1 );
reg_PXI_SUBP_FIFO_CNT = 0x4008;
reg_GX_DISPCNT = 0;
reg_GX_DISPSTAT = 0; // ※ reg_GX_VCOUNTはベタクリアできないので、この先頭部分のクリアを分離する。
// NTRの時には、バナーがある時は、MCCNTのカードイネーブルビットが"1"で、無いときには"0"になっていたが、
// NTR起動の時には、ここでもそれを踏襲しないとダメかも。。。
// クリアしていないレジスタは、VCOUNT, PIFCNT, MC-, EXMEMCNT, IME, RBKCNT1, PAUSE, POWLCDCNT, 全3D系です。
if( isPlatformTWL ) {
// TWL専用レジスタのクリア
}
}
// ============================================================================
// サブルーチン
// ============================================================================
@ -668,7 +462,6 @@ static BOOL SYSMi_IsDebuggerBannerViewMode( void )
}
// バナーファイルの読み込みの実体
static void SYSMi_ReadCardBannerFile( void )
{
@ -755,14 +548,6 @@ static void SYSMi_WriteAdjustRTC( void )
}
// FIFO経由でARM7にメッセージ通知。※PXI_FIFO_TAG_USER_1を使用。
static BOOL SYSMi_SendMessageToARM7(u32 msg)
{
#pragma unused(msg)
return TRUE;
}
// NTR,TWLカード存在チェック 「リターン 1カード認識 0カードなし」
static int SYSMi_ExistCard( void )
{
@ -802,7 +587,7 @@ void SYSM_SetBackLightBrightness( void )
//======================================================================
// Nintendoロゴチェック 「リターン 1:Nintendoロゴ認識成功 0失敗」
BOOL SYSM_CheckNinLogo(u16 *logo_cardp)
BOOL SYSM_CheckNintendoLogo(u16 *logo_cardp)
{
u16 *logo_orgp = (u16 *)SYSROM9_NINLOGO_ADR; // ARM9のシステムROMのロゴデータとカートリッジ内のものを比較
u16 length = NINTENDO_LOGO_LENGTH >> 1;
@ -836,18 +621,6 @@ static BOOL SYSMi_CheckEntryAddress( void )
}
// ARM7によるNITROゲームのロード完了を確認する。
static BOOL SYSMi_CheckARM7LoadNITROCard( void )
{
if( SYSMi_ExistCard()
// && !( SYSM_GetBootFlag() & BFLG_LOAD_CARD_COMPLETED )
) {
return FALSE;
}
return TRUE;
}
// クローンブート判定
static void SYSMi_CheckCardCloneBoot( void )
{
@ -904,70 +677,3 @@ static void SYSMi_CheckRTC( void )
//======================================================================
// デバッグ
//======================================================================
// 初期データのデバッグ表示
#ifdef __SYSM_DEBUG
static void SYSMi_DispInitialDebugData( void )
{
OS_Printf("SYSM version :20%x\n", SYSMENU_VER);
if( GetMovedInfoFromIPL1Addr()->isOnDebugger ) OS_Printf("Run On IS-DEBUGGER\n");
else OS_Printf("Run On IS-EMULATOR\n");
if(GetMovedInfoFromIPL1Addr()->rtcStatus & 0x01) OS_Printf("RTC reset is detected!\n");
if(GetMovedInfoFromIPL1Addr()->rtcError) OS_Printf("RTC error is detected!\n");
#if 0
OS_Printf("NvDate :%4d\n",sizeof(NvDate));
OS_Printf("NvNickname :%4d\n",sizeof(NvNickname));
OS_Printf("NvComment :%4d\n",sizeof(NvComment));
OS_Printf("NvOwnerInfo :%4d\n",sizeof(NvOwnerInfo));
OS_Printf("NvAlarm :%4d\n",sizeof(NvAlarm));
OS_Printf("NvTpCalibData:%4d\n",sizeof(NvTpCalibData));
OS_Printf("NvOption :%4d\n",sizeof(NvOption));
OS_Printf("NCD :%4d\n",sizeof(NitroConfigData));
OS_Printf("NCDStore :%4d\n",sizeof(NCDStore));
#endif
#if 0
{ // ROM_HEADER_BUFFの内容を書き出し
int i,j;
u32 *romhp = (u32 *)GetRomHeaderAddr();
OS_Printf("ROM Header Buff\n ");
for(i = 0; i < 6; i++) {
for(j = 0; j < 4; j++) OS_Printf(" 0x%8x", *romhp++);
OS_Printf("\n ");
}
OS_Printf("\n");
}
{ // ROM_HEADER_BUFFの内容を書き出し
int i,j;
u32 *romhp = (u32 *)MB_CARD_ROM_HEADER_ADDRESS;
OS_Printf("MB Card ROM Header Buff\n ");
for(i = 0; i < 6; i++) {
for(j = 0; j < 4; j++) OS_Printf(" 0x%8x", *romhp++);
OS_Printf("\n ");
}
OS_Printf("\n");
}
#endif /* 0 */
}
#endif /* __SYSM_DEBUG */
#ifdef __DEBUG_SECURITY_CODE
// セキュリティがきちんと働いているかを確認するデバッグコード
static void DispSingleColorScreen( int mode )
{
( void )OS_DisableIrq();
GX_LoadBGPltt ( &security_detection_color[ mode ], 0, sizeof(GXRgb) );
GXS_LoadBGPltt ( &security_detection_color[ mode ], 0, sizeof(GXRgb) );
GX_DispOn();
GXS_DispOn();
GX_SetGraphicsMode ( GX_DISPMODE_GRAPHICS, GX_BGMODE_0, GX_BG0_AS_2D );
GXS_SetGraphicsMode( GX_BGMODE_0 );
GX_SetMasterBrightness( 0 );
GXS_SetMasterBrightness( 0 );
GX_SetVisiblePlane ( GX_PLANEMASK_NONE );
GXS_SetVisiblePlane( GX_PLANEMASK_NONE );
}
#endif

View File

@ -42,11 +42,11 @@ LINCLUDES = $(SRCDIR)/$(LOGO_DIR)
#LLIBRARIES =
#LDEPENDS_NEF =
LLIBRARIES += libnam$(TWL_LIBSUFFIX).a\
libese$(TWL_LIBSUFFIX).a\
libboot$(TWL_LIBSUFFIX).a
LLIBRARIES += libnam$(TWL_LIBSUFFIX).a \
libese$(TWL_LIBSUFFIX).a \
libboot$(TWL_LIBSUFFIX).a
ADDRESS_DTCM = 0x0e000000
ADDRESS_DTCM = 0x0e000000
DEFAULT_COMP_ARM7 = hyena
DEFAULT_MAKEROM_ARM7_BASE = $(TWLIPL_ROOT)/components/$(DEFAULT_COMP_ARM7)/$(TWL_BUILDTYPE_ARM7)/$(DEFAULT_COMP_ARM7)

View File

@ -41,65 +41,13 @@ static void DrawLauncher(u16 nowCsr, const MenuParam *pMenu);
// static variable -------------------------------------
static int s_csr = 0; // メニューのカーソル位置
static const u16 *s_pStrLauncher[ LAUNCHER_ELEMENT_NUM ]; // ロゴメニュー用文字テーブルへのポインタリスト
static u64 old_titleIdArray[TITLE_PROPERTY_NUM];
static u64 old_titleIdArray[ LAUNCHER_TITLE_LIST_NUM ];
// const data -----------------------------------------
//===============================================
// Launcher.c
//===============================================
static const u16 *const s_pStrLauncherElemTbl[ LAUNCHER_ELEMENT_NUM ][ TWL_LANG_CODE_MAX ] = {
{
(const u16 *)L"DSカード",
(const u16 *)L"DS Card",
(const u16 *)L"DS Card(F)",
(const u16 *)L"DS Card(G)",
(const u16 *)L"DS Card(I)",
(const u16 *)L"DS Card(S)",
},
{
(const u16 *)L"ピクトチャット",
(const u16 *)L"PictoChat",
(const u16 *)L"PictoChat(F)",
(const u16 *)L"PictoChat(G)",
(const u16 *)L"PictoChat(I)",
(const u16 *)L"PictoChat(S)",
},
{
(const u16 *)L"DSダウンロードプレイ",
(const u16 *)L"DS Download Play",
(const u16 *)L"DS Download Play(F)",
(const u16 *)L"DS Download Play(G)",
(const u16 *)L"DS Download Play(I)",
(const u16 *)L"DS Download Play(S)",
},
{
(const u16 *)L"本体設定",
(const u16 *)L"Machine Settings",
(const u16 *)L"Machine Settings(F)",
(const u16 *)L"Machine Settings(G)",
(const u16 *)L"Machine Settings(I)",
(const u16 *)L"Machine Settings(S)",
},
};
static MenuPos s_launcherPos[] = {
{ TRUE, 4 * 8, 8 * 8 },
{ TRUE, 4 * 8, 10 * 8 },
{ TRUE, 4 * 8, 12 * 8 },
{ TRUE, 4 * 8, 14 * 8 },
{ TRUE, 4 * 8, 16 * 8 },
};
static const MenuParam s_launcherParam = {
LAUNCHER_ELEMENT_NUM,
TXT_COLOR_BLACK,
TXT_COLOR_GREEN,
TXT_COLOR_RED,
&s_launcherPos[0],
(const u16 **)&s_pStrLauncher,
};
static const u16 *const str_backlight[] = {
(const u16 *)L"BLT:ON ",
@ -118,10 +66,10 @@ static BannerFile *empty_banner;
static BannerFile *nobanner_banner;
static BannerFile *card_banner;
static BannerFile *download_banner;
static u8 image_index_list[TITLE_PROPERTY_NUM];
static u8 image_index_list[ LAUNCHER_TITLE_LIST_NUM ];
static const int MAX_SHOW_BANNER = 6;
static GXOamAttr banner_oam_attr[MAX_SHOW_BANNER+10];// アフィンパラメータ埋める関係で少し大きめ
static u8 *pbanner_image_list[TITLE_PROPERTY_NUM];
static u8 *pbanner_image_list[ LAUNCHER_TITLE_LIST_NUM ];
static int banner_count = 0;
static void LoadBannerFiles()
@ -195,7 +143,7 @@ static void BannerDraw(int cursor, int selected, TitleProperty *titleprop)
*/
// TitleProperty弄り
for(l=0;l<TITLE_PROPERTY_NUM;l++)
for(l=0;l<LAUNCHER_TITLE_LIST_NUM;l++)
{
if(titleprop[l].titleID == 0) //IDがゼロの時はEmpty
{
@ -208,7 +156,7 @@ static void BannerDraw(int cursor, int selected, TitleProperty *titleprop)
}
// TitlePropertyを見てVRAMにキャラクタデータをロード
for(l=0;l<TITLE_PROPERTY_NUM;l++)
for(l=0;l<LAUNCHER_TITLE_LIST_NUM;l++)
{
if(titleprop[l].titleID != old_titleIdArray[l])
{
@ -217,7 +165,7 @@ static void BannerDraw(int cursor, int selected, TitleProperty *titleprop)
break;
}
}
for(l=0;l<TITLE_PROPERTY_NUM;l++)
for(l=0;l<LAUNCHER_TITLE_LIST_NUM;l++)
{
u8 m;
u8 *pban=((BannerFile *)titleprop[l].pBanner)->v1.image;
@ -229,7 +177,7 @@ static void BannerDraw(int cursor, int selected, TitleProperty *titleprop)
}
if(m == banner_count)
{
if(banner_count<TITLE_PROPERTY_NUM-1){
if(banner_count<LAUNCHER_TITLE_LIST_NUM-1){
GX_LoadOBJ(pban, (u32)m*BNR_IMAGE_SIZE , BNR_IMAGE_SIZE);
pbanner_image_list[m] = pban;
banner_count++;
@ -273,7 +221,7 @@ static void BannerDraw(int cursor, int selected, TitleProperty *titleprop)
for (l=0;l<MAX_SHOW_BANNER;l++)
{
int num = cursor/CURSOR_PER_SELECT - 2 + l;
if(-1 < num && num < TITLE_PROPERTY_NUM){
if(-1 < num && num < LAUNCHER_TITLE_LIST_NUM){
banner_oam_attr[l].charNo = image_index_list[num]*4;
if(l == 2 || l == 3)
@ -309,7 +257,6 @@ void LauncherInit( TitleProperty *pTitleList )
{
#pragma unused( pTitleList )
int i;
GX_DispOff();
GXS_DispOff();
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE );
@ -318,17 +265,6 @@ void LauncherInit( TitleProperty *pTitleList )
PrintfSJIS( 0, 0, TXT_COLOR_BLUE, "TWL-SYSTEM MENU ver.%06x", SYSMENU_VER );
// NITRO設定データのlanguageに応じたメインメニュー構成言語の切り替え
for( i = 0; i < LAUNCHER_ELEMENT_NUM; i++ ) {
s_pStrLauncher[ i ] = s_pStrLauncherElemTbl[ i ][ TSD_GetLanguage() ];
}
if( !SYSM_IsNITROCard() ) {
s_launcherPos[ 0 ].enable = FALSE; // DSカードが無い時は、先頭要素を無効にする。
}
//DrawMenu( s_csr, &s_launcherParam );
SVC_CpuClear( 0x0000, &tpd, sizeof(TpWork), 16 );
InitGetAndDrawRtcData( RTC_DATE_TOP_X, RTC_DATE_TOP_Y, RTC_TIME_TOP_X, RTC_TIME_TOP_Y );
@ -390,27 +326,18 @@ TitleProperty *LauncherMain( TitleProperty *pTitleList )
if(csr_v == 0) csr_v = -1;
}
s_csr += csr_v;
if((TITLE_PROPERTY_NUM-1)*CURSOR_PER_SELECT < s_csr) s_csr = (TITLE_PROPERTY_NUM-1)*CURSOR_PER_SELECT;
if((LAUNCHER_TITLE_LIST_NUM-1)*CURSOR_PER_SELECT < s_csr) s_csr = (LAUNCHER_TITLE_LIST_NUM-1)*CURSOR_PER_SELECT;
if( s_csr < 0 ) s_csr = 0;
if(s_csr%CURSOR_PER_SELECT == 0){
csr_v = 0;
selected = s_csr/CURSOR_PER_SELECT;
}
// tp_select = SelectMenuByTP( &s_csr, &s_launcherParam );
// DrawMenu( s_csr, &s_launcherParam );
#ifdef DBGBNR
BannerDraw( s_csr, selected, pTitleList );
#endif
if( ( pad.trg & PAD_BUTTON_A ) || ( tp_select ) ) { // メニュー項目への分岐
/*
if( s_launcherPos[ 0 ].enable ) {
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE );
return NULL;
}
*/
if(pTitleList[selected].titleID != 0)
{
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE );

View File

@ -26,7 +26,6 @@ extern "C" {
#endif
// define data----------------------------------------------------------
#define TITLE_PROPERTY_NUM 40
// global variables--------------------------------------------------

View File

@ -38,14 +38,8 @@ static BannerFile banner; //
// const data------------------------------------------------------------------
#if 1
typedef struct CardStatus {
u16 primarySlot; // PULLOUT, DETECT, VALID, INVALID
u16 secondarySlot; // 同上。
}CardStatus;
// メイン
void TwlMain( void )
{
enum {
@ -59,7 +53,7 @@ void TwlMain( void )
};
u32 state = START;
TitleProperty *pBootTitle = NULL;
TitleProperty pTitleList[TITLE_PROPERTY_NUM];
TitleProperty pTitleList[ LAUNCHER_TITLE_LIST_NUM ];
OS_Init();
@ -101,7 +95,7 @@ void TwlMain( void )
// FS_ReadSharedContentFile( ContentID );
// NANDアプリリストの取得----------
(void)SYSM_GetNandTitleList( pTitleList, TITLE_PROPERTY_NUM );
(void)SYSM_GetNandTitleList( pTitleList, LAUNCHER_TITLE_LIST_NUM );
while( 1 ) {
OS_WaitIrq(1, OS_IE_V_BLANK); // Vブランク割り込み待ち
@ -132,12 +126,9 @@ void TwlMain( void )
}
break;
case AUTHENTICATE:
switch ( SYSM_LoadAndAuthenticateTitle( pBootTitle ) ) { // アプリロード&認証
switch ( SYSM_LoadAndAuthenticateTitle( pBootTitle ) ) { // アプリロード&認証 成功時never return
case AUTH_PROCESSING:
break;
case AUTH_RESULT_SUCCEEDED:
state = BOOT;
break;
case AUTH_RESULT_TITLE_POINTER_ERROR:
case AUTH_RESULT_AUTHENTICATE_FAILED:
case AUTH_RESULT_ENTRY_ADDRESS_ERROR:
@ -145,171 +136,13 @@ void TwlMain( void )
break;
}
break;
case BOOT:
SYSM_Finalize(); // 終了処理
return;
case STOP: // 停止
break;
}
}
}
#endif
// ============================================================================
// function's description
// ============================================================================
/*
void TwlMain(void)
{
typedef enum PrgState {
STATE_START = 1,
STATE_LOGO_DISP,
STATE_LOGO_MENU,
STATE_WAIT_BOOT
}PrgState;
PrgState prg_state = STATE_START;
BOOL boot_decision = FALSE;
// 初期化----------------------------------
SYSM_Init(); // システムメニュー関連データの初期化TwlMainの先頭でコールして下さい。
OS_Init();
(void)OS_EnableIrq();
(void)OS_EnableInterrupts();
FS_Init( FS_DMA_NOT_USE );
GX_Init();
GX_SetPower(GX_POWER_ALL); // 各ロジック パワーON
// 割り込み許可----------------------------
(void)OS_SetIrqFunction(OS_IE_V_BLANK, INTR_VBlank);
(void)OS_EnableIrqMask(OS_IE_V_BLANK);
(void)GX_VBlankIntr(TRUE);
// デバイス初期化-------------------------------
#ifndef __TP_OFF
TP_Init();
#endif
(void)RTC_Init();
// システムの初期化------------------
InitAllocator( &g_allocator );
CMN_InitFileSystem( &g_allocator );
// InitAllocSystem();
// ARM7初期化待ち--------------------------
// if( SYSM_WaitARM7Init() ) { // ARM7側の初期化が終わるのを待ってからメインループ開始
// return; // TRUEが返されたら、デバッガブートなのでリターン
// }
// メインループ----------------------------
while(1){
OS_WaitIrq(1, OS_IE_V_BLANK); // Vブランク割り込み待ち
ReadKeyPad(); // キー入力の取得
if(SYSM_IsTPReadable()) {
ReadTpData(); // TP入力の取得
}
// if(SYSM_Main()) { // IPL2システムのメイン
// return; // TRUEが帰ってきたらメインループからリターンNITROゲーム起動等
// }
switch(prg_state) {
case STATE_START:
boot_decision = CheckBootStatus(); // ブート状態をチェックする。(ショートカット起動やコンパイルスイッチによる強制起動)
// if( !SYSM_GetBannerFile( &banner ) ) { // バナーデータのリード
// OS_Printf("ROM banner data read failed.\n");
// }
prg_state = STATE_LOGO_DISP;
break;
//-----------------------------------
// NITROロゴ表示
//-----------------------------------
case STATE_LOGO_DISP:
if( LogoMain() ) { // ロゴ表示ルーチン※BFLG_GAMEBOY_LOGO_OFFの時は即終了
InitBG(); // BG初期化
LauncherInit(); // ブート未決定時のみロゴメニューを初期化する。
prg_state = STATE_LOGO_MENU;
}
break; // ※NITROカードが正当でない場合は、このまま無限ループ。
//-----------------------------------
// ロゴメニューで起動モード選択
//-----------------------------------
case STATE_LOGO_MENU:
{
IPL2BootType command = LauncherMain( boot_decision );
switch(command) {
case BOOT_TYPE_UNSOLVED:
break;
case BOOT_TYPE_NITRO:
// if( !SYSM_BootNITRO() ) {
// (void)DrawStringSJIS( 4, 20, RED, (const u8 *)"This NITRO card is invalid!!");
// }
break;
case BOOT_TYPE_PICT_CHAT:
// (void)SYSM_BootPictChat();
break;
case BOOT_TYPE_WIRELESS_BOOT:
// (void)SYSM_BootDSDownloadPlay();
break;
case BOOT_TYPE_BMENU:
// (void)SYSM_BootMachineSetting();
break;
default:
OS_Panic( "ERROR: boot code failed : %d\n", command );
}
if(command) {
prg_state = STATE_WAIT_BOOT;
}
}
break;
case STATE_WAIT_BOOT:
// SYSM_PermitToBootSelectedTarget();
break;
}
if ( PAD_DetectFold() == TRUE ) { // スリープモードへの遷移
// SYSM_FinalizeCardPulledOut();
SYSM_GoSleepMode();
// (void)SYSM_IsCardPulledOut(); // カード抜け検出コマンド発行
// SYSM_FinalizeCardPulledOut();
// カード抜け検出
// if ( SYSM_IsCardPulledOut() ) {
if ( 0 ) {
(void)PM_ForceToPowerOff();
}
}
// if (SYSM_IsCardPulledOut()) { // カード抜け検出
if ( 0 ) {
OS_Printf("Card is pulled out.\n");
OS_Terminate();
}
OS_PrintServer(); // ARM7からのプリントデバッグを処理する
//---- BG-VRAMの更新
// DC_FlushRange ( bgBakS, sizeof(bgBakS) );
// MI_CpuCopyFast( bgBakS, (void*)(HW_DB_BG_VRAM+0xf000), sizeof(bgBakS) );
}
}
*/
// アロケータの初期化
static void InitAllocator( NNSFndAllocator* pAllocator )
{
@ -341,25 +174,6 @@ void Free( void *pBuffer )
}
#if 0
// mallocシステムの初期化
static void InitAllocSystem(void)
{
void* tempLo;
OSHeapHandle hh;
tempLo = OS_InitAlloc(OS_ARENA_MAIN, OS_GetMainArenaLo(), OS_GetMainArenaHi(), 16);
OS_SetArenaLo(OS_ARENA_MAIN, tempLo);
OS_TPrintf( "ArenaLo : %08x ArenaHi : %08x\n", OS_GetMainArenaLo(), OS_GetMainArenaHi() );
hh = OS_CreateHeap(OS_ARENA_MAIN, OS_GetMainArenaLo(), OS_GetMainArenaHi());
if(hh < 0) {
OS_Panic("ARM9: Fail to create heap...\n");
}
hh = OS_SetCurrentHeap(OS_ARENA_MAIN, hh);
}
#endif
// ブート状態を確認し、ロゴ表示有無を判断する-------
static BOOL CheckBootStatus(void)
{

View File

@ -5,17 +5,17 @@ SystemMenu_RED
・ランチャー △
・カードアプリ取得 ×
・NANDアプリリスト取得 ○
・TWLカード起動 ×
・NTRカードNTRモード起動 ×
・NANDアプリ起動 △ (制限あり)
・カード活線挿抜処理 ×
・NTRカードNTRモード起動 ×
・NANDアプリリスト取得 ○
・NANDアプリ起動 ○
・ISデバッガ対応 ×
・ファームウェアとして正規動作 ×
・アプリ起動時のWRAM-MAP設定 ×
・アプリ起動時のWRAM-MAP設定
・署名・暗号処理 ×
・鍵管理 ×
・メモリマップFIX ×
・メモリマップFIX
・NTRコンポーネントパッチ ×
・本体設定 △
・言語選択 ○
@ -32,6 +32,8 @@ SystemMenu_RED
・アプリ管理 ×
・SDにコピーする際のファイルフォーマット×
・TWLバナー対応 ×
・makebanner作成 ×
・NANDファーム→ランチャーパラメータ引渡し ×
・アドレスFIX ×
・ランチャー⇔NANDアプリ間パラメータ引渡し ×
@ -39,16 +41,16 @@ SystemMenu_RED
・NAND,SDマウント情報アクセス制限 ×
・アプリからのHWリセット時パラメータ ×
・DSダウンロードプレイの情報 ×
・NAND内オーバーレイFS ×
・NAND内オーバーレイFS
・共有リソースアクセス ×
・タイトル外部リソースアクセス ×
・NANDアプリデバッグ対応 × (現状カードアプリとしてデバッグ)
・NANDアプリインストール ○ TwlSDKのNMenuを使用
・NANDフォーマット ○ TwlSDKのdemos.TWL/fatfs/formatterを使用
・NANDフォーマット △ TwlSDKのdemos.TWL/fatfs/formatterを使用
・起動できないランチャーを書いて起動しなくなった時の復旧は、GCDファーム形式のプログラムを作らないとダメ
・makerom.TWL対応
・ヘッダをTwlSDKの共有に
・TitleIDを入れる
・ファーム用ビルドPKIを不使用、AES暗号範囲変更に対応
・TWLカードのーマル領域をマニュアル設定できるように。

View File

@ -30,6 +30,8 @@ extern "C" {
// define data----------------------------------------------------------
#define LAUNCHER_TITLE_LIST_NUM 40 // ランチャーのタイトルリスト数
// タイトル情報
typedef struct TitleProperty { // この情報は、ランチャー時には認証通ってないけど、起動時には認証通すので大丈夫だろう。
u64 titleID; // タイトルID
@ -88,7 +90,7 @@ extern void SYSM_BootMachineSetting( void );
extern BOOL SYSM_ReadBannerFile( BannerFile *banner );
extern BOOL SYSM_IsTPReadable( void );
extern BOOL SYSM_CheckNinLogo( u16 *logo_cardp );
extern BOOL SYSM_CheckNintendoLogo( u16 *logo_cardp );
extern void SYSM_LoadNintendoLogo2D( u16 *ninLogoDatap, u16 *dstp, u16 color, u32 *tempBuffp ); // tempBuffpには0x700byte必要です。
extern void SYSM_LoadNintendoLogo1D( u16 *ninLogoDatap, u16 *dstp, u16 color, u32 *tempBuffp ); // 同上。