不同供电方式的笔记本启动方法

343 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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状态

三、完结

本文完结,撒花结束。