バックライトをつける前にINIフラグをチェックするようにした

PM_InitFIRMの最適化

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@68 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yutaka 2007-10-25 12:00:48 +00:00
parent b708a5bca5
commit 9db3977a8c
4 changed files with 124 additions and 10 deletions

View File

@ -18,12 +18,13 @@
#include <firm/pm.h>
#include <twl/spi/common/pm_common.h>
#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");
}
}

View File

@ -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();
}

View File

@ -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() )
{

View File

@ -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