积分 1683 最后登录 2023-11-7 精华 0 阅读权限 210 主题 44 UID 292792 帖子 1837 PB币 2223 威望 158 贡献 0 技术 512 活跃 597
UID 292792 帖子 1837 PB币 2223 贡献 0 技术 512 活跃 597
4 F
发表于 2014-7-9 15:59:38
IP属地安徽
| 只看该作者
本帖最后由 nml 于 2014-7-11 14:39 编辑
DSDT杂七杂八
Clover从入门到精通
说到DSDT就不得不说Clover,强大的工具,可以配合DSDT将黑苹果发挥到极致。
四叶草有三好
时尚:在变色龙被改为各种版本的今天,Clover犹如一棵不起眼的四叶草,从角落里拔地而起,以迅雷不及掩耳盗铃儿响叮当之势成为OSX86领域里的黑马+潮流,就连崇尚Chameleon的tonymacx86论坛里也出现了一些Clover的帖子。 兼容:Clover支持自定义主题,支持从10.6以下的各个版本苹果系统,最新的Yosemite第一个预览版发布以后,Clover很快就有了更新。它不仅是引导黑苹果的利器,而且支持GPT格式磁盘,可以引导WIN8.1,可以引导最新的Ubuntu 14.04,这些我都已经测试过了,没有任何问题。 强大:Clover吸收了Chameleon的大部分主要功能,抛弃了老旧的MBR,在UEFI中引导速度几乎如闪电般迅速。
在其引导界面,可以直接对config.plist文件进行各种临时修改,方便遇到五国的黑苹果玩家自己摸索出路。
Clover的快捷键大全
Esc 返回子菜单,刷新页面 F1 打开帮助(即图中所示) F2 保存引导日志(仅支持FAT32) F3 显示隐藏引导项目(如果你隐藏了的话) F4 保存oem DSDT文件到EFI/CLOVER/ACPI/origin/文件夹(FAT32) F5 保存打过补丁的DSDT文件到上一文件夹(FAT32) F6 保存显卡驱动到EFI/CLOVER/misc文件夹(FAT32) F10 保存屏幕截图到EFI/CLOVER/misc文件夹(FAT32) F12 弹出所选卷(仅限DVD) 空格 显示选中引导项目的内容(相当于系统中我们使用鼠标右键) 数字键1~9 对应菜单中的快捷键 A 主菜单 O 主选项 R 软重启 U 退出
打造自己的万能钥匙『通用引导U盘』——管理Clover的OEM文件夹
安装完Clover之后,认真的人会发现OEM文件夹里有个Product Name目录,我在论坛里很少见到有人提起。
这相当于是一个归档文件夹,可以将自己的每台黑苹果信息都保存进来,并且如果Clover是装在了U盘里、那么只要里面有你的文件,就可以轻而易举地引导你的黑苹果。
如果你有多台黑苹果、这是个不错的选择哦~
有的人会问、如何知道自己的Product Name呢?
有两种方法:
查找自己的主板型号,然后去网上搜一下,找到官方网页,定位官方正式名称(大小写敏感),全部复制粘贴即可。 用Clover引导,保存引导Log,进入系统以后打开Log,在开始的地方就可以找到这样的字眼,直接完整复制、粘贴到OEM/Product Name文件夹改名即可。
这个文件夹里面的文件和根目录的差不多,但是要注意、如果你的引导方式是UEFI,那么请将所有引导文件(config.plsit/kexts/dsdt/ssdt...)放到OEN/Product Name/UEFI/目录下面,否则一旦文件名生效、外面的文件就不会生效了。 提取纯净的DSDT、SSDT文件
用clover启动,在引导选择系统时按F4键; 挂载ESP分区,进入clover所在文件夹,将ACPI/origin下所有文件复制到某一个文件夹中; 下载最新版iasl for mac,或者自己编译也可以; 将iasl程序和原始的dsdt、ssdt文件(不可放多余文件)放到同一个文件夹下面;打开terminal,cd到该文件夹,输入命令如果一切顺利,文件夹中会多出一套DSL文件; 将新生成的DSL文件备份一份、设为只读,用最新版Maciasl开始修改非备份的DSL文件。
通过Clover的Fix获得一份错误较少的DSDT文件(只需要重启尝试,简单~方便~)
在引导界面,进入Clover的选项。如果你不知道怎么进入选项,下图中第二排第一个图标就是了(你自己的不一定是第二排第一个,记图标不要记位置)
进入DSDT fix mask
根据自己的需要进行定制,比如这里我是:
如果达到了你满意的效果,可以在引导界面按F5,进入系统之后,在EFI/CLOVER/ACPI/Patched文件夹下找到你所需要的DSDT文件;当然,如果不嫌麻烦,你也可以在进入系统后、用Maciasl直接提取。
灵活运用各种Patch
截至发帖时,尚未找到公开发布的、正式的9系主板patch,此帖所有的探索是基于Intel 8系、7系、甚至6系平台的DSDT Patch进行的修改。
先上一张图....
这是目前自己能修改出来的最好成果,但问题肯定还有很多。期待以后苹果正式发布9系平台之后,能再修改到更完美。 Maciasl的环境设置
我喜欢黑色背景,因为代码高亮在这里会看的很清楚
编译器选择5,其他的可以不用勾
加入需要参考的常用patch源
修改
下面我会以一个实例来演示修改过程,源文件是以这块主板通过上面的【提取纯净的DSDT、SSDT文件】方法获得。
基本错误修复
iasl反编译后的错误基本上已经很少了,但是仍然有27个错误:
大致看一下,基本上都是图中9898、9908行出现的问题:
这类错误是由于其函数本为方法,而没有加入小括号使用而造成的,直接加上空格和一对括号即可,此处改为:其余错误以此类推,发现最后剩下两个错误。第一个是『6271, 6126, syntax error, unexpected PARSEOP_ZERO』,定位到所在行,删除从错误起始处开始的所有zero项目以及空行。
再次编译,最后一个错误是『14260, 6126, syntax error, unexpected PARSEOP_ARG0』,定位到错误行,写的是...
If (CondRefOf (MDBG))
{
Return (MDBG)
Arg0
}
... 复制代码 删除Arg0,重新编译,原来的错误已经没有了。令人吃惊的是,又多处14个错误、75个警告信息:
不慌~错误才14个~比刚才少,警告很容易处理、甚至不处理也能编译成功。
何况论坛里有各种大神的教程,怕什么?淡定,先喝口菊花茶~8471, 6086, Not a control method, cannot invoke (PS0X is a Untyped)
8544, 6086, Not a control method, cannot invoke (PS3X is a Untyped)
... 复制代码 这一类错误意思是说PS0X/PS3X非控制方法,我理解就是最前面的声明不正确,移到最前面去看看:
可能你会很奇怪,明明已经写的是『MethodObj』了呀。 External (PS0X, MethodObj) // 0 Arguments
External (PS2X, MethodObj) // 0 Arguments
External (PS3X, MethodObj) // 0 Arguments 复制代码 再回到第一个错误处观察整个IF语句:
注意我圈起来的部分,再对比上一张图,发现第64行、65行都没有加入『MethodObj』,而其内容『_SB_.PCI0.XHC_.PS0X』、『_SB_.PCI0.XHC_.PS3X』与错误处的语句很相似。不难推断,起始引起错误的是前面的这些External语句。
于是,我将前面的External中包含『PS0x/PS2X/PS3X』的地方都改成『External (_SB_.PCI0.XHC_.PS0X, MethodObj)』这种形式。全部改完,错误基本已经全部被消灭。
如图,添加完之后,已经是『0 errors』了。
剩下的全是一些警告或者Remarks,完全不用管。如果你有时间,可以参考论坛大神们的帖子去慢慢完善,本帖不再赘述。
下面是九阳真经~
以上是我收藏的关于DSDT的大神的帖子,排名不分先后,也不一定就囊括了所有的。
请大家善用论坛搜索功能哟~ 一个小道patch
这是在国外论坛看到一个9系主板朋友发帖求助时,看见别人回复的。
详细说明什么的没有,我就试了一下、发现可以用,而且用完以后警告还减少了。
(...论坛字数限制、我放到楼下~)
各位自己斟酌着使用吧,patch之前记得要备份哟~ DTGP
我的上一块主板是华硕的ROG M6I,用了PJALM的PATCH,PJ大神的ASUS源里有很多华硕主板的PATCH,可以拿来参考。
我就不一个一个贴了,基本上每块主板都要加上函数DTGP,而且代码完全一样。不多说,送上代码:# Add the DTGP method
into method label DTGP remove_entry;
into definitionblock code_regex . insert begin
Method (DTGP, 5, NotSerialized)\n
{\n
If (LEqual (Arg0, Buffer (0x10)\n
{\n
/* 0000 */ 0xC6, 0xB7, 0xB5, 0xA0, 0x18, 0x13, 0x1C, 0x44,\n
/* 0008 */ 0xB0, 0xC9, 0xFE, 0x69, 0x5E, 0xAF, 0x94, 0x9B\n
}))\n
{\n
If (LEqual (Arg1, One)) {\n
If (LEqual (Arg2, Zero)) {\n
Store (Buffer (One) { 0x03 }, Arg4)\n
Return (One)\n
}\n
If (LEqual (Arg2, One)) {\n
Return (One)\n
}\n
}\n
}\n
Store (Buffer (One) { 0x00 }, Arg4)\n
Return (Zero)\n
}
end; 复制代码 EHCI
EHCI和XHCI都是高速USB接口的控制器。
先上一个8系的代码,作为示范:# Patches the Intel USB3 on Intel 8 Series chipsets to allow more power output
#Fix EHC1
into method label _DSM parent_label EHC1 remove_entry;
into device label EHC1 insert begin
Method (_DSM, 4, NotSerialized)\n
{\n
Store (Package (0x15) {\n
"AAPL,slot-name", "Built In",\n
"name", "Intel EHCI Controller",\n
"model", Buffer(0x3E) {"Intel 8 Series Chipset Family USB Enhanced Host Controller #1"},\n
"device_type", Buffer (0x0E) {"USB Controller"},\n
"AAPL,current-available", 0x0834,\n
"AAPL,current-extra", 0x0A8C,\n
"AAPL,current-in-sleep", 0x03E8,\n
"AAPL,current-extra-in-sleep", 0x0834,\n
"AAPL,max-port-current-in-sleep", 0x0A8C,\n
"AAPL,device-internal", 0x02,\n
Buffer (One) {0x00}\n
}, Local0)\n
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))\n
Return (Local0)\n
}
end; 复制代码 简要说明:
名称 功能 何去何从 AAPL,slot-name 内建 保留 name 设备名称 保留 model 设备详细名称 部分保留、修改成自己的名称(可用DPCIManager查看) device_type 设备类型 保留 AAPL,current-xxx 电流值 因为不知道这块主板的情况、所以全部删掉 Buffer 不知道 保留
删改完成之后,可能会出现错误提示,一般会说长度不对。你可以自己换算成16位的,每个逗号分隔两个项目;或者直接删掉『Store (Package (0x15) 』里的0x15值,系统会自动计算。
还有一个是EHCI2的,和这个一样,改完之后我的patch是:# Patches the Intel USB3 on Intel 9 Series chipsets to allow more power output
#Fix EHC1
into method label _DSM parent_label EHC1 remove_entry;
into device label EHC1 insert begin
Method (_DSM, 4, NotSerialized)\n
{\n
Store (Package () {\n
"AAPL,slot-name", "Built In",\n
"name", "Intel EHCI Controller",\n
"model", Buffer(0x3E) {"Intel 9 Series Chipset Family USB Enhanced Host Controller #1"},\n
"device_type", Buffer (0x0E) {"USB Controller"},\n
Buffer (One) {0x00}\n
}, Local0)\n
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))\n
Return (Local0)\n
}
end;
#Fix EHC2
into method label _DSM parent_label EHC2 remove_entry;
into device label EHC2 insert begin
Method (_DSM, 4, NotSerialized)\n
{\n
Store (Package () {\n
"AAPL,slot-name", "Built In",\n
"name", "Intel EHCI Controller",\n
"model", Buffer (0x3E) {"Intel 9 Series Chipset Family USB Enhanced Host Controller #2"},\n
"device_type", Buffer (0x0E) {"USB Controller"},\n
Buffer (One) {0x00}\n
}, Local0)\n
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))\n
Return (Local0)\n
}
end; 复制代码 XHCI
这个的改法基本和上面是一样的。
稍微有点区别的地方是,在开启DSDT FIX USB功能引导进入系统以后,它的current电流值我们可以通过IOReg/IOJone软件找到,从而改成我们需要的。
我的修改好之后,是这样:#Fix XHC
into method label _DSM parent_label XHC remove_entry;
into device label XHC insert begin
Method (_DSM, 4, NotSerialized)\n
{\n
Store (Package (0x13) {\n
"AAPL,slot-name", "Built In",\n
"name", "Intel XHCI Controller",\n
"model", Buffer (0x37) {"Intel 9 Series Chipset Family USB xHCI Host Controller"},\n
"device_type", Buffer (0x0E) {"USB Controller"},\n
"AAPL,current-available", 0x0834,\n
"AAPL,current-extra", 0x0A8C,\n
"AAPL,current-in-sleep", 0x0A8C,\n
"AAPL,max-port-current-in-sleep", 0x0834,\n
"AAPL,device-internal", 0x00,\n
Buffer (One) {0x00}\n
}, Local0)\n
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))\n
Return (Local0)\n
}
end; 复制代码 HDEF
HDEF是板载声卡的控制器,我们可以通过修改DSDT使得系统能够识别该设备(在系统信息-》PCI项目中),而要能在声音设备中看见设备以及使用、一般还需要另外的驱动。这里先说DSDT修改HDEF。
我在PJ大神的Sabertooth Z77 Patch中找到了相同的ALC892设备代码,所以、省掉了很多力气,直接复制:# Fix HDEF device for the Realtek ALC892 audio codec
into method label _DSM parent_label HDEF remove_entry;
into device label HDEF insert begin
Method (_DSM, 4, NotSerialized)\n
{\n
Store (Package (0x0E) {\n
"AAPL,slot-name", "Built In",\n
"name", "Realtek Audio Controller",\n
"model", Buffer () {"Realtek ALC892 Audio Controller"},\n
"device_type", Buffer (0x10) {"Audio Controller"},\n
"layout-id", Buffer (0x04) {0x01,0x00,0x00,0x00},\n
"PinConfigurations", Buffer (Zero) {},\n
"hda-gfx", Buffer (0x0A) {"onboard-1"}\n
}, Local0)\n
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))\n
Return (Local0)\n
}
end; 复制代码
展开阅读全文​
1
查看全部评分