diff --git a/build/systemMenu_RED/NandInitializerProduction/ARM7.TWL/Makefile b/build/systemMenu_RED/NandInitializerProduction/ARM7.TWL/Makefile index 95307158..acf32289 100644 --- a/build/systemMenu_RED/NandInitializerProduction/ARM7.TWL/Makefile +++ b/build/systemMenu_RED/NandInitializerProduction/ARM7.TWL/Makefile @@ -26,7 +26,8 @@ TWL_NO_STD_PCHDR = True ifndef TWLSDK_NOCRYPTO #---------------------------------------------------------------------------- -SRCS = main.c \ +SRCS = crt0.SCFG_NOLOCK.c \ + main.c \ kami_pxi.c \ formatter.c \ nvram_misc.c @@ -38,7 +39,7 @@ LCFILE_SPEC = ../../NandInitializerRed/ARM7.TWL/$(TARGET_NAME).lsf LCFILE_TEMPLATE = ../../NandInitializerRed/ARM7.TWL/$(TARGET_NAME).lcf.template LDRES_TEMPLATE = ../../NandInitializerRed/ARM7.TWL/$(TARGET_NAME).response.template -CRT0_O = crt0.SCR.TWL.o +CRT0_O = crt0.SCFG_NOLOCK.o # スタック不足防止の為、インライン展開せずにコンパイルする CCFLAGS_OPT = -O4 -inline off @@ -46,21 +47,29 @@ CCFLAGS_OPT = -O4 -inline off #---------------------------------------------------------------------------- include $(TWLSDK_ROOT)/build/buildtools/commondefs -MACRO_FLAGS += -DSDK_ARM7COMP_LTD -DSDK_SEA +MACRO_FLAGS += -DSDK_ARM7COMP_LTD -DSDK_SEA -DSDK_NOINIT 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' LINCLUDES = $(ROOT)/build/libraries/spi/ARM7/include \ + $(ROOT)/build/libraries/os/common/include \ + $(ROOT)/build/libraries/init/common/include \ + $(TWL_IPL_RED_ROOT)/include \ ../../NandInitializerRed/common/include \ ../../NandInitializerRed/ARM7.TWL/include SRCDIR = ../../NandInitializerRed/ARM7.TWL/src +LLIBRARY_DIRS += $(TWL_IPL_RED_ROOT)/lib/ARM7-TS/$(TWL_BUILD_DIR) \ + ./obj/ARM7-TS.LTD/$(TWL_BUILD_DIR) + LLIBRARIES += libwl_sp$(TWL_LIBSUFFIX).a \ libsdio_sp$(TWL_LIBSUFFIX).a \ libathdrv_sp$(TWL_LIBSUFFIX).a \ libwpa_sp$(TWL_LIBSUFFIX).a \ + libhotsw_sp$(TWL_LIBSUFFIX).a \ + libreloc_info_sp$(TWL_LIBSUFFIX).a LDEPENDS_NEF = $(TWL_LIBS) $(LLIBRARIES) diff --git a/build/systemMenu_RED/NandInitializerRed/ARM7.TWL/Makefile b/build/systemMenu_RED/NandInitializerRed/ARM7.TWL/Makefile index e7696f5a..0d12c988 100644 --- a/build/systemMenu_RED/NandInitializerRed/ARM7.TWL/Makefile +++ b/build/systemMenu_RED/NandInitializerRed/ARM7.TWL/Makefile @@ -26,7 +26,8 @@ TWL_NO_STD_PCHDR = True ifndef TWLSDK_NOCRYPTO #---------------------------------------------------------------------------- -SRCS = main.c \ +SRCS = crt0.SCFG_NOLOCK.c \ + main.c \ kami_pxi.c \ formatter.c \ nvram_misc.c @@ -38,7 +39,7 @@ LCFILE_SPEC = $(TARGET_NAME).lsf LCFILE_TEMPLATE = $(TARGET_NAME).lcf.template LDRES_TEMPLATE = $(TARGET_NAME).response.template -CRT0_O = crt0.SCR.TWL.o +CRT0_O = crt0.SCFG_NOLOCK.o # スタック不足防止の為、インライン展開せずにコンパイルする CCFLAGS_OPT = -O4 -inline off @@ -46,17 +47,26 @@ CCFLAGS_OPT = -O4 -inline off #---------------------------------------------------------------------------- include $(TWLSDK_ROOT)/build/buildtools/commondefs -MACRO_FLAGS += -DSDK_ARM7COMP_LTD -DSDK_SEA +MACRO_FLAGS += -DSDK_ARM7COMP_LTD -DSDK_SEA -DSDK_NOINIT 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' -LINCLUDES = $(ROOT)/build/libraries/spi/ARM7/include ../common/include +LINCLUDES += $(ROOT)/build/libraries/spi/ARM7/include \ + $(ROOT)/build/libraries/os/common/include \ + $(TWL_IPL_RED_ROOT)/include \ + ../common/include \ + $(ROOT)/build/libraries/init/common/include + +LLIBRARY_DIRS += $(TWL_IPL_RED_ROOT)/lib/ARM7-TS/$(TWL_BUILD_DIR) \ + ./obj/ARM7-TS.LTD/$(TWL_BUILD_DIR) LLIBRARIES += libwl_sp$(TWL_LIBSUFFIX).a \ libsdio_sp$(TWL_LIBSUFFIX).a \ libathdrv_sp$(TWL_LIBSUFFIX).a \ - libwpa_sp$(TWL_LIBSUFFIX).a + libwpa_sp$(TWL_LIBSUFFIX).a \ + libhotsw_sp$(TWL_LIBSUFFIX).a \ + libreloc_info_sp$(TWL_LIBSUFFIX).a LDEPENDS_NEF = $(TWL_LIBS) $(LLIBRARIES) diff --git a/build/systemMenu_RED/NandInitializerRed/ARM7.TWL/armadillo.lsf b/build/systemMenu_RED/NandInitializerRed/ARM7.TWL/armadillo.lsf index c8ee8fec..f9d28f17 100644 --- a/build/systemMenu_RED/NandInitializerRed/ARM7.TWL/armadillo.lsf +++ b/build/systemMenu_RED/NandInitializerRed/ARM7.TWL/armadillo.lsf @@ -78,6 +78,8 @@ Ltdautoload SCRWRAM Library libfs_sp$(LIBSUFFIX).a Library libcard_sp$(LIBSUFFIX).a Library libcamera_sp$(LIBSUFFIX).a + Library libhotsw_sp$(LIBSUFFIX).a + Library libreloc_info_sp$(LIBSUFFIX).a Object * (.wram) Object * (.ltdwram) diff --git a/build/systemMenu_RED/NandInitializerRed/ARM7.TWL/src/crt0.SCFG_NOLOCK.c b/build/systemMenu_RED/NandInitializerRed/ARM7.TWL/src/crt0.SCFG_NOLOCK.c new file mode 100644 index 00000000..9d5e531b --- /dev/null +++ b/build/systemMenu_RED/NandInitializerRed/ARM7.TWL/src/crt0.SCFG_NOLOCK.c @@ -0,0 +1,790 @@ +/*---------------------------------------------------------------------------* + Project: TwlSDK - libraries - init - ARM7.TWL + File: crt0.SCR.c + + Copyright 2008 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Date:: $ + $Rev$ + $Author$ + *---------------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include +#include +#ifndef SDK_FINALROM +#include +#endif +#include "boot_sync.h" + +/*---------------------------------------------------------------------------*/ +void _start(void); +void _start_AutoloadDoneCallback(void* argv[]); + +/*---------------------------------------------------------------------------* + 外部参照 + *---------------------------------------------------------------------------*/ +/* リンカスクリプトにより定義されるシンボル参照 */ +extern void SDK_AUTOLOAD_LIST(void); +extern void SDK_AUTOLOAD_LIST_END(void); +extern void SDK_AUTOLOAD_START(void); +extern void SDK_STATIC_START(void); +extern void SDK_STATIC_BSS_START(void); +extern void SDK_STATIC_BSS_END(void); +extern void SDK_LTDAUTOLOAD_LIST(void); +extern void SDK_LTDAUTOLOAD_LIST_END(void); +extern void SDK_LTDAUTOLOAD_START(void); +extern void SDK_WRAM_ARENA_LO(void); + +/* 外部関数参照 */ +extern void OS_IrqHandler(void); +#ifndef SDK_NOINIT +extern void _fp_init(void); +extern void __call_static_initializers(void); +#endif + +/*---------------------------------------------------------------------------* + 定数定義 + *---------------------------------------------------------------------------*/ +#define SDK_NITROCODE_LE 0x2106c0de +#define SDK_NITROCODE_BE 0xdec00621 +#define SDK_TWLCODE_LE 0x6314c0de +#define SDK_TWLCODE_BE 0xdec01463 + +/* .rodata セクションに配置するロードに必要な情報 */ +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, +}; + +void* const _start_LtdModuleParams[] = +{ + (void*)SDK_LTDAUTOLOAD_LIST, + (void*)SDK_LTDAUTOLOAD_LIST_END, + (void*)SDK_LTDAUTOLOAD_START, + (void*)0, + (void*)SDK_TWLCODE_BE, + (void*)SDK_TWLCODE_LE, +}; + +/*---------------------------------------------------------------------------* + 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 ; ハンドシェイク完了 */ +}; + +/*---------------------------------------------------------------------------* + Name: Stop + Description: プログラムを停止する。 + Arguments: なし。 + Returns: なし。 + *---------------------------------------------------------------------------*/ +static const u32 microcode_Stop[2] = +{ + 0xef000006, /* @1: swi #6 ; SVC_Halt */ + 0xeafffffd /* b @1 ; ループ */ +}; + +/*---------------------------------------------------------------------------* + Name: GotoMain + Description: ARM9 に特定の状態になったことを伝えた上で、Main 関数へジャンプ + する。同時に指定バッファの 0 クリアを行う。スタック内で動作させ + ることを想定している為、スタックを一切使用しない。 + Arguments: r0 - 0 クリアするバッファの先頭アドレス。 + 4 バイトアラインされたアドレスである必要がある。 + r1 - 上位 8 bit: ARM9 に伝えるフェーズ番号。 + 下位 24 bit: 0 クリアするバッファのサイズ。 + 4 の倍数である必要がある。 + r2 - 同期用フェーズ管理変数へのポインタ。 + r3 - Main 関数のポインタ。Main 関数が Thumb コードである場合 + には、bx 命令でジャンプするため最下位ビットが 1 になって + いる必要がある。 + Returns: なし。 + *---------------------------------------------------------------------------*/ +static const u32 microcode_GotoMain[10] = +{ + 0xe59fc01c, /* @1: ldr r12, [pc, #28] ; 下位 24 bit マスクを用意 */ + 0xe111000c, /* tst r1, r12 ; クリアバッファ残サイズをチェック */ + 0xe3a0c000, /* mov r12, #0 ; クリア用変数を用意 */ + 0x1480c004, /* strne r12, [r0], #4 ; 4 バイトクリア */ + 0x12411004, /* subne r1, r1, #4 ; クリアバッファ残サイズ -= 4 */ + 0x1afffff9, /* bne @1 ; 残サイズが 0 になるまでループ */ + 0xe1a01c21, /* mov r1, r1, LSR #24 ; フェーズ管理変数の更新値を用意 */ + 0xe1c210b0, /* strh r1, [r2] ; フェーズ管理変数を更新 */ + 0xe12fff13, /* bx r3 ; Main 関数へジャンプ */ + 0x00fffffc /* 0x00fffffc */ +}; + + +/*---------------------------------------------------------------------------* + 内部関数プロトタイプ + *---------------------------------------------------------------------------*/ +static void INITi_CheckSysConfig(void); +static void INITi_DetectMainMemorySize(void); +static void INITi_Stop(void); +static void INITi_DoAutoload(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); + +/*---------------------------------------------------------------------------*/ +#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] + + /* SCFG 設定を確認 */ + bl INITi_CheckSysConfig + + /* ランチャーから渡された情報を退避 */ + ldr r3, =SDK_WRAM_ARENA_LO + sub r2, r3, #0x40 + ldr r1, =HW_LAUNCHER_DELIVER_PARAM_BUF +@001: + cmp r2, r3 + ldrlt r0, [r1], #4 + strlt r0, [r2], #4 + blt @001 + + /* ハンドシェイク用マイクロコードを専用 WRAM にコピー */ + ldr r1, =microcode_ShakeHand + ldr r2, =HW_PRV_WRAM + add r3, r2, #40 // sizeof(microcode_ShakeHand) +@002: ldr r0, [r1], #4 + str r0, [r2], #4 + cmp r2, r3 + blt @002 + + /* 専用 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 IRQ stack check code + mov r0, #HW_PSR_SYS_MODE // System mode + msr cpsr_csfx, r0 + sub sp, r1, #4 // 4 bytes for SYS 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 + + /* 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 + + /* メインメモリサイズを調査 */ + bl INITi_DetectMainMemorySize + +#ifndef SDK_FINALROM + /* デバッグ出力ウィンドウを設定 */ + 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 + + /* IRQ 割込みベクタ設定 */ + 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 + +@0f0: + /* Main 関数へのジャンプ用マイクロコードをスタックの底にコピー */ + ldr r1, =microcode_GotoMain + sub r2, sp, #40 + mov r3, sp +@0f1: cmp r2, r3 + ldrlt r0, [r1], #4 + strlt r0, [r2], #4 + blt @0f1 + + /* マイクロコードを経由して Main 関数へジャンプ */ + ldr r0, =SDK_STATIC_START + bic r0, r0, #0x00000003 + ldr r1, =SDK_STATIC_BSS_END + sub r1, r1, r0 + add r1, r1, #3 + bic r1, r1, #0x00000003 + bic r1, r1, #0xff000000 + mov r2, #BOOT_SYNC_PHASE_4 + mov r2, r2, LSL #24 + orr r1, r1, r2 + ldr r2, =HW_BOOT_SYNC_PHASE + ldr r3, =TwlSpMain + ldr lr, =HW_RESET_VECTOR + sub r12, sp, #40 + bx r12 + /* never return */ +} + +/*---------------------------------------------------------------------------* + 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: INITi_CheckSysConfig + Description: SCFG 関連 I/O レジスタの内容を確認する。 + A7-SCFG ブロックがアクセス有効な場合には、ローダーが行う設定処 + 理を代行した上でアクセスを無効化する。 + ARM7 専用 WRAM 内にローダーが展開している I/O レジスタ情報を確 + 認した上でメインメモリ上の共有領域にコピーする。 + Arguments: なし。 + Returns: なし。 + *---------------------------------------------------------------------------*/ +static asm void +INITi_CheckSysConfig(void) +{ + /* A7-SCFG のアクセス可否判定 */ + ldr r1, =REG_EXT_ADDR + ldr r0, [r1] + ldr r2, =HW_PRV_WRAM_SYSRV + tst r0, #REG_SCFG_EXT_CFG_MASK + beq @invalid + +@valid: + /* ARM7 Secure-ROM 切り離し */ + ldr r1, =REG_A7ROM_ADDR + ldrb r0, [r1] + orr r0, r0, #REG_SCFG_A7ROM_SEC_MASK + strb r0, [r1] + + /* ARM9 Secure-ROM 切り離し */ + ldr r1, =REG_A9ROM_ADDR + ldrb r0, [r1] + orr r0, r0, #REG_SCFG_A9ROM_SEC_MASK + strb r0, [r1] + + /* NITRO 無線を有効化 */ + ldr r1, =REG_WL_ADDR + ldrh r0, [r1] + orr r0, r0, #REG_SCFG_WL_OFFB_MASK + strh r0, [r1] + + /* ROM 設定、NITRO 無線設定、ボンディングオプション情報を WRAM に展開 */ + ldr r3, =REG_OP_ADDR // SCFG-OP + ldrb r1, [r3] + and r0, r1, #(REG_SCFG_OP_OP1_MASK | REG_SCFG_OP_OP0_MASK) + ldr r3, =REG_A9ROM_ADDR // SCFG-ROM:0~7 + ldrb r1, [r3] + and r3, r1, #(REG_SCFG_A9ROM_RSEL_MASK | REG_SCFG_A9ROM_SEC_MASK) + orr r0, r0, r3, LSL #(HWi_WSYS08_ROM_ARM9RSEL_SHIFT - REG_SCFG_A9ROM_RSEL_SHIFT) + ldr r3, =REG_A7ROM_ADDR // SCFG-ROM:8~15 + ldrb r1, [r3] + and r3, r1, #(REG_SCFG_A7ROM_RSEL_MASK | REG_SCFG_A7ROM_FUSE_MASK) + orr r0, r0, r3, LSL #(HWi_WSYS08_ROM_ARM7RSEL_SHIFT - REG_SCFG_A7ROM_RSEL_SHIFT) + ldr r3, =REG_WL_ADDR // SCFG-WL + ldrb r1, [r3] + and r3, r1, #REG_SCFG_WL_OFFB_MASK + orr r0, r0, r3, LSL #(HWi_WSYS08_WL_OFFB_SHIFT - REG_SCFG_WL_OFFB_SHIFT) + strb r0, [r2, #HWi_WSYS08_WRAMOFFSET] + + /* 各新規ブロックへクロックを供給 */ + ldr r1, =REG_CLK_ADDR + ldrh r0, [r1] + ldr r3, =REG_SCFG_CLK_SNDMCLK_MASK | REG_SCFG_CLK_WRAMHCLK_MASK | REG_SCFG_CLK_AESHCLK_MASK | REG_SCFG_CLK_SD2HCLK_MASK | REG_SCFG_CLK_SD1HCLK_MASK + orr r0, r0, r3 + strh r0, [r1] + + /* JTAG 情報を WRAM に展開 */ + ldr r3, =REG_JTAG_ADDR // SCFG-JTAG + ldrh r1, [r3] + and r0, r1, #(REG_SCFG_JTAG_CPUJE_MASK | REG_SCFG_JTAG_ARM7SEL_MASK) + and r3, r1, #REG_SCFG_JTAG_DSPJE_MASK + orr r0, r0, r3, LSR #(REG_SCFG_JTAG_DSPJE_SHIFT - HWi_WSYS09_JTAG_DSPJE_SHIFT) + strb r0, [r2, #HWi_WSYS09_WRAMOFFSET] + + /* 各拡張機能を有効化 */ + ldr r1, =REG_EXT_ADDR // SCFG_EXT + ldr r0, [r1] + ldr r3, =REG_SCFG_EXT_WRAM_MASK | REG_SCFG_EXT_GPIO_MASK | REG_SCFG_EXT_I2C_MASK | REG_SCFG_EXT_I2S_MASK | REG_SCFG_EXT_MIC_MASK | REG_SCFG_EXT_SD2_MASK | REG_SCFG_EXT_SD1_MASK | REG_SCFG_EXT_AES_MASK | REG_SCFG_EXT_DMAC_MASK + orr r0, r0, r3 + orr r0, r0, #(REG_SCFG_EXT_DSEL_MASK | REG_SCFG_EXT_INTC_MASK) + bic r0, r0, #REG_SCFG_EXT_MC_B_MASK + str r0, [r1] + + /* 各拡張機能の制御設定内容を WRAM に展開 */ + str r0, [r2, #HWi_WSYS04_WRAMOFFSET] + + /* メモリーカード I/F のスロット選択 */ + ldr r1, =REG_MC1_ADDR // SCFG_MC1 + ldr r0, [r1] + bic r0, r0, #REG_MI_MC1_SWP_MASK + str r0, [r1] + + /* WRAM-A/B/C が ARM7 に割り当たっていることを確認 */ + ldr r1, =REG_MBK1_ADDR + ldr r0, [r1] + ldr r3, =0x8d898581 + cmp r0, r3 + blne INITi_Stop + ldr r1, =REG_MBK2_ADDR + ldr r0, [r1] + ldr r3, =0x8d898581 + cmp r0, r3 + blne INITi_Stop + ldr r1, =REG_MBK3_ADDR + ldr r0, [r1] + ldr r3, =0x9d999591 + cmp r0, r3 + blne INITi_Stop + ldr r1, =REG_MBK4_ADDR + ldr r0, [r1] + ldr r3, =0x8d898581 + cmp r0, r3 + blne INITi_Stop + ldr r1, =REG_MBK5_ADDR + ldr r0, [r1] + ldr r3, =0x9d999591 + cmp r0, r3 + blne INITi_Stop + + /* WRAM-A/B/C のメモリマップを設定 */ + ldr r1, =REG_MBK6_ADDR + ldr r0, =0x080037c0 + str r0, [r1] + ldr r1, =REG_MBK7_ADDR + ldr r0, =0x07c03780 + str r0, [r1] + ldr r1, =REG_MBK8_ADDR + ldr r0, =0x07803740 + str r0, [r1] + ldr r1, =REG_MBK9_ADDR + ldr r0, =0x00ffff0f + str r0, [r1] + + /* A7-SCFG ブロックへのアクセスを無効化 */ + ldr r1, =REG_EXT_ADDR + ldr r0, [r1] +/* bic r0, r0, #REG_SCFG_EXT_CFG_MASK */ + str r0, [r1] + +@invalid: + /* ROM 設定、NITRO 無線設定内容を確認 */ + ldrb r0, [r2, #HWi_WSYS08_WRAMOFFSET] + and r0, r0, #(HWi_WSYS08_ROM_ARM7RSEL_MASK | HWi_WSYS08_ROM_ARM9RSEL_MASK | HWi_WSYS08_ROM_ARM9SEC_MASK) + cmp r0, #HWi_WSYS08_ROM_ARM9SEC_MASK + blne INITi_Stop + + /* SCFG レジスタ設定情報を共有領域にコピー */ + 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: メインメモリサイズを調査する。 + 調査結果は (u16*)HW_MMEMCHECER_SUB に格納される。 + 格納される値は [OS_CONSOLE_SIZE_16MB|OS_CONSOLE_SIZE_32B] + NOTE: プラットフォームが NITRO の場合は考慮していない。 + Arguments: なし。 + Returns: なし。 + *---------------------------------------------------------------------------*/ +#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) +{ + ldr r2, =HW_MMEMCHECKER_SUB + add r3, r2, #OSi_IMAGE_DIFFERENCE2 + mov r0, #OS_CONSOLE_SIZE_16MB + + /* OSi_CHECKNUM1 (0x55) 書き込みテスト */ + mov r1, #OSi_CHECKNUM1 + strb r1, [r3] + + ldr r2, =OSi_100usWAIT +@1 subs r2, r2, #4 + bcs @1 + + ldrb r1, [r3] + cmp r1, #OSi_CHECKNUM1 + bne @check_smix + + /* OSi_CHECKNUM2 (0xaa) を 書き込みテスト */ + mov r1, #OSi_CHECKNUM2 + strb r1, [r3] + + ldr r2, =OSi_100usWAIT +@2 subs r2, r2, #4 + bcs @2 + + ldrb r1, [r3] + cmp r1, #OSi_CHECKNUM2 + moveq r0, #OS_CONSOLE_SIZE_32MB + +@check_smix: + /* SMIX レジスタを調査 */ + 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 + strb r0, [r2] + bx lr +} + +/*---------------------------------------------------------------------------* + Name: INITi_Stop + Description: プログラムを停止する。ARM7 専用 WRAM に Halt を繰り返すループ + 関数をコピーし、コピーした関数を実行する。 + Arguments: なし。 + Returns: なし。 + *---------------------------------------------------------------------------*/ +static asm void +INITi_Stop(void) +{ + ldr r1, =microcode_Stop + ldr r2, =HW_PRV_WRAM + add r3, r2, #8 // sizeof(microcode_Stop) +@copy_loop: + ldr r0, [r1], #4 + str r0, [r2], #4 + cmp r2, r3 + blt @copy_loop + +@stop_loop: + ldr r0, =HW_PRV_WRAM + mov lr, pc + bx r0 + b @stop_loop + /* never return */ +} + +/*---------------------------------------------------------------------------* + Name: INITi_DoAutoload + Description: リンク情報に沿って、各オートロードブロックの固定データ部の展開 + 及び変数部の 0 クリアを行う。 + NITRO 互換オートロードセグメントは存在せず、TWL 専用セグメント + のみが存在するという前提。 + Arguments: なし。 + Returns: なし。 + *---------------------------------------------------------------------------*/ + +static asm void +INITi_DoAutoload(void) +{ + stmfd sp!, {lr} + + /* オートロードを実施 */ +@000: + 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_LTDAUTOLOAD_START +@001: + cmp r12, r3 + bge @010 + /* 固定セクション */ + 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 +#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 = sizeo of bss section + bl INITi_Fill32 + ldmfd sp!, {r1} + b @001 + + /* オートロードリスト・オートロード元バッファをクリア */ +@010: + ldr r1, =_start_LtdModuleParams + ldr r12, [r1] // r12 = SDK_LTDAUTOLOAD_LIST + ldr r3, [r1, #4] // r3 = SDK_LTDAUTOLOAD_LIST_END + ldr r0, [r1, #8] // r0 = SDK_LTDAUTOLOAD_START +@011: + cmp r12, r3 + bge @0f0 + mov r1, #0 // r1 = clear value + str r1, [r12], #4 + ldr r2, [r12] // r2 = size of fixed section + str r1, [r12], #4 + str r1, [r12], #4 + str r1, [r12], #4 + bl INITi_Fill32 + b @011 + +@0f0: + /* オートロード完了コールバック呼び出し */ + ldr r0, =_start_ModuleParams + ldr r1, =_start_LtdModuleParams + ldmfd sp!, {lr} + b _start_AutoloadDoneCallback +} + +#ifndef SDK_NOINIT + +static asm void +/*---------------------------------------------------------------------------* + 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 + stmfd sp!, {r1} + mov lr, pc + bx r0 + ldmfd sp!, {r1} + /* 一旦呼び出したポインタはゼロクリア (IRQスタックを間借りしている為) */ + mov r0, #0 + str r0, [r1], #4 + b @001 +@002: + ldmia sp!, {lr} + bx lr +} +#endif + +/*---------------------------------------------------------------------------* + 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/systemMenu_RED/NandInitializerRed/ARM7.TWL/src/main.c b/build/systemMenu_RED/NandInitializerRed/ARM7.TWL/src/main.c index c63a1e10..e6363f00 100644 --- a/build/systemMenu_RED/NandInitializerRed/ARM7.TWL/src/main.c +++ b/build/systemMenu_RED/NandInitializerRed/ARM7.TWL/src/main.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -35,6 +36,7 @@ #include #include "nvram_sp.h" #include "kami_pxi.h" +#include /*---------------------------------------------------------------------------* 定数定義 @@ -48,6 +50,7 @@ #define THREAD_PRIO_FATFS 8 #define THREAD_PRIO_NWM_COMMAND 9 #define THREAD_PRIO_NWM_WPA 10 +#define THREAD_PRIO_HOTSW 11 #define THREAD_PRIO_RTC 12 #define THREAD_PRIO_SNDEX 14 #define THREAD_PRIO_FS 15 @@ -61,6 +64,9 @@ #define DMA_NO_FATFS FATFS_DMA_4 // = 0 #define DMA_NO_NWM 3 +/* カードチャタリングカウンタ */ +#define CHATTERING_COUNTER 0x1988 // 100ms分 (0x1988 * 15.3us = 100000us) + /*---------------------------------------------------------------------------* 内部関数定義 *---------------------------------------------------------------------------*/ @@ -137,6 +143,16 @@ TwlSpMain(void) // WVR_Begin(heapHandle); // NITRO 無線 SPI_Init(THREAD_PRIO_SPI); + // チャッタリングカウンタの値を設定 + reg_MI_MC1 = (u32)((reg_MI_MC1 & ~REG_MI_MC1_CC_MASK) | + (CHATTERING_COUNTER << REG_MI_MC1_CC_SHIFT)); + + // チャタリングカウンタ分待つことによりCDETが0になる + OS_SpinWait( OS_MSEC_TO_CPUCYC(200) ); + + // カードスロット1電源ON + HOTSWi_TurnCardPowerOn(1); + /////////////// #ifndef NAND_INITIALIZER_LIMITED_MODE KamiPxiInit(); @@ -290,7 +306,7 @@ InitializeCdc(void) { OSThread thread; u32 stack[18]; - +/* // ランチャー経由で起動した場合はCODECは既に初期化されているため // コンポーネントがCODECを初期化する必要はありません。 // 将来的にはバッサリと切る必要がありますが、 @@ -299,7 +315,7 @@ InitializeCdc(void) { return; } - +*/ /* ダミースレッド作成 */ OS_CreateThread(&thread, DummyThread, NULL, (void*)((u32)stack + (sizeof(u32) * 18)), sizeof(u32) * 18, OS_THREAD_PRIORITY_MAX); diff --git a/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/main.rsf b/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/main.rsf index 3fe44a04..43ce73e5 100644 --- a/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/main.rsf +++ b/build/systemMenu_RED/NandInitializerRed/ARM9.TWL/main.rsf @@ -151,6 +151,11 @@ Property # CodecMode $(MAKEROM_CODEC_MODE) + # + # SCFG: scfg lock [TRUE/FALSE] + # + LockSCFG FALSE + # # DisableDebug :最終ROMでは、実行時にデバッグできないようにTRUEにする必要があります。 #