From 41034826b1df6331ffe44b46af505a110a874bf3 Mon Sep 17 00:00:00 2001 From: yosiokat Date: Tue, 24 Jun 2008 13:01:23 +0000 Subject: [PATCH] =?UTF-8?q?jackal=E3=82=B3=E3=83=B3=E3=83=9D=E3=83=BC?= =?UTF-8?q?=E3=83=8D=E3=83=B3=E3=83=88=E8=BF=BD=E5=8A=A0=E3=80=82=20?= =?UTF-8?q?=E3=83=A9=E3=83=B3=E3=83=81=E3=83=A3=E3=83=BC=E3=81=A7hyena?= =?UTF-8?q?=E3=81=A8jackal=E3=82=92=E5=88=87=E3=82=8A=E6=9B=BF=E3=81=88?= =?UTF-8?q?=E3=82=89=E3=82=8C=E3=82=8B=E3=82=88=E3=81=86=E5=A4=89=E6=9B=B4?= =?UTF-8?q?=E3=80=82=EF=BC=88=E3=83=87=E3=83=95=E3=82=A9=E3=83=AB=E3=83=88?= =?UTF-8?q?jackal=EF=BC=89?= 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@1680 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- build/components/Makefile | 3 +- build/components/hyena.TWL/Makefile | 13 +- build/components/hyena.TWL/src/crt0.LTD.c | 747 ++++++++++++++++++ build/components/hyena.TWL/src/main.c | 27 +- build/components/jackal.TWL/Makefile | 128 +++ .../components/jackal.TWL/jackal.lcf.template | 400 ++++++++++ build/components/jackal.TWL/jackal.lsf | 94 +++ .../components/jackal.TWL/wram_regs/Makefile | 49 ++ .../jackal.TWL/wram_regs/wram_regs.c | 121 +++ .../sharedFont/ARM9/Makefile | 4 + build/libraries_sysmenu/sysmenu/ARM9/Makefile | 8 + .../sysmenu/ARM9/src/title.c | 17 +- build/systemMenu_RED/Launcher/ARM9/Makefile | 20 +- build/systemMenu_RED/Launcher/ARM9/main.rsf | 3 +- build/systemMenu_RED/Launcher/ARM9/src/main.c | 4 +- 15 files changed, 1612 insertions(+), 26 deletions(-) create mode 100644 build/components/hyena.TWL/src/crt0.LTD.c create mode 100644 build/components/jackal.TWL/Makefile create mode 100644 build/components/jackal.TWL/jackal.lcf.template create mode 100644 build/components/jackal.TWL/jackal.lsf create mode 100644 build/components/jackal.TWL/wram_regs/Makefile create mode 100644 build/components/jackal.TWL/wram_regs/wram_regs.c diff --git a/build/components/Makefile b/build/components/Makefile index bfd7acf1..03299feb 100644 --- a/build/components/Makefile +++ b/build/components/Makefile @@ -22,7 +22,8 @@ include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs #---------------------------------------------------------------------------- SUBDIRS = \ - hyena.TWL + hyena.TWL \ + jackal.TWL #---------------------------------------------------------------------------- diff --git a/build/components/hyena.TWL/Makefile b/build/components/hyena.TWL/Makefile index 5d7f87d0..2b136838 100644 --- a/build/components/hyena.TWL/Makefile +++ b/build/components/hyena.TWL/Makefile @@ -31,9 +31,9 @@ TWL_CODEGEN ?= ARM SUBDIRS = $(SYSMENU_ROOT)/build/libraries/aes \ wram_regs -SRCS = main.c \ - initScfg.c \ - $(ROOT)/build/libraries/init/ARM7.TWL/src/crt0.LTD.c +SRCS = crt0.LTD.c \ + main.c \ + initScfg.c TARGET_NAME = hyena @@ -73,9 +73,14 @@ MAKELCF_FLAGS += -DUSE_CRYPTO_LIBS='libsea_sp$(TWL_LIBSUFFIX).a libcrypto_sp$(TW MACRO_FLAGS += -DSDK_SEA endif -MACRO_FLAGS += -DSDK_SYSMENU_BUILD +MACRO_FLAGS += -DSDK_NOINIT \ + -DSDK_SYSMENU_BUILD #MACRO_FLAGS += -DSDK_ARM7COMP_LTD +ifeq ($(DEFAULT_COMP_ARM7),hyena) +MACRO_FLAGS += -DUSE_HYENA_COMPONENT +endif + MAKELCF_FLAGS += -DADDRESS_LTDWRAM='0x037a8000' \ -DADDRESS_FLXMAIN='0x02280200' \ -DADDRESS_BOOTCORE='0x0380f000' \ diff --git a/build/components/hyena.TWL/src/crt0.LTD.c b/build/components/hyena.TWL/src/crt0.LTD.c new file mode 100644 index 00000000..cbf11c21 --- /dev/null +++ b/build/components/hyena.TWL/src/crt0.LTD.c @@ -0,0 +1,747 @@ +/*---------------------------------------------------------------------------* + Project: TwlSDK - libraries - init - ARM7.TWL + File: crt0.LTD.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 +#include +#include +#include +#include +#include +#include +#include +#include "boot_sync.h" + +/*---------------------------------------------------------------------------*/ +void _start(void); +void _start_AutoloadDoneCallback(void* argv[]); +void INIT_InitializeScfg(void); + +#define SDK_NITROCODE_LE 0x2106c0de +#define SDK_NITROCODE_BE 0xdec00621 + +#define SDK_TWLCODE_LE 0x6314c0de +#define SDK_TWLCODE_BE 0xdec01463 + +/* 外部関数参照定義 */ +extern void OS_IrqHandler(void); +extern void _fp_init(void); +extern void __call_static_initializers(void); + +/* 内部関数プロトタイプ定義 */ +static void INITi_DoAutoload(void); +static BOOL INITi_IsRunOnTwl( void ); +static void INITi_CopySysConfig( void ); +static void INITi_DetectMainMemorySize(void); +#ifndef SDK_NOINIT +static void INITi_ShelterStaticInitializer(u32* ptr); +static void INITi_CallStaticInitializers(void); +#endif +static void* INITi_Copy32(void* dst, void* src, u32 size); +static void* INITi_Fill32(void* dst, u32 value, u32 size); + +/* リンカスクリプトにより定義されるシンボル参照 */ +extern void SDK_AUTOLOAD_LIST(void); +extern void SDK_AUTOLOAD_LIST_END(void); +extern void SDK_AUTOLOAD_START(void); +extern void SDK_STATIC_BSS_START(void); +extern void SDK_STATIC_BSS_END(void); + +#ifdef USE_HYENA_COMPONENT +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, + (void*)0, // CompressedStaticEnd. This fixed number will be updated by compstatic tool. + (void*)0, // SDK_VERSION_ID // SDK version info /* [TODO] ビルドを通すため */ + (void*)SDK_NITROCODE_BE, + (void*)SDK_NITROCODE_LE, +}; +#else +void* const _start_ModuleParams[] = +{ + (void*)0, + (void*)0, + (void*)0, + (void*)SDK_STATIC_BSS_START, + (void*)SDK_STATIC_BSS_END, + (void*)0, + (void*)0, + (void*)SDK_NITROCODE_BE, + (void*)SDK_NITROCODE_LE, +}; +#endif + +extern void SDK_LTDAUTOLOAD_LIST(void); +extern void SDK_LTDAUTOLOAD_LIST_END(void); +extern void SDK_LTDAUTOLOAD_START(void); + +void* const _start_LtdModuleParams[] = +{ + (void*)SDK_LTDAUTOLOAD_LIST, + (void*)SDK_LTDAUTOLOAD_LIST_END, + (void*)SDK_LTDAUTOLOAD_START, + (void*)0, // CompressedLtdautoloadEnd. This fixed number will be updated by compstatic tool. + (void*)SDK_TWLCODE_BE, + (void*)SDK_TWLCODE_LE, +}; + + +#ifdef DEBUG_WRAM_SETTING +u32 const wramMapping[12] = { + 0x8d898581, 0x8c888480, 0x9c989490, 0x8c888480, + 0x9c989490, 0x00000000, 0x09403900, 0x09803940, + 0x080037c0, 0x09403900, 0x09803940, 0x0000000f +}; +#endif + +/* [TODO] + * 現状 TWL のマルチブートローダーがどこに情報を残してくれるか未定のため、 + * ビルドを通すためだけのでたらめな定義です。*/ +#define TWLIPL_PARAM_DOWNLOAD_PARAMETER 0x02ffb000 + +/*---------------------------------------------------------------------------* + Name: ShakeHand + Description: ARM9 の ShakeHand 関数と同期を取る。 + メインメモリでないメモリ空間で実行される必要がある。 + Arguments: r0 - ARM9 同期用変数へのポインタ。 + r1 - ARM7 同期用変数へのポインタ。 + Returns: なし。 + *---------------------------------------------------------------------------*/ +static const u32 microcode_ShakeHand[10] = +{ + 0xe1d020b0, /* ldrh r2, [r0] ; 同期変数9を共有メモリから読む */ + 0xe1d130b0, /* ldrh r3, [r1] ; 同期変数7を共有メモリから読む */ + 0xe2833001, /* @1: add r3, r3, #1 ; 同期変数7 ++ */ + 0xe1c130b0, /* strh r3, [r1] ; 同期変数7を共有メモリに書く */ + 0xe1d0c0b0, /* ldrh r12, [r0] ; 同期変数9の現状を共有メモリから読む */ + 0xe152000c, /* cmp r2, r12 ; 同期変数9の変化を判定する */ + 0x0afffffa, /* beq @1 ; 変化していなければループ */ + 0xe2833001, /* add r3, r3, #1 ; 同期変数7 ++ */ + 0xe1c130b0, /* strh r3, [r1] ; 同期変数7を共有メモリに書く */ + 0xe12fff1e /* bx lr ; ハンドシェイク完了 */ +}; + +#ifdef DEBUG_WRAM_SETTING +/*---------------------------------------------------------------------------* + Name: WaitAgreement + Description: ARM9 の起動ベクタが特定の状態になるまで待つ。 + メインメモリでないメモリ空間で実行される必要がある。 + Arguments: r0 - 同期用フェーズ管理変数へのポインタ。 + r1 - 待機するフェーズ番号。 + Returns: なし。 + *---------------------------------------------------------------------------*/ +static const u32 microcode_WaitAgreement[7] = +{ + 0xe1d020b0, /* @1: ldrh r2, [r0] ; フェーズ管理変数を共有メモリから読む */ + 0xe1510002, /* cmp r1, r2 ; 待機フェーズ番号と比較 */ + 0x012fff1e, /* bxeq lr ; 一致していれば待機完了 */ + 0xe3a03010, /* mov r3, #16 ; 空ループ回数初期化 */ + 0xe2533001, /* @2: subs r3, r3, #1 ; 空ループ回数 -- */ + 0x1afffffd, /* bne @2 ; 16 回ループ */ + 0xeafffff8 /* b @1 ; 先頭に戻る */ +}; +#endif + +/*---------------------------------------------------------------------------* + Name: GotoMain + Description: ARM9 に特定の状態になったことを伝えた上で、Main 関数へジャンプ + する。メインメモリでないメモリ空間で実行される必要がある。 + Arguments: r0 - Main 関数のポインタ。Main 関数が Thumb コードである場合 + には、bx 命令でジャンプするため最下位ビットが 1 になって + いる必要がある。 + r1 - 同期用フェーズ管理変数へのポインタ。 + r2 - ARM9 に伝えるフェーズ番号。 + Returns: なし。 + *---------------------------------------------------------------------------*/ +static const u32 microcode_GotoMain[2] = +{ + 0xe1c120b0, /* strh r2, [r1] ; フェーズ管理変数を更新 */ + 0xe12fff10 /* bx r0 ; Main 関数へジャンプ */ +}; + +/*---------------------------------------------------------------------------*/ +#include + +/*---------------------------------------------------------------------------* + Name: _start + Description: 起動ベクタ。 + Arguments: なし。 + Returns: なし。 + *---------------------------------------------------------------------------*/ +SDK_WEAK_SYMBOL asm void +_start(void) +{ +@000: + /* 割り込み禁止 */ + mov r12, #HW_REG_BASE + str r12, [r12, #REG_IME_OFFSET] // Use that LSB of HW_REG_BASE is 0b0 + + /* ハンドシェイク用マイクロコードを専用 WRAM にコピー */ + ldr r1, =microcode_ShakeHand + ldr r2, =HW_PRV_WRAM + add r3, r2, #40 +@001: ldr r0, [r1], #4 + str r0, [r2], #4 + cmp r2, r3 + blt @001 + + /* 専用 WRAM 上のコードで ARM9 とハンドシェイク */ + ldr r0, =HW_BOOT_SHAKEHAND_9 + ldr r1, =HW_BOOT_SHAKEHAND_7 + ldr r2, =HW_PRV_WRAM + mov lr, pc + bx r2 + +@010: + /* スタックポインタ設定 */ + mov r0, #HW_PSR_SVC_MODE // SuperVisor mode + msr cpsr_c, r0 + ldr sp, =HW_PRV_WRAM_SVC_STACK_END + mov r0, #HW_PSR_IRQ_MODE // IRQ mode + msr cpsr_c, r0 + ldr sp, =HW_PRV_WRAM_IRQ_STACK_END + ldr r1, =SDK_IRQ_STACKSIZE + sub r1, sp, r1 + sub sp, sp, #4 // 4 bytes for stack check code + mov r0, #HW_PSR_SYS_MODE + msr cpsr_csfx, r0 + sub sp, r1, #4 // 4 bytes for stack check code + + /* スタック領域をクリア */ + ldr r0, =SDK_SYS_STACKSIZE + sub r1, r1, r0 + ldr r2, =HW_PRV_WRAM_IRQ_STACK_END + mov r0, #0 +@011: cmp r1, r2 + strlt r0, [r1], #4 + blt @011 + + /* SCFG を HW_SYS_CONF_BUF へコピー */ + bl INIT_InitializeScfg + bl INITi_CopySysConfig + + /* TWL ハードウェア上で動作しているかどうかを調査 */ + bl INITi_IsRunOnTwl + /* TWL ハードウェア上で動作していない場合は永久ループ */ +@012: bne @012 + + /* ダウンロードパラメータ情報を共有エリアに退避 */ + ldr r0, =HW_DOWNLOAD_PARAMETER // r0 = start address of destination range + ldr r1, =TWLIPL_PARAM_DOWNLOAD_PARAMETER // r1 = start address of source range + mov r2, #HW_DOWNLOAD_PARAMETER_SIZE // r2 = size of download parameter + bl INITi_Copy32 + + /* プリロードパラメータアドレスが格納されていない場合は、デフォルト値をセット */ + ldr r0, =HW_PRELOAD_PARAMETER_ADDR + ldr r1, [r0] + cmp r1, #0 + ldreq r1, =HW_PARAM_TWL_SETTINGS_DATA_DEFAULT + streq r1, [r0] + +@020: + /* Autoload を実施 */ + bl INITi_DoAutoload + + /* STATIC ブロックの .bss セクションを 0 クリア */ + mov r1, #0 // r1 = clear value for STATIC bss section + ldr r3, =_start_ModuleParams + ldr r0, [r3, #12] // r0 = start address of STATIC bss section + ldr r2, [r3, #16] + subs r2, r2, r0 // r2 = size of STATIC bss section + blgt INITi_Fill32 + + //---- detect main memory size + bl INITi_DetectMainMemorySize + +#ifndef SDK_FINALROM + //---- set debug print window + ldr r1, =HW_PRINT_OUTPUT_ARM9 + mov r0, #OS_PRINT_OUTPUT_DEFAULT_ARM9 + orr r0, r0, #(OS_PRINT_OUTPUT_DEFAULT_ARM7<<8) + strh r0, [r1] + mov r0, #OS_PRINT_OUTPUT_DEFAULT_ARM9ERR + orr r0, r0, #(OS_PRINT_OUTPUT_DEFAULT_ARM7ERR<<8) + strh r0, [r1, #2] +#endif + + /* 割り込みベクタ設定 */ + ldr r1, =HW_INTR_VECTOR_BUF + ldr r0, =OS_IrqHandler + str r0, [r1] + +#ifndef SDK_NOINIT + /* c++ 用初期化 */ + bl _fp_init + bl TwlSpStartUp + bl __call_static_initializers + bl INITi_CallStaticInitializers +#endif + +@030: + /* Main 関数へのジャンプ用マイクロコードをスタックの底にコピー */ + ldr r1, =microcode_GotoMain + ldr r0, [r1], #4 + str r0, [sp, #-4] + ldr r0, [r1] + str r0, [sp] + + /* マイクロコードを経由して Main 関数へジャンプ */ + ldr r0, =TwlSpMain + ldr r1, =HW_BOOT_SYNC_PHASE + mov r2, #BOOT_SYNC_PHASE_4 + ldr lr, =HW_RESET_VECTOR + sub r3, sp, #4 + bx r3 +} + +/*---------------------------------------------------------------------------* + Name: INITi_DoAutoload + Description: リンク情報に沿って、各オートロードブロックの固定データ部の展開 + 及び変数部の 0 クリアを行う。 + Arguments: なし。 + Returns: なし。 + *---------------------------------------------------------------------------*/ +/* + * < 二段階オートロード > + * 0x02380000 に crt0 及び一段目ロード元バイナリが配置されている。 + * NITRO と共有可能な WRAM 上に配置されるべきバイナリデータを 0x037c0000 にロードする。 + * TWL でしか動作しない WRAM 上に配置されるべきバイナリデータを続きのアドレスにロードする。 + * 0x02400000 に ARM9 の二段目ロード元バイナリが配置されている。 + * 0x04000 バイト分はカード ROM から再読み出し不可なので、0x02f80000 - 0x02f84000 に退避する。 + * 0x02e80000 に二段目ロード元バイナリが配置されている。 + * 0x04000 バイト分はカード ROM から再読み出し不可なので、0x02f84000 - 0x02f88000 に退避する。 + * NITRO と共有可能な MAIN 上に配置されるべきバイナリデータを 0x02f88000 にロードする。 + * TWL でしか動作しない MAIN 上に配置されるべきバイナリデータを続きのアドレスにロードする。 + */ +static asm void +INITi_DoAutoload(void) +{ + stmfd sp!, {lr} + +@01_autoload: + /* WRAM 用ブロックをオートロード */ + ldr r0, =_start_ModuleParams + ldr r12, [r0] // r12 = SDK_AUTOLOAD_LIST + ldr r3, [r0, #4] // r3 = SDK_AUTOLOAD_LIST_END + ldr r1, [r0, #8] // r1 = SDK_AUTOLOAD_START +@01_segments_loop: + cmp r12, r3 + bge @02_start + /* 固定セクション */ + ldr r0, [r12], #4 // r0 = start address of destination range of fixed section + ldr r2, [r12], #4 // r2 = size of fixed section + bl INITi_Copy32 + stmfd sp!, {r0, r1} + /* static initializer テーブル */ + ldr r0, [r12], #4 // r0 = start address of source range of static initializers table +#ifndef SDK_NOINIT + stmfd sp!, {r3, r12} + bl INITi_ShelterStaticInitializer + ldmfd sp!, {r3, r12} +#endif + /* bss セクション */ + ldmfd sp!, {r0} // r0 = start address of destination range of bss section + mov r1, #0 // r1 = clear value for bss section + ldr r2, [r12], #4 // r2 = size of bss section + bl INITi_Fill32 + ldmfd sp!, {r1} // r1 = end address of source range of the autoload segment + b @01_segments_loop + +@02_start: + + /* メインメモリ用オートロードブロックの存在を確認 */ + ldr r1, =HW_TWL_ROM_HEADER_BUF + ldr r0, [r1, #ROM_Header.s.sub_ltd_size] + cmp r0, #0 + beq @03_start + +@02_autoload: + /* メインメモリ用ブロックをオートロード */ + ldr r0, =_start_LtdModuleParams + ldr r12, [r0] // r12 = SDK_LTDAUTOLOAD_LIST + ldr r3, [r0, #4] // r3 = SDK_LTDAUTOLOAD_LIST_END + ldr r1, [r0, #8] // r1 = SDK_AUTOLOAD_START +@02_segments_loop: + cmp r12, r3 + bge @03_start + /* 固定セクション */ + ldr r0, [r12], #4 + ldr r2, [r12], #4 + bl INITi_Copy32 + stmfd sp!, {r0, r1} + /* static initializer テーブル */ + ldr r0, [r12], #4 +#ifndef SDK_NOINIT + stmfd sp!, {r3, r12} + bl INITi_ShelterStaticInitializer + ldmfd sp!, {r3, r12} +#endif + /* bss セクション */ + ldmfd sp!, {r0} + mov r1, #0 + ldr r2, [r12], #4 + bl INITi_Fill32 + ldmfd sp!, {r1} + b @02_segments_loop + +@03_start: + /* オートロード完了コールバック関数呼び出し */ + ldr r0, =_start_ModuleParams + ldr r1, =_start_LtdModuleParams + ldmfd sp!, {lr} + b _start_AutoloadDoneCallback +} + + +#ifndef SDK_NOINIT +/*---------------------------------------------------------------------------* + Name: INITi_ShelterStaticInitializer + Description: 各オートロードセグメント内の static initializer へのポインタ + テーブルを IRQ スタックの最上部に退避する。 + Arguments: ptr - セグメント内のポインタテーブルへのポインタ。 + テーブルは NULL で終端されている必要がある。 + Returns: なし。 + *---------------------------------------------------------------------------*/ +static asm void +INITi_ShelterStaticInitializer(u32* ptr) +{ + /* 引数確認 */ + cmp r0, #0 + bxeq lr + + /* 退避場所先頭アドレスを計算 */ + ldr r1, =HW_PRV_WRAM_IRQ_STACK_END + ldr r2, =SDK_IRQ_STACKSIZE + sub r1, r1, r2 + add r1, r1, #4 + + /* 退避場所先頭から空き場所を調査 */ +@001: ldr r2, [r1] + cmp r2, #0 + addne r1, r1, #4 + bne @001 + + /* 空き場所にテーブルをコピー */ +@002: ldr r2, [r0], #4 + str r2, [r1], #4 + cmp r2, #0 + bne @002 + + bx lr +} + +/*---------------------------------------------------------------------------* + Name: INITi_CallStaticInitializers + Description: 各オートロードセグメント内の static initializer を呼び出す。 + オートロード処理によって IRQ スタックの最上部に退避されている + 関数ポインタテーブルを一つずつ呼び出す。 + Arguments: なし。 + Returns: なし。 + *---------------------------------------------------------------------------*/ +static asm void +INITi_CallStaticInitializers(void) +{ + stmdb sp!, {lr} + + /* テーブル退避場所先頭アドレスを計算 */ + ldr r1, =HW_PRV_WRAM_IRQ_STACK_END + ldr r2, =SDK_IRQ_STACKSIZE + sub r1, r1, r2 + add r1, r1, #4 + + /* テーブルに管理されているポインタを一つずつ呼び出し */ +@001: ldr r0, [r1] + cmp r0, #0 + beq @002 + stmdb sp!, {r1} + mov lr, pc + bx r0 + ldmia sp!, {r1} + /* 一旦呼び出したポインタはゼロクリア (IRQスタックを間借りしている為) */ + mov r0, #0 + str r0, [r1], #4 + b @001 + +@002: ldmia sp!, {lr} + bx lr +} +#endif + +/*---------------------------------------------------------------------------* + Name: _start_AutoloadDoneCallback + Description: オートロード完了コールバック。 + Arguments: argv - オートロードパラメータを保持している配列。 + 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: なし。 + *---------------------------------------------------------------------------*/ +SDK_WEAK_SYMBOL asm void +_start_AutoloadDoneCallback(void* argv[]) +{ + bx lr +} + +/*---------------------------------------------------------------------------* + Name: NitroSpStartUp + Description: Hook for user start up. + Arguments: None. + Returns: None. + *---------------------------------------------------------------------------*/ +SDK_WEAK_SYMBOL void +NitroSpStartUp(void) +{ +} + +/*---------------------------------------------------------------------------* + Name: INITi_IsRunOnTwl + + Description: check running platform + + This function is used in only Nitro-TWL hybrid mode. + (In Nitro mode and TWL limited mode, treated as constant) + + Arguments: None + + Returns: TRUE : running on TWL + FALSE : running on NITRO + *---------------------------------------------------------------------------*/ +static asm BOOL INITi_IsRunOnTwl( void ) +{ + ldr r0, =HW_PRV_WRAM_SYSRV + ldrb r0, [r0,#HWi_WSYS08_WRAMOFFSET] + and r0, r0, #HWi_WSYS08_ROM_ARM9SEC_MASK | HWi_WSYS08_ROM_ARM9RSEL_MASK + cmp r0, #HWi_WSYS08_ROM_ARM9SEC_MASK + moveq r0, #TRUE + movne r0, #FALSE + + bx lr +} + +/*---------------------------------------------------------------------------* + Name: INIT_InitializeScfg + + Description: ローダーが行う SCFG ブロックへの設定処理を代行する為の関数。 + 処理の実体は crt0 の外部に定義するため、弱シンボルとする。 + + Arguments: None. + + Returns: None. + *---------------------------------------------------------------------------*/ +SDK_WEAK_SYMBOL asm void +INIT_InitializeScfg(void) +{ + bx lr +} + +/*---------------------------------------------------------------------------* + Name: INITi_CopySysConfig + + Description: copy SCFG registers to HW_SYS_CONF_BUF and HW_PRV_WRAM_SYSRV + + Arguments: None. + + Returns: None. + *---------------------------------------------------------------------------*/ +static asm void INITi_CopySysConfig( void ) +{ + //---- copy scfg setting + ldr r2, =HW_PRV_WRAM_SYSRV + ldr r3, =HW_SYS_CONF_BUF + ldr r0, [r2, #HWi_WSYS04_WRAMOFFSET] + str r0, [r3, #HWi_WSYS04_OFFSET] + ldrh r0, [r2, #HWi_WSYS08_WRAMOFFSET] + strh r0, [r3, #HWi_WSYS08_OFFSET] + + bx lr +} + +/*---------------------------------------------------------------------------* + Name: INITi_DetectMainMemorySize + + Description: detect main memory size. + result is written into (u32*)HW_MMEMCHECKER_SUB. + value is [OS_CONSOLE_SIZE_4MB|OS_CONSOLE_SIZE_8MB| + OS_CONSOLE_SIZE_16MB|OS_CONSOLE_SIZE_32MB] + + Arguments: None. + + Returns: None. + *---------------------------------------------------------------------------*/ +#define OSi_IMAGE_DIFFERENCE 0x400000 +#define OSi_IMAGE_DIFFERENCE2 0xb000000 +#define OSi_DETECT_NITRO_MASK (REG_SND_SMX_CNT_E_MASK | REG_SND_SMX_CNT_FSEL_MASK) +#define OSi_DETECT_NITRO_VAL (REG_SND_SMX_CNT_E_MASK) + +#define OSi_CHECKNUM1 0x55 +#define OSi_CHECKNUM2 0xaa +#define OSi_100usWAIT 3352 // 100us = 3351.4cycles(33.514MHz) + +static asm void INITi_DetectMainMemorySize( void ) +{ + stmfd sp!, {lr} + + //---- detect memory size + mov r0, #OS_CONSOLE_SIZE_4MB + mov r1, #0 + + ldr r2, =HW_MMEMCHECKER_SUB + sub r3, r2, #OSi_IMAGE_DIFFERENCE +@1: + strh r1, [r2] + ldrh r12, [r3] + cmp r1, r12 + bne @2 + + add r1, r1, #1 + cmp r1, #2 // check 2 loop + bne @1 + + //---- 4MB + b @3 + + //---- 8MB or 16MB or 32MB +@2: + // check if running on twl/nitro + bl INITi_IsRunOnTwl + movne r0, #OS_CONSOLE_SIZE_8MB + bne @3 + + //---- 16MB or 32MB + add r3, r2, #OSi_IMAGE_DIFFERENCE2 + mov r0, #OS_CONSOLE_SIZE_16MB + ldrb r2, [r3] + + mov r1, #OSi_CHECKNUM1 + strb r1, [r3] + + ldr r12, =OSi_100usWAIT +@4 subs r12, r12, #4 + bcs @4 + + ldrb r1, [r3] + cmp r1, #OSi_CHECKNUM1 + bne @3 + + mov r1, #OSi_CHECKNUM2 + strb r1, [r3] + + ldr r12, =OSi_100usWAIT +@5 subs r12, r12, #4 + bcs @5 + + ldrb r1, [r3] + cmp r1, #OSi_CHECKNUM2 + moveq r0, #OS_CONSOLE_SIZE_32MB + +@3: + //---- check SMX_CNT + strb r2, [r3] + ldr r3, =REG_SMX_CNT_ADDR + ldrh r1, [r3] + and r1, r1, #OSi_DETECT_NITRO_MASK + cmp r1, #OSi_DETECT_NITRO_VAL + orreq r0, r0, #OS_CHIPTYPE_SMX_MASK + + ldr r2, =HW_MMEMCHECKER_SUB + strh r0, [r2] + + ldmfd sp!, {lr} + bx lr +} + +/*---------------------------------------------------------------------------* + Name: INITi_Copy32 + Description: 32 bit 単位でコピーを行う。スタックを 36 バイト消費するが、 + レジスタ r3 - r12 は破壊しない。 + Arguments: r0 - コピー先へのポインタ ( 4 バイトアライン )。 + r1 - コピー元へのポインタ ( 4 バイトアライン )。 + r2 - コピーする長さをバイト単位で指定 ( 4 の倍数 )。 + Returns: r0 - コピー後のコピー先へのポインタ ( r0 + r2 )。 + r1 - コピー後のコピー元へのポインタ ( r1 + r2 )。 + *---------------------------------------------------------------------------*/ +static asm void* +INITi_Copy32(void* dst, void* src, u32 size) +{ + stmfd sp!, {r3-r11} + bics r3, r2, #0x0000001f + beq @next + add r3, r0, r3 +@loop: + ldmia r1!, {r4-r11} + stmia r0!, {r4-r11} + cmp r3, r0 + bgt @loop +@next: + tst r2, #0x00000010 + ldmneia r1!, {r4-r7} + stmneia r0!, {r4-r7} + tst r2, #0x00000008 + ldmneia r1!, {r4-r5} + stmneia r0!, {r4-r5} + tst r2, #0x00000004 + ldmneia r1!, {r4} + stmneia r0!, {r4} + ldmfd sp!, {r3-r11} + bx lr +} + +/*---------------------------------------------------------------------------* + Name: INITi_Fill32 + Description: 32 bit 単位でバッファ内容を指定データで埋める。スタックを 36 + バイト消費するが、レジスタ r3 - r12 は破壊しない。 + Arguments: r0 - バッファへのポインタ ( 4 バイトアライン )。 + r1 - バッファを埋める内容を 32 bit 値で指定。 + r2 - バッファを埋める長さをバイト単位で指定 ( 4 の倍数 )。 + Returns: r0 - 処理後のバッファへのポインタ ( r0 + r2 )。 + *---------------------------------------------------------------------------*/ +static asm void* +INITi_Fill32(void* dst, u32 value, u32 size) +{ + stmfd sp!, {r3-r11} + mov r4, r1 + mov r5, r1 + mov r6, r1 + mov r7, r1 + mov r8, r1 + mov r9, r1 + mov r10, r1 + mov r11, r1 + bics r3, r2, #0x0000001f + beq @next + add r3, r0, r3 +@loop: + stmia r0!, {r4-r11} + cmp r3, r0 + bgt @loop +@next: + tst r2, #0x00000010 + stmneia r0!, {r4-r7} + tst r2, #0x00000008 + stmneia r0!, {r4-r5} + tst r2, #0x00000004 + stmneia r0!, {r4} + ldmfd sp!, {r3-r11} + bx lr +} + +#include diff --git a/build/components/hyena.TWL/src/main.c b/build/components/hyena.TWL/src/main.c index 22e3be7d..ba877d53 100644 --- a/build/components/hyena.TWL/src/main.c +++ b/build/components/hyena.TWL/src/main.c @@ -107,6 +107,7 @@ extern void SDK_LTDAUTOLOAD_LTDWRAM_BSS_END(void); extern void SDK_LTDAUTOLOAD_LTDMAIN_BSS_END(void); #endif extern void SDK_SEA_KEY_STORE(void); +extern void SDK_STATIC_BSS_END(void); extern BOOL sdmcGetNandLogFatal( void ); @@ -116,6 +117,13 @@ extern BOOL sdmcGetNandLogFatal( void ); Arguments: None. Returns: None. *---------------------------------------------------------------------------*/ +#define COMPONENT_WRAM_A_OFS (HW_WRAM_A_LTD - HW_WRAM_BASE) +#define COMPONENT_WRAM_A_OFS_END (COMPONENT_WRAM_A_OFS + HW_WRAM_A_SIZE) +#define COMPONENT_WRAM_B_OFS (COMPONENT_WRAM_A_OFS - HW_WRAM_B_SIZE) +#define COMPONENT_WRAM_B_OFS_END (COMPONENT_WRAM_A_OFS) +#define COMPONENT_WRAM_C_OFS (COMPONENT_WRAM_B_OFS - HW_WRAM_C_SIZE) +#define COMPONENT_WRAM_C_OFS_END (COMPONENT_WRAM_B_OFS) + void TwlSpMain(void) { @@ -152,14 +160,15 @@ TwlSpMain(void) // NANDのFATALエラー検出 if( sdmcGetNandLogFatal() != FALSE) { /* 故障扱い処理 */ - SYSM_SetFatalError( TRUE ); + SYSMi_GetWork()->flags.common.isNANDFatalError = TRUE; } - // [TODO:] カード電源ONして、ROMヘッダのみリード&チェックくらいはやっておきたい - - SYSMi_GetWork()->flags.common.isARM9Start = TRUE; // [TODO:] HW_RED_RESERVEDはNANDファームでクリアしておいて欲しい + SYSMi_GetWork()->flags.common.isARM9Start = TRUE; // ヒープ領域設定 +#ifndef USE_HYENA_COMPONENT + OS_SetSubPrivArenaLo( (void*)SDK_STATIC_BSS_END ); +#endif OS_SetSubPrivArenaHi( (void*)SYSM_OWN_ARM7_MMEM_ADDR_END ); // メモリ配置をいじっているので、アリーナHiも変更しないとダメ!! OS_SetWramSubPrivArenaHi( (void*)(SYSM_OWN_ARM7_WRAM_ADDR_END - HW_FIRM_FROM_FIRM_BUF_SIZE) ); // この時点では鍵をつぶさないように OS_TPrintf( "MMEM SUBPRV ARENA HI : %08x -> %08x\n", OS_GetSubPrivArenaHi(), OS_GetSubPrivArenaHi() ); @@ -270,12 +279,6 @@ TwlSpMain(void) while (TRUE) { OS_Halt(); - - //---- check reset - if (OS_IsResetOccurred()) - { - OS_ResetSystem(); - } BOOT_WaitStart(); } } @@ -347,7 +350,11 @@ PrintDebugInfo(void) { OS_TPrintf("ARM7: This component is running on NITRO.\n"); } +#ifdef USE_HYENA_COMPONENT OS_TPrintf("ARM7: This component is \"hyena.TWL\"\n"); +#else + OS_TPrintf("ARM7: This component is \"jackal.TWL\"\n"); +#endif } #include diff --git a/build/components/jackal.TWL/Makefile b/build/components/jackal.TWL/Makefile new file mode 100644 index 00000000..9d6f9722 --- /dev/null +++ b/build/components/jackal.TWL/Makefile @@ -0,0 +1,128 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: TwlIPL - components - jackal.TWL +# 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:: $ +# $Rev$ +# $Author$ +#---------------------------------------------------------------------------- + +# Main memory にコードを退避させたathdrvを使用。(for test) +TMP_WL_MAIN ?= FALSE + +TARGET_FIRM = SYSTEMMENU +override TARGET_PLATFORM = TWL +override TWL_PROC = ARM7 +override TWL_ARCHGEN = LIMITED +override TWL_PLATFORM = TS +TWL_NO_STD_PCHDR = True +TWL_CODEGEN ?= ARM + +#---------------------------------------------------------------------------- + +SUBDIRS = $(SYSMENU_ROOT)/build/libraries/aes \ + wram_regs + +HYENA_SRCDIR = ../hyena.TWL/src +SRCS = $(HYENA_SRCDIR)/crt0.LTD.c \ + $(HYENA_SRCDIR)/main.c \ + $(HYENA_SRCDIR)/initScfg.c + +TARGET_NAME = jackal + +TARGET_NEF = $(TARGET_NAME).tef +LCFILE_SPEC = $(TARGET_NAME).lsf +LCFILE_TEMPLATE = $(TARGET_NAME).lcf.template +LDRES_TEMPLATE = $(ROOT)/build/components/armadillo.TWL/armadillo.response.template + +CRT0_O = $(OBJDIR)/crt0.LTD.o + +# スタック不足防止の為、インライン展開せずにコンパイルする +CCFLAGS_OPT = -O4 -inline off + +#---------------------------------------------------------------------------- +include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs + +# crt0.o 、 libpm_sp および libnwm_sp は、ローカルでビルドしたものを使用するので、除外する。 +ifeq ($(TMP_WL_MAIN), TRUE) +GLIBRARIES := $(filter-out $(CRT0_O) libpm_sp$(TWL_LIBSUFFIX).a libathdrv_sp$(TWL_LIBSUFFIX).a,$(GLIBRARIES)) +else +GLIBRARIES := $(filter-out $(CRT0_O) libpm_sp$(TWL_LIBSUFFIX).a,$(GLIBRARIES)) +endif + +MACRO_FLAGS += -DSDK_ARM7COMP_LTD -DSDK_SEA \ + -DSDK_NOINIT \ + -DSDK_SYSMENU_BUILD + +MAKELCF_FLAGS += -DADDRESS_FLXMAIN='0x02280200' \ + -DADDRESS_BOOTCORE='0x0380f000' \ + -DCRT0_O='$(CRT0_O)' + +MAKELCF_FLAGS += -DISDBG_LIBS_TWL='$(if $(ISDBG_LIBS_TWL),$(ISDBG_LIBS_TWL),libstubsistd_sp$(TWL_LIBSUFFIX).a)' \ + -DISDBG_LIBS_NITRO='libstubsisd_sp$(TWL_LIBSUFFIX).a' + +#-------------------------------- +# install target +#-------------------------------- +INSTALL_TARGETS = $(BINDIR)/$(TARGET_NAME).tef \ + $(BINDIR)/$(TARGET_NAME).TWL.FLX.sbin \ + $(BINDIR)/$(TARGET_NAME)_defs.TWL.FLX.sbin \ + $(BINDIR)/$(TARGET_NAME).TWL.LTD.sbin \ + $(BINDIR)/$(TARGET_NAME)_defs.TWL.LTD.sbin + +INSTALL_DIR = $(TWL_INSTALL_COMPONENTSDIR)/$(TARGET_NAME)/$(TWL_BUILDTYPE) + +LINCLUDES = $(ROOT)/build/libraries/spi/ARM7/include \ + $(ROOT)/build/libraries/spi/ARM7/pm/include \ + $(ROOT)/build/libraries/init/common/include \ + $(ROOT)/build/libraries/reboot/common/include \ + $(SYSMENU_ROOT)/build/libraries_sysmenu/sysmenu/common/include + +SYSMENU_LIBS = \ + libsysmenu_sp$(TWL_LIBSUFFIX).a \ + libsysmmcu_sp$(TWL_LIBSUFFIX).a \ + libboot_sp$(TWL_LIBSUFFIX).a \ + libds_sp$(TWL_LIBSUFFIX).a \ + libhotsw_sp$(TWL_LIBSUFFIX).a \ + libdht_sp$(TWL_LIBSUFFIX).a \ + libpm_sp.SYSMENU$(TWL_LIBSUFFIX).a + +ifeq ($(TMP_WL_MAIN), TRUE) +SYSMENU_LIBS += \ + libathdrv_sp.SYSMENU$(TWL_LIBSUFFIX).a +endif + +SDK_APPEND_LIBS = \ + libwl_sp.TWL.LTD.a \ + libaes_sp.firm.LTD.a \ + libsea_sp.TWL.LTD.a \ + libreboot_sp$(TWL_LIBSUFFIX).a + +LLIBRARIES += $(SYSMENU_LIBS) $(SDK_APPEND_LIBS) + +LLIBRARY_DIRS += ./ + +ifeq ($(TMP_WL_MAIN), TRUE) +LLIBRARY_DIRS += $(SYSMENU_ROOT)/lib/TwlWireless/$(TWL_LIBTYPE) +endif + +LDEPENDS_NEF = $(TWL_LIBS) $(LLIBRARIES) + + +do-build: $(TARGETS) + +#---------------------------------------------------------------------------- +include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules + +#---------------------------------------------------------------------------- + +#===== End of Makefile ===== diff --git a/build/components/jackal.TWL/jackal.lcf.template b/build/components/jackal.TWL/jackal.lcf.template new file mode 100644 index 00000000..6ae1bd6b --- /dev/null +++ b/build/components/jackal.TWL/jackal.lcf.template @@ -0,0 +1,400 @@ +#--------------------------------------------------------------------------- +# Project: TwlSDK - components - armadillo.TWL +# File: armadillo.lcf.template +# +# 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$ +#--------------------------------------------------------------------------- +MEMORY +{ + (RWX) : ORIGIN = , LENGTH = 0x0 > + binary.STATIC_FOOTER (RWX) : ORIGIN = 0, LENGTH = 0x0 >> + + F (RW) : ORIGIN = 0, LENGTH = 0x0 > + + binary.LTDAUTOLOAD_TOP (RW) : ORIGIN = 0, LENGTH = 0x0 > + + (RWX) : ORIGIN = , LENGTH = 0x0 >> + + binary.LTDAUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> + + L (RW) : ORIGIN = 0, LENGTH = 0x0 > + + check.WORKRAM (RWX) : ORIGIN = 0x03740000, LENGTH = 0xd0000 > workram.check +} + +KEEP_SECTION +{ + .sinit +} + +SECTIONS +{ + ############################ STATIC ################################# + .: + { + ALIGNALL(4); + . = ALIGN(4); + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL ; + + + # + # TEXT BLOCK: READ ONLY + # + SDK_STATIC_START =.; + OBJECT(_start,*) + + + + + + + + + + + + + + + + + + + . = ALIGN(4); + SDK_STATIC_SINIT_START =.; + + + + + + + + + + + + + WRITEW 0; + + # + # DATA BLOCK: READ WRITE + # + . = ALIGN(4); + + + + + + + + + + + + + . = ALIGN(4); + SDK_STATIC_END =.; + + SDK_STATIC_SIZE = SDK_STATIC_END - SDK_STATIC_START; + __sinit__ = SDK_STATIC_SINIT_START; # for static initializer + + } > + + ..bss: + { + ALIGNALL(4); + . = ALIGN(4); + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL ; + + + # + # BSS BLOCK + # + SDK_STATIC_BSS_START =.; + + + + + + + + + + + + + . = ALIGN(4); + SDK_STATIC_BSS_END = .; + + SDK_STATIC_BSS_SIZE = SDK_STATIC_BSS_END - SDK_STATIC_BSS_START; + + } >> + + ############################ STATIC_FOOTER ########################## + .binary.STATIC_FOOTER: + { + WRITEW 0xdec00621; # LE(0x2106C0DE) = NITRO CODE + WRITEW _start_ModuleParams - ADDR(.); + WRITEW 0; # NO DIGEST + WRITEW _start_LtdModuleParams - ADDR(.); + + } > binary.STATIC_FOOTER + + ############################ OVERLAYDEFS ############################ + .F: + { + ### module information + WRITEW ADDR(.); # load address + WRITEW _start; # entry address + WRITEW SDK_STATIC_SIZE; # size of module + WRITEW _start_AutoloadDoneCallback; # callback autoload done + + } > F + + ########################### LTDAUTOLOADS ############################ + SDK_LTDAUTOLOAD_TOP_START = 0x02f00000; + SDK_LTDAUTOLOAD_TOP_SIZE = 4; # STATIC 領域が無い代わりに 4 bytes のダミーがバイナリファイルの先頭に入る # + SDK_LTDAUTOLOAD_START = SDK_LTDAUTOLOAD_TOP_START + SDK_LTDAUTOLOAD_TOP_SIZE; + SDK_LTDAUTOLOAD_SIZE = 0; + SDK_LTDAUTOLOAD_BSS_END = 0x03740000; + + .binary.LTDAUTOLOAD_TOP: + { + WRITEW 0; + + } > binary.LTDAUTOLOAD_TOP + + + .: + { + ALIGNALL(4); + . = ALIGN(4); + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL ; + + + # + # TEXT BLOCK: READ ONLY + # + SDK_LTDAUTOLOAD..START =.; + + + + + + + + + . = ALIGN(4); + SDK_STATIC_ETABLE_START =.; + __exception_table_start__ =.; + EXCEPTION + __exception_table_end__ =.; + SDK_STATIC_ETABLE_END =.; + + + + + + + + + + + + + + . = ALIGN(4); + SDK_LTDAUTOLOAD..SINIT_START =.; + + + + + + + + + + + + + WRITEW 0; + + # + # DATA BLOCK: READ WRITE BLOCK + # + . = ALIGN(4); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . = ALIGN(4); + SDK_LTDAUTOLOAD..END =.; + + SDK_LTDAUTOLOAD..SIZE = SDK_LTDAUTOLOAD..END - SDK_LTDAUTOLOAD..START; + SDK_LTDAUTOLOAD_SIZE = SDK_LTDAUTOLOAD_SIZE + SDK_LTDAUTOLOAD..SIZE; + + } > + + ..bss: + { + ALIGNALL(4); + . = ALIGN(4); + + # + # Definition to refer overlay segment, when same name symbols exist in multiple overlays. + # + + SEARCH_SYMBOL ; + + + # + # BSS BLOCK + # + SDK_LTDAUTOLOAD..BSS_START =.; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . = ALIGN(4); + SDK_LTDAUTOLOAD..BSS_END =.; + SDK_LTDAUTOLOAD_BSS_END =.; + + SDK_LTDAUTOLOAD..BSS_SIZE = SDK_LTDAUTOLOAD..BSS_END - SDK_LTDAUTOLOAD..BSS_START; + + } >> + + + SDK_MOUNT_INFO_TABLE = SDK_LTDAUTOLOAD_BSS_END; + SDK_LTDAUTOLOAD_BSS_END = SDK_MOUNT_INFO_TABLE + 0x400; + + ######################### LTDAUTOLOAD_INFO ########################## + .binary.LTDAUTOLOAD_INFO: + { + + WRITEW ADDR(.); + WRITEW SDK_LTDAUTOLOAD..SIZE; + WRITEW SDK_LTDAUTOLOAD..SINIT_START; + WRITEW SDK_LTDAUTOLOAD..BSS_SIZE; + + + } > binary.LTDAUTOLOAD_INFO + + SDK_LTDAUTOLOAD_LIST = SDK_LTDAUTOLOAD_START + SDK_LTDAUTOLOAD_SIZE; + SDK_LTDAUTOLOAD_LIST_END = SDK_LTDAUTOLOAD_LIST + SIZEOF(.binary.LTDAUTOLOAD_INFO); + SDK_LTDAUTOLOAD_SIZE = SDK_LTDAUTOLOAD_SIZE + SIZEOF(.binary.LTDAUTOLOAD_INFO); + + ########################## LTDOVERLAYDEFS ########################### + .L: + { + ### TWL limited extended static module information + WRITEW SDK_LTDAUTOLOAD_TOP_START; # load address + WRITEW SDK_MOUNT_INFO_TABLE; # address of the FS mount information table + WRITEW SDK_LTDAUTOLOAD_SIZE + SDK_LTDAUTOLOAD_TOP_SIZE; # size of module + WRITEW 0; # padding + + } > L + + ############################ OTHERS ################################# + SDK_SUBPRIV_ARENA_LO = 0x02ffc000; # メインメモリアリーナはサイズ 0 + SDK_SEA_KEY_STORE = SDK_LTDAUTOLOAD_BSS_END; + SDK_WRAM_ARENA_LO = SDK_LTDAUTOLOAD_BSS_END + 0x40; + + SDK_IRQ_STACKSIZE = ; # allocated in WRAM + SDK_SYS_STACKSIZE = ; # allocated in WRAM + SDK_SYS_STACKSIZE_SIGN = (SDK_SYS_STACKSIZE < 0x80000000) * 2 - 1; + + .check.WORKRAM: + { + . = SDK_WRAM_ARENA_LO + 0x80 + SDK_IRQ_STACKSIZE + SDK_SYS_STACKSIZE * SDK_SYS_STACKSIZE_SIGN; + + } > check.WORKRAM +} diff --git a/build/components/jackal.TWL/jackal.lsf b/build/components/jackal.TWL/jackal.lsf new file mode 100644 index 00000000..c826baaf --- /dev/null +++ b/build/components/jackal.TWL/jackal.lsf @@ -0,0 +1,94 @@ +#---------------------------------------------------------------------------- +# Project: TwlSDK - components - armadillo.TWL +# File: armadillo.lsf +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded insructions, 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$ +#---------------------------------------------------------------------------- +# +# Nitro LCF SPEC FILE +# +#-------- +Static $(TARGET_NAME) +{ + Address $(ADDRESS_FLXMAIN) + StackSize 1024 1024 + + Library $(CRT0_O) + Object $(OBJDIR)/initScfg.o + Library libwm_sp$(LIBSUFFIX).a + Library libnwm_sp$(LIBSUFFIX).a + Library libwvr_sp$(LIBSUFFIX).a + Library libwpa_sp$(LIBSUFFIX).a +} + +#-------- +Ltdautoload SCRWRAM +{ + Address 0x03758000 + + Library libsubpsyscall.a + Library libsyscall_sp.twl.a + Library $(CW_LIBS) + Library $(ISDBG_LIBS_TWL) + Library $(ISDBG_LIBS_NITRO) + + Object * (.etable) + Object $(OBJDIR)/main.o + + Library libsea_sp$(LIBSUFFIX).a + Library libcrypto_sp$(LIBSUFFIX).a + + Library libos_sp$(LIBSUFFIX).a + Library libmi_sp$(LIBSUFFIX).a + Library libstd_sp$(LIBSUFFIX).a + Library libmath_sp$(LIBSUFFIX).a + Library libpxi_sp$(LIBSUFFIX).a + Library libexi_sp$(LIBSUFFIX).a + Library libi2c_sp$(LIBSUFFIX).a + Library libsdio_sp$(LIBSUFFIX).a + Library libpad_sp$(LIBSUFFIX).a + Library libscfg_sp$(LIBSUFFIX).a + Library libmcu_sp$(LIBSUFFIX).a + Library libcdc_sp$(LIBSUFFIX).a + Library libsnd_sp$(LIBSUFFIX).a + Library libsndex_sp$(LIBSUFFIX).a + Library libspi_sp$(LIBSUFFIX).a + Library libpm_sp.SYSMENU$(LIBSUFFIX).a + Library libtp_sp$(LIBSUFFIX).a + Library libtpex_sp$(LIBSUFFIX).a + Library libmic_sp$(LIBSUFFIX).a + Library libmicex_sp$(LIBSUFFIX).a + Library libnvram_sp$(LIBSUFFIX).a + Library librtc_sp$(LIBSUFFIX).a + Library libfatfs_sp$(LIBSUFFIX).a + Library libwl_sp$(LIBSUFFIX).a + Library libathdrv_sp$(LIBSUFFIX).a + Library libfs_sp$(LIBSUFFIX).a + Library libcard_sp$(LIBSUFFIX).a + Library libcamera_sp$(LIBSUFFIX).a + + Library libboot_sp$(LIBSUFFIX).a + Library libreboot_sp$(LIBSUFFIX).a + Library libhotsw_sp$(LIBSUFFIX).a + Library libreloc_info_sp$(LIBSUFFIX).a + Library libsysmenu_sp$(LIBSUFFIX).a + Library libsysmmcu_sp$(LIBSUFFIX).a + Library libaes_sp.firm.LTD.a + Library libdht_sp$(LIBSUFFIX).a + + Object * (.wram) + Object * (.ltdwram) + Object * (.rsvwram) + Object * (.main) + Object * (.ltdmain) +} diff --git a/build/components/jackal.TWL/wram_regs/Makefile b/build/components/jackal.TWL/wram_regs/Makefile new file mode 100644 index 00000000..d8f67eab --- /dev/null +++ b/build/components/jackal.TWL/wram_regs/Makefile @@ -0,0 +1,49 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: TwlFirm - tools - nandfirm-ds-launcher +# 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. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +TWL_PROC = ARM7 + +SUBDIRS = + +LINCLUDES = ../include + +#---------------------------------------------------------------------------- + +TARGET_BIN = wram_regs.rbin + +SRCS = \ + wram_regs.c \ + +#SRCDIR = # using default +#LCFILE = # using default + + +include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs + +INSTALL_DIR = . +INSTALL_TARGETS = $(BINDIR)/$(TARGET_BIN) + + +#---------------------------------------------------------------------------- + +do-build: $(TARGETS) + + +include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== diff --git a/build/components/jackal.TWL/wram_regs/wram_regs.c b/build/components/jackal.TWL/wram_regs/wram_regs.c new file mode 100644 index 00000000..882e0644 --- /dev/null +++ b/build/components/jackal.TWL/wram_regs/wram_regs.c @@ -0,0 +1,121 @@ +/*---------------------------------------------------------------------------* + Project: TwlIPL - wram_regs + File: wram_regs.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 + +#define COMPONENT_WRAM_A_OFS (HW_WRAM_A_LTD - HW_WRAM_BASE) +#define COMPONENT_WRAM_A_OFS_END (COMPONENT_WRAM_A_OFS + HW_WRAM_A_SIZE) +#define COMPONENT_WRAM_B_OFS (COMPONENT_WRAM_A_OFS - HW_WRAM_B_SIZE) +#define COMPONENT_WRAM_B_OFS_END (COMPONENT_WRAM_A_OFS) +#define COMPONENT_WRAM_C_OFS (COMPONENT_WRAM_B_OFS - HW_WRAM_C_SIZE * 2) +#define COMPONENT_WRAM_C_OFS_END (COMPONENT_WRAM_B_OFS) + +// MAP_TS_LTD for jackal +// WRAM-A Lock:ON, Master:ARM7, Enable:Slot0-3(256Kbytes), Address(7):0x037c0000-0x037fffff, Address(9):None +// WRAM-B Lock:ON, Master:ARM7, Enable:Slot5-7(256Kbytes), Address(7):0x03780000-0x037bffff, Address(9):None +// WRAM-C Lock:ON, Master:ARM7, Enable:Slot3-7(160Kbytes), Address(7):0x03758000-0x037bffff, Address(9):None +// WRAM-C Lock:OFF, Msster:ARM9, Enable:Slot0-2( 96Kbytes), Address(7):0x03700000-0x03717fff, Address(9):0x03700000-0x0317ffff +// WRAM-0 Master:ARM9, (16Kbytes), Address(7):0x03040000-0x03043fff, Address(9):0x03040000-0x03043fff +// WRAM-1 Master:ARM9, (16Kbytes), Address(7):0x03044000-0x03047fff, Address(9):0x03044000-0x03047fff + +// MAP_TS_LTD original +// WRAM-A Lock:ON, Master:ARM7, Enable:Slot0-3(256Kbytes), Address(7):0x037c0000-0x037fffff, Address(9):None +// WRAM-B Lock:OFF, Master:ARM9, Enable:Slot0-7(256Kbytes), Address(7):0x03740000-0x037bffff, Address(9):0x03740000-0x037bffff +// WRAM-C Lock:OFF, Msster:ARM9, Enable:Slot0-7(256Kbytes), Address(7):0x03700000-0x0373ffff, Address(9):0x03700000-0x0373ffff +// WRAM-0 Master:ARM9, (16Kbytes), Address(7):0x03040000-0x03043fff, Address(9):0x03040000-0x03043fff +// WRAM-1 Master:ARM9, (16Kbytes), Address(7):0x03044000-0x03047fff, Address(9):0x03044000-0x03047fff + +u32 HYENA_WramReg[0x30/sizeof(u32)] = +{ + // ARM9 + + // WRAM-A + REG_MI_MBK1_FIELD( + TRUE, MI_WRAM_OFFSET_192KB/2, MI_WRAM_ARM7, + TRUE, MI_WRAM_OFFSET_128KB/2, MI_WRAM_ARM7, + TRUE, MI_WRAM_OFFSET_64KB/2, MI_WRAM_ARM7, + TRUE, MI_WRAM_OFFSET_0KB/2, MI_WRAM_ARM7 + ), + // WRAM-B + REG_MI_MBK2_FIELD( + TRUE, MI_WRAM_OFFSET_96KB, MI_WRAM_ARM7, + TRUE, MI_WRAM_OFFSET_64KB, MI_WRAM_ARM7, + TRUE, MI_WRAM_OFFSET_32KB, MI_WRAM_ARM7, + TRUE, MI_WRAM_OFFSET_0KB, MI_WRAM_ARM7 + ), + REG_MI_MBK3_FIELD( + TRUE, MI_WRAM_OFFSET_224KB, MI_WRAM_ARM7, + TRUE, MI_WRAM_OFFSET_192KB, MI_WRAM_ARM7, + TRUE, MI_WRAM_OFFSET_160KB, MI_WRAM_ARM7, + TRUE, MI_WRAM_OFFSET_128KB, MI_WRAM_ARM7 + ), + // WRAM-C + REG_MI_MBK4_FIELD( + TRUE, MI_WRAM_OFFSET_96KB, MI_WRAM_ARM7, + TRUE, MI_WRAM_OFFSET_64KB, MI_WRAM_ARM9, + TRUE, MI_WRAM_OFFSET_32KB, MI_WRAM_ARM9, + TRUE, MI_WRAM_OFFSET_0KB, MI_WRAM_ARM9 + ), + REG_MI_MBK5_FIELD( + TRUE, MI_WRAM_OFFSET_224KB, MI_WRAM_ARM7, + TRUE, MI_WRAM_OFFSET_192KB, MI_WRAM_ARM7, + TRUE, MI_WRAM_OFFSET_160KB, MI_WRAM_ARM7, + TRUE, MI_WRAM_OFFSET_128KB, MI_WRAM_ARM7 + ), + + REG_MI_MBK6_FIELD( NULL >> 16, + MI_WRAM_IMAGE_256KB, + NULL >> 16 + ), + REG_MI_MBK7_FIELD( NULL >> 15, + MI_WRAM_IMAGE_256KB, + NULL >> 15 + ), + REG_MI_MBK8_FIELD( ( COMPONENT_WRAM_C_OFS_END + 0x18000 ) >> 15, + MI_WRAM_IMAGE_128KB, + COMPONENT_WRAM_C_OFS >> 15 + ), + + // ARM7 + REG_MI_MBK6_FIELD( COMPONENT_WRAM_A_OFS_END >> 16, + MI_WRAM_IMAGE_256KB, + COMPONENT_WRAM_A_OFS >> 16 + ), + REG_MI_MBK7_FIELD( COMPONENT_WRAM_B_OFS_END >> 15, + MI_WRAM_IMAGE_256KB, + COMPONENT_WRAM_B_OFS >> 15 + ), + REG_MI_MBK8_FIELD( COMPONENT_WRAM_C_OFS_END >> 15, + MI_WRAM_IMAGE_256KB, + COMPONENT_WRAM_C_OFS >> 15 + ), + + // WRAM Lock + (u32)( + (0x00 << 0) | + (0x00 << 8) | + (0x00 << 16) | + + // WRAM-0/1 + (0 << 24) | + + // VRAM-C + (7 << 26) | + // VRAM-D + (7 << 29) + ), +}; + diff --git a/build/libraries_sysmenu/sharedFont/ARM9/Makefile b/build/libraries_sysmenu/sharedFont/ARM9/Makefile index 58f7aea1..90eff0f8 100644 --- a/build/libraries_sysmenu/sharedFont/ARM9/Makefile +++ b/build/libraries_sysmenu/sharedFont/ARM9/Makefile @@ -35,6 +35,10 @@ include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs MACRO_FLAGS += -DUSE_FONT_WRAM_LOAD +ifeq ($(DEFAULT_COMP_ARM7),hyena) +MACRO_FLAGS += -DUSE_HYENA_COMPONENT +endif + INSTALL_TARGETS = $(TARGETS) INSTALL_DIR = $(SYSMENU_INSTALL_LIBDIR) diff --git a/build/libraries_sysmenu/sysmenu/ARM9/Makefile b/build/libraries_sysmenu/sysmenu/ARM9/Makefile index 9761b634..a15226f1 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/Makefile +++ b/build/libraries_sysmenu/sysmenu/ARM9/Makefile @@ -46,6 +46,14 @@ ifeq ($(DO_NOT_SHOW_LAUNCHER),TRUE) MACRO_FLAGS += -DDO_NOT_SHOW_LAUNCHER endif +ifeq ($(DISABLE_INITIAL_SETTINGS),TRUE) +MACRO_FLAGS += -DDISABLE_INITIAL_SETTINGS +endif + +ifeq ($(DEFAULT_COMP_ARM7),hyena) +MACRO_FLAGS += -DUSE_HYENA_COMPONENT +endif + include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs INSTALL_TARGETS = $(TARGETS) diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c index f31ad5a2..08ed577e 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -46,9 +46,15 @@ #define AUTH_KEY_BUFFER_LEN 128 #define MB_AUTH_SIGN_SIZE (128) /* digital sign size */ -#define WRAM_SLOT_FOR_FS 5 +#define THREAD_PRIO_FS_WRAM 3 #define WRAM_SIZE_FOR_FS MI_WRAM_SIZE_96KB +#ifdef USE_HYENA_COMPONENT +#define WRAM_SLOT_FOR_FS 5 +#else +#define WRAM_SLOT_FOR_FS 0 +#endif + #include #define DS_HASH_TABLE_SIZE (256*1024) @@ -422,7 +428,7 @@ static BOOL MakeTitleListMakerInfoFromTitleID( TitleListMakerInfo *info, OSTitle { int l; NAMTitleInfo naminfo; - // [TODO:]この関数で得られる情報は無検証なので改ざんの可能性があるが、これで良いか + // この関数で得られる情報は無検証なので改ざんの可能性があるが、メーカーコードのみの判定なので、速度を優先する。(2008.06.20吉岡) // (でもFastつけないと一回300msぐらいかかる) NAM_ReadTitleInfoFast( &naminfo, titleID ); for(l=0;l