基于通用型边缘计算微小化主机现代待机的呼吸灯实现
2020-02-02王再跃顾长利王娟
王再跃 顾长利 王娟
(安徽合肥联宝信息技术有限公司 安徽省合肥市 230091)
1 研究背景
计算机在出现的前几十年,研究的重点一直是如何提高机器性能,而不是在降低功耗上。便携式笔记本被发明后,业界才开始考虑如何省电以延长电池的供电时间。由Intel,Microsoft,Toshiba等公司共同制定的提供操作系统应用程序管理电源接口的spec-ACPI 中规定了各种省电状态,就系统而言有S0,S1..S5 等,对于CPU 来说有C0,C1..C10,对于各种外部设备则有D0,D1,D2,D3。当笔记本暂时不使用时,用户可以通过在系统下发送睡眠的指令,也可以直接合上盖子,进入S3 状态。需要使用时只需要轻触鼠标或者打开上盖,一秒钟以后就进入操作系统。但是,随着智能手机的普及,人们对于电子设备即拿即用,随时响应的要求越来越高。计算机在传统的睡眠模式S3 时所有的通讯设备都被关闭,用户无法收到即时的通讯信息和邮件,不能够满足人们对于实时性,低功耗的需求,现代待机(ModernStandby)的诞生解决了这一困扰。Microsoft 在Win10 引入了ModernStandby 的电源模式,设备可以立即使能或者关闭,以极低的功耗模式在后台运行,为用户提供了更快的开/关体验,同时也扩展了对硬件的支持。对于台式机系统来说,是从外部到内部一步一步进入低功耗的状态。在这个过程中,如果有任何设备拒绝进入这一状态,整个链路就会中断,回到普通的运行模式。比如一个接有USB 设备的边缘计算微小化主机系统,如果有任何一个外设没有能够进入D3 低功耗状态,那么从SoC 到USBController 都会在带电的状态,无法进入现代待机。除了硬件之外,软件也需要配合,不能有任何的软件拒绝进入这一状态,如果要让这个过程顺利完成,仅有操作系和CPU 的支持是不够的,现代待机是一个系统的工程,要求主板,外围设备和BIOS都支持这一模式,并且还要对各种系统配置进行参数的调试才能顺利进入。正因如此,这一电源模式对计算机的硬件和软件的要求都非常高,实现起来也很复杂,也是造成该功能暂未普及的原因之一,而台式机由于其可扩展性强,支持的外部设备众多,留给用户自己DIY 的空间也很大,对现代待机的支持就更加困难。传统的S3 睡眠状态是将当前的系统状态和内容全部存到Memory 中,仅有内存带电,其他所有的设备都停止供电,风扇也会停转,对于用户和开发人员来说可以直观感知到的是睡眠指示灯的闪烁,对于支持ModernStandby 的系统,如何判断系统已经进入了现代待机的状态,让用户体会到它与传统S3 睡眠的不同,给研发工程师们带来了挑战。
2 创新解决方案研究与应用
传统台式机实现睡眠的LED 灯闪烁一般是通过板端的超级输入输出芯片SIO 来完成,当用户在系统下通过控制选项选择要让机器进入睡眠状态或者手动点击睡眠按钮时,会触发系统管理中断信号进而调用相应的中断处理函数来实现LED 灯的闪烁。SIO 对于LED 灯的控制寄存器定义如下,只需要在屏幕熄灭时填写对应的寄存器地址来控制bit 位的使能即可。如图1所示。
图1
工程师们需要思考如何利用灯效让用户区别现代待机和传统睡眠,广泛应用于手机等便携设备的呼吸灯是个不错的选择。呼吸灯是指灯光在控制器的作用下完成由亮到暗的逐渐变化,给人的感觉像在呼吸,可以用来达到提醒用户的功能。本文提供的方法可以将该功能应用在支持现代待机的台式机上,属于业界首创,也是第一次将现代待机的功能应用于台式机上。开发工程师和用户都可以通过呼吸灯的变化直观的了解系统是否有进入到现代待机的状态,该方法简单易用,效果明显,可以推广到笔记本和台式机等支持现代待机的平台上。
控制LED 灯的亮度主要有两种方法,一种是给LED 灯上施加模拟信号(可以串接可调电阻或DAC 输出模拟信号),通过改变流经LED 上的电流控制LED 灯的亮度;另一种是使用PWM,给LED 灯上施加数字信号,通过调整数字信号的占空比(调整占空比= 调整有效值)来控制。这里我们的呼吸灯就是采用第二种PWM的方法。在边缘计算微小化台式机主板上我们利用SIO 芯片控制呼吸灯的占空比来实现,可以通过SIO 芯片开放出来的寄存器来调节不同的占空比实现灯的明亮变化。
图2 是完整的一次呼吸过程中Duty 的变化值,横坐标是时间的变化,纵坐标代表着占空比的变化,B8h 是指延长最暗的时间,是根据人眼的视觉暂留来设定的,B9h 对应的每一格亮度占用的时长,单位是以10ms 来计算,亮度的变化总共有40 格,从0x90-0xB7。通过这一设定可以很好的实现呼吸的效果。
图2
图3
实现灯效控制的方法已经找到,但是对于终端用户和系统工程师来说,判断是否进入现代待机状态的标准是不一样的,如背景部分所述,现代待机是一个系统的工程,主板上任何设备的功耗状态都会影响到系统最终的待机深度。对于终端使用的用户来说最直观的判断机器是否进入现代待机的方法是通过屏幕的亮灭,可以以此作为触发LED 灯呼吸的条件,利用SIO 芯片来实现LED 灯效的控制,要求屏幕熄灭和点亮时SIO 做出相应动作,但是在台式机上实现较于笔记本而言更有难度。使用台式机的用户可以外接各种显示接口的显示器,很难掌握用户对于外接显示器的使用,SIO 无法像在笔记本电脑上控制内置屏一样掌握屏幕的亮灭状态。通过综合分析台式机上系统的图形显示驱动和底层软件的交互,我们发现可以利用BIOS 来通知SIO 对LED 进行控制。在Intel 平台上,当屏幕熄灭时,系统自带的inbox 驱动会通知到ACPI 下的ASLcode,只需要在这段代码中添加对SIO 的通知即可。
对于在项目开发阶段的工程师来说,这一判断方法并不适用,硬件工程师需要掌握各个设备的功耗状态以了解其是否真正实现了深度待机,单纯通过屏幕的亮灭远远不够。下图是在支持现代待机的设备上调试的日志,显示了板端的哪些设备影响了现代待机的深度,从左侧的设备列表上可以看到网卡,显卡的驱动,USB 的controller 都有影响到这一待机状态的进入。
因此,硬件工程师需要实际的量测#SLP_S0 的信号,如果其状态为low 并且维持5s 以上,才认为系统进入了现代待机的模式,进而去使能呼吸灯的灯效,通过这一方法的实现可以帮助系统工程师准确的掌握板端设备的现代待机状态,防止出现误判的场景。
以上是针对不同的使用者提出的现代待机场景的呼吸灯解决方案,可以成功的在边缘计算微小化主机上实现深度待机灯效的控制,并且区别于传统的睡眠模式给用户新的使用体验;另一方面也考虑到了在开发过程中工程师对于设备功耗情况的调试,对于判断系统是否进入现代待机模式提供了新的思路。随着现代待机技术的普及,该方案也可以移植到其他使用该功能的设备上。