mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
のみ行うよう修正。 ・アプリブート時のマウント情報設定への対応。 ・ランチャーは、自身の起動時にマウント情報を自分でセットするようにする。 ・暫定対策:全ドライブをRW可能にしている。 ・暫定対策:FS不具合回避のため、"nand:"を'F'ドライブに設定。 ・MachineSettingsとPictoChatでのnand_app_hack.hを使用したFSの暫定 NAND対応を削除。 これに伴い、nand_app_hack.hも削除。 ・NANDアプリ読み込み時のリストバグ修正。 git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@272 b08762b0-b915-fc4b-9d8c-17b2551a87ff
116 lines
4.2 KiB
C
116 lines
4.2 KiB
C
/*---------------------------------------------------------------------------*
|
||
Project: TwlIPL
|
||
File: boot.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.h>
|
||
#include "reboot.h"
|
||
|
||
|
||
// define data-------------------------------------------------------
|
||
#define MAINP_SEND_IF 0x2000
|
||
#define reg_MI_MC_SWP (*(REGType8v *) ( REG_MC1_ADDR + 1 ) )
|
||
|
||
// extern data-------------------------------------------------------
|
||
|
||
// function's prototype----------------------------------------------
|
||
|
||
static void BOOTi_ClearREG_RAM( void );
|
||
|
||
// global variables--------------------------------------------------
|
||
|
||
// static variables--------------------------------------------------
|
||
|
||
// const data--------------------------------------------------------
|
||
|
||
void BOOT_Init( void )
|
||
{
|
||
reg_PXI_MAINPINTF = 0x0000;
|
||
}
|
||
|
||
BOOL BOOT_WaitStart( void )
|
||
{
|
||
if( (reg_PXI_MAINPINTF & 0x000f ) == 0x000f ) {
|
||
(void)OS_DisableIrq(); // ここで割り込み禁止にしないとダメ。
|
||
(void)OS_SetIrqMask(0); // SDKバージョンのサーチに時間がかかると、ARM9がHALTにかかってしまい、ARM7のサウンドスレッドがARM9にFIFOでデータ送信しようとしてもFIFOが一杯で送信できない状態で無限ループに入ってしまう。
|
||
/*
|
||
#ifdef ISDBG_MB_CHILD_
|
||
if( ( GetIpl2WorkAddr()->ipl2_type != 0xff ) && ( GetIpl2WorkAddr()->ipl2_type & 0x28 ) )
|
||
#endif // ISDBG_MB_CHILD_ // USG or NATなら無線パッチを当てる
|
||
{
|
||
InsertWLPatch();
|
||
}
|
||
*/
|
||
|
||
BOOTi_ClearREG_RAM(); // ARM7側のメモリ&レジスタクリア。
|
||
reg_MI_MBK9 = 0; // 全WRAMのロック解除
|
||
reg_PXI_MAINPINTF = MAINP_SEND_IF | 0x0100; // ARM9に対してブートするようIRQで要求+ARM7のステートを1にする。
|
||
|
||
// SDK共通リブート
|
||
{
|
||
// メモリクリアリストの設定
|
||
static u32 clr_list[] =
|
||
{
|
||
SYSM_OWN_ARM7_MMEM_ADDR, SYSM_OWN_ARM7_MMEM_ADDR_END - SYSM_OWN_ARM7_MMEM_ADDR,
|
||
SYSM_OWN_ARM9_MMEM_ADDR, SYSM_OWN_ARM9_MMEM_ADDR_END - SYSM_OWN_ARM9_MMEM_ADDR,
|
||
SYSM_OWN_ARM7_WRAM_ADDR, SYSM_OWN_ARM7_WRAM_ADDR_END - SYSM_OWN_ARM7_WRAM_ADDR,
|
||
SYSM_OWN_ARM7_WRAM_ADDR, SYSM_OWN_ARM7_WRAM_ADDR_END - SYSM_OWN_ARM7_WRAM_ADDR,
|
||
#ifdef ISDBG_MB_CHILD_
|
||
HW_PRV_WRAM_END - 0x600, (HW_PRV_WRAM_END - HW_PRV_WRAM_SYSRV_SIZE) - (HW_PRV_WRAM_END - 0x600),
|
||
HW_PRV_WRAM_END - 0x600 + 0x20, HW_PRV_WRAM_END - (HW_PRV_WRAM_END - 0x600 + 0x20),
|
||
#endif
|
||
HW_MAIN_MEM_SHARED, HW_RED_RESERVED - HW_MAIN_MEM_SHARED,
|
||
HW_ARENA_INFO_BUF, HW_ROM_HEADER_BUF - HW_ARENA_INFO_BUF,
|
||
HW_PXI_SIGNAL_PARAM_ARM9, HW_MAIN_MEM_SYSTEM_END - HW_PXI_SIGNAL_PARAM_ARM9,
|
||
NULL
|
||
};
|
||
OS_Boot( (void *)*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x34), clr_list );
|
||
}
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
static void BOOTi_ClearREG_RAM( void )
|
||
{
|
||
int i ;
|
||
|
||
for( i = 0; i <= MI_DMA_MAX_NUM; i++ ) { // DMAの停止
|
||
MI_StopDma( (u16)i );
|
||
}
|
||
|
||
if( SYSMi_GetWork()->isCardBoot ) {
|
||
#ifdef DEBUG_USED_CARD_SLOT_B_
|
||
reg_MI_MC_SWP = 0x80; // カードスロットのスワップ
|
||
#endif
|
||
*(u32 *)HW_BOOT_CHECK_INFO_BUF = SYSMi_GetWork()->nCardID; // カード抜けチェックバッファにカードIDをセット
|
||
*(u32 *)HW_RED_RESERVED = SYSMi_GetWork()->nCardID;
|
||
}
|
||
|
||
// レジスタのクリア
|
||
SVC_CpuClearFast( 0x0000, (void*)(HW_REG_BASE + 0x0b0), (0x13c - 0x0b0) );
|
||
// DMA0SAD ~ RCNT1
|
||
SVC_CpuClearFast( 0x0000, (void*)(HW_REG_BASE + 0x400), 0x104 ); // SG0CNT_L ~ SGMCNT
|
||
SVC_CpuClearFast( 0x0000, (void*)(HW_REG_BASE + 0x508), 0x14 ); // SGRVCNT ~ SGRV1CLEN
|
||
reg_GX_DISPSTAT = 0;
|
||
reg_SPI_SPICNT = 0;
|
||
reg_PXI_MAINP_FIFO_CNT = 0x4008;
|
||
|
||
*(vu32 *)HW_RESET_PARAMETER_BUF = 0; // リセットバッファをクリア
|
||
|
||
// クリアしていないレジスタは、VCOUNT, JOY, PIFCNT, MC-, EXMEMCNT, IME, PAUSE, POWLCDCNT, 他セキュリティ系です。
|
||
(void)OS_ResetRequestIrqMask((u16)~0);
|
||
}
|