DSDT修改详解

作者: JavasBoy 分类: Apple, 电脑 发布时间: 2011-01-09 01:39 ė166,711 views 66条评论

装过黑苹果的都可能知道有一个叫DSDT的东西吧,我现在对DSDT也不是很了解,在学习高手写的东西。因为我每次打开这个帖子紫米配的图片打开都很慢,而且好多都显示不出来,我用上代理才能完全显示所有图片。所以我转到博客里来,希望能让更多的玩苹果系统的同学看到。以下是远景论坛紫米写的教程我转发过来,写的很详细,对新人学习DSDT非常有帮助。

原帖地址:http://bbs.pcbeta.com/thread-633082-1-1.html紫米编写。

『前言』请务必考量自己目前的系统使用状况(11/27)

还是强调一下,这并非教程,我对于里面参数了解有限,
只是想开个帖跟大家一起讨论DSDT 的修改。
为了让你的苹果运作更贴近真苹果,
我想你绝对少不了使用DSDT 这个文件,
而善用DSDT 可以帮助你减少使用很多不必要的第三方驱动。
看到国外有些高手正努力在DSDT 下工夫,
而远景似乎尚未有这样的讨论。
有鉴于此,所以发了这样的讨论帖。

然而各厂的主机板对于DSDT 里的参数设定仍有差距,
没有办法一概而论,
因此,在此只是针对技嘉主机板做讨论。
而且最好是Intel 晶片组,
若是AMD 或是NVIDIA 晶片组,因为差距颇大。
所以,不列入讨论。
当然,非技嘉主机板的朋友请自行考量测试。

最后,DSDT 的修改有一定风险,请务必准备第二个救援系统,
方便在修改失败后,还能更正回来。
目前,我也是把旧的80G 磁碟独立做了一个苹果系统,
然后并未插在主机板上,
只在系统出问题才拿来使用。
所以,除非你有万全准备,请千万别做太过大胆尝试。
以免造成遗憾。

先对紫米目前的设备做个简介 :
CPU : Intel E6400 2.13GHz
MB : GA-965P-DS4 rev1.0
GPU : ASUS 9800 GT Top (改8800 GT 的ROM) 解决滑鼠的延迟问题
记忆体: A-DATA DDR800 1G X 4
音效卡: Realtek ALC883
网路卡: Marvell Yukon 88E8053

目前的使用状况 :
1. 手动的睡眠正常。
2. 唤醒正常,可使用键盘、滑鼠、电源钮正常唤醒。
3. USB 设备皆显示为内建,睡眠不会出现设备移除的提示。
4. 开机Log 讯息没有错误讯息。
5. 关机、重新启动可以断电。

待解决的问题 :
1. 能源节约器的让电脑进入睡眠的设定无法正常作用。 (萤幕会休眠但主机仍运转)

使用的第三方驱动或仿冒驱动: (02/03)
1. fakesmc.kext 非用不可的驱动
2. LegacyHDA.kext 自制的仿冒驱动,为了使用5.1 声道
已经不需要EvOreboot.kext 关机/重新启动不断电的驱动(02/03)
已经不需要PlatformUUID.kext UUID 错误(12/16)

近况说明:(12/16)
最近,再次拿弟弟的Aspire One 来玩Snow Leopard,
刚好发现了一些问题与事实。
AOA150 的DSDT 跟苹果内建非常接近,
本以为也许可以玩出个更为接近真苹果的MacBook One (总是天不从人愿)
问题其实颇多的,多半是硬体限制,
如:ATOM CPU 尽管在10.6.2 前都能使用,
但仍须透过NullCPUPowerManagement.kext 帮助,
也就是AppleIntelCPUPowerManagement 无法辨识CPU,
如果不使用NullCPUPowerManagement.kext 是无法进入系统,
至此,有关于原生CPU 的功能几乎都需要靠第三方驱动来帮忙(残念),
而后的显示卡与音效卡...更令我一个头两个大...
AOA150 的GMA950 似乎无法透过修改装置ID 加载驱动。
而ALC268 的音效卡在PathMap 的设定似乎完全不适用某些原则。

近况说明:(02/03)
先说声抱歉,更新时间拉得长了。
花了些时间研究关机断电的参数,
终于顺利再不使用第三方驱动的情况下顺利关机断电。
至于重新启动也透过新的Boot 可以达成。

『序』了解参数含义

<1> PEGP
所在位址: 10000 (通常)
代表装置为: PCI Express Root Port
通常在苹果命名为: PEGP、IOU0、IOU1、IOU2、NRP1、NRP5、P0P9
管理显示卡,所以关于显示的装置都会出现载这个项目,
如: GFX0、LCD、VGA、TV、PXS1

