笔记本关机开机的电源时序

397 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

简介

在笔记本中的不同睡眠状态下,EC的上电时序也有着不同的区别,本文简单介绍一下不同的睡眠模式区别,以及关机开机状态切换的实现。

一、睡眠模式  

S0即开机状态。

S1指的是CPU停止工作,其他的主要部件仍然正常工作。

S2指的是CPU关闭,总线时钟也被关闭,其他的部件仍然正常工作。

S3指的是我们常说的睡眠(Sleep) :除了内存外的部件都停止工作。这就是我们熟悉的STR(Suspend to RAM),即除了内存以外的大部分机器部件都进入断电状态。 这种休眠状态恢复速度特别快,但由于内存中的数据并没有被保存下来,因此这个状态的系统并没有进入真正意义上的休眠状态,仍在持续耗电。

S4指的是休眠(Hibernate) 内存信息写入硬盘,所有部件停止工作。这就是STD(Suspend to Disk),这时系统主电源关闭,硬盘存储S4前数据信息。

在我现在的接触中,S5指的是插着AC的关机状态,SX指的仅电池供电的关机状态。

S0->S5

S0->S5指的是从开机到关机(插着AC)状态。

//-----------------------------------------------------------------
// S0 to S5 sequnce
//-----------------------------------------------------------------
void Oem_S0S5Sequence(void)
{
    if ( PowSeqDelay != 0x00 )
    {
        PowSeqDelay--; 				//1m Sec count base
        if ( PowSeqDelay != 0x00 )
        {
            return;
        }
    }

	while(PWSeqStep<(sizeof(asPowerSEQS0S5)/sizeof(sPowerSEQ)))
	{	
		if(asPowerSEQS0S5[PWSeqStep].checkstatus==0x00)	// Do function
		{
			(asPowerSEQS0S5[PWSeqStep].func)();
			PowSeqDelay = asPowerSEQS0S5[PWSeqStep].delay;
			PWSeqStep++;
			if(PowSeqDelay!=0x00)
			{
				break;
			}
		}
		else	// Check input status pin
		{
			if((asPowerSEQS0S5[PWSeqStep].func)())
			{
				PowSeqDelay = asPowerSEQS0S5[PWSeqStep].delay;
				PWSeqStep++;
			}
			break;
		}
	}  
}

S5->S0

S5->S0指的是从关机(插着AC)到开机状态。


//----------------------------------------------------------------------------
// S5 to S0 sequnce
//----------------------------------------------------------------------------
void Oem_S5S0Sequence(void)
{
    if ( PowSeqDelay != 0x00 )
    {
        PowSeqDelay--; 				//1m Sec count base
        if ( PowSeqDelay != 0x00 )
        {
            return;
        } 
    }

	while(PWSeqStep<(sizeof(asPowerSEQS5S0)/sizeof(sPowerSEQ)))
	{	
		if(asPowerSEQS5S0[PWSeqStep].checkstatus==0x00)	// Do function
		{
			(asPowerSEQS5S0[PWSeqStep].func)();
			PowSeqDelay = asPowerSEQS5S0[PWSeqStep].delay;
			PWSeqStep++;
			if(PowSeqDelay!=0x00)
			{
				break;
			}
		}
		else											// Check input status pin
		{
			if((asPowerSEQS5S0[PWSeqStep].func)())
			{
                            PowSeqDelay = asPowerSEQS5S0[PWSeqStep].delay;
			    PWSeqStep++;
			}  
			break;
		}	
	}
}

二、完结

本文完结,撒花结束。