mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
thumb対策
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@238 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
7bddb5032a
commit
9f479ee8d1
@ -26,11 +26,11 @@
|
||||
|
||||
|
||||
// define data-------------------------------------------------------
|
||||
#define SUBP_RECV_IF_ENABLE 0x4000
|
||||
#define SUBP_RECV_IF_ENABLE 0x4000
|
||||
|
||||
#define C1_DTCM_ENABLE 0x00010000 // データTCM イネーブル
|
||||
#define C1_EXCEPT_VEC_UPPER 0x00002000 // 例外ベクタ 上位アドレス(こちらに設定して下さい)
|
||||
#define C1_SB1_BITSET 0x00000078 // レジスタ1用1固定ビット列(後期アボートモデル、DATA32構成シグナル制御、PROG32構成シグナル制御、ライトバッファイネーブル)
|
||||
#define C1_DTCM_ENABLE 0x00010000 // データTCM イネーブル
|
||||
#define C1_EXCEPT_VEC_UPPER 0x00002000 // 例外ベクタ 上位アドレス(こちらに設定して下さい)
|
||||
#define C1_SB1_BITSET 0x00000078 // レジスタ1用1固定ビット列(後期アボートモデル、DATA32構成シグナル制御、PROG32構成シグナル制御、ライトバッファイネーブル)
|
||||
|
||||
// extern data-------------------------------------------------------
|
||||
|
||||
@ -47,126 +47,128 @@ static void ResetCP15( void );
|
||||
// const data--------------------------------------------------------
|
||||
void BOOT_Init( void )
|
||||
{
|
||||
reg_PXI_SUBPINTF = 0x0000;
|
||||
reg_PXI_SUBPINTF = 0x0000;
|
||||
}
|
||||
|
||||
static void ie_subphandler( void )
|
||||
{
|
||||
OS_TPrintf( "INTR SUBP!!\n" );
|
||||
OS_SetIrqCheckFlag( OS_IE_SUBP );
|
||||
OS_TPrintf( "INTR SUBP!!\n" );
|
||||
OS_SetIrqCheckFlag( OS_IE_SUBP );
|
||||
}
|
||||
|
||||
// ブート準備をして、ARM7からの通知を待つ。
|
||||
void BOOT_Ready( void )
|
||||
{
|
||||
// メモリクリアリストの設定
|
||||
static u32 clr_list[] =
|
||||
{
|
||||
HW_ITCM, HW_ITCM_SIZE,
|
||||
//HW_DTCM, HW_DTCM_SIZE,
|
||||
NULL
|
||||
};
|
||||
|
||||
int i;
|
||||
|
||||
// エントリアドレスの正当性をチェックし、無効な場合は無限ループに入る。
|
||||
// SYSMi_CheckEntryAddress();
|
||||
|
||||
for( i = 0; i <= MI_DMA_MAX_NUM; i++ ) { // DMAの停止
|
||||
MI_StopDma( (u16)i );
|
||||
}
|
||||
|
||||
// FinalizeCardPulledOut(); // カード抜け検出終了処理
|
||||
BOOTi_ClearREG_RAM(); // レジスタ&RAMクリア
|
||||
(void)GX_VBlankIntr( FALSE );
|
||||
(void)OS_SetIrqFunction( OS_IE_SUBP, ie_subphandler );
|
||||
OS_EnableInterrupts();
|
||||
(void)OS_SetIrqMask( OS_IE_SUBP ); // サブプロセッサ割り込みのみを許可。
|
||||
reg_PXI_SUBPINTF = SUBP_RECV_IF_ENABLE | 0x0f00; // ARM9ステートを "0x0f" に
|
||||
// ※もうFIFOはクリア済みなので、使わない。
|
||||
// ARM7からの通知待ち
|
||||
OS_WaitIrq( 1, OS_IE_SUBP );
|
||||
|
||||
OS_TPrintf( "INTR SUBP passed!!\n" );
|
||||
// 割り込みをクリアして最終ブートシーケンスへ。
|
||||
reg_PXI_SUBPINTF &= 0x0f00; // サブプロセッサ割り込み許可フラグをクリア
|
||||
(void)OS_DisableIrq();
|
||||
(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
|
||||
// メモリクリアリストの設定
|
||||
static u32 clr_list[] =
|
||||
{
|
||||
HW_ITCM, HW_ITCM_SIZE,
|
||||
//HW_DTCM, HW_DTCM_SIZE,
|
||||
NULL
|
||||
};
|
||||
|
||||
// プロテクションユニットの初期化
|
||||
ResetCP15();
|
||||
|
||||
// SDK共通リブート
|
||||
OS_Boot( (void *)*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x24), clr_list );
|
||||
int i;
|
||||
|
||||
// エントリアドレスの正当性をチェックし、無効な場合は無限ループに入る。
|
||||
// SYSMi_CheckEntryAddress();
|
||||
|
||||
for( i = 0; i <= MI_DMA_MAX_NUM; i++ ) { // DMAの停止
|
||||
MI_StopDma( (u16)i );
|
||||
}
|
||||
|
||||
// FinalizeCardPulledOut(); // カード抜け検出終了処理
|
||||
BOOTi_ClearREG_RAM(); // レジスタ&RAMクリア
|
||||
(void)GX_VBlankIntr( FALSE );
|
||||
(void)OS_SetIrqFunction( OS_IE_SUBP, ie_subphandler );
|
||||
OS_EnableInterrupts();
|
||||
(void)OS_SetIrqMask( OS_IE_SUBP ); // サブプロセッサ割り込みのみを許可。
|
||||
reg_PXI_SUBPINTF = SUBP_RECV_IF_ENABLE | 0x0f00; // ARM9ステートを "0x0f" に
|
||||
// ※もうFIFOはクリア済みなので、使わない。
|
||||
// ARM7からの通知待ち
|
||||
OS_WaitIrq( 1, OS_IE_SUBP );
|
||||
|
||||
OS_TPrintf( "INTR SUBP passed!!\n" );
|
||||
// 割り込みをクリアして最終ブートシーケンスへ。
|
||||
reg_PXI_SUBPINTF &= 0x0f00; // サブプロセッサ割り込み許可フラグをクリア
|
||||
(void)OS_DisableIrq();
|
||||
(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
|
||||
|
||||
// プロテクションユニットの初期化
|
||||
ResetCP15();
|
||||
|
||||
// SDK共通リブート
|
||||
OS_Boot( (void *)*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x24), clr_list );
|
||||
}
|
||||
|
||||
|
||||
// 使用したレジスタ&メモリのクリア
|
||||
static void BOOTi_ClearREG_RAM( void )
|
||||
{
|
||||
// 最後がサブプロセッサ割り込み待ちなので、IMEはクリアしない。
|
||||
(void)OS_SetIrqMask( 0 );
|
||||
(void)OS_ResetRequestIrqMask( (u16)~0 );
|
||||
|
||||
// メモリクリア
|
||||
GX_SetBankForLCDC( GX_VRAM_LCDC_ALL ); // VRAM クリア
|
||||
MI_CpuClearFast( (void*)HW_LCDC_VRAM, HW_LCDC_VRAM_SIZE );
|
||||
(void)GX_DisableBankForLCDC();
|
||||
// MI_CpuClearFast( (void *)HW_ITCM, HW_ITCM_SIZE ); // ITCM クリア ※ITCMにはSDKのコードが入っているので、BOOT_Coreでクリアする。
|
||||
// MI_CpuClearFast( (void *)HW_DTCM, HW_DTCM_SIZE - 0x800 ); // DTCM クリア ※DTCMはスタック&SDK変数入りなので、最後にBOOT_Coreでクリアする。
|
||||
MI_CpuClearFast( (void *)HW_OAM, HW_OAM_SIZE ); // OAM クリア
|
||||
MI_CpuClearFast( (void *)HW_PLTT, HW_PLTT_SIZE ); // パレット クリア
|
||||
MI_CpuClearFast( (void *)HW_DB_OAM, HW_DB_OAM_SIZE ); // OAM クリア
|
||||
MI_CpuClearFast( (void *)HW_DB_PLTT,HW_DB_PLTT_SIZE ); // パレット クリア
|
||||
|
||||
// レジスタクリア
|
||||
MI_CpuClearFast( (void*)( HW_REG_BASE + 0x8 ), 0x12c ); // BG0CNT ~ KEYCNT
|
||||
MI_CpuClearFast( (void*)( HW_REG_BASE + 0x280 ), 0x40 ); // DIVCNT ~ SQRTD3
|
||||
MI_CpuClearFast( (void*)( HW_REG_BASE + 0x1000 ), 0x6e ); // DISP1CNT1 ~ DISPBRTCNT1
|
||||
CP_SetDiv32_32( 0, 1 );
|
||||
reg_PXI_SUBP_FIFO_CNT = 0x4008;
|
||||
reg_GX_DISPCNT = 0;
|
||||
reg_GX_DISPSTAT = 0; // ※ reg_GX_VCOUNTはベタクリアできないので、この先頭部分のクリアを分離する。
|
||||
|
||||
// クリアしていないレジスタは、VCOUNT, PIFCNT, MC-, EXMEMCNT, IME, RBKCNT1, PAUSE, POWLCDCNT, 全3D系。
|
||||
// 最後がサブプロセッサ割り込み待ちなので、IMEはクリアしない。
|
||||
(void)OS_SetIrqMask( 0 );
|
||||
(void)OS_ResetRequestIrqMask( (u16)~0 );
|
||||
|
||||
// メモリクリア
|
||||
GX_SetBankForLCDC( GX_VRAM_LCDC_ALL ); // VRAM クリア
|
||||
MI_CpuClearFast( (void*)HW_LCDC_VRAM, HW_LCDC_VRAM_SIZE );
|
||||
(void)GX_DisableBankForLCDC();
|
||||
// MI_CpuClearFast( (void *)HW_ITCM, HW_ITCM_SIZE ); // ITCM クリア ※ITCMにはSDKのコードが入っているので、BOOT_Coreでクリアする。
|
||||
// MI_CpuClearFast( (void *)HW_DTCM, HW_DTCM_SIZE - 0x800 ); // DTCM クリア ※DTCMはスタック&SDK変数入りなので、最後にBOOT_Coreでクリアする。
|
||||
MI_CpuClearFast( (void *)HW_OAM, HW_OAM_SIZE ); // OAM クリア
|
||||
MI_CpuClearFast( (void *)HW_PLTT, HW_PLTT_SIZE ); // パレット クリア
|
||||
MI_CpuClearFast( (void *)HW_DB_OAM, HW_DB_OAM_SIZE ); // OAM クリア
|
||||
MI_CpuClearFast( (void *)HW_DB_PLTT,HW_DB_PLTT_SIZE ); // パレット クリア
|
||||
|
||||
// レジスタクリア
|
||||
MI_CpuClearFast( (void*)( HW_REG_BASE + 0x8 ), 0x12c ); // BG0CNT ~ KEYCNT
|
||||
MI_CpuClearFast( (void*)( HW_REG_BASE + 0x280 ), 0x40 ); // DIVCNT ~ SQRTD3
|
||||
MI_CpuClearFast( (void*)( HW_REG_BASE + 0x1000 ), 0x6e ); // DISP1CNT1 ~ DISPBRTCNT1
|
||||
CP_SetDiv32_32( 0, 1 );
|
||||
reg_PXI_SUBP_FIFO_CNT = 0x4008;
|
||||
reg_GX_DISPCNT = 0;
|
||||
reg_GX_DISPSTAT = 0; // ※ reg_GX_VCOUNTはベタクリアできないので、この先頭部分のクリアを分離する。
|
||||
|
||||
// クリアしていないレジスタは、VCOUNT, PIFCNT, MC-, EXMEMCNT, IME, RBKCNT1, PAUSE, POWLCDCNT, 全3D系。
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
// システム制御コプロセッサ リセット
|
||||
//-----------------------------------------------------------------------
|
||||
#include <twl/code32.h>
|
||||
asm static void ResetCP15( void )
|
||||
{
|
||||
// プロテクションユニット&キャッシュ&ITCM無効。DTCMは有効(スタックをクリアするため)
|
||||
ldr r0, = C1_DTCM_ENABLE | C1_EXCEPT_VEC_UPPER | C1_SB1_BITSET
|
||||
mcr p15, 0, r0, c1, c0, 0
|
||||
|
||||
// ITCMの割り当てを解除
|
||||
mov r0, #0
|
||||
mcr p15, 0, r0, c6, c5, 0
|
||||
|
||||
// DTCMの割り当てを解除
|
||||
// mov r0,#0
|
||||
// mcr p15, 0, r0, c9, c1, 0
|
||||
|
||||
// キャッシュ無効化
|
||||
mov r0, #0
|
||||
mcr p15, 0, r0, c7, c5, 0 // 命令キャッシュ
|
||||
mcr p15, 0, r0, c7, c6, 0 // データキャッシュ
|
||||
|
||||
// ライトバッファ エンプティ待ち
|
||||
mcr p15, 0, r0, c7, c10, 4
|
||||
|
||||
bx lr
|
||||
// プロテクションユニット&キャッシュ&ITCM無効。DTCMは有効(スタックをクリアするため)
|
||||
ldr r0, = C1_DTCM_ENABLE | C1_EXCEPT_VEC_UPPER | C1_SB1_BITSET
|
||||
mcr p15, 0, r0, c1, c0, 0
|
||||
|
||||
// ITCMの割り当てを解除
|
||||
mov r0, #0
|
||||
mcr p15, 0, r0, c6, c5, 0
|
||||
|
||||
// DTCMの割り当てを解除
|
||||
// mov r0,#0
|
||||
// mcr p15, 0, r0, c9, c1, 0
|
||||
|
||||
// キャッシュ無効化
|
||||
mov r0, #0
|
||||
mcr p15, 0, r0, c7, c5, 0 // 命令キャッシュ
|
||||
mcr p15, 0, r0, c7, c6, 0 // データキャッシュ
|
||||
|
||||
// ライトバッファ エンプティ待ち
|
||||
mcr p15, 0, r0, c7, c10, 4
|
||||
|
||||
bx lr
|
||||
}
|
||||
#include <twl/codereset.h>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user