f23258 发表于 2018-12-3 22:27

【原创】改屏机黑苹果的春天,通过修正ACPI实现合盖睡眠

本帖最后由 f23258 于 2018-12-3 23:19 编辑

改屏机的黑苹果,其合盖睡眠一直是个老大难的问题,之前没接触所以也没深入研究。
前阵子入了台X330,《为了一直挂念的窄边框,X330体验流水分享》,开始第一次与改屏机亲密接触。
机器到手黑苹果起来也很容易的顺风顺水,但是怎么折腾就是没有原生亮度和合盖睡眠。强迫症使然的想折腾完善,了解改屏原理后,放弃了在我机器上实现原生的亮度调节。但是对于无法合盖睡眠这事,心里一直有想法,强迫症使然的找思路。几经折腾,黑果大神武大实现代码,最终在X330上完美实现了合盖睡眠。

一、原理
X230的改屏有两三家的方案,但基本原理都是一样的。
原机的LVDS是没法支持高分的,要支持高分只能从DP口下手,而X230是支持底座的,所以改屏都是从底座接口处的DP做文章。
如何实现各家有各家的思路,但基本原理就是从DP处修正以便可以接入高分屏屏,相当于外接了一个显示器,而对于是否屏蔽内屏就看各家实力了(需改BIOS屏蔽LVDS,据说省电一点,这点本人未实证)。
从苹果系统的规范上来说,合盖事件在外接显示屏的情况下,机器也是不会实现睡眠的,只是内屏熄屏,外屏工作,这一点在白苹果机器上得到了实证。而对于改屏机而言,其实只有一个屏幕,但是系统当它是外接了一个显示器(复制模式能调节亮度),这样内屏熄(实际已无内屏),外屏继续工作,当然导致系统无法进入睡眠了。
这也是改屏机器一直无法睡眠的原因。
而如何解决这个问题,从ACPI的睡眠方法中找到了启发。

二、规范
苹果系统的调用和运作,很大程序上会去调用各个ACPI,所以ACPI和白果越接近,就有越容易黑的可能。
查找WAKE/SLEEP等等关键词,可以确认ACPI规范了3种进入睡眠的方式,分别是:
(1)PNP0C0C — Power Button Device
(2)PNP0C0D — Lid Device
(3)PNP0C0E — Sleep Button Device

其中,PNP0C0D — Lid Device,又规范了_LID方法:
返回值:
0 – The lid is closed
Non-zero – The lid is open
通常情况下,黑苹果启用(3)时,视同关机,向系统发出了关机参数,致使黑苹果系统崩溃。
而黑果系统的合盖睡眠,是按PNP0C0D方式进行。这个时候合盖进入睡眠时,开盖终止睡眠。连接外显的情况下,无法睡眠,内屏和外显同步性异常。
通过PNP0C0E进入睡眠时,盒盖还是按下功能键,会立即睡眠,睡眠过程快于Lid方式,连接外显的情况下,睡眠正常。
以上这一点就是改屏机实现睡眠的可能,完整的根据规范定义出睡眠的必要参数和条件,以实现改屏机合盖睡眠。

三、实现
ACPI规范中,针对PNP0C0E的实现举了这么一个例子,

