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