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 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 // レジスタ固定ビット列後期アボートモデル、DATA32構成シグナル制御、PROG32構成シグナル制御、ライトバッファイネーブル #define C1_SB1_BITSET 0x00000078 // レジスタ固定ビット列後期アボートモデル、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;
// エントリアドレスの正当性をチェックし、無効な場合は無限ループに入る。
// 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
// プロテクションユニットの初期化 int i;
ResetCP15();
// エントリアドレスの正当性をチェックし、無効な場合は無限ループに入る。
// SDK共通リブート // SYSMi_CheckEntryAddress();
OS_Boot( (void *)*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x24), clr_list );
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 ) 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>