mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1746 b08762b0-b915-fc4b-9d8c-17b2551a87ff
230 lines
6.7 KiB
C
230 lines
6.7 KiB
C
/*---------------------------------------------------------------------------*
|
||
Project: TwlFirm - tools - ts_dev9
|
||
File: main.c
|
||
|
||
Copyright 2007 Nintendo. All rights reserved.
|
||
|
||
These coded instructions, statements, and computer programs contain
|
||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||
Company Ltd., and are protected by Federal copyright law. They may
|
||
not be disclosed to third parties or copied or duplicated in any form,
|
||
in whole or in part, without the prior written consent of Nintendo.
|
||
|
||
$Log: $
|
||
$NoKeywords: $
|
||
*---------------------------------------------------------------------------*/
|
||
#include <firm.h>
|
||
#include "font.h"
|
||
#include "screen.h"
|
||
|
||
//#define PRINT_DEBUG
|
||
|
||
#ifndef PRINT_DEBUG
|
||
#undef OS_TPrintf
|
||
#define OS_TPrintf(...) ((void)0)
|
||
#endif // PRINT_DEBUG
|
||
|
||
static void myInit(void);
|
||
static void myVBlankIntr(void);
|
||
|
||
/***************************************************************
|
||
PreInit
|
||
|
||
FromBootの対応&OS_Init前に必要なメインメモリの初期化
|
||
***************************************************************/
|
||
static void PreInit(void)
|
||
{
|
||
/*
|
||
メインメモリ関連
|
||
*/
|
||
// SHARED領域クリア
|
||
MI_CpuClearFast((void*)HW_WRAM_EX_LOCK_BUF, (HW_WRAM_EX_LOCK_BUF_END - HW_WRAM_EX_LOCK_BUF));
|
||
MI_CpuClearFast((void*)HW_BIOS_EXCP_STACK_MAIN, (HW_REAL_TIME_CLOCK_BUF - HW_BIOS_EXCP_STACK_MAIN));
|
||
MI_CpuClearFast((void*)HW_PXI_SIGNAL_PARAM_ARM9, (HW_MMEMCHECKER_MAIN - HW_PXI_SIGNAL_PARAM_ARM9));
|
||
MI_CpuClearFast((void*)HW_ROM_HEADER_BUF, (HW_ROM_HEADER_BUF_END-HW_ROM_HEADER_BUF));
|
||
|
||
// FromBrom全消去
|
||
MIi_CpuClearFast( 0, (void*)OSi_GetFromBromAddr(), sizeof(OSFromBromBuf) );
|
||
|
||
// ブートタイプの変更
|
||
( (OSBootInfo *)OS_GetBootInfo() )->boot_type = OS_BOOTTYPE_NAND;
|
||
}
|
||
|
||
/***************************************************************
|
||
PostInit
|
||
|
||
各種初期化
|
||
***************************************************************/
|
||
static void PostInit(void)
|
||
{
|
||
}
|
||
|
||
/***************************************************************
|
||
EraseAll
|
||
|
||
不正終了しました
|
||
いろいろ消してください
|
||
DSモードにして終わるのがよいか?
|
||
***************************************************************/
|
||
static void EraseAll(void)
|
||
{
|
||
}
|
||
|
||
void TwlMain( void )
|
||
{
|
||
u32 len;
|
||
#define X_OFF 2
|
||
s16 y = 2;
|
||
|
||
PreInit();
|
||
myInit();
|
||
PostInit();
|
||
|
||
//---- clear screen buffer
|
||
ClearScreen();
|
||
|
||
PrintString( X_OFF, y, FONT_CYAAN, "NAND Firm Writer" );
|
||
PrintString( X_OFF+18, y++, FONT_YELLOW, "%s", __DATE__ );
|
||
PrintString( X_OFF+21, y++, FONT_YELLOW, "%s", __TIME__ );
|
||
OS_WaitVBlankIntr();
|
||
y++;
|
||
|
||
PXI_RecvStream(&len, sizeof(len));
|
||
PrintString( X_OFF, y++, FONT_WHITE, "Firm length: %d bytes", len );
|
||
OS_WaitVBlankIntr();
|
||
y++;
|
||
|
||
PrintString( X_OFF, y++, FONT_WHITE, "Load NAND Firm..." );
|
||
OS_WaitVBlankIntr();
|
||
|
||
if ( PXI_RecvID() != FIRM_PXI_ID_NULL )
|
||
{
|
||
goto err;
|
||
}
|
||
PrintString( X_OFF+20, y++, FONT_GREEN, "Done." );
|
||
PrintString( X_OFF, y++, FONT_WHITE, "Write NAND Firm..." );
|
||
OS_WaitVBlankIntr();
|
||
|
||
if ( PXI_RecvID() != FIRM_PXI_ID_NULL )
|
||
{
|
||
goto err;
|
||
}
|
||
PrintString( X_OFF+20, y++, FONT_GREEN, "Done." );
|
||
PrintString( X_OFF, y++, FONT_WHITE, "Verify NAND Firm..." );
|
||
OS_WaitVBlankIntr();
|
||
|
||
if ( PXI_RecvID() != FIRM_PXI_ID_NULL )
|
||
{
|
||
goto err;
|
||
}
|
||
PrintString( X_OFF+20, y++, FONT_GREEN, "Done." );
|
||
|
||
PrintString( X_OFF, 20, FONT_GREEN, "SUCCESS ALL!" );
|
||
do
|
||
{
|
||
OS_WaitVBlankIntr();
|
||
}
|
||
while ( PAD_DetectFold() && (PAD_Read() & PAD_ALL_MASK) == (PAD_BUTTON_START|PAD_BUTTON_SELECT|PAD_BUTTON_X));
|
||
|
||
PXI_NotifyID( FIRM_PXI_ID_NULL );
|
||
OS_Terminate();
|
||
|
||
err:
|
||
PrintString( X_OFF+20, y++, FONT_RED, "Failed." );
|
||
OS_WaitVBlankIntr();
|
||
PXI_NotifyID( FIRM_PXI_ID_ERR );
|
||
OS_Terminate();
|
||
}
|
||
|
||
//----------------------------------------------------------------
|
||
// myInit
|
||
//
|
||
void myInit(void)
|
||
{
|
||
//---- init
|
||
OS_InitFIRM();
|
||
OS_InitTick();
|
||
OS_InitAlarm();
|
||
FX_Init();
|
||
GX_Init();
|
||
GX_DispOff();
|
||
GXS_DispOff();
|
||
|
||
//---- init displaying
|
||
GX_SetBankForLCDC(GX_VRAM_LCDC_ALL);
|
||
MI_CpuClearFast((void *)HW_LCDC_VRAM, HW_LCDC_VRAM_SIZE);
|
||
(void)GX_DisableBankForLCDC();
|
||
|
||
MI_CpuFillFast((void *)HW_OAM, 192, HW_OAM_SIZE);
|
||
MI_CpuClearFast((void *)HW_PLTT, HW_PLTT_SIZE);
|
||
MI_CpuFillFast((void *)HW_DB_OAM, 192, HW_DB_OAM_SIZE);
|
||
MI_CpuClearFast((void *)HW_DB_PLTT, HW_DB_PLTT_SIZE);
|
||
|
||
//---- setting 2D for top screen
|
||
GX_SetBankForBG(GX_VRAM_BG_128_A);
|
||
|
||
G2_SetBG0Control(GX_BG_SCRSIZE_TEXT_256x256,
|
||
GX_BG_COLORMODE_16,
|
||
GX_BG_SCRBASE_0xf800, GX_BG_CHARBASE_0x00000, GX_BG_EXTPLTT_01);
|
||
G2_SetBG0Priority(0);
|
||
G2_BG0Mosaic(FALSE);
|
||
GX_SetGraphicsMode(GX_DISPMODE_GRAPHICS, GX_BGMODE_0, GX_BG0_AS_2D);
|
||
GX_SetVisiblePlane(GX_PLANEMASK_BG0);
|
||
|
||
GX_LoadBG0Char(d_CharData, 0, sizeof(d_CharData));
|
||
GX_LoadBGPltt(d_PaletteData, 0, sizeof(d_PaletteData));
|
||
|
||
|
||
|
||
//---- setting 2D for bottom screen
|
||
GX_SetBankForSubBG(GX_VRAM_SUB_BG_128_C);
|
||
|
||
G2S_SetBG0Control(GX_BG_SCRSIZE_TEXT_256x256,
|
||
GX_BG_COLORMODE_16,
|
||
GX_BG_SCRBASE_0xf800, GX_BG_CHARBASE_0x00000, GX_BG_EXTPLTT_01);
|
||
G2S_SetBG0Priority(0);
|
||
G2S_BG0Mosaic(FALSE);
|
||
GXS_SetGraphicsMode(GX_BGMODE_0);
|
||
GXS_SetVisiblePlane(GX_PLANEMASK_BG0);
|
||
|
||
GXS_LoadBG0Char(d_CharData, 0, sizeof(d_CharData));
|
||
GXS_LoadBGPltt(d_PaletteData, 0, sizeof(d_PaletteData));
|
||
|
||
|
||
//---- screen
|
||
MI_CpuFillFast((void *)gScreen, 0, sizeof(gScreen));
|
||
DC_FlushRange(gScreen, sizeof(gScreen));
|
||
/* DMA操作でIOレジスタへアクセスするのでキャッシュの Wait は不要 */
|
||
// DC_WaitWriteBufferEmpty();
|
||
GX_LoadBG0Scr(gScreen, 0, sizeof(gScreen));
|
||
GXS_LoadBG0Scr(gScreen, 0, sizeof(gScreen));
|
||
|
||
//---- init interrupt
|
||
OS_SetIrqFunction(OS_IE_V_BLANK, myVBlankIntr);
|
||
(void)OS_EnableIrqMask(OS_IE_V_BLANK);
|
||
(void)GX_VBlankIntr(TRUE);
|
||
(void)OS_EnableIrq();
|
||
(void)OS_EnableInterrupts();
|
||
|
||
//---- start displaying
|
||
GX_DispOn();
|
||
GXS_DispOn();
|
||
}
|
||
|
||
//----------------------------------------------------------------
|
||
// myVBlankIntr
|
||
// vblank interrupt handler
|
||
//
|
||
static void myVBlankIntr(void)
|
||
{
|
||
//---- upload pseudo screen to VRAM
|
||
DC_FlushRange(gScreen, sizeof(gScreen));
|
||
/* DMA操作でIOレジスタへアクセスするのでキャッシュの Wait は不要 */
|
||
// DC_WaitWriteBufferEmpty();
|
||
GX_LoadBG0Scr(gScreen, 0, sizeof(gScreen));
|
||
GXS_LoadBG0Scr(gScreen, 0, sizeof(gScreen));
|
||
|
||
OS_SetIrqCheckFlag(OS_IE_V_BLANK);
|
||
}
|
||
|