一个简陋的例子
我在参考资料1 放了ENE的一款EC控制器芯片手册,对细节感兴趣的同学可以参考阅读一下。
EC的工作原理EC和BIOS的合作十分紧密。EC通过BIOS的ACPI表将它所需要报告的信息和方法报告给操作系统,并与之交互。
一个典型的信息交互通道是这样:
它在ACPI table中的表现就是:
Device (EC0) { Name (_HID, EISAID(“PNP0C09”)) Method (_CRS) { … } Name (_GPE, 0 ) Method(_Q06) { … } Method(_Q07) { … } Method(_Q08) { … } Method(_Q0A) { … } // EC uses GPE0 // Adapter event // Thermal event // Battery event // LID event
从这个例子中看到,电池报警、AC电源插入、温度传感器报告和LID(笔记本盖子)信息,先报告给EC不同的Q里,EC再接入ACPI的GPE,GPE的触发会产生SCI,这时候操作系统就知道了。一个Event产生,操作系统在收到SCI后,会检查GPE,看是谁触发了事件;在发现是GP_STS0后,就知道是EC产生的时间,接着会去检查EC的Q0x,看看具体是EC的哪个管脚引发的,按图索骥,最终发现Event的产生方,而对该消息作出相应处理。
看起来似乎相当难懂!好吧,我们看个case study。
笔记本盖子开启/合上case study
我们来简化一下上面那个图:
- 笔记本合上,EC触发GPE。OS收到GPE,查看GP_STS,发现是GPE0触发,知道是EC导致。访问EC得知是Q0A。通过_LID的关键字和PNP知道是盖子信息,知道是盖子合上了。
然后检查用户的电源管理策略作出相应处理: