From 9f479ee8d1de2cf5bf41db86c270a6cb5002dc0a Mon Sep 17 00:00:00 2001 From: yutaka Date: Wed, 21 Nov 2007 05:48:23 +0000 Subject: [PATCH] =?UTF-8?q?thumb=E5=AF=BE=E7=AD=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@238 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../libraries_sysmenu/boot/ARM9/src/bootAPI.c | 208 +++++++++--------- 1 file changed, 105 insertions(+), 103 deletions(-) diff --git a/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c b/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c index 527f7b0f..f12709da 100644 --- a/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c +++ b/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c @@ -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 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