thumb対策

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@238 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yutaka 2007-11-21 05:48:23 +00:00
parent 7bddb5032a
commit 9f479ee8d1

View File

@ -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 // レジスタ固定ビット列後期アボートモデル、DATA32構成シグナル制御、PROG32構成シグナル制御、ライトバッファイネーブル
#define C1_DTCM_ENABLE 0x00010000 // データTCM イネーブル
#define C1_EXCEPT_VEC_UPPER 0x00002000 // 例外ベクタ 上位アドレス(こちらに設定して下さい)
#define C1_SB1_BITSET 0x00000078 // レジスタ固定ビット列後期アボートモデル、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>