<2> HDEF
所在位址: 1B0000
代表装置为: HD Audio Controller
通常在苹果命名为: HDEF
管理音效卡。

<3> PEX0 ~ PEX5
所在位址: 1C0000 ~ 1C0005
代表装置为: PCI Express Port 1 ~ PCI Express Port 6
通常在苹果命名为: RP01 ~ RP06
负责管理一些内建网路卡、内建无线网路卡、FireWire (部份苹果的DSDT),
或者是JmicronATA、JmicronSATA,
因此,你会在这些项目下找到LAN、GIGE、ETH、ARPT、FRWR。

<4> USB0 ~ USB6、US31
所在位址: 1A0001 ~ 1A0002 、1D0001 ~ 1D0002
代表装置为: USB UHCI Controller 1 ~ USB UHCI Controller 6
通常在苹果命名为: UHC1 ~ UHC6
USB 管理装置的位置。

<5> USBE、USE2
所在位址: 1A0007、1D0007
代表装置为: USB2 EHCI Controller 1、USB2 EHCI Controller2
通常在苹果命名为: EHC1 ~ EHC2
高速USB 管理装置的位置。

<6> HUB0
所在位址: 1E0000
代表装置为: PCI Bridge
通常在苹果命名为: PCIB
FireWire 管理装置的位置,可以在项目中找到FRWR。

<7> PX40
所在位址: 1F0000
代表装置为: LPC Inte***ce Controller
通常在苹果命名为: LPCB
Low Pin Count Inte***ce Controller,低速设备管理装置,
主要负责并行埠、串列埠、键盘、滑鼠、软碟机等低速装置。
这个项目下有许多装置的设定,包含大家所熟悉的HPET、RTC...等等。

<8> IDE0
所在位址: 1F0001
代表装置为: IDE Controller
通常在苹果命名为: PATA
旧式的硬碟与光碟机连接汇流排,
基本上新一点的主机板已经没有这个装置了。

<9> IDE1
所在位址: 1F0002
代表装置为: SATA AHCI Controller
通常在苹果命名为: SATA
管理SATA (AHCI) 的装置。

<10> IDE2
所在位址: 1F0005
代表装置为: SATA RAID Controller (纯属猜测)
通常在苹果命名为: 无
苹果不支援Intel RAID,所以没有这个项目。

<11> PX43
所在位址: 1F0003
代表装置为: SMBus Controller
通常在苹果命名为: SBUS
System Management Bus Controller,
控制主板上的装置并收集相应的讯息。

<12> 各细项说明




『装置查询』帮助你了解你的硬体装置(11/30)

以上是以紫米的主机板设定为主的项目参数,
也许你的DSDT 多出很多项目,让你傻眼或措手不及。
因此提供你如何知道装置的方法,

一般辨识装置的方式有两种 :
<1> 查询装置的位址 :
如上方提供的1C0000、1D0000、1E0000、1F0000 ...等
这些都是装置的Address (位址),在同一晶片组下基本上不会变动,
也就是使用Intel 晶片组,位址都会跟上方式大同小异,甚至一样。

然而,如果是使用AMD 或是NVIDIA 就会差距很大,
因为晶片厂定义位址并不相同。

<2> 查询装置的代码 :
上方提供PNP0C04、PNP0000、INT0800、PNP103 ...等
这些试装置的Hardware ID (硬体ID),这个项目是固定不变的,
所以是最好用来查询硬体是什么的方式。

然而还有些装置并不是使用上方的Hardware ID,
必须利用IORegistryExplorer 来查询。

之后,利用以下网址来察看代码代表什么吧!
Intel 的Device ID (Vendor ID 8086)

http://pci-ids.ucw.cz/read/PC/8086

AMD 的Device ID (Vendor ID 1022)

http://pci-ids.ucw.cz/read/PC/1022

NVIDIA 的Device ID (Vendor ID 10DE)

http://pci-ids.ucw.cz/read/PC/10de

『DSDT 架构』先知道DSDT 长什么样子(11/30)

现在终于要进入到跟DSDT 修改比较有关的部份,
首先还是先了解一下,DSDT 里面的架构,
<1> Namespace (命名空间) :





<1> Objects (物件) :




以上是这个篇章的内容,带你大概了解一些关于DSDT 架构与内容,
此后将开始一些实质的修改。
以下附上 :

1. ACPI Specification 4.0 的PDF档(12/01)
目前似乎无法做站外连结,请自行到Google 搜寻:
ACPI Specification 4.0