原文有如下描述:
The AML code below does the following:
• Creates a device named “SLPB” and associates the Plug and Play identifier (through the _HID object) of “PNP0C0E.”
• The Plug and Play identifier associates this device object with the sleep button driver.
• Creates an operational region for the control method sleep button’s programming model:
System I/O space at 0x201.
• Fields that are not accessed are written as “1s” (these status bits clear upon writing a “1” to their bit position, hence preserved would fail in this case).
• Creates a field within the operational region for the sleep button status bit (called PBP). In this case the sleep button status bit is a child of the general-purpose status bit 0. When this bit is set it is the responsibility of the AML code to clear it (OSPM clears the general-purpose status bits). The address of the status bit is 0x201.0 (bit 0 at address 0x201).
• Creates an additional status bit called PBW for the sleep button wake event. This is the next bit and its physical address would be 0x201.1 (bit 1 at address 0x201).
• Generates an event handler for the sleep button that is connected to bit 0 of the general-purpose status register 0. The event handler does the following:
• Clears the sleep button status bit in hardware (writes a “1” to it).
• Notifies OSPM of the event by calling the Notify command passing the sleep button object and the device specific event indicator 0x80.
看着容易头晕,大概意思就是定义一个SLPB的设备名称来和PNP0C0E关联,再通过特定Notify(\_SB.SLPB, 0x80)来实现睡眠。
基于此,要实现此功能,得满足以下条件:
1、更名,使用原DSDT里的LID相关不起作用
2、做LID相关补丁,使LID事件发生时调用PNP0C0E的方法
3、修正PNP0C0E方法传递的参数,使系统正确休眠。

代码的最终实现有宪武开发完成,在X330改屏机上和X1C 5TH均测试通过。
X230的EFI将在《还战X230完美黑苹果,macOS Mojave 10.14安装即使用》主帖中更新。
以上只是通过对ACPI对某些功能实现的探讨,仔细研究ACPI规范,应该会有发现更多黑果完美的可能。

附上ACPI标准规范文件以供参考:
附件一:
附件二:

yangjingmike 发表于 2018-12-3 22:30

膜拜下大神

wenlj163 发表于 2018-12-3 22:41

可以可以

330已出

iamcheyan 发表于 2018-12-3 23:16

膜拜了

弟大勿博 发表于 2018-12-3 23:50

技术贴啊,造福黑友!

版主正在加分设精的路上。

peacefeeling 发表于 2018-12-4 06:11

睡什么睡!起来嗨!

simon86 发表于 2018-12-4 07:33

http://www.ibmnb.com//mobcent//app/data/phiz/default/23.png

f23258 发表于 2018-12-4 10:01

peacefeeling 发表于 2018-12-4 06:11
睡什么睡!起来嗨!

这么早HIGH到哪了?

dialox 发表于 2018-12-4 12:38

群里改屏的师傅们活要多了。

huzhi28251 发表于 2018-12-4 16:54

厉害

kfg 发表于 2018-12-4 16:58

厉害!!!

335941414 发表于 2018-12-4 19:05

二个zip文件怎么使用??

chenyingkeng 发表于 2018-12-4 20:24

实在是技术精品文章,论坛就要多多来这样的好文!

wuyuwuti 发表于 2018-12-4 21:30


膜拜下大神

一中路阿鹏 发表于 2018-12-4 23:33

支持,一路黑到头..马上快白了

think坏了 发表于 2018-12-5 07:00

都四神之人

maj 发表于 2018-12-5 09:44

内涵好文!

youngyucn 发表于 2019-1-12 22:36

呼吁版主设精

Gemazon 发表于 2019-1-13 18:34

f23258 发表于 2018-12-3 22:27
改屏机的黑苹果,其合盖睡眠一直是个老大难的问题,之前没接触所以也没深入研究。
前阵子入了台X330,《为 ...

白苹果笔记本外接显示屏,官方说法需要接通电源,否则很快会重新进入休眠。按照这个思路,黑苹果拔下电源线,是否会进入睡眠呢?

kingkonglue 发表于 2019-1-13 18:47

f23258 发表于 2018-12-3 22:27
改屏机的黑苹果,其合盖睡眠一直是个老大难的问题,之前没接触所以也没深入研究。
前阵子入了台X330,《为 ...

厉害,尽然没有加技术分!

stevenjtx 发表于 2019-1-15 14:19

厉害,收藏个

gjack12 发表于 2019-6-25 22:05

楼主,我想问一下,就是您的这个补丁通用吗?还有clover里改名的都有哪些,我想参照您的补丁给我的电脑解决合盖睡眠问题,谢谢
页: [1]
查看完整版本: 【原创】改屏机黑苹果的春天,通过修正ACPI实现合盖睡眠