From 9db3977a8c5014d1b564960317865903944ccc59 Mon Sep 17 00:00:00 2001 From: yutaka Date: Thu, 25 Oct 2007 12:00:48 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=90=E3=83=83=E3=82=AF=E3=83=A9=E3=82=A4?= =?UTF-8?q?=E3=83=88=E3=82=92=E3=81=A4=E3=81=91=E3=82=8B=E5=89=8D=E3=81=AB?= =?UTF-8?q?INI=E3=83=95=E3=83=A9=E3=82=B0=E3=82=92=E3=83=81=E3=82=A7?= =?UTF-8?q?=E3=83=83=E3=82=AF=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E3=81=97=E3=81=9F=20PM=5FInitFIRM=E3=81=AE=E6=9C=80=E9=81=A9?= =?UTF-8?q?=E5=8C=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@68 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- build/libraries/pm/ARM7/pm_init.c | 66 ++++++++++++++++++++++-- build/nandfirm/sdmc-launcher/ARM7/main.c | 14 +++-- build/nandfirm/sdmc-launcher/ARM9/main.c | 31 ++++++++++- include/firm/pm/ARM7/pm_init.h | 23 +++++++++ 4 files changed, 124 insertions(+), 10 deletions(-) diff --git a/build/libraries/pm/ARM7/pm_init.c b/build/libraries/pm/ARM7/pm_init.c index 35f6e9b4..51fbd84e 100644 --- a/build/libraries/pm/ARM7/pm_init.c +++ b/build/libraries/pm/ARM7/pm_init.c @@ -18,12 +18,13 @@ #include #include -#define OS_MSEC_TO_CPUCYC( msec ) ((u32)( ((HW_CPU_CLOCK/1000) * (u32)(msec)) )) +static OSTick tickINI = 0; +static BOOL doneBackLight = FALSE; /*---------------------------------------------------------------------------* Name: PM_InitFIRM - Description: power B/L on + Description: set default parameters Arguments: None @@ -31,6 +32,8 @@ *---------------------------------------------------------------------------*/ void PM_InitFIRM( void ) { + PM_CheckINIFlag(); + // LED PMi_ResetFlags( REG_PMIC_LED_CTL_ADDR, PMIC_LED_CTL_AUTO_BLINK | PMIC_LED_CTL_BLINK_BY_SLEEP ); PMi_SetParams( REG_PMIC_LVL4_BRT_ADDR, @@ -53,9 +56,62 @@ void PM_InitFIRM( void ) // LCD ON PMi_SetFlags( REG_PMIC_CTL2_ADDR, PMIC_CTL2_VDD50 ); - // back light ON + // back light PMi_SetParams( REG_PMIC_BL_BRT_A_ADDR, PMIC_BACKLIGHT_BRIGHT_MAX, PMIC_BL_BRT_A_MASK ); // TODO: less brightness PMi_SetParams( REG_PMIC_BL_BRT_B_ADDR, PMIC_BACKLIGHT_BRIGHT_MAX, PMIC_BL_BRT_B_MASK ); // TODO: less brightness - OS_SpinWaitCpuCycles( OS_MSEC_TO_CPUCYC( 17*4 ) ); - PMi_SetFlags( REG_PMIC_CTL2_ADDR, PMIC_CTL2_BACK_LIGHT_1 | PMIC_CTL2_BACK_LIGHT_2 ); +} + +/*---------------------------------------------------------------------------* + Name: PM_CheckINIFlag + + Description: Check INI in GX_DISPSTAT (able to call before PM_InitFIRM) + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ +void PM_CheckINIFlag(void) +{ + if ( !tickINI ) + { + if ( reg_GX_DISPSTAT & REG_GX_DISPSTAT_INI_MASK ) + { + tickINI = OS_GetTick(); + } + } +} + +/*---------------------------------------------------------------------------* + Name: PM_BackLightOn + + Description: power B/L on if not set yet + + Arguments: force TRUE: wait until valid condition + FALSE not set unless valid condition + + Returns: None + *---------------------------------------------------------------------------*/ +void PM_BackLightOn( BOOL force ) +{ + if ( doneBackLight ) + { + return; // have already set + } + PM_CheckINIFlag(); + //OS_TPrintf("PM_BackLightOn: %d msec\n", (u32)OS_TicksToMilliSeconds(OS_GetTick()-tickINI)); + if ( force ) + { + while ((u32)OS_TicksToMilliSeconds(OS_GetTick()-tickINI) < 34) + { + } + PMi_SetFlags( REG_PMIC_CTL2_ADDR, PMIC_CTL2_BACK_LIGHT_1 | PMIC_CTL2_BACK_LIGHT_2 ); + doneBackLight = TRUE; + //OS_TPrintf("PM_BackLightOn: Done\n"); + } + else if ((u32)OS_TicksToMilliSeconds(OS_GetTick()-tickINI) >= 34) + { + PMi_SetFlags( REG_PMIC_CTL2_ADDR, PMIC_CTL2_BACK_LIGHT_1 | PMIC_CTL2_BACK_LIGHT_2 ); + doneBackLight = TRUE; + //OS_TPrintf("PM_BackLightOn: Done\n"); + } } diff --git a/build/nandfirm/sdmc-launcher/ARM7/main.c b/build/nandfirm/sdmc-launcher/ARM7/main.c index 2cd75c89..91606933 100644 --- a/build/nandfirm/sdmc-launcher/ARM7/main.c +++ b/build/nandfirm/sdmc-launcher/ARM7/main.c @@ -42,7 +42,7 @@ static u8 step = 0x80; Profile */ #ifndef SDK_FINALROM -#define PRFILE_MAX 128 +#define PRFILE_MAX 0x100 u32 profile[PRFILE_MAX]; u32 pf_cnt = 0; #endif @@ -94,12 +94,14 @@ void TwlSpMain( void ) I2Ci_WriteRegister(I2C_SLAVE_DEBUG_LED, 0x01, ++step); // 0: before PXI - profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); + profile[pf_cnt++] = (u32)OS_TicksToMicroSecondsBROM(OS_GetTick()); #endif OS_InitFIRM(); + OS_EnableIrq(); // PMでOS_InitTick()を使っているので (他でも使ってる?) #ifndef SDK_FINALROM + //OS_EnableIrq(); // 1: after PXI profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); #endif @@ -107,6 +109,7 @@ void TwlSpMain( void ) OS_SetDebugLED(++step); PM_InitFIRM(); + PM_BackLightOn( FALSE ); #ifndef SDK_FINALROM // 2: after PM @@ -115,7 +118,8 @@ void TwlSpMain( void ) OS_SetDebugLED(++step); - /* FATFSライブラリ用にカレントヒープに設定 */ + /* FATFSライブラリ用にカレントヒープを設定 */ + /* WRAM上のfatfsHeapをメインメモリヒープとして登録している */ { OSHeapHandle hh; u8 *lo = (u8*)fatfsHeap; @@ -135,6 +139,7 @@ void TwlSpMain( void ) profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); #endif OS_SetDebugLED(++step); + PM_BackLightOn( FALSE ); if ( FATFS_MountDriveFirm( DRIVE_NO, BOOT_DEVICE, PARTITION_NO ) ) { @@ -144,6 +149,7 @@ void TwlSpMain( void ) profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); #endif OS_SetDebugLED(++step); + PM_BackLightOn( FALSE ); switch ( PAD_Read() & PAD_KEYPORT_MASK ) { @@ -175,6 +181,7 @@ void TwlSpMain( void ) profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); #endif OS_SetDebugLED(++step); + PM_BackLightOn( FALSE ); if ( FATFS_LoadHeader() && FATFS_LoadStatic() ) { @@ -184,6 +191,7 @@ void TwlSpMain( void ) profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); #endif OS_SetDebugLED(++step); + PM_BackLightOn( TRUE ); FATFS_Boot(); } diff --git a/build/nandfirm/sdmc-launcher/ARM9/main.c b/build/nandfirm/sdmc-launcher/ARM9/main.c index 32d7c208..6901f195 100644 --- a/build/nandfirm/sdmc-launcher/ARM9/main.c +++ b/build/nandfirm/sdmc-launcher/ARM9/main.c @@ -39,7 +39,7 @@ static SVCSignHeapContext acPool; Profile */ #ifndef SDK_FINALROM -#define PRFILE_MAX 128 +#define PRFILE_MAX 0x100 u32 profile[PRFILE_MAX]; u32 pf_cnt = 0; #endif @@ -49,6 +49,8 @@ u32 pf_cnt = 0; FromBootの対応をまとめる&メインメモリの初期化 OS_Init前なので注意 + MI_LoadHeader前にかなり(数100msec)時間があるので、可能なら + OS_Init後にいろいろ処理したい! ***************************************************************/ static void PreInit(void) { @@ -70,6 +72,23 @@ static void PreInit(void) MIi_CpuClearFast( 0, (void*)OSi_GetFromBromAddr(), sizeof(OSFromBromBuf) ); } +/*************************************************************** + PostInit + + MI_LoadHeader前にかなり(数100msec)時間があるので、可能なら + OS_Init後にいろいろ処理したい! + メインメモリの初期化 +***************************************************************/ +static void PostInit(void) +{ + /* + メインメモリ関連 (ARM9用の領域を全クリア) + */ + + MIi_CpuClearFast( 0, (void*)HW_DELIVER_ARG_BUF_END, HW_TWL_MAIN_MEM_MAIN_SIZE-HW_DELIVER_ARG_BUF_SIZE ); + DC_FlushAll(); +} + /*************************************************************** CheckHeader @@ -101,11 +120,12 @@ void TwlMain( void ) #ifndef SDK_FINALROM // 0: before PXI - profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); + profile[pf_cnt++] = (u32)OS_TicksToMicroSecondsBROM(OS_GetTick()); #endif OS_InitFIRM(); #ifndef SDK_FINALROM + OS_EnableIrq(); OS_InitTick(); // 1: after PXI profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); @@ -113,6 +133,13 @@ void TwlMain( void ) SVC_InitSignHeap( &acPool, acHeap, sizeof(acHeap) ); + PostInit(); + +#ifndef SDK_FINALROM + // 2: after PostInit + profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick()); +#endif + // load menu if ( MI_LoadHeader( &acPool, RSA_KEY_ADDR ) && CheckHeader() && MI_LoadStatic() ) { diff --git a/include/firm/pm/ARM7/pm_init.h b/include/firm/pm/ARM7/pm_init.h index c1be14f0..055c8d93 100644 --- a/include/firm/pm/ARM7/pm_init.h +++ b/include/firm/pm/ARM7/pm_init.h @@ -33,6 +33,29 @@ extern "C" { *---------------------------------------------------------------------------*/ void PM_InitFIRM( void ); +/*---------------------------------------------------------------------------* + Name: PM_CheckINIFlag + + Description: Check INI in GX_DISPSTAT (able to call before PM_InitFIRM) + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ +void PM_CheckINIFlag(void); + +/*---------------------------------------------------------------------------* + Name: PM_BackLightOn + + Description: power B/L on if not set yet + + Arguments: force TRUE: wait until valid condition + FALSE not set unless valid condition + + Returns: None + *---------------------------------------------------------------------------*/ +void PM_BackLightOn( BOOL force ); + #ifdef __cplusplus } /* extern "C" */ #endif