・ランチャーでバックライト輝度変更が行えるよう変更。

・リセットパラメータ取得部分の整備。(SDKの対応待ち)

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@189 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2007-11-15 12:52:47 +00:00
parent 8b0e7bf9d9
commit 0d5ce3f4a5
19 changed files with 131 additions and 1078 deletions

View File

@ -35,7 +35,7 @@
#include <twl/aes.h>
#include <twl/mcu.h>
#include <sysmenu/boot/common/boot.h>
#include <sysmenu/sysmenu_work.h>
#include <sysmenu/sysmenu_lib/common/sysmenu_work.h>
/*---------------------------------------------------------------------------*
@ -78,20 +78,29 @@ void
TwlSpMain(void)
{
OSHeapHandle heapHandle;
// SYSMワークのクリア
MI_CpuClear32( SYSMi_GetWork(), sizeof(SYSM_work) );
// OS 初期化
OS_Init();
PrintDebugInfo();
// Cold/Hotスタート判定
if( *(vu32 *)HW_RESET_PARAMETER_BUF == 0 ) { // NANDファームが毎回このバッファにマイコンフリーレジスタ値をセットしてくれる
if( *(vu32 *)HW_RESET_PARAMETER_BUF == 0 ) { // NANDファームが毎回このバッファにマイコンフリーレジスタ値をセットしてくれる
u32 data = 1;
MCU_SetFreeRegisters( 0, (u8 *)&data, 4 ); // マイコンフリーレジスタにホットスタートフラグをセット
SYSM_GetWork()->isHotStart = FALSE;
MCU_SetFreeRegisters( 0, (u8 *)&data, 4 ); // マイコンフリーレジスタにホットスタートフラグをセット
SYSMi_GetWork()->isHotStart = FALSE;
}else {
SYSM_GetWork()->isHotStart = TRUE;
MI_CpuCopy32 ( SYSMi_GetResetParam(), &SYSMi_GetWork()->resetParam, sizeof(ResetParam) );
SYSMi_GetWork()->isHotStart = TRUE;
}
SYSM_GetWork()->isARM9Start = TRUE; // ※HW_RED_RESERVEDはNANDファームでクリアしておいて欲しい
#ifdef SYSM_RESET_PARAM_READY_
MI_CpuClear32( SYSMi_GetResetParam(), sizeof(ResetParam) );
#else
MI_CpuClear32( &SYSMi_GetWork()->resetParam, sizeof(ResetParam) );
#endif
SYSMi_GetWork()->isARM9Start = TRUE; // ※HW_RED_RESERVEDはNANDファームでクリアしておいて欲しい
// ヒープ領域設定
{

View File

@ -1,46 +0,0 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlIPL
# File: Makefile
#
# 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.
#
# $Date:: 2007-10-03#$
# $Rev: 1319 $
# $Author: kitase_hirotake $
#----------------------------------------------------------------------------
SUBDIRS =
#----------------------------------------------------------------------------
TARGET_PLATFORM = TWL
TWL_ARCHGEN = LIMITED
TWL_PROC = ARM9
SRCS = crt1.c
TARGET_OBJ = crt1.o
LINCLUDES = $(COMMON_DIR)
include $(TWLIPL_ROOT)/build/buildtools/commondefs.sysmenu
INSTALL_TARGETS = $(TARGETS)
INSTALL_DIR = $(SYSMENU_INSTALL_LIBDIR)
#----------------------------------------------------------------------------
do-build: $(TARGETS)
include $(TWLIPL_ROOT)/build/buildtools/modulerules.sysmenu
#===== End of Makefile =====

View File

@ -26,7 +26,7 @@ TARGET_PLATFORM = TWL
TWL_ARCHGEN = LIMITED
TWL_PROC = ARM9
SRCS = sysmenu_lib.c sysmenu_card.c sysmenu_util.c gameBoot.c ninLogoFunc.c \
SRCS = sysmenu_lib.c sysmenu_card.c sysmenu_util.c ninLogoFunc.c \
settingsAPI.c mountInfo.c
TARGET_LIB = libsysmenu$(TWL_LIBSUFFIX).a

View File

@ -1,559 +0,0 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: crt1.c
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.
$Date:: $
$Rev$
$Author$
*---------------------------------------------------------------------------*/
#include <twl/code32.h>
#include <twl.h>
#include <sysmenu/sysmenu_work.h> // SYSM changed.
#define SDK_NOCOMPRESS // SYSM changed.
extern void NitroMain( void );
extern void OS_IrqHandler( void );
static void do_autoload( void );
static void init_cp15( void );
void _start( void );
extern void* const _start_ModuleParams[];
void _start_AutoloadDoneCallback( void* argv[] );
extern void __call_static_initializers( void );
extern void _fp_init( void );
// from LCF
extern u32 SDK_IRQ_STACKSIZE[];
extern void SDK_AUTOLOAD_START( void ); // autoload data will start from here
extern void SDK_AUTOLOAD_LIST( void ); // start pointer to autoload information
extern void SDK_AUTOLOAD_LIST_END( void ); // end pointer to autoload information
extern void SDK_STATIC_BSS_START( void ); // static bss start address
extern void SDK_STATIC_BSS_END( void ); // static bss end address
/*---------------------------------------------------------------------------*
Name: _start
Description: Start up
Arguments: None
Returns: None.
*---------------------------------------------------------------------------*/
#define INITi_HW_DTCM SDK_AUTOLOAD_DTCM_START
__declspec ( weak ) asm void _start( void )
{
//---- set IME = 0
// ( use that LSB of HW_REG_BASE equal to 0 )
mov r12, #HW_REG_BASE
str r12, [r12, #REG_IME_OFFSET]
//---- initialize cp15
bl init_cp15
//---- initialize stack pointer
// SVC mode
mov r0, #HW_PSR_SVC_MODE
msr cpsr_c, r0
ldr r0, =INITi_HW_DTCM
add r0, r0, #0x3fc0
mov sp, r0
// IRQ mode
mov r0, #HW_PSR_IRQ_MODE
msr cpsr_c, r0
ldr r0, =INITi_HW_DTCM
add r0, r0, #0x3fc0
sub r0, r0, #HW_SVC_STACK_SIZE
mov sp, r0
// System mode
ldr r1, =SDK_IRQ_STACKSIZE
sub r1, r0, r1
mov r0, #HW_PSR_SYS_MODE
msr cpsr_csfx, r0
sub sp, r1, #4 // 4byte for stack check code
//---- load autoload block and initialize bss
#ifndef SDK_NOCOMPRESS
ldr r1, =_start_ModuleParams
ldr r0, [r1, #20] // r0 = bottom of compressed data
bl MIi_UncompressBackward
#endif
bl do_autoload
//---- clear memory
// DTCM (16KB)
mov r0, #0
ldr r1, =INITi_HW_DTCM
mov r2, #HW_DTCM_SIZE
bl MIi_CpuClear32
/* // BG/OBJ palette (1KB) // SYSM changed.
mov r0, #0
ldr r1, =HW_PLTT
mov r2, #HW_PLTT_SIZE
bl MIi_CpuClear32
// OAM (1KB)
mov r0, #0x0200
ldr r1, =HW_OAM
mov r2, #HW_OAM_SIZE
bl MIi_CpuClear32
*/
//---- set interrupt vector
ldr r1, =INITi_HW_DTCM
add r1, r1, #0x3fc0
add r1, r1, #HW_DTCM_SYSRV_OFS_INTR_VECTOR
ldr r0, =OS_IrqHandler
str r0, [r1, #0]
#ifndef SDK_NOINIT
//---- for C++
bl _fp_init
bl NitroStartUp
bl __call_static_initializers
#endif
//---- start (to 16bit code)
ldr r1, =NitroMain
// ldr lr, =HW_RESET_VECTOR
ldr lr, =RETURN_FROM_MAIN_ARM9_FUNCP // SYSM changed.
bx r1
}
/*---------------------------------------------------------------------------*
Name: _start_ModuleParams
Description: autoload/compress/arguments data block
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
void* const _start_ModuleParams[] =
{
(void*)SDK_AUTOLOAD_LIST,
(void*)SDK_AUTOLOAD_LIST_END,
(void*)SDK_AUTOLOAD_START,
(void*)SDK_STATIC_BSS_START,
(void*)SDK_STATIC_BSS_END,
#ifndef SDK_NOCOMPRESS
(void*)0, // CompressedStaticEnd
#endif
};
/*---------------------------------------------------------------------------*
Name: MIi_UncompressBackward
Description: Uncompress special archive for module compression
Arguments: bottom = Bottom adrs of packed archive + 1
bottom[-12] = offset for top of compressed data
inp_top = bottom + bottom[-12]
bottom[ -8] = offset for bottom of compressed data
inp = bottom + bottom[ -8]
bottom[ -4] = offset for bottom of original data
outp = bottom + bottom[ -4]
typedef struct
{
int bufferTop;
int compressBottom;
int originalBottom;
} CompFooter;
Returns: None.
*---------------------------------------------------------------------------*/
asm void MIi_UncompressBackward( register void* bottom )
{
#define data r0
#define inp_top r1
#define outp r2
#define inp r3
#define outp_save r4
#define flag r5
#define count8 r6
#define index r7
#define len r12
cmp bottom, #0
beq @exit
stmfd sp!, {r4-r7}
ldmdb bottom, {r1-r2}
add outp, bottom, outp
sub inp, bottom, inp_top, LSR #24
bic inp_top, inp_top, #0xff000000
sub inp_top, bottom, inp_top
mov outp_save, outp
@loop:
cmp inp, inp_top // exit if inp==inp_top
ble @end_loop
ldrb flag, [inp, #-1]! // r4 = compress_flag = *--inp
mov count8, #8
@loop8:
subs count8, count8, #1
blt @loop
tst flag, #0x80
bne @blockcopy
@bytecopy:
ldrb data, [inp, #-1]!
#ifdef SDK_TEG
sub outp, outp, #1
swpb data, data, [outp]
#else
strb data, [outp, #-1]! // Copy 1 byte
#endif
b @joinhere
@blockcopy:
ldrb len, [inp, #-1]!
ldrb index, [inp, #-1]!
orr index, index, len, LSL #8
bic index, index, #0xf000
add index, index, #0x0002
add len, len, #0x0020
@patterncopy:
ldrb data, [outp, index]
#ifdef SDK_TEG
sub outp, outp, #1
swpb data, data, [outp]
#else
strb data, [outp, #-1]!
#endif
subs len, len, #0x0010
bge @patterncopy
@joinhere:
cmp inp, inp_top
mov flag, flag, LSL #1
bgt @loop8
@end_loop:
// DC_FlushRange & IC_InvalidateRange
bic inp, inp_top, #HW_CACHE_LINE_SIZE - 1
@cacheflush:
mcr p15, 0, inp, c7, c5, 1 // ICache
mcr p15, 0, inp, c7, c14, 1 // DCache
add inp, inp, #HW_CACHE_LINE_SIZE
cmp inp, outp_save
blt @cacheflush
ldmfd sp!, {r4-r7}
@exit bx lr
}
/*---------------------------------------------------------------------------*
Name: do_autoload
Description: put autoload data block according to autoload information,
and clear static bss by filling with 0.
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
static asm void do_autoload( void )
{
#define ptable r0
#define infop r1
#define infop_end r2
#define src r3
#define dest r4
#define dest_size r5
#define dest_end r6
#define tmp r7
ldr ptable, =_start_ModuleParams
ldr infop, [ptable, #0] // r1 = start pointer to autoload_info
ldr infop_end, [ptable, #4] // r2 = end pointer to autoload_info
ldr src, [ptable, #8] // r3 = autoload block
@2:
cmp infop, infop_end // reach to end?
beq @fill_bss
ldr dest, [infop], #4 // dest
ldr dest_size, [infop], #4 // size
add dest_end, dest, dest_size // dest_end
@1:
cmp dest, dest_end
ldrmi tmp, [src], #4 // [dest++] <- [src++]
strmi tmp, [dest], #4
bmi @1
//---- fill bss with 0
ldr dest_size, [infop], #4 // size
add dest_end, dest, dest_size // bss end
mov tmp, #0
@4:
cmp dest, dest_end
strcc tmp, [dest], #4
bcc @4
beq @2
//---- fill static static bss with 0
@fill_bss:
ldr dest, [ptable, #12] // BSS segment start
ldr dest_end, [ptable, #16] // BSS segment end
mov tmp, #0
@3:
cmp dest, dest_end
strcc tmp, [dest], #4
bcc @3
// r0 = _start_ModuleParams
b _start_AutoloadDoneCallback // Jump into the callback
}
/*---------------------------------------------------------------------------*
Name: _start_AutoloadDoneCallback
Description: hook for end of autoload (This is dummy target for DEBUGGER)
Arguments: argv: pointer for autoload parameters
argv[0] = SDK_AUTOLOAD_LIST
argv[1] = SDK_AUTOLOAD_LIST_END
argv[2] = SDK_AUTOLOAD_START
argv[3] = SDK_STATIC_BSS_START
argv[4] = SDK_STATIC_BSS_END
Returns: None.
*---------------------------------------------------------------------------*/
__declspec ( weak ) asm void _start_AutoloadDoneCallback( void* argv[] )
{
bx lr
}
//-----------------------------------------------------------------------
// システム制御コプロセッサ 初期化
//-----------------------------------------------------------------------
static asm void init_cp15(void)
{
// プロテクションユニット/キャッシュ/TCM ディセーブル
mrc p15, 0, r0, c1, c0, 0
ldr r1, =HW_C1_ICACHE_ENABLE | HW_C1_DCACHE_ENABLE \
| HW_C1_ITCM_ENABLE | HW_C1_DTCM_ENABLE \
| HW_C1_ITCM_LOAD_MODE | HW_C1_DTCM_LOAD_MODE \
| HW_C1_LD_INTERWORK_DISABLE \
| HW_C1_PROTECT_UNIT_ENABLE
bic r0, r0, r1
mcr p15, 0, r0, c1, c0, 0
// キャッシュ無効化
mov r0, #0
mcr p15, 0, r0, c7, c5, 0 // 命令キャッシュ
mcr p15, 0, r0, c7, c6, 0 // データキャッシュ
// ライトバッファ エンプティ待ち
mcr p15, 0, r0, c7, c10, 4
/*
; Region G: BACK_GROUND: Base = 0x0, Size = 4GB, I:NC NB / D:NC NB, I:NA / D:NA
; Region 0: IO_VRAM: Base = 0x04000000, Size = 64MB, I:NC NB / D:NC NB, I:RW / D:RW
; Region 1Rel: MAIN_MEM: Base = 0x02000000, Size = 4MB, I:Cach Buf / D:Cach Buf, I:RW / D:RW
; Region 1Dbg: MAIN_MEM: Base = 0x02000000, Size = 8MB, I:Cach Buf / D:Cach Buf, I:RW / D:RW
; Region 2Rel: SOUND_DATA: Base = 0x02380000, Size = 512KB, I:NC NB / D:NC NB, I:NA / D:NA
; Region 2D4M: SOUND_DATA: Base = 0x02300000, Size = 1MB, I:NC NB / D:NC NB, I:NA / D:NA
; Region 2D8M: SOUND_DATA: Base = 0x02600000, Size = 2MB, I:NC NB / D:NC NB, I:NA / D:NA
; Region 3: CARTRIDGE: Base = 0x08000000, Size = 128MB, I:NC NB / D:NC NB, I:NA / D:RW
; Region 4: DTCM: Base = SOUND_DATA, Size = 16KB, I:NC NB / D:NC NB, I:NA / D:RW
; Region 5: ITCM: Base = 0x01000000, Size = 16MB, I:NC NB / D:NC NB, I:RW / D:RW
; Region 6: BIOS: Base = 0xffff0000, Size = 32KB, I:Cach NB / D:Cach NB, I:RO / D:RO
; Region 7: SHARE_WORK: Base = 0x027ff000, Size = 4KB, I:NC NB / D:NC NB, I:NA / D:RW
;(Region 7: DBG_RESERVE: Base = 0x02700000, Size = 1MB, I:NC NB / D:NC NB, I:RW / D:RW)
*/
#define SET_PROTECTION_A( id, adr, siz ) ldr r0, =(adr|HW_C6_PR_##siz|HW_C6_PR_ENABLE)
#define SET_PROTECTION_B( id, adr, siz ) mcr p15, 0, r0, c6, id, 0
#define REGION_BIT(a,b,c,d,e,f,g,h) (((a)<<0)|((b)<<1)|((c)<<2)|((d)<<3)|((e)<<4)|((f)<<5)|((g)<<6)|((h)<<7))
#define REGION_ACC(a,b,c,d,e,f,g,h) (((a)<<0)|((b)<<4)|((c)<<8)|((d)<<12)|((e)<<16)|((f)<<20)|((g)<<24)|((h)<<28))
#define NA 0
#define RW 1
#define RO 5
//
// メモリリージョン初期化
//
//---- I/O レジスタ & VRAM 等
SET_PROTECTION_A( c0, HW_IOREG, 64MB )
SET_PROTECTION_B( c0, HW_IOREG, 64MB )
//---- メインメモリ
SET_PROTECTION_A( c1, HW_MAIN_MEM_MAIN, 4MB )
SET_PROTECTION_B( c1, HW_MAIN_MEM_MAIN, 4MB )
/* //---- サウンドデータ領域 // SYSM changed.
#if HW_MAIN_MEM_SUB_SIZE+HW_MAIN_MEM_SHARED_SIZE == 0x1000
SET_PROTECTION_A( c2, HW_MAIN_MEM_SUB, 4KB )
SET_PROTECTION_B( c2, HW_MAIN_MEM_SUB, 4KB )
#elif HW_MAIN_MEM_SUB_SIZE+HW_MAIN_MEM_SHARED_SIZE == 0x2000
SET_PROTECTION_A( c2, HW_MAIN_MEM_SUB, 8KB )
SET_PROTECTION_B( c2, HW_MAIN_MEM_SUB, 8KB )
#elif HW_MAIN_MEM_SUB_SIZE+HW_MAIN_MEM_SHARED_SIZE == 0x4000
SET_PROTECTION_A( c2, HW_MAIN_MEM_SUB, 16KB )
SET_PROTECTION_B( c2, HW_MAIN_MEM_SUB, 16KB )
#elif HW_MAIN_MEM_SUB_SIZE+HW_MAIN_MEM_SHARED_SIZE == 0x8000
SET_PROTECTION_A( c2, HW_MAIN_MEM_SUB, 32KB )
SET_PROTECTION_B( c2, HW_MAIN_MEM_SUB, 32KB )
#elif HW_MAIN_MEM_SUB_SIZE+HW_MAIN_MEM_SHARED_SIZE == 0x10000
SET_PROTECTION_A( c2, HW_MAIN_MEM_SUB, 64KB )
SET_PROTECTION_B( c2, HW_MAIN_MEM_SUB, 64KB )
#elif HW_MAIN_MEM_SUB_SIZE+HW_MAIN_MEM_SHARED_SIZE == 0x20000
SET_PROTECTION_A( c2, HW_MAIN_MEM_SUB, 128KB )
SET_PROTECTION_B( c2, HW_MAIN_MEM_SUB, 128KB )
#elif HW_MAIN_MEM_SUB_SIZE+HW_MAIN_MEM_SHARED_SIZE == 0x40000
SET_PROTECTION_A( c2, HW_MAIN_MEM_SUB, 256KB )
SET_PROTECTION_B( c2, HW_MAIN_MEM_SUB, 256KB )
#elif HW_MAIN_MEM_SUB_SIZE+HW_MAIN_MEM_SHARED_SIZE == 0x80000
SET_PROTECTION_A( c2, HW_MAIN_MEM_SUB, 512KB )
SET_PROTECTION_B( c2, HW_MAIN_MEM_SUB, 512KB )
#elif HW_MAIN_MEM_SUB_SIZE+HW_MAIN_MEM_SHARED_SIZE == 0x100000
SET_PROTECTION_A( c2, HW_MAIN_MEM_SUB, 1MB )
SET_PROTECTION_B( c2, HW_MAIN_MEM_SUB, 1MB )
#elif HW_MAIN_MEM_SUB_SIZE+HW_MAIN_MEM_SHARED_SIZE == 0x200000
SET_PROTECTION_A( c2, HW_MAIN_MEM_SUB, 2MB )
SET_PROTECTION_B( c2, HW_MAIN_MEM_SUB, 2MB )
#else
#pragma message(ERROR: Size unmatch HW_MAIN_MEM_SUB_SIZE)
#endif
*/
//---- カートリッジ又は他の用途
// CPU 内部ワーク RAM 等
SET_PROTECTION_A( c3, HW_CTRDG_ROM, 128MB )
SET_PROTECTION_B( c3, HW_CTRDG_ROM, 128MB )
//---- データ TCM
// + CPU 内部ワーク RAM の場合あり
//#if (HW_DTCM & 0x3FFF) != 0
//#pragma message(ERROR: HW_DTCM need to be aligned 16KB!)
//#endif
// SET_PROTECTION_A( c4, HW_DTCM, 16KB )
ldr r0, =SDK_AUTOLOAD_DTCM_START
orr r0, r0, #HW_C6_PR_16KB
orr r0, r0, #HW_C6_PR_ENABLE
SET_PROTECTION_B( c4, HW_DTCM, 16KB )
//---- 命令 TCM
// データ TCM より優先が高い、メインメモリ領域までのイメージ
SET_PROTECTION_A( c5, HW_ITCM_IMAGE, 16MB )
SET_PROTECTION_B( c5, HW_ITCM_IMAGE, 16MB )
//---- BIOS
SET_PROTECTION_A( c6, HW_BIOS, 32KB )
SET_PROTECTION_B( c6, HW_BIOS, 32KB )
//---- SHARED CPU 間通信ワーク領域
SET_PROTECTION_A( c7, HW_MAIN_MEM_SHARED, 4KB )
SET_PROTECTION_B( c7, HW_MAIN_MEM_SHARED, 4KB )
#if HW_MAIN_MEM_SHARED_SIZE != 0x1000
#pragma message(ERROR: Size unmatch HW_MAIN_MEM_SHARED_SIZE)
#endif
//
// 命令TCM 設定
//
mov r0, #HW_C9_TCMR_32MB
mcr p15, 0, r0, c9, c1, 1
//
// データTCM 設定
//
ldr r0, =INITi_HW_DTCM
orr r0, r0, #HW_C9_TCMR_16KB
mcr p15, 0, r0, c9, c1, 0
//
// 命令キャッシュ イネーブル (リージョン設定)
// 1: MAIN_MEM
// 6: BIOS
//
mov r0, #REGION_BIT(0,1,0,0,0,0,1,0)
mcr p15, 0, r0, c2, c0, 1
//
// データキャッシュ イネーブル (リージョン設定)
// 1: MAIN_MEM
// 6: BIOS
//
mov r0, #REGION_BIT(0,1,0,0,0,0,1,0)
mcr p15, 0, r0, c2, c0, 0
//
// ライトバッファ イネーブル(リージョン設定)
// 1: MAIN_MEM
//
mov r0, #REGION_BIT(0,1,0,0,0,0,0,0)
mcr p15, 0, r0, c3, c0, 0
//
// 命令アクセス許可 (リージョン設定)
// IO_VRAM : RW
// MAIN_MEM_MAIN : RW
// MAIN_MEM_SUB : NA
// CTRDG : NA
// DTCM : NA
// ITCM : RW
// BIOS : RO
// SHARED : NA
//
ldr r0, =REGION_ACC(RW,RW,NA,NA,NA,RW,RO,NA)
mcr p15, 0, r0, c5, c0, 3
//
// データアクセス許可(リージョン設定)
// IO_VRAM : RW
// MAIN_MEM_MAIN : RW
// MAIN_MEM_SUB : NA
// CTRDG : RW
// DTCM : RW
// ITCM : RW
// BIOS : RO
// SHARED : RW
//
ldr r0, =REGION_ACC(RW,RW,NA,RW,RW,RW,RO,RW)
mcr p15, 0, r0, c5, c0, 2
//
// システム制御コプロセッサ マスター設定
//
mrc p15, 0, r0, c1, c0, 0
ldr r1,=HW_C1_ICACHE_ENABLE | HW_C1_DCACHE_ENABLE | HW_C1_CACHE_ROUND_ROBIN \
| HW_C1_ITCM_ENABLE | HW_C1_DTCM_ENABLE \
| HW_C1_SB1_BITSET | HW_C1_EXCEPT_VEC_UPPER \
| HW_C1_PROTECT_UNIT_ENABLE
orr r0, r0, r1
mcr p15, 0, r0, c1, c0, 0
bx lr
}
/*---------------------------------------------------------------------------*
Name: NitroStartUp
Description: hook for user start up
Arguments: None
Returns: None.
*---------------------------------------------------------------------------*/
__declspec ( weak ) void NitroStartUp( void )
{
}

View File

@ -1,247 +0,0 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: gameBoot.c
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.
$Date:: $
$Rev$
$Author$
*---------------------------------------------------------------------------*/
#include <twl.h>
#include <sysmenu/memorymap.h>
// define data-------------------------------------------------------
#define C1_DTCM_ENABLE 0x00010000 // データTCM イネーブル
#define C1_EXCEPT_VEC_UPPER 0x00002000 // 例外ベクタ 上位アドレス(こちらに設定して下さい)
#define C1_SB1_BITSET 0x00000078 // レジスタ固定ビット列後期アボートモデル、DATA32構成シグナル制御、PROG32構成シグナル制御、ライトバッファイネーブル
#define INITi_HW_DTCM SDK_AUTOLOAD_DTCM_START
// extern data-------------------------------------------------------
// from LCF
extern u32 SDK_IRQ_STACKSIZE[];
// function's prototype----------------------------------------------
void ReturnFromMain(void);
void ResetCP15(void);
void ClearBankregAndStack(void);
void CpuClear32Byte(void);
void BootFuncEnd(void);
// global variables--------------------------------------------------
// static variables--------------------------------------------------
// const data--------------------------------------------------------
#include <twl/code32.h> // このソースはデフォルトではARMでコンパイルされる。
//-----------------------------------------------------------------------
// メインルーチンからのリターン
//-----------------------------------------------------------------------
/*
ReturnFromMainをRamの後方にコピーする方法がReturnFromMainアドレスから
   (BootFuncEnd - ReturnFromMain)
   
   
*/
asm void ReturnFromMain(void)
{
//---------------------------------------
// データキャッシュを全て無効に。DC_InvalidateAllを抜き出して実装
//---------------------------------------
mov r0, #0
mcr p15, 0, r0, c7, c6, 0
//---------------------------------------
// ARM7との同期をとるsubp_stateが2になるのを待って、mainp_stateを2にする。
//---------------------------------------
ldr r1, =REG_SUBPINTF_ADDR
@0 ldrh r0, [r1]
and r0, r0, #0x000f
cmp r0, #0x0002
bne @0
mov r0, #0x0200
strh r0, [r1]
//---------------------------------------
// ISデバッガ動作フラグの格納
//---------------------------------------
#ifdef __IS_DEBUGGER_BUILD
ldr r3, =HW_MAIN_MEM_EX_END
sub r0, r3, #0x400
ldrh r11, [r0, #0x14] // r11 = GetMovedInfoFromIPL1Addr()->isOnDebugger
#endif
//---------------------------------------
// ARM7との同期をとるsubp_stateが1になるのを待って、mainp_stateを1にする。
//---------------------------------------
ldr r1, =REG_SUBPINTF_ADDR
@1 ldrh r0, [r1]
and r0, r0, #0x000f
cmp r0, #0x0001
bne @1
mov r0, #0x0100
strh r0, [r1]
//---------------------------------------
// バンクレジスタ&スタッククリア
//---------------------------------------
bl ClearBankregAndStack
//---------------------------------------
// プロテクションユニットの解除
//---------------------------------------
bl ResetCP15
//---------------------------------------
// ARM7との最終同期をとる(subp_stateが0になるのを待って、mainp_stateを0にする
//---------------------------------------
ldr r1, =REG_SUBPINTF_ADDR
@2 ldrh r0, [r1]
and r0, r0, #0x000f
cmp r0, #0x0001
beq @2
ldr r3, =REG_VCOUNT_ADDR // Vカウンタを全IPL2バージョンで同一値(=0)でアプリに引き渡すようにする。
@3 ldrh r0, [r3]
cmp r0, #0
bne @3
// mov r0, #0 // R0に読んだVカウント値が"0"なので、これはいらない
strh r0, [r1]
//---------------------------------------
// R11の値をもとにブートアドレス取得
//---------------------------------------
ldr r3, =HW_MAIN_MEM_EX_END // ゲーム・エントリポイント 獲得
ldr r12, [r3, #-(0x200 - 0x24)] // rmhp->arm9->entryAddr
mov lr, r12
#ifdef __IS_DEBUGGER_BUILD
cmp r11, #1 // if (!GetMovedInfoFromIPL1Addr()->isOnDebugger)
ldreq r12, [r3, #-(0x200 - 0x168)] // デバッガ・エントリポイント 獲得
#endif
//---------------------------------------
// 汎用レジスタクリア
//---------------------------------------
ldr r11, =INITi_HW_DTCM // クリアしたDTCMからデータを読み出して、汎用レジスタをクリアする。
ldmia r11, {r0-r10}
mov r11, #0
//---------------------------------------
// ゲームブート
//---------------------------------------
bx r12
}
//-----------------------------------------------------------------------
// システム制御コプロセッサ リセット
//-----------------------------------------------------------------------
asm void ResetCP15(void)
{
// プロテクションユニットキャッシュITCM無効。DTCMは有効スタックをクリアするため
ldr r0, = C1_DTCM_ENABLE | C1_EXCEPT_VEC_UPPER | C1_SB1_BITSET
mcr p15, 0, r0, c1, c0, 0
// ITCMの割り当てを解除
mov r0, #0
mcr p15, 0, r0, c6, c5, 0
// DTCMの割り当てを解除
// mov r0,#0
// mcr p15, 0, r0, c9, c1, 0
// キャッシュ無効化
mov r0, #0
mcr p15, 0, r0, c7, c5, 0 // 命令キャッシュ
mcr p15, 0, r0, c7, c6, 0 // データキャッシュ
// ライトバッファ エンプティ待ち
mcr p15, 0, r0, c7, c10, 4
bx lr
}
//-----------------------------------------------------------------------
// バンクレジスタ リセット スタック領域 クリア
//-----------------------------------------------------------------------
asm void ClearBankregAndStack(void)
{
mov r12, lr
#ifndef IPL2_ONLYMULTIBOOT
mov r0, #0xc0 | HW_PSR_SVC_MODE // SVCモードへ切り換え & IRQ/FIQ不許可
msr cpsr_cxsf, r0
ldr r0, =INITi_HW_DTCM
add r0, r0, #0x3fc0
mov sp, r0 // SP のセット
mov lr, #0
msr spsr_csxf, lr
mov r0, #0xc0 | HW_PSR_IRQ_MODE // IRQモードへ切り換え & IRQ/FIQ不許可
msr cpsr_cxsf, r0
ldr r0, =INITi_HW_DTCM
add r0, r0, #0x3fc0
sub r0, r0, #HW_SVC_STACK_SIZE
mov sp, r0 // SP のセット
mov lr, #0
msr spsr_cxsf, lr
ldr r1, =SDK_IRQ_STACKSIZE
sub r1, r0, r1
mov r0, #0xc0 | HW_PSR_SYS_MODE // システムモードへ切り換え & IRQ/FIQ不許可
msr cpsr_cxsf, r0
sub sp, r1, #4 // SP のセット & 4byte for stack check code
#endif // IPL2_ONLYMULTIBOOT
ldr r0, =HW_ITCM // ITCMのクリア
mov r1, #HW_ITCM_SIZE
bl CpuClear32Byte
ldr r0, =INITi_HW_DTCM // スタックを含めたDTCMのクリア
mov r1, #HW_DTCM_SIZE
bl CpuClear32Byte
bx r12
}
// 32byte単位のメモリクリア r0 dstp,r1 byteSize
asm void CpuClear32Byte(void)
{
add r2, r0, r1 // 終了アドレスの算出
mov r1, r1, lsr #5 // サイズは32byte単位
mov r3, #0
mov r4, r3
mov r5, r3
mov r6, r3
mov r7, r3
mov r8, r3
mov r9, r3
mov r10, r3
@0 cmp r0, r2 // クリア終了?
stmltia r0!, {r3-r10}
blt @0
bx lr
}
void BootFuncEnd(void)
{
}
#include <twl/codereset.h> // ここまで。

View File

@ -77,7 +77,7 @@ BOOL SYSM_IsCardPulledOut(void)
case CARD_DETECTING:
if (SYSMi_IsCardDataReady()) {
u32 cardID = *(vu32 *)REG_CARD_DATA;
if ( ( cardID != SYSM_GetWork()->nCardID ) &&
if ( ( cardID != SYSMi_GetWork()->nCardID ) &&
SYSM_IsExistCard() )
{
cpw.detectPullOut = TRUE;

View File

@ -19,9 +19,7 @@
#include <sysmenu.h>
#include <sysmenu/boot/common/boot.h>
#include "sysmenu_define.h"
#include "sysmenu_card.h"
#include "spi.h"
#include "mb_child.h"
// define data-----------------------------------------------------------------
@ -51,9 +49,7 @@ void *(*SYSM_Alloc)( u32 size );
void (*SYSM_Free )( void *ptr );
#ifdef __SYSM_DEBUG
SharedWork *swp; // デバッガでのIPL1SharedWorkのウォッチ用
SYSM_work *pSysm; // デバッガでのSYSMワークのウォッチ用
NitroConfigData *ncdp; // デバッガでのNCデータ のウォッチ用
#endif
// static variable-------------------------------------------------------------
@ -80,8 +76,7 @@ static BannerCheckParam s_bannerCheckList[ NTR_BNR_VER_MAX ] = {
void SYSM_Init( void *(*pAlloc)(u32), void (*pFree)(void*) )
{
#ifdef __SYSM_DEBUG
pSysm = SYSM_GetWork();
ncdp = GetTSD();
pSysm = SYSMi_GetWork();
#endif /* __SYSM_DEBUG */
// ARM7コンポーネント用プロテクションユニット領域変更
@ -96,7 +91,7 @@ void SYSM_Init( void *(*pAlloc)(u32), void (*pFree)(void*) )
// MI_SetMainMemoryPriority(MI_PROCESSOR_ARM7);
// MI_SetWramBank(MI_WRAM_ARM7_ALL);
SVC_CpuClearFast(0x0000, (u16 *)SYSM_GetWork(), sizeof(SYSM_work)); // SYSMワークのクリア
reg_OS_PAUSE |= REG_OS_PAUSE_CHK_MASK; // PAUSEレジスタのチェックフラグのセット
}
@ -117,7 +112,10 @@ void SYSM_SetAllocFunc( void *(*pAlloc)(u32), void (*pFree)(void*) )
// パラメータリード
void SYSM_ReadParameters( void )
{
reg_OS_PAUSE |= REG_OS_PAUSE_CHK_MASK; // PAUSEレジスタのチェックフラグのセット
// ARM7のリセットパラメータ取得が完了するのを待つ
while( !SYSMi_GetWork()->isARM9Start ) {
SVC_WaitByLoop( 0x1000 );
}
if( SYSM_ReadTWLSettingsFile() ) { // NANDからTWL本体設定データをリード
SYSM_SetBackLightBrightness( (u8)TSD_GetBacklightBrightness() ); // 読み出したTWL本体設定データをもとにバックライト輝度設定
@ -279,6 +277,12 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size)
}
// リセットパラメータの取得
const ResetParam *SYSM_GetResetParam( void )
{
return (const ResetParam *)&SYSMi_GetWork()->resetParam;
}
// ロゴデモスキップか?
BOOL SYSM_IsLogoDemoSkip( void )
{
@ -292,7 +296,7 @@ BOOL SYSM_IsLogoDemoSkip( void )
static BOOL SYSMi_IsDebuggerBannerViewMode( void )
{
#ifdef __IS_DEBUGGER_BUILD
return ( SYSM_GetWork()->isOnDebugger &&
return ( SYSMi_GetWork()->isOnDebugger &&
SYSMi_IsValidCard() &&
SYSM_GetCardRomHeader()->dbgRomSize == 0 ) ? TRUE : FALSE;
#else
@ -303,7 +307,7 @@ static BOOL SYSMi_IsDebuggerBannerViewMode( void )
// 有効なTWL/NTRカードが差さっているか
BOOL SYSM_IsExistCard( void )
{
return SYSM_GetWork()->isExistCard;
return SYSMi_GetWork()->isExistCard;
}
@ -493,12 +497,13 @@ OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len);
// デバイス制御
//
// ============================================================================
#define BACKLIGHT_LEVEL_MAX 22
// バックライト輝度調整
void SYSM_SetBackLightBrightness( u8 brightness )
{
( void )PMi_WriteRegister( 0x20, (u16)( 8 + brightness * 2 ) ); // 輝度調整はとりあえず適当(※ハード担当に消費電力面から適当な値を確認する)
TSD_SetBacklightBrightness( brightness );
( void )PMi_WriteRegister( 4, (u16)brightness );
SYSM_WriteTWLSettingsFile();
}
@ -550,7 +555,6 @@ static void SYSMi_WriteAdjustRTC( void )
// バナーファイルの読み込みの実体
static void SYSMi_ReadCardBannerFile( void )
{
s32 lockCardID;
NTRBannerFile *pBanner = &s_bannerBuf;
if( ( !SYSMi_IsValidCard() ) || ( *(void** )BANNER_ROM_OFFSET == NULL ) ) {
@ -559,13 +563,8 @@ static void SYSMi_ReadCardBannerFile( void )
}
// ROMカードからのバナーデータのリード
if ( ( lockCardID = OS_GetLockID() ) > 0 ) {
( void )OS_LockCard( (u16 )lockCardID );
DC_FlushRange( pBanner, sizeof(NTRBannerFile) );
SYSM_ReadCard(*(void** )BANNER_ROM_OFFSET, pBanner, sizeof(NTRBannerFile) );
( void )OS_UnLockCard( (u16 )lockCardID );
OS_ReleaseLockID( (u16 )lockCardID );
}
DC_FlushRange( pBanner, sizeof(NTRBannerFile) );
CARD_ReadRom( 4, *(void** )BANNER_ROM_OFFSET, pBanner, sizeof(NTRBannerFile) );
// バナーデータの正誤チェック
{
@ -621,7 +620,7 @@ BOOL SYSM_IsNTRCard( void )
static int SYSMi_IsValidCard( void )
{
if( ( SYSM_GetCardRomHeader()->nintendo_logo_crc16 == 0xcf56 ) &&
( SYSM_GetCardRomHeader()->header_crc16 == SYSM_GetWork()->cardHeaderCrc16 ) ) {
( SYSM_GetCardRomHeader()->header_crc16 == SYSMi_GetWork()->cardHeaderCrc16 ) ) {
return TRUE; // NTR,TWLカードありNintendoロゴCRC、カードヘッダCRCが正しい場合
// ※Nintendoロゴデータのチェックは、特許の都合上、ロゴ表示ルーチン起動後に行います。
}else {
@ -656,7 +655,6 @@ static BOOL SYSMi_CheckEntryAddress( void )
// クローンブート判定
static void SYSMi_CheckCardCloneBoot( void )
{
s32 lockCardID;
u8 *buffp = (u8 *)&s_bannerBuf; // バナー用バッファをテンポラリとして使用
u32 total_rom_size = SYSM_GetCardRomHeader()->rom_valid_size ? SYSM_GetCardRomHeader()->rom_valid_size : 0x01000000;
u32 file_offset = total_rom_size & 0xFFFFFE00;
@ -665,19 +663,14 @@ static void SYSMi_CheckCardCloneBoot( void )
return;
}
if ( ( lockCardID = OS_GetLockID() ) > 0 ) {
( void )OS_LockCard( (u16 )lockCardID );
DC_FlushRange( buffp, BNR_IMAGE_SIZE );
SYSM_ReadCard( (void *)file_offset, buffp, BNR_IMAGE_SIZE );
( void )OS_UnLockCard( (u16 )lockCardID );
OS_ReleaseLockID( (u16 )lockCardID );
}
DC_FlushRange( buffp, BNR_IMAGE_SIZE );
CARD_ReadRom( 4, (void *)file_offset, buffp, BNR_IMAGE_SIZE );
buffp += total_rom_size & 0x000001FF;
if( *buffp++ == 'a' && *buffp == 'c' ) {
SYSM_GetWork()->cloneBootMode = CLONE_BOOT_MODE;
SYSMi_GetWork()->cloneBootMode = CLONE_BOOT_MODE;
}else {
SYSM_GetWork()->cloneBootMode = OTHER_BOOT_MODE;
SYSMi_GetWork()->cloneBootMode = OTHER_BOOT_MODE;
}
}
@ -694,7 +687,7 @@ static void SYSMi_CheckRTC( void )
!SYSM_CheckRTCTime( &time )
#ifndef __IS_DEBUGGER_BUILD // 青デバッガではRTCの電池がないので、毎回ここにひっかかって設定データが片方クリアされてしまう。これを防ぐスイッチ。
||
( SYSM_GetWork()->rtcStatus & 0x01 )
( SYSMi_GetWork()->rtcStatus & 0x01 )
#endif
) { // RTCの異常を検出したら、rtc入力フラグrtcOffsetを0にしてNVRAMに書き込み。
OS_TPrintf("\"RTC reset\" or \"Illegal RTC data\" detect!\n");

View File

@ -853,9 +853,9 @@ static void CallbackChild_MB( u32 status, void *arg )
case MB_COMM_CSTATE_BOOT_READY: // ブート準備完了
OS_Printf("CB: boot ready.\n");
// SYSM_GetWork()->mb_flag = 1;
// SYSM_GetWork()->mb_ggid = *(u32 *)( MB_GetBeaconRecvStatus()->list[ pCwork->connectTargetNo ].bssDesc.gameInfo.ggid );
// SYSM_GetWork()->mb_ggid = MB_GetBeaconRecvStatus()->list[ pCwork->connectTargetNo ].gameInfo.ggid;
// SYSMi_GetWork()->mb_flag = 1;
// SYSMi_GetWork()->mb_ggid = *(u32 *)( MB_GetBeaconRecvStatus()->list[ pCwork->connectTargetNo ].bssDesc.gameInfo.ggid );
// SYSMi_GetWork()->mb_ggid = MB_GetBeaconRecvStatus()->list[ pCwork->connectTargetNo ].gameInfo.ggid;
(void)SetPrgNextSeqQue( PSEQ_BOOT_READY );
break;

View File

@ -18,8 +18,8 @@
SUBDIRS = \
../../../libraries_sysmenu/sysmenu \
# ../../../libraries_sysmenu/boot \
# ../../../components/hyena.TWL
../../../libraries_sysmenu/boot \
../../../components/hyena.TWL
#----------------------------------------------------------------------------

View File

@ -22,12 +22,12 @@
// define data------------------------------------------
#define LAUNCHER_ELEMENT_NUM 4 // ƒ<>ƒSƒ<53>ƒjƒ…<C692>[Ì<E2809A>Ú<E28093>
#define LAUNCHER_ELEMENT_NUM 4 // ƒ<>ƒSƒ<53>ƒjƒ…<C692>[Ì<E2809A>Ú<E28093>
#define B_LIGHT_BUTTON_TOP_X 24
#define B_LIGHT_BUTTON_TOP_Y 21
#define B_LIGHT_BUTTON_BOTTOM_X ( B_LIGHT_BUTTON_TOP_X + 7 )
#define B_LIGHT_BUTTON_BOTTOM_Y ( B_LIGHT_BUTTON_TOP_Y + 2 )
#define B_LIGHT_BUTTON_TOP_X ( 0 )
#define B_LIGHT_BUTTON_TOP_Y ( 22 * 8 )
#define B_LIGHT_BUTTON_BOTTOM_X ( B_LIGHT_BUTTON_TOP_X + 32 )
#define B_LIGHT_BUTTON_BOTTOM_Y ( B_LIGHT_BUTTON_TOP_Y + 16 )
#define CURSOR_PER_SELECT 14
@ -55,11 +55,6 @@ static u64 old_titleIdArray[ LAUNCHER_TITLE_LIST_NUM ];
// Launcher.c
//===============================================
static const u16 *const str_backlight[] = {
(const u16 *)L"BLT:ON ",
(const u16 *)L"BLT:OFF",
};
//======================================================
// ランチャー
//======================================================
@ -275,7 +270,7 @@ void LauncherInit( TitleProperty *pTitleList )
DrawBackLightSwitch();
PrintfSJIS( 0, 0, TXT_COLOR_BLUE, "TWL-SYSTEM MENU ver.%06x", SYSMENU_VER );
PrintfSJIS( 0, 0, TXT_COLOR_BLUE, "TWL-SYSTEM MENU ver.", SYSMENU_VER );
SVC_CpuClear( 0x0000, &tpd, sizeof(TpWork), 16 );
@ -294,9 +289,9 @@ void LauncherInit( TitleProperty *pTitleList )
// ランチャーメイン
TitleProperty *LauncherMain( TitleProperty *pTitleList )
{
static BOOL touch_bl = FALSE;
BOOL tp_bl_on_off = FALSE;
BOOL tp_select = FALSE;
static BOOL touch_bl_bak = FALSE;
BOOL touch_bl_trg = FALSE;
BOOL tp_select = FALSE;
static int csr_v = 0;
static int selected = 0;
@ -307,19 +302,16 @@ TitleProperty *LauncherMain( TitleProperty *pTitleList )
// バックライトON,OFF制御
//--------------------------------------
if(tpd.disp.touch) {
BOOL range = WithinRangeTP( B_LIGHT_BUTTON_TOP_X * 8, B_LIGHT_BUTTON_TOP_Y * 8 - 4,
B_LIGHT_BUTTON_BOTTOM_X * 8, B_LIGHT_BUTTON_BOTTOM_Y * 8 - 4, &tpd.disp );
if( range && !touch_bl ) {
touch_bl = TRUE;
tp_bl_on_off = TRUE;
}
BOOL touch_bl = WithinRangeTP( B_LIGHT_BUTTON_TOP_X, B_LIGHT_BUTTON_TOP_Y,
B_LIGHT_BUTTON_BOTTOM_X, B_LIGHT_BUTTON_BOTTOM_Y, &tpd.disp );
touch_bl_trg = ( touch_bl && tpd.disp.touch && !touch_bl_bak ) ;
touch_bl_bak = tpd.disp.touch;
}else {
touch_bl = FALSE;
touch_bl_bak = FALSE;
}
if( (pad.trg & PAD_BUTTON_R) || (tp_bl_on_off) ) {
// TSD_SetBacklightBrightness( TSD_GetBacklightBrightness() ^ 0x01 );
DrawBackLightSwitch();
if( (pad.trg & PAD_BUTTON_START) || touch_bl_trg ) {
SYSM_SetBackLightBrightness( (u8)( ( TSD_GetBacklightBrightness() + 1 ) & 0x07 ) );
}
//--------------------------------------
@ -386,16 +378,7 @@ static void DrawLauncher(u16 nowCsr, const MenuParam *pMenu)
// バックライトスイッチの表示
static void DrawBackLightSwitch(void)
{
u16 color;
// if( GetNCDWork()->option.backLightOffFlag ) {
if ( 1 ) {
color = TXT_COLOR_BLACK;
}else {
color = TXT_COLOR_RED;
}
PutStringUTF16( B_LIGHT_BUTTON_TOP_X, B_LIGHT_BUTTON_TOP_Y, color,
str_backlight[ 0 ] );
PrintfSJIS( B_LIGHT_BUTTON_TOP_X, B_LIGHT_BUTTON_TOP_Y, TXT_COLOR_RED,
"BL:%d\n", TSD_GetBacklightBrightness() );
}

View File

@ -25,11 +25,12 @@
extern "C" {
#endif
// define data----------------------------------------------------------
// define data-------------------------------------------------------
#define SYSMENU_VER 0x071115
// global variables--------------------------------------------------
// function-------------------------------------------------------------
// function----------------------------------------------------------
void LauncherInit( TitleProperty *pTitleList );
TitleProperty *LauncherMain( TitleProperty *pTitleList );

View File

@ -25,7 +25,6 @@
// define data-----------------------------------------------------------------
// function's prototype-------------------------------------------------------
static BOOL CheckBootStatus( void );
static void INTR_VBlank( void );
// global variable-------------------------------------------------------------
@ -139,86 +138,6 @@ void TwlMain( void )
}
// ブート状態を確認し、ロゴ表示有無を判断する-------
static BOOL CheckBootStatus(void)
{
#if 0
BOOL boot_decision = FALSE; // 「ブート内容未定」に
BOOL other_shortcut_off = FALSE;
//-----------------------------------------------------
// デバッグ用コンパイルスイッチによる挙動
//-----------------------------------------------------
{
#ifdef __LOGO_SKIP // ※デバッグ用ロゴスキップ
SetLogoEnable( FALSE ); // ロゴ表示スキップ
#endif /* __LOGO_SKIP */
}
//-----------------------------------------------------
// NITRO設定データ未入力時の設定メニューショートカット起動
//-----------------------------------------------------
#ifdef __DIRECT_BOOT_BMENU_ENABLE // ※NITRO設定データ未入力時のブートメニュー直接起動スイッチがONか
if( !TSD_IsSetTP() ||
!TSD_IsSetLanguage() ||
!TSD_IsSetDateTime() ||
!TSD_IsSetUserColor() ||
!TSD_IsSetNickname() ) { // TP,言語,RTC,ニックネームがセットされていなければ、ロゴ表示もゲームロードも行わず、ブートメニューをショートカット起動。
if( ( pad.cont & PAD_PRODUCTION_NITRO_SHORTCUT ) == PAD_PRODUCTION_NITRO_SHORTCUT ) {
other_shortcut_off = TRUE; // 量産工程用のキーショートカットが押されていたら、設定メニュー起動はなし。
}else if( !SYSM_IsInspectNITROCard() ) { // 但し、量産用のキーショートカットが押されている時か、NITRO検査カードがささっている時は、ブートメニューへのショートカット起動は行わない。
SYSM_SetBootFlag( BFLG_BOOT_BMENU );
SetLogoEnable( FALSE );
return TRUE; // 「ブート内容決定」でリターン
}
}
#endif /* __DIRECT_BOOT_BMENU_ENABLE */
//-----------------------------------------------------
// キーショートカット起動
//-----------------------------------------------------
if( !other_shortcut_off
// && !TSD_IsAutoBoot()
) {
// 他ショートカットONかつオート起動OFFの時
u32 nowBootFlag = 0;
if(pad.cont & PAD_BUTTON_R){ // Rボタン押下起動なら、ロゴ表示なしでAGBゲームへ
SetLogoEnable( FALSE );
nowBootFlag = BFLG_BOOT_AGB;
}else if(pad.cont & PAD_BUTTON_L){ // Lボタン押下起動なら、ロゴ表示後にNITROゲームへ
nowBootFlag = BFLG_BOOT_NITRO;
}else if(pad.cont & PAD_BUTTON_B){ // Bボタン押下起動なら、ロゴ表示後にブートメニューへ
nowBootFlag = BFLG_BOOT_BMENU;
}
if( nowBootFlag ) {
SYSM_SetBootFlag( nowBootFlag );
return TRUE; // 「ブート内容決定」でリターン
}
}
//-----------------------------------------------------
// 自動起動オプション有効時の挙動
//-----------------------------------------------------
#ifndef __SYSM_DEBUG
// if( TSD_IsAutoBoot() ) {
if( 0 ) {
if ( SYSM_IsExistCard() ) { // NITROカードのみの時はNITRO起動
SYSM_SetBootFlag( BFLG_BOOT_NITRO );
return TRUE; // 「ブート内容決定」でリターン
}
}
#endif /* __SYSM_DEBUG */
#endif
return FALSE; // 「ブート内容未定」でリターン
}
// ============================================================================
// 割り込み処理
// ============================================================================

View File

@ -408,7 +408,7 @@ int TP_CalibrationMain( void )
}
if( ( pad.trg & PAD_BUTTON_A ) || tp_ok ) {
SYSM_GetWork()->isValidTSD = 0;
SYSMi_GetWork()->isValidTSD = 0;
s_pTPC->calibTemp.data.raw_x1 = s_pTPC->sample[0].x;
s_pTPC->calibTemp.data.raw_y1 = s_pTPC->sample[0].y;

View File

@ -80,7 +80,7 @@ void SelectLanguageInit( void )
PutStringUTF16( 8 * 8, 18 * 8, TXT_COLOR_RED, (const u16 *)L"Select language." );
}
if( ( SYSM_GetWork()->isValidTSD ) ||
if( ( SYSMi_GetWork()->isValidTSD ) ||
( TSD_GetLanguage() >= TWL_LANG_CODE_MAX ) ) {
s_langCode = TWL_LANG_ENGLISH;
}else {
@ -128,7 +128,7 @@ int SelectLanguageMain( void )
}
if( ( pad.trg & PAD_BUTTON_A ) || tp_select ) { // メニュー項目への分岐
SYSM_GetWork()->isValidTSD = 0;
SYSMi_GetWork()->isValidTSD = 0;
TSD_SetLanguage( s_langCode );
TSD_SetFlagLanguage( TRUE ); // 言語入力フラグを立てる

View File

@ -113,7 +113,7 @@ void SetRTCInit( void )
PutStringUTF16( RETURN_BUTTON_TOP_X, RETURN_BUTTON_TOP_Y, TXT_COLOR_CYAN, (const u16 *)L" RETURN " );
if( g_initialSet ) {
if( SYSM_GetWork()->rtcStatus & 0x01) {
if( SYSMi_GetWork()->rtcStatus & 0x01) {
PutStringUTF16( 8 * 8, 18 * 8, TXT_COLOR_RED, (const u16 *)L"RTC reset is detected!" );
}else {
PutStringUTF16( 8 * 8, 18 * 8, TXT_COLOR_RED, (const u16 *)L"Set RTC." );
@ -379,7 +379,7 @@ static int InputRtcDateTimeMain( void )
TSD_SetRTCOffset( SYSM_CalcRTCOffsetAndSetDateTime( &date, &s_pWork->dtp.Time ) );
}
SYSM_GetWork()->isValidTSD = 0;
SYSMi_GetWork()->isValidTSD = 0;
TSD_SetFlagDateTime( TRUE ); // RTC入力フラグを立てる。
// ::::::::::::::::::::::::::::::::::::::::::::::
// TWL設定データファイルへの書き込み

View File

@ -20,14 +20,13 @@
#include <twl.h>
#include <twl/os/common/format_rom.h>
#include <sysmenu/sysmenu_lib.h>
#include <sysmenu/banner.h>
#include <sysmenu/settings.h>
#include <sysmenu/sysmenu_work.h>
#include <sysmenu/memorymap.h>
#include <sysmenu/acsign.h>
#include <sysmenu/mb_loader.h>
#include <sysmenu/sysmenu_lib.h>
/* SYSMENU_H_ */
#endif

View File

@ -22,6 +22,9 @@
#include <sysmenu/sysmenu_lib/ARM9/sysmenu_api.h>
#endif // SDK_ARM9
#include <sysmenu/sysmenu_lib/common/sysmenu_work.h>
#ifdef __cplusplus
extern "C" {
#endif

View File

@ -19,11 +19,11 @@
#define __SYSM_LIB_H__
#include <twl.h>
#include <twl/os/common/format_rom.h>
#include <twl/nam.h>
#include <twl/os/common/format_rom.h>
#include <sysmenu/banner.h>
#include <sysmenu/sysmenu_work.h>
#include <sysmenu/settings.h>
#include <sysmenu/sysmenu_lib/common/sysmenu_work.h>
#ifdef __cplusplus
extern "C" {
@ -31,8 +31,17 @@ extern "C" {
// define data----------------------------------------------------------
#define CARD_SLOT_NUM 1 // カードスロット数
#define LAUNCHER_TITLE_LIST_NUM 40 // ランチャーのタイトルリスト数
#ifndef SDK_FINALROM
//#define __SYSM_DEBUG // デバッグコード用ビルドスイッチ
#endif // SDK_FINALROM
#define CARD_SLOT_NUM 1 // カードスロット数
#define LAUNCHER_TITLE_LIST_NUM 40 // ランチャーのタイトルリスト数
#define PAD_PRODUCTION_SKIP_INITIAL_SHORTCUT ( PAD_BUTTON_A | PAD_BUTTON_B \
| PAD_BUTTON_X | PAD_BUTTON_Y | PAD_BUTTON_R )
// 量産工程で使用する初回起動設定をキャンセルするショートカットキー
typedef enum PlatformCode {
PLATFORM_NTR = 0,
@ -40,15 +49,6 @@ typedef enum PlatformCode {
}PlatformCode;
// タイトル情報フラグ
typedef struct TitleFlags {
u16 platform : 4;
u16 media : 4;
u16 isLogoSkip : 1;
u16 rsv : 7;
}TitleFlags;
// タイトル情報
typedef struct TitleProperty { // この情報は、ランチャー時には認証通ってないけど、起動時には認証通すので大丈夫だろう。
NAMTitleId titleID; // タイトルIDTitleID_Hiで起動メディアは判定できる
@ -57,16 +57,6 @@ typedef struct TitleProperty { //
u8 rsv[ 2 ];
}TitleProperty;
// リセットパラメータ
typedef struct ResetParam {
NAMTitleId bootTitleID; // 起動するタイトルがあるかあるならそのタイトルID
u32 rsv_A;
TitleFlags flags;
u8 rsv_B[ 2 ];
}ResetParam;
// アプリ認証結果
typedef enum AuthResult {
AUTH_PROCESSING = 0,
@ -105,6 +95,7 @@ extern BOOL SYSM_IsInspectCard( void ); //
extern BOOL SYSM_IsTPReadable( void ); // TPリード可能か
extern BOOL SYSM_IsLogoDemoSkip( void ); // ロゴデモ飛ばし状態か?
extern void SYSM_SetLogoDemoSkip( BOOL skip ); // ロゴデモ飛ばし状態を設定する。
extern const ResetParam *SYSM_GetResetParam( void ); // リセットパラメータの取得
// 本体設定データアクセス
extern BOOL SYSM_ReadTWLSettingsFile( void ); // TWL設定データのリード

View File

@ -19,65 +19,72 @@
#define __SYSMENU_WORK_H__
#include <twl.h>
#include <twl/nam.h>
#ifdef __cplusplus
extern "C" {
#endif
// compile switch ---------------------------------
#ifndef SDK_FINALROM
//#define __SYSM_DEBUG
#endif // SDK_FINALROM
//#define SYSM_RESET_PARAM_READY_
// define data ------------------------------------
#define SYSMENU_VER 0x071113 // SystemMenuバージョン
#define PAD_PRODUCTION_SKIP_INITIAL_SHORTCUT ( PAD_BUTTON_A | PAD_BUTTON_B \
| PAD_BUTTON_X | PAD_BUTTON_Y | PAD_BUTTON_R )
// 量産工程で使用する初回起動設定をキャンセルするショートカットキー
#define CLONE_BOOT_MODE 1
#define OTHER_BOOT_MODE 2
// タイトル情報フラグ
typedef struct TitleFlags {
u16 platform : 4;
u16 media : 4;
u16 isLogoSkip : 1;
u16 rsv : 7;
}TitleFlags;
// リセットパラメータ
typedef struct ResetParam {
NAMTitleId bootTitleID; // 起動するタイトルがあるかあるならそのタイトルID
u32 rsv_A;
TitleFlags flags;
u8 rsv_B[ 2 ];
}ResetParam;
//----------------------------------------------------------------------
// データ型定義
//----------------------------------------------------------------------
// SYSM共有ワーク構造体
typedef struct SYSM_work {
BOOL isValidTSD; // NITRO設定データ無効フラグ
BOOL isOnDebugger; // デバッガ動作か?
BOOL isExistCard; // 有効なNTR/TWLカードが存在するか
BOOL isHotStart; // Hot/Coldスタート判定
BOOL isARM9Start; // ARM9スタートフラグ
u16 cardHeaderCrc16; // システムメニューで計算したROMヘッダCRC16
int cloneBootMode;
volatile BOOL isARM9Start; // ARM9スタートフラグ
BOOL isHotStart; // Hot/Coldスタート判定
BOOL isValidTSD; // NITRO設定データ無効フラグ
BOOL isOnDebugger; // デバッガ動作か?
BOOL isExistCard; // 有効なNTR/TWLカードが存在するか
u16 cardHeaderCrc16; // システムメニューで計算したROMヘッダCRC16
int cloneBootMode;
ResetParam resetParam;
// NTR-IPL2のレガシー 最終的には消すと思う
u32 nCardID;
BOOL enableCardNormalOnly;
u8 rtcStatus;
u32 nCardID;
BOOL enableCardNormalOnly;
u8 rtcStatus;
}SYSM_work;
//----------------------------------------------------------------------
// SYSM共有ワーク領域のアドレス獲得
//----------------------------------------------------------------------
#if 1
#define SYSM_GetResetParam() ( (ResetParam *)HW_RED_RESERVED )
#define SYSM_GetWork() ( (SYSM_work *)( HW_RED_RESERVED + 0x40 ) )
#else
// SYSMリセットパラメータの取得
#define SYSM_GetResetParam() ( (ResetParam *)0x02000100 )
#ifdef SYSM_RESET_PARAM_READY_
// SYSMリセットパラメータの取得※ライブラリ向け。ARM9側はSYSM_GetResetParamを使用して下さい。
#define SYSMi_GetResetParam() ( (ResetParam *)0x02000100 )
// SYSM共有ワークの取得
#define SYSM_GetWork() ( (SYSM_work *)HW_RED_RESERVED )
#endif
#define SYSMi_GetWork() ( (SYSM_work *)HW_RED_RESERVED )
#else // SYSM_RESET_PARAM_READY_
#define SYSMi_GetResetParam() ( (ResetParam *)HW_RED_RESERVED )
#define SYSMi_GetWork() ( (SYSM_work *)( HW_RED_RESERVED + 0x40 ) )
#endif // SYSM_RESET_PARAM_READY_
// カードROMヘッダワークの取得
#define SYSM_GetCardRomHeader() ( (ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF )
@ -86,5 +93,5 @@ typedef struct SYSM_work {
}
#endif
#endif // __SYSMENU_WORK_H__
#endif // __SYSMENU_WORK_H__