2. 紫米上述的一些整理资料
(包含DSDT Map、DSDT PNP、DSDT Configuration)
DSDT.zip (5.1 KB)

『IORegistryExplorer 使用』了解装置的详细状况(12/03)

DSDT 的修改目的一方面是为了处理开机进入系统所遇到的问题,
另一方面就是为了处理硬体装置的驱动问题,
因此,先会判断装置情况,你会了解你需要从何下手。

<1> 首先,必须先判断你的电脑是否有这个装置?
有时候厂商在同款的主机板是使用相同的BIOS,
所以DSDT 资讯是一样,然而不同型号的主机板功能与装置也有所增减,
所以有可能DSDT 有的参数,实际上是不存在于主机板上。
最简单的方式就是从系统侦测的硬体资讯来判断。
如果有侦测到硬体装置,都会显示其device-id 或者vendor-id。

<2> 确定你的硬体驱动了吗?
如果已经确定电脑有此硬体装置,
那么,一般来说,可以分为四种情况,
(1) DSDT 有定义参数而装置有驱动:
(2) DSDT 有定义参数而装置无驱动:
一般来说,有驱动的硬体装置都会有驱动名称的加载项,
虽然,有些例外,但可以通过一些苹果机的IOReg 来判断。

(3) DSDT 无定义参数而装置有驱动:
(4) DSDT 无定义参数而装置无驱动:
一般状况会像下图一般,
判断驱动与否,跟上面的情况是一致的。

『DSDT 修改提要』详细修改的必备工具(12/03)

看到DSDT 庞大的参数群,你应该会有疑惑?
我怎么知道哪些参数是可以更动? 哪些又不可以?
DSDT 是属于ACPI 架构的一环,
所有相关的资讯可以从ACPI Specification 得知(一楼有提供下载)
然而,这个ACPI Specification 只是提供参数设定的方法。
那么该如何对应主机板上的装置参数?
所以,还需要晶片组的Datasheet,如:紫米所使用ICH8 Datasheet。
而Datasheet 最主要个功用就是告诉你参数的具体位置与设定数据。

也许你还不是很懂,以上的这个图片的含义。
但如果你够敏锐,你可能会发现一件事,
那么同一款的晶片组的参数位置是不是都在同一个位置。
因为Datasheet 是把ICH8、ICH8R、ICH8M 合在一起说明。
那么参数位置应该都在一样的位置。
也就是我可以使用
iMac 7,1 和MacBook Pro 3,1 这些使用ICH8M 的晶片来复制数据。
但很可惜,有一点需特别留意,
桌上型机种与笔记型机种所需的参数有些不同。
所以,尽管你可以套用,却有可少了一些桌上型机种要的数据,
而多了一些不要的数据。
因此,仍须要多加比对才行。

以下是可能会使用的基本工具:
(1) iasl [转换dsl 与aml 间的工具] 下方附件提供下载
(2) 文字编辑(苹果系统内建的工具)
(3) 参考用的苹果机种DSDT
(4) ACPI Specification (一楼有提供)
(5) 所使用晶片组的Datasheet (Google 一下就有了)
(6) DSDTSE (如果你不喜欢使用终端机转档,可以使用这个编辑与转档合一的工具)
下载网址: http://www.osx86.es/?p=610

『DSDT 修改提要』在执行修改DSDT 前的一些注意事项(12/08)

相信尝试修改DSDT 的朋友时常在修改完成后,
要使用iasl 转换成DSDT.aml 时,不免出现一些警告或是错误而苦恼不已,
因此,在介绍一些修改前,先提一下紫米本身的经验与处理方式。

<1> 取得DSDT
取得DSDT 的方式其实不少,个人建议是使用Everest 提取最好,

http://bbs.pcbeta.com/viewthread.php?tid=567358

(感谢sweec 前辈的分享)
是比较简单且可以取得最原始的DSDT。

<2> 转换的错误资讯说明
当然,编辑总免不了一些错误,
然而,弄懂错误的原因,才能真正解决问题。

<3> DSDT 编辑要点说明
以下,以实例做一些说明:
Package ()、Buffer () 的长度决定方法:

呼叫方法与物件连结关系,务必确定DSDT 包含所属物件,
才能避免在转译时发生错误:




最新的iasl 转换工具:
iasl 20091112.zip (223.71 KB)

『DSDT 重要系统参数修改』最为重要的参数修改(12/08)

此项,将收集影响系统开机登入的参数修改,
想使用DSDT 就必须修改的部份。

<1> RTC、CMOS 重置修改(12/08)
适用情况:
开机发生错误重新起动,会造成BIOS 设定遗失恢复成预设值。

