持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情
简介
在这一篇文章中,区分一下S3状态到开机的时序,G3状态到S5的时序的区别。需要注意的是,这里提到的S3,G3指的都是不插AC的关机状态。
一、S3->S0
S3->S0指的是从SX到开机状态。
SX到S0时程序需要使能通讯0x80端口,唤醒键盘,使能触摸板,同时启动的时候还需要设置背光亮度。
//-----------------------------------------------------------------------------
// The variable of Sx -> S0
//-----------------------------------------------------------------------------
void SX_S0CommVar(void)
{
CheckPowerStateIndex = 0x00;
SysPowState=SYSTEM_S0;
TurnOff_AUX_CNT = 0x00;
CLEAR_MASK (POWER_FLAG3,S5_AUX_OFF);
ResetSCIEvent();
#if CIRFuncSupport
Reset_CIR();
#endif
// Keyboard enable
Enable_KB();
CAM_EN_H();
CAM_DIS_LED_OFF();
AutoBootTimer = 0;
OEM_SX_S0CommVar();
LIDQevent_WA = 1;
}
下面是S3到开机状态的电源时序执行片段。
//----------------------------------------------------------------------------
// S3 to S0 sequnce
//----------------------------------------------------------------------------
void Oem_S3S0Sequence(void)
{
if ( PowSeqDelay != 0x00 )
{
PowSeqDelay--; //1m Sec count base
if ( PowSeqDelay != 0x00 )
{
return;
}
}
while(PWSeqStep<(sizeof(asPowerSEQS3S0)/sizeof(sPowerSEQ)))
{
if(asPowerSEQS3S0[PWSeqStep].checkstatus==0x00) // Do function
{
(asPowerSEQS3S0[PWSeqStep].func)();
PowSeqDelay = asPowerSEQS3S0[PWSeqStep].delay;
PWSeqStep++;
if(PowSeqDelay!=0x00)
{
break;
}
}
else // Check input status pin
{
if((asPowerSEQS3S0[PWSeqStep].func)())
{
PowSeqDelay = asPowerSEQS3S0[PWSeqStep].delay;
PWSeqStep++;
}
break;
}
}
}
二、G3->S5
G3->S5指的是不插AC的关机状态到插上AC的关机状态。这里的G3含义和SX含义相同。
第一步:先定义一个时序数组
//-------------------------------------------------------------------------------------
// Do G3 -> S5 power sequnce
//-------------------------------------------------------------------------------------
const sPowerSEQ code asPowerSEQG3S5[]=
{
{ NullFun, 0, 0, }, // Dummy ste
{ PF_PWRBTN_HI, 0, 0, }, // 01
{ PF_AUX_ON, 0, 0, }, // 02
{ PF_Read_AUX_PG, 10, 1, }, // 04
{ PF_EC_DSW_PWROK_HI, 0, 0, }, // 06
{ PF_CHK_VCCIN_AUX_PG_HI, 90, 1, }, // 07
#if SUPPORT_INTERFACE_eSPI
{ PF_eSPI_Bus_On, 0, 0, }, // 08
#endif
{ PF_RSMRST_HI, 0, 0, }, // 09
#if SUPPORT_INTERFACE_eSPI
{ PF_Check_eSPI_Enable, 0, 1, }, // 0A
{ PF_INIT_PMIO, 0, 0, }, // 0B
#endif
{ G3_S5Variable, 0, 0, }, // always in the end of tabel
};
第二步:实现G3->S5功能
//-----------------------------------------------------------------------------
// The variable of G3 -> S5
//-----------------------------------------------------------------------------
void G3_S5Variable(void)
{
SysPowState=SYSTEM_S5;
Ram(0x55)
OEM_CCG5_Init();
if((0x55==BRAM_FLASH_ID0)&&(0xAA==BRAM_FLASH_ID1)&&
(0x55==BRAM_FLASH_ID2)&&(0xAA==BRAM_FLASH_ID3))
{
BRAM_FLASH_ID0 = 0x01;
BRAM_FLASH_ID1 = 0x11;
BRAM_FLASH_ID2 = 0;
BRAM_FLASH_ID3 = 0;
Oem_TriggerS5S0();
}
}
第三步:轮训电源状态
//----------------------------------------------------------------------------
// G3 to S5 sequnce
//----------------------------------------------------------------------------
void Oem_G3S5Sequence(void)
{
if ( PowSeqDelay != 0x00 )
{
PowSeqDelay--; //1m Sec count base
if ( PowSeqDelay != 0x00 )
{
return;
}
}
while(PWSeqStep<(sizeof(asPowerSEQG3S5)/sizeof(sPowerSEQ)))
{
if(asPowerSEQG3S5[PWSeqStep].checkstatus==0x00) // Do function
{
(asPowerSEQG3S5[PWSeqStep].func)();
PowSeqDelay = asPowerSEQG3S5[PWSeqStep].delay;
PWSeqStep++;
if(PowSeqDelay!=0x00)
{
break;
}
}
else // Check input status pin
{
if((asPowerSEQG3S5[PWSeqStep].func)())
{
PowSeqDelay = asPowerSEQG3S5[PWSeqStep].delay;
PWSeqStep++;
}
break;
}
}
}
第四步:检查是否切换到S5状态
三、完结
本文完结,撒花结束。