6、使用最新版的键盘驱动VoodooPS2Controller.kext,Fn+F7和Fn+F8亮度可以调节,但没有小太阳,而且不能保存关机前的亮度。此时有水波纹所以显卡是驱动了的,出现这些问题是因为Fn+F7和Fn+F8对应DSDT没有和驱动VoodooPS2Controller.kext映射对应。 6.1 修改DSDT,亮度增加Fn+F7,查找Method (_Q14, 0, NotSerialized),将里面的代码修改为: Method (_Q14, 0, NotSerialized) { Notify (PS2K, 0x0206) Notify (PS2K, 0x0286) } 6.2 亮度减小,FN+F8,查找Method (_Q15, 0, NotSerialized),修改为: Method (_Q15, 0, NotSerialized) { Notify (PS2K, 0x0205) Notify (PS2K, 0x0285) } 6.3 外接显示器,Fn+F6,查找Method (_Q16, 0, NotSerialized),(由于没有HDMI接口显示器并未测试此项,VGA外接还要另外利用KextstoPatch修改AppleIntelSNBGraphicsFB.kext)修改为: Method (_Q16, 0, NotSerialized) { Notify (PS2K, 0x026e) Notify (PS2K, 0x02ee) } 7、修改显卡显存384MB到768MB,可以减少随机花屏假死的概率但不能杜绝,不能杜绝,不能杜绝,重要的事说三遍,在AppleIntelSNBGraphicsFB里的二进制文件代码C745C400 000018改为C745C400 000030,尾数18=384MB,20=512MB,30=768MB,40=1024MB。这里选择Colver的KextsToPatch。 <key>KernelAndKextPatches</key> <dict> <key>KextsToPatch</key> <array> <dict> <key>Comment</key> <string>Change HD3000 Memory from 384MB to 768MB on 10.12</string> <key>Disabled</key> <false/> <key>Find</key> <data> x0XEAAAAGA== </data> <key>Name</key> <string>com.apple.driver.AppleIntelSNBGraphicsFB</string> <key>Replace</key> <data> x0XEAAAAMA== </data> </dict> </array> </dict> 8、据说在开机启动参数里添加“slide=0”也可以减少随机花屏假死的概率,如果添加后不能启动还是去除吧(用HotPatch时就发现添加后不能启动)。
屏蔽独显(Nvidia GT610m) 这个单独拿出来说 基本原理:在电脑开机时(对应_INI method)和睡眠唤醒时(对应_WAK method)调用关闭Nvidia独显的Method。
这个网站http://hybrid-graphics-linux.tuxfamily.org/index.php?title=ACPI_calls总结了关闭Nvidia显卡的常见methods,还列举了一些机型的具体情况,大家可以去看看,弄清楚自己电脑关闭显卡的method究竟是哪个,然后结合这个帖子来修改DSDT.
正如上面那个网站所示,关闭Nvidia独显一般有两种方法:一、使用 _DSM + _PS3;二、直接用_OFF(或者DOFF,SGOF等等,有些机型是不同的);
虽然上面那个网站一般都是直接调用OFF()函数来关闭独显的,但个人觉得如果有_DSM和_PS3的话,先使用方法一比较好,因为方法二可能会有一些影响,比如CPU变频的问题。(具体请看参考帖子[教程] 解决Optimus 和CPU Turbo 变频冲突)。
具体方法: 很多人喜欢把SSDT的显卡部分移到DSDT中然后添加关闭独显的代码,并且开机DropOEMSSDT只用DSDT。但是我个人觉得这样子很麻烦,首先在移动过程中可能会产生错误,而且Drop掉SSDT后,DSDT中的那些External variables,methods就无法access了,因此DSDT中用到这些Objects,Methods的地方就会产生问题。如果Drop SSDT的目的是为了使用clover和变色龙的Generate P-States和C-States的话,clover可以只Drop掉有CPU信息的SSDT,变色龙可以把除有CPU信息的其他SSDT放在Extra目录下再DropSSDT,所以我认为完全没有必要花时间来移动显卡部分或者其他东西。如果DSDT和SSDT要相互调用对方的函数,那就在definition block那里加上External就好了。(如果新人看不懂这一段就跳过吧) 说了那么多废话,终于开始了。 注意,在修改DSDT和SSDT之前,可以用这个帖子介绍的方法先生成dsl文件,可以减少错误,还有其他错误自己爬帖解决。不过如果你某个DSDT或SSDT有错误不能解决但你不需要再把它编译成AML文件的话,可以不用管它。
方法一: 1.首先在DSDT和SSDT中搜索找到要用的函数_WAK,_INI,_PS3,_DSM。_WAK一般只有一个。_INI可能有很多个,最好用\_SB.PCI0下或\_SB.PCI0.PEG0.PEGP的。_PS3只有一个,如果没有的话看方法二。_DSM会有很多个,一定要用\_SB.PCI0.PEG0.PEGP下的,如果\_SB.PCI0.PEG0.PEGP下没有,搜索看看显卡定义Device(IGPU)下有没有(注意,以下步骤是默认你DSDT的相关methods为一般情况,若有不同需根据你自己的DSDT做相应更改) 2.在_WAK之前新建一个Method PINI() - Method (PINI, 0, NotSerialized)
- {
- \_SB.PCI0.PEG0.PEGP._DSM (Buffer (0x10)
- {
- /* 0000 */ 0xF8, 0xD8, 0x86, 0xA4, 0xDA, 0x0B, 0x1B, 0x47,
- /* 0008 */ 0xA7, 0x2B, 0x60, 0x42, 0xA6, 0xB5, 0xBE, 0xE0
- }, 0x0100, 0x1A, Buffer (0x04)
- {
- 0x01, 0x00, 0x00, 0x03
- })
- \_SB.PCI0.PEG0.PEGP._PS3 ()
- }
3.在_WAK和适当的_INI中调用PINI()。_WAK和_INI可能不在同一个DSDT或SSDT中,没有关系 - Method (_WAK, 1, Serialized)
- {
- PINI ()
- ......
- }
- [。。。省略。。。]
- Method (_INI, 0, NotSerialized)
- {
- PINI ()
- .......
- }
-
- 方法二:
- 如果没有_PS3函数,或者使用上面的方法没效果,那就试试这个方法吧。
- 1.在_WAK和\_SB.PCI0下或\_SB.PCI0.PEG0.PEGP下适当的_INI里面加入”\_SB.PCI0.PEG0.PEGP._OFF() "
- Method (_WAK, 1, Serialized)
- {
- \_SB.PCI0.PEG0.PEGP._OFF()
- ......
- }
- [。。。省略。。。]
- Method (_INI, 0, NotSerialized)
- {
- \_SB.PCI0.PEG0.PEGP._OFF()
- .......
- }
4.编译,如果有类似“Error Object does not exist (PINI)”的错误 若Object does not exist (PINI) 在DefinitionBlock(在DSDT和SSDT的最上面)加上 External(PINI, MethodObj) 例如 DefinitionBlock ("acpi_dsdt.aml", "DSDT", 1, "LENOVO", "CB-01 ", 0x00000001) { External (_SB_.PCI0.PAUD.PUAM, MethodObj) // Warning: Unresolved Method, guessing 0 arguments (may be incorrect, see warning above) External (_SB_.PCI0.XHC_.DUAM, MethodObj) // Warning: Unresolved Method, guessing 0 arguments (may be incorrect, see warning above) External (_SB_.TPM_.PTS_, MethodObj) // Warning: Unresolved Method, guessing 1 arguments (may be incorrect, see warning above) External (_PR_.CFGD, FieldUnitObj) External (_PR_.CPU0._PPC, IntObj) External (_PR_.CPU0._PSS, PkgObj) External (PINI, MethodObj)
若Object does not exist (\_SB.PCI0.PEG0.PEGP._PS3) 在DefinitionBlock加上 External(_SB_.PCI0.PEG0.PEGP._PS3, MethodObj) 若Object does not exist (\_SB.PCI0.PEG0.PEGP._DSM) 在DefinitionBlock加上 External(_SB_.PCI0.PEG0.PEGP._PS3, MethodObj) 5.没有错误了,编译,save AML,把修改了的DSDT.aml, SSDT.aml和其他所以没有修改的SSDT*.aml放在Extra目录(变色龙),或patched文件夹(Clover),这样的话要DropSSDT。开机,进BIOS里Config/Display--Graphics Device选择双显卡,保存重启幸运的话,Nvidia显卡应该被屏蔽了。
声卡(Conexant Cx20590) 1、注入声卡Layout-id=28(十六进制为1C),如果是用标准的AppleALC.kext并注入Layout-id=3,那么内置麦克风不能用。这里使用的是Layout-id=28。 在DSDT里打补丁[audio]Audio Layout 3,然后查找layout-id,将下面的0x03, 0x00, 0x00, 0x00修改为0x1C, 0x00, 0x00, 0x00 Device (HDEF) { …… Method (_DSM, 4, NotSerialized) { If (LEqual (Arg2, Zero)) { Return (Buffer (One) { 0x03 }) }
Return (Package (0x06) { "layout-id", Buffer (0x04) { 0x1C, 0x00, 0x00, 0x00 },
"hda-gfx", Buffer (0x0A) { "onboard-1" },
"PinConfigurations", Buffer (Zero) {} }) } }
或者是在Clover的config.plist里注入 <key>Devices</key> <dict> <key>Audio</key> <dict> <key>Inject</key> <string>28</string> </dict> </dict>
2、在Clover的config.plist里勾选FixHPET=Yes <key>ACPI</key> <dict> <key>DSDT</key> <dict> <key>Fixes</key> <dict> <key>FixHPET_0010</key> <true/> </dict> </dict>
3、为驱动AppleALC.kext在未支持的版本里运行,添加启动参数“-alcbeta” <key>Boot</key> <dict> <key>Arguments</key> <string>-alcbeta</string> </dict>
4、添加驱动AppleALC.kext到文件夹/L/E
|