修改前:

修改后:

『DSDT 重大修复』重要的参数修改(02/03)

<1> 不使用PlatformUUID.kext 修复UUID Error (12/16)
适用情况:
1. 在DSDT 中的Device (PCI0) 有定义Name (_UID, X)
2. 使用最新的Chameleon 2.0 RC4


<2> 让EHCI USB 2.0 识别为内建(02/03)
适用情况:
如果识别为扩展槽,将会发生睡眠后出现装置移除的问题。

                Method (_DSM, 4, NotSerialized)
                {
                    Store (Package (0x04)
                        {
                            "AAPL,clock-id",
                            Buffer (One)
                            {
                                0x01
                            }
                        }, Local0)
                    DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
                    Return (Local0)
                }

                Method (_DSM, 4, NotSerialized)
                {
                    Store (Package (0x04)
                        {
                            "AAPL,clock-id",
                            Buffer (One)
                            {
                                0x02
                            }
                        }, Local0)
                    DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
                    Return (Local0)
                }

请务必确认你已在DSDT 前方加上以下物件:

    Method (DTGP, 5, NotSerialized)
    {
        If (LEqual (Arg0, Buffer (0x10)
                {
                    /* 0000 */ 0xC6, 0xB7, 0xB5, 0xA0, 0x18, 0x13, 0x1C, 0x44,
                    /* 0008 */ 0xB0, 0xC9, 0xFE, 0x69, 0x5E, 0xAF, 0x94, 0x9B
                }))
        {
            If (LEqual (Arg1, One))
            {
                If (LEqual (Arg2, Zero))
                {
                    Store (Buffer (One)
                        {
                            0x03
                        }, Arg4)
                    Return (One)
                }

                If (LEqual (Arg2, One))
                {
                    Return (One)
                }
            }
        }
        Store (Buffer (One)
            {
                0x00
            }, Arg4)
        Return (Zero)
    }

否则在编译时会发生错误。

<3> 使用USB 装置唤醒睡眠(02/03)
适用情况:
装置可以睡眠,但只能透过电源钮唤醒。

第一部份:

第二部份:

第三部份:







以上也许会跟你原始的DSDT 有些不同,
请无须在意,只要针对紫米提及要修改的部份做修正就行了。
其它部份可以无视。
请务必确认三个部份的参数名称要相符才行,
若确定相同,其可重新开机试试是否可以使用键盘或滑鼠唤醒。

<4> 使用Speedstep 达到CPU 降频节能()
适用情况:
避免CPU 一直处于高速状态,可根据情况调整频率速度。

还尚未了解所有参数的意义,若有需要可以先参考这个帖子:
venicehuang 的帖子

『DSDT 加载驱动引导』参数修改(02/04)

使用DSDT 加载原生驱动,基本上都会需要以下这个物件:

    Method (DTGP, 5, NotSerialized)
    {
        If (LEqual (Arg0, Buffer (0x10)
                {
                    /* 0000 */ 0xC6, 0xB7, 0xB5, 0xA0, 0x18, 0x13, 0x1C, 0x44,
                    /* 0008 */ 0xB0, 0xC9, 0xFE, 0x69, 0x5E, 0xAF, 0x94, 0x9B
                }))
        {
            If (LEqual (Arg1, One))
            {
                If (LEqual (Arg2, Zero))
                {
                    Store (Buffer (One)
                        {
                            0x03
                        }, Arg4)
                    Return (One)
                }

                If (LEqual (Arg2, One))
                {
                    Return (One)
                }
            }
        }
        Store (Buffer (One)
            {
                0x00
            }, Arg4)
        Return (Zero)
    }

请先确认你已经添加到DSDT 中。
之后只需要添加强制修改device-id 的参数即可达到效果。

<1> 引导加载AppleLPC.kext 增加对装置的管理(02/04)
适用情况:
可以在能源节约器增加一个选项。

                Method (_DSM, 4, NotSerialized)
                {
                    Store (Package (0x02)
                        {
                            "device-id",
                            Buffer (0x04)
                            {
                                0x18, 0x3A, 0x00, 0x00
                            }
                        }, Local0)
                    DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
                    Return (Local0)
                }

其中的device-id 有以下的选择:
0x02, 0x3B, 0x00, 0x00 是5 Series/3400 Series
0x01, 0x3B, 0x00, 0x00 是Mobile 5 Series
0x00, 0x3B, 0x00, 0x00 是5 Series
0x18, 0x3A, 0x00, 0x00 是ICH10
0x16, 0x29, 0x00, 0x00 是ICH9R
0x15, 0x28, 0x00, 0x00 是ICH8M
0x11, 0x28, 0x00, 0x00 是ICH8M-E
0xBD, 0x27, 0x00, 0x00 是ICH7M DH
0xB9, 0x27, 0x00, 0x00 是ICH7M
0x70, 0x26, 0x00, 0x00 是ICH6 ESB

