diff --git a/build/components/hyena.TWL/Makefile b/build/components/hyena.TWL/Makefile index b691a6df..f13f1595 100644 --- a/build/components/hyena.TWL/Makefile +++ b/build/components/hyena.TWL/Makefile @@ -1,6 +1,6 @@ #! make -f #---------------------------------------------------------------------------- -# Project: TwlSDK - components - hyena.TWL +# Project: TwlIPL # File: Makefile # # Copyright 2007 Nintendo. All rights reserved. @@ -41,7 +41,10 @@ include $(TWLIPL_ROOT)/build/buildtools/commondefs #MACRO_FLAGS += -DSDK_ARM7COMP_LTD -MAKELCF_FLAGS += -DADDRESS_LTDWRAM='0x037c0000' -DCRT0_O='$(CRT0_O)' +MAKELCF_FLAGS += -DADDRESS_LTDWRAM='0x037c0000' \ + -DADDRESS_FLXMAIN='0x02280000' \ + -DADDRESS_BOOTCORE='0x0380f100' \ + -DCRT0_O='$(CRT0_O)' MAKELCF_FLAGS += -DISDBG_LIBS='$(ISDBG_LIBS)' #-------------------------------- diff --git a/build/components/hyena.TWL/hyena.lcf.template b/build/components/hyena.TWL/hyena.lcf.template index dcfbe8f0..42432695 100644 --- a/build/components/hyena.TWL/hyena.lcf.template +++ b/build/components/hyena.TWL/hyena.lcf.template @@ -1,6 +1,6 @@ #--------------------------------------------------------------------------- -# Project: TwlSDK - components - racoon.TWL -# File: racoon.lcf.template +# Project: TwlIPL +# File: hyena.lcf.template # # Copyright 2007 Nintendo. All rights reserved. # diff --git a/build/components/hyena.TWL/hyena.lsf b/build/components/hyena.TWL/hyena.lsf index 9dc91ebb..61501403 100644 --- a/build/components/hyena.TWL/hyena.lsf +++ b/build/components/hyena.TWL/hyena.lsf @@ -1,6 +1,6 @@ #---------------------------------------------------------------------------- -# Project: TwlSDK - components - racoon.TWL -# File: racoon.lsf +# Project: TwlIPL +# File: hyena.lsf # # Copyright 2007 Nintendo. All rights reserved. # @@ -20,7 +20,7 @@ #-------- Static $(TARGET_NAME) { - Address 0x02280000 + Address $(ADDRESS_FLXMAIN) Library $(CRT0_O) StackSize 1024 1024 } @@ -55,8 +55,7 @@ Autoload WRAM librtc_sp.TWL$(CODEGEN).a \ libwvr_sp.TWL$(CODEGEN).a \ libaes_sp.TWL$(CODEGEN).a \ - libboot_sp.TWL$(CODEGEN).a \ - $(ISDBG_LIBS) + $(ISTD_LIBS) Library libsdio_hcd_twl.TWL$(CODEGEN).a \ libsdio_busdriver.TWL$(CODEGEN).a \ @@ -68,6 +67,13 @@ Autoload WRAM Object $(OBJDIR)/main.o } +Autoload BOOT_CORE +{ + Address $(ADDRESS_BOOTCORE) + + Library libboot_sp.TWL$(CODEGEN).a +} + #-------- Ltdautoload LTDMAIN { diff --git a/build/components/hyena.TWL/src/main.c b/build/components/hyena.TWL/src/main.c index cb535b48..522181a3 100644 --- a/build/components/hyena.TWL/src/main.c +++ b/build/components/hyena.TWL/src/main.c @@ -83,7 +83,14 @@ TwlSpMain(void) PrintDebugInfo(); // ヒープ領域設定 - OS_SetSubPrivArenaHi( (void*)0x02380000 ); // メモリ配置をいじっているので、アリーナHiも変更しないとダメ!! + { + void *wram = OS_GetWramSubPrivArenaHi(); + void *mmem = OS_GetSubPrivArenaHi(); + OS_SetSubPrivArenaHi( (void*)0x02380000 ); // メモリ配置をいじっているので、アリーナHiも変更しないとダメ!! + OS_SetWramSubPrivArenaHi( (void*)BOOTCORE_ARM7_ADDR ); + OS_TPrintf( "MMEM SUBPRV ARENA HI : %08x -> %08x\n", mmem, OS_GetSubPrivArenaHi() ); + OS_TPrintf( "WRAM SUBPRV ARENA HI : %08x -> %08x\n", wram, OS_GetWramSubPrivArenaHi() ); + } heapHandle = InitializeAllocateSystem(); // ボタン入力サーチ初期化 diff --git a/build/libraries_sysmenu/boot/ARM7/src/boot.c b/build/libraries_sysmenu/boot/ARM7/src/boot.c index 6fc310d8..a9a21423 100644 --- a/build/libraries_sysmenu/boot/ARM7/src/boot.c +++ b/build/libraries_sysmenu/boot/ARM7/src/boot.c @@ -53,17 +53,20 @@ static void _ISDbgLib_OnLoadChildBinary( void ); static asm void ClearMemory( void ) { mov r11, lr - -// ldr r0, = IPL2_ADDR_TOP // IPL2-ARM9 & ARM7プログラムのクリア -// ldr r1, = MB_BSSDESC_ADDRESS -// bl CpuClear32Byte - - ldr r0, = HW_WRAM // ARM7WRAMのクリア - ldr r1, = RETURN_FROM_MAIN_ARM7_FUNCP +#if 0 + ldr r0, = 0x02280000 // SYSMENU-ARM7 MMEMのクリア + ldr r1, = 0x02380000 bl CpuClear32Byte +// ldr r0, = 0x02800000 // SYSMENU-ARM9 MMEMのクリア +// ldr r1, = 0x02e80000 +// bl CpuClear32Byte -@1 bx r11 + ldr r0, = HW_WRAM_A_LTD // ARM7-WRAMのクリア( LTDのマッピング ) + ldr r1, = BOOTCORE_ARM7_ADDR + bl CpuClear32Byte +#endif + bx r11 } @@ -117,15 +120,9 @@ static asm void ClearBankREG_Stack( void ) add r1, r2, #0x800 bl CpuClear32Byte -#ifndef ISDBG_MB_CHILD_ - add r0, r2, #0xd80 // HW_BIOS_EXCP_STACK_MAIN (MAINPデバッガモニタ例外ハンドラ) - add r1, r0, #0x80 - bl CpuClear32Byte -#else // ISDBG_MB_CHILD_ - add r0, r2, #0xda0 // HW_ARENA_INFO_BUF (アリーナ情報構造体) ※mb_childビルド時には、デバッガモニタ用ハンドラはクリアしない。 + add r0, r2, #0xda0 // HW_ARENA_INFO_BUF (アリーナ情報構造体) ※デバッガモニタ用ハンドラはクリアしない。 add r1, r0, #0x60 bl CpuClear32Byte -#endif // ISDBG_MB_CHILD_ add r0, r2, #0xf80 add r1, r0, #0x80 @@ -156,6 +153,30 @@ asm void BOOT_Core( void ) //--------------------------------------- bl ClearMemory + //--------------------------------------- + // ARM9との同期をとる(subp_stateを3にしてから、mainp_stateが3になるのを待つ。) + //--------------------------------------- + ldr r1, =REG_MAINPINTF_ADDR + mov r0, #0x0300 + strh r0, [r1] // メインプロセッサインターフェースレジスタ +@1 ldrh r0, [r1] + and r0, r0, #0x000f + cmp r0, #0x0003 + bne @1 + + //--------------------------------------- + // ARM7 WRAMバンク設定 MBK6-MBK9 ※ARM7がMBK9でWRAMロックをする前にARM9でWRAM設定を済ませておく必要がある。 + //--------------------------------------- + ldr r0, =HW_TWL_ROM_HEADER_BUF + add r10, r0, #0x1a0 // rom_header->s.sub_wram_config_data + // r10- => r9-r2 + ldr r9, =REG_MBK6_ADDR + add r2, r9, #15 +@2 ldr r3, [r10], #4 + str r3, [r9], #4 + cmp r9, r2 + blt @2 + //--------------------------------------- // 無線マルチブート用ローダー起動 //--------------------------------------- @@ -176,10 +197,10 @@ asm void BOOT_Core( void ) ldr r1, =REG_MAINPINTF_ADDR mov r0, #0x0100 strh r0, [r1] // メインプロセッサインターフェースレジスタ -@1 ldrh r0, [r1] +@3 ldrh r0, [r1] and r0, r0, #0x000f cmp r0, #0x0001 - bne @1 + bne @3 //--------------------------------------- // ISデバッガでのDL子機プログラムのデバッグ情報設定 @@ -201,9 +222,9 @@ asm void BOOT_Core( void ) ldr r1, =REG_MAINPINTF_ADDR mov r0, #0 strh r0, [r1] // メインプロセッサインターフェースレジスタ -@2 ldrh r0, [r1] +@4 ldrh r0, [r1] cmp r0, #0x0001 - beq @2 + beq @4 //--------------------------------------- // R11の値をもとにブートアドレス取得 diff --git a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c index 6b02a161..60365022 100644 --- a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c +++ b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c @@ -55,6 +55,7 @@ BOOL BOOT_WaitStart( void ) } */ BOOTi_ClearREG_RAM(); // ARM7側のメモリ&レジスタクリア。 + reg_MI_MBK9 = 0; // 全WRAMのロック解除 reg_PXI_MAINPINTF = MAINP_SEND_IF | 0x0100; // ARM9に対してブートするようIRQで要求+ARM7のステートを1にする。 BOOT_Core(); // never return } @@ -78,6 +79,7 @@ static void BOOTi_ClearREG_RAM( void ) reg_GX_DISPSTAT = 0; reg_SPI_SPICNT = 0; reg_PXI_MAINP_FIFO_CNT = 0x4008; + // クリアしていないレジスタは、VCOUNT, JOY, PIFCNT, MC-, EXMEMCNT, IME, PAUSE, POWLCDCNT, 他セキュリティ系です。 (void)OS_ResetRequestIrqMask((u16)~0); } diff --git a/build/libraries_sysmenu/boot/ARM9/src/boot.c b/build/libraries_sysmenu/boot/ARM9/src/boot.c index 2efefb21..7dfa3515 100644 --- a/build/libraries_sysmenu/boot/ARM9/src/boot.c +++ b/build/libraries_sysmenu/boot/ARM9/src/boot.c @@ -56,13 +56,7 @@ static void _ISDbgLib_OnLoadChildBinary(void); asm void BOOT_Core( void ) { //--------------------------------------- - // データキャッシュを全て無効に。(DC_InvalidateAllを抜き出して実装) - //--------------------------------------- - mov r0, #0 - mcr p15, 0, r0, c7, c6, 0 - - //--------------------------------------- - // ARM7との同期をとる(subp_stateが2になるのを待って、mainp_stateを2にする。) + // ARM7との同期をとる(subp_stateが2になるのを待って、mainp_stateを2にする) //--------------------------------------- ldr r1, =REG_SUBPINTF_ADDR @0 ldrh r0, [r1] @@ -72,6 +66,40 @@ asm void BOOT_Core( void ) mov r0, #0x0200 strh r0, [r1] + //--------------------------------------- + // データキャッシュを全て無効に。(DC_InvalidateAllを抜き出して実装) + //--------------------------------------- + mov r0, #0 + mcr p15, 0, r0, c7, c6, 0 + + //--------------------------------------- + // ARM7との同期をとる(subp_stateが3になるのを待つ) + //--------------------------------------- + ldr r1, =REG_SUBPINTF_ADDR +@1 ldrh r0, [r1] + and r0, r0, #0x000f + cmp r0, #0x0003 + bne @1 + + //--------------------------------------- + // ARM9 WRAMバンクの設定 MBK1-MBK8 ※WRAMバンクの設定をする時には、ARM7はARM7専用WRAMのBOOT_Coreにいる必要がある。 + //--------------------------------------- + ldr r0, =HW_TWL_ROM_HEADER_BUF + add r0, r0, #0x180 // rom_header->s.main_wram_config_data + // r0- => r9-r2 + ldr r9, =REG_MBK1_ADDR + add r2, r9, #32 +@2 ldr r3, [r0], #4 + str r3, [r9], #4 + cmp r9, r2 + blt @2 + + //--------------------------------------- + // ARM7との同期をとる(mainp_stateを3にする。) + //--------------------------------------- + mov r0, #0x0300 + strh r0, [r1] + //--------------------------------------- // ISデバッガ動作フラグの格納 //--------------------------------------- @@ -84,10 +112,10 @@ asm void BOOT_Core( void ) // ARM7との同期をとる(subp_stateが1になるのを待って、mainp_stateを1にする。) //--------------------------------------- ldr r1, =REG_SUBPINTF_ADDR -@1 ldrh r0, [r1] +@3 ldrh r0, [r1] and r0, r0, #0x000f cmp r0, #0x0001 - bne @1 + bne @3 mov r0, #0x0100 strh r0, [r1] @@ -115,10 +143,10 @@ asm void BOOT_Core( void ) // ARM7との最終同期をとる(subp_stateが0になるのを待って、mainp_stateを0にする) //--------------------------------------- ldr r1, =REG_SUBPINTF_ADDR -@2 ldrh r0, [r1] +@4 ldrh r0, [r1] and r0, r0, #0x000f cmp r0, #0x0001 - beq @2 + beq @4 mov r0, #0 strh r0, [r1] diff --git a/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c b/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c index 11d756a6..038f8d48 100644 --- a/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c +++ b/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c @@ -16,7 +16,9 @@ *---------------------------------------------------------------------------*/ #include +#include #include +#include //#include //#include "IPL2_work.h" //#include "define.h" @@ -76,6 +78,15 @@ void BOOT_Ready( void ) (void)OS_SetIrqMask( 0 ); (void)OS_ResetRequestIrqMask( (u16)~0 ); + // WRAMの配置 + { + ROM_Header_Short *pROMH = (ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF; + MIHeader_WramRegs *pWRAMREGS = (MIHeader_WramRegs *)pROMH->main_wram_config_data; + reg_GX_VRAMCNT_C = pWRAMREGS->main_vrambnk_c; + reg_GX_VRAMCNT_D = pWRAMREGS->main_vrambnk_d; + reg_GX_VRAMCNT_WRAM = pWRAMREGS->main_wrambnk_01; + } + BOOT_Core(); // never return } diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c index 31a1d4dd..33f56587 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c @@ -469,6 +469,9 @@ OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len); (void)FS_CloseFile(file); } + + // ROMヘッダバッファをコピー + MI_CpuCopy32( (void *)HW_TWL_ROM_HEADER_BUF, (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); // 起動。 BOOT_Ready(); diff --git a/build/systemMenu_RED/Launcher/ARM9/Makefile b/build/systemMenu_RED/Launcher/ARM9/Makefile index d173ad32..a65668f3 100644 --- a/build/systemMenu_RED/Launcher/ARM9/Makefile +++ b/build/systemMenu_RED/Launcher/ARM9/Makefile @@ -16,7 +16,9 @@ # $Author: $ #---------------------------------------------------------------------------- -SUBDIRS = +SUBDIRS = ../../../libraries_sysmenu/sysmenu \ + ../../../libraries_sysmenu/boot \ + ../../../components/hyena.TWL #---------------------------------------------------------------------------- diff --git a/build/systemMenu_RED/MachineSettings/ARM9/Makefile b/build/systemMenu_RED/MachineSettings/ARM9/Makefile index 7062a395..1dd5136b 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/Makefile +++ b/build/systemMenu_RED/MachineSettings/ARM9/Makefile @@ -22,7 +22,7 @@ SUBDIRS = ../../../libraries_sysmenu/sysmenu TARGET_FIRM = SYSTEMMENU TARGET_PLATFORM = TWL -TWL_ARCHGEN = LIMITED +#TWL_ARCHGEN = LIMITED TARGET_BIN = main.srl diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/MachineSetting.c b/build/systemMenu_RED/MachineSettings/ARM9/src/MachineSetting.c index a3570bed..c7801421 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/MachineSetting.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/MachineSetting.c @@ -167,6 +167,12 @@ int MachineSettingMain( void ) } tp_select = SelectMenuByTP( &s_csr, &s_settingParam ); DrawMenu( s_csr, &s_settingParam ); + +#if 0 + if( pad.trg & PAD_BUTTON_START ) { + PM_ForceToResetHardware(); + } +#endif if( ( pad.trg & PAD_BUTTON_A ) || ( tp_select ) ) { // メニュー項目への分岐 if( s_settingPos[ s_csr ].enable ) { diff --git a/doc/TWL_SystemMenu繝。繝「繝ェ繝槭ャ繝.vsd b/doc/TWL_SystemMenu繝。繝「繝ェ繝槭ャ繝.vsd index dd65e88b..e89928a2 100644 Binary files a/doc/TWL_SystemMenu繝。繝「繝ェ繝槭ャ繝.vsd and b/doc/TWL_SystemMenu繝。繝「繝ェ繝槭ャ繝.vsd differ diff --git a/doc/rom_header_format.xls b/doc/rom_header_format.xls index 1e68fb58..29b0c2b2 100644 Binary files a/doc/rom_header_format.xls and b/doc/rom_header_format.xls differ diff --git a/include/sysmenu/boot/common/boot.h b/include/sysmenu/boot/common/boot.h index e537b9ce..252cb37a 100644 --- a/include/sysmenu/boot/common/boot.h +++ b/include/sysmenu/boot/common/boot.h @@ -25,6 +25,7 @@ extern "C" { /*---------------------------------------------------------------------------* Type definition *---------------------------------------------------------------------------*/ +#define BOOTCORE_ARM7_ADDR 0x0380f100 /*---------------------------------------------------------------------------* functions