<2> 引导加载显示卡驱动(02/04)
适用情况:
可以在不使用任何第三方驱动,达到加载系统原生驱动。


            Device (PEGP)
            {
                Name (_ADR, 0x00010000)
                Device (GFX0)
                {
                    Name (_ADR, Zero)
                    Name (_SUN, One)
                    Method (_DSM, 4, NotSerialized)
                    {
                        Store (Package (0x18)
                            {
                                "AAPL,slot-name",
                                Buffer (0x07)
                                {
                                    "Slot-1"
                                },

                                "device_type",
                                Buffer (0x0C)
                                {
                                    "NVDA,Parent"
                                },

                                "model",
                                Buffer (0x17)
                                {
                                    "NVIDIA Geforce 9800 GT"
                                },

                                "NVCAP",
                                Buffer (0x14)
                                {
                                    /* 0000 */ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00,
                                    /* 0008 */ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
                                    /* 0010 */ 0x00, 0x00, 0x00, 0x00
                                },

                                "rom-revision",
                                Buffer (0x06)
                                {
                                    "3173a"
                                },

                                "VRAM,totalsize",
                                Buffer (0x04)
                                {
                                    0x00, 0x00, 0x00, 0x20
                                },

                                "@0,compatible",
                                Buffer (0x0B)
                                {
                                    "NVDA,NVMac"
                                },

                                "@0,device_type",
                                Buffer (0x08)
                                {
                                    "display"
                                },

                                "@0,name",
                                Buffer (0x0F)
                                {
                                    "NVDA,Display-A"
                                },

                                "@1,compatible",
                                Buffer (0x0B)
                                {
                                    "NVDA,NVMac"
                                },

                                "@1,device_type",
                                Buffer (0x08)
                                {
                                    "display"
                                },

                                "@1,name",
                                Buffer (0x0F)
                                {
                                    "NVDA,Display-B"
                                }
                            }, Local0)
                        DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
                        Return (Local0)
                    }
                }
            }

关于NVCAP 需要两个小工具:
(1) NVFlash (Win) 用来取出显示卡原始资料
(2) NVCAP Maker (Mac) 用来查询NVCAP 值

请先到Win 下使用NVFlash,
会出现DOS 介面,输入指令nvflash -b nvidia.rom
会在同资料夹理出现nvidia.rom 这个档案。

之后,开启Mac
使用NVCAP Maker 1.4 开启nvidia.rom
就能得到一串数字,04000000000003000c0000000000000700000000
然后两两分开0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00,
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
0x00, 0x00, 0x00, 0x00 即可。

<3> 引导加载音效卡驱动(02/04)
适用情况:
可以在不使用HDAEnable.kext 情况下,达到加载系统原生驱动。

                Method (_DSM, 4, NotSerialized)
                {
                    Store (Package (0x04)
                        {
                            "layout-id",
                            Buffer (0x04)
                            {
                                0x78, 0x03, 0x00, 0x00
                            },

                            "PinConfigurations",
                            Buffer (Zero) {}
                        }, Local0)
                    DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
                    Return (Local0)
                }

附件:
NVCAP Maker 1.4 NVCAP Maker 1.4.zip (351.39 KB)

NVFlash 档案过大,请自行上Google 搜索NVFlash for Windows

本文出自 刘荣星的博客,转载时请注明出处及相应链接。

本文永久链接: https://www.liurongxing.com/pc-apple-mac-dsdt.html

6条评论

  1. 莫良 2011年2月4日 17:49 回复

    新年快乐~

  2. 叉叉兵 2011年2月11日 22:24 回复

    好高深的问题。

  3. Luna 2011年3月26日 17:48 回复

    很好,要的就是这种手动修改方法。收藏了。

  4. shuai 2011年4月30日 15:16 回复

    你会不会制作,能不能给我做一个啊,我把配置给你!

  5. kiszeng 2013年8月23日 23:31 回复

    出现第四种情况怎么处理,系统侦测到硬件装置,但是DSDT里没有定义参数

  6. 李夕阳 2013年12月22日 21:22 回复

    楼主辛苦了,你是这几年所知道的关于DSDT方面最详细的,支持你,也希望你能把A卡详细介绍一下,会继续拜读您的大作

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Ɣ回顶部