[黑苹果入门]关于DSDT的入门知识

1.DSDTDSDT是主板BIOS用来描述主板上硬件设备的代码集合,通过代码告诉操作系统自己的主板上插有什么样的设备,以及对设备具体的描述。想使用DSDT驱动显卡的前提是,你必须使用第三方KEXT驱动了你的显卡,然后获得了一些关于你显卡的具体技术数据。完美驱动还是不完美驱动并不重要,我们需要的是得到NVCAP的值。

2.
退一步,如果你找不到KEXT来驱动你的显卡,你需要做的就是用相似的显卡NVCAP的值加入DSDT,运气好的话也能驱动。善用论坛搜索

3.DSDT
的作用仅仅是描述你硬件(包括硬件位置,ID,型号,一些必须的值比如NVCAP),告诉MAC系统你有显卡这么个东西,MAC系统然后检查下自己的驱动库里有这么个硬件的驱动没,如果有的话就驱动了,没有的话,你DSDT写的再好,MAC也会告诉你,对不起,我不认识你的东西。当然,MAC系统也可能认错,比如你的显卡是256M NV 9200M GS,放入Natit.kext,驱动之后系统概述里显示的是8400GT,显存只有128,这并不影响你使用,这个时候你就要在DSDT里加入代码告诉他你是9200的不是8400,它读到之后就正确显示了。后面会告诉你如何获得NACAP的值。

4.NACAP
的值并不是每个显卡都不同,相似显卡的NACAP的值是一样的,多尝试尝试。
下面开始修改显卡的DSDT部分。我是InsydeBIOS,所以我会以这个BIOS为例子。其他主板修改方法类似。
修改之前要明白几个DSDT的架构,想详细了解的可以参考论坛紫米的帖子,我通俗的描述下我的思路

1
 显卡在MAC里通常描述成PEGP,有些新手可能会发现,自己的DSDT中根本找不到PEGP,咋办呢~好办。
方法1,启动MAC系统,用IORegistryExplorer查看你显卡的位置,一般情况下都是PCI0的分支下,同样,它肯定也是在你DSDT中的DEVICE (PCI0)分支下。具体的名字每个主板可能都不一样了,比如我的DSDT中叫PVGA。也有可能叫POP2,名字不重要。
方法2intel的芯片组一般是Name (_ADR, 0x00010000)搜索这个关键字就可以找到显卡位置。在这个显卡项目下有可能出现GFX0LCDVGATVPXS1 这些东西,不过既然是PC,一般GFX0是没有的,这个需要我们加入的,暂且理解为显卡,我不清楚这个,模仿就是了。

2 DSDT
代码程序语言,我不知道怎么编写的,我不太懂编程。不过要想修改要有几个原则(我自己的理解,不知道对不对,重要的是结果)。
   1
,修改一处就编译一次,直接O错误,警告可以不理会它,不影响DSDT的使用。
   2
,你想使用一个你DSDT中没有的mothed(XX,XX,X)或者你引用了一个未定义的Device(***),比如,你发现你DSDT中没PEGP,想手动加入,一旦你加上去了,编译肯定出错,因为编译器不知道你这个玩意PEGP从哪冒出来的,所以你要先定义它。在哪定义在后面说。
   3
,注意加入新代码的时候括号要对应,不要让代码这部分漏出来,不然编译器又不知道你想表述什么意思了,出头鸟吗?
   4
,注意两个代码之间加一个空行,还有DEVICE PEGP)别顶在开头,用TAB键往后撤撤。   
   5
,如果你遵循第1条原则编译之后出现的错误个数很多,那肯定是你新加入的代码有问题,不用看错误描述,按照234原则检查你的新加入代码。除非你网上复制的代码本身就有错误。
下面分两种方法加入代码
方法1 不管位置在哪个地方,只要确定是INTEL芯片组,显卡肯定在PCI0设备的目录下,所以搜索DEVICE (PCI0)(注意是数字0不是字母o.
你会看到如果代码(各个BIOS可能不一样)
Device (PCI0)
        {
            Name (_HID, EisaId ("PNP0A08"))
            Name (_CID, EisaId ("PNP0A03"))
            Name (_ADR, Zero)
               
。。。。。。。。。
把下面显卡的代码加入到Name (_HID, EisaId ("PNP0A08"))上面一样,也就是PCI0第一个括号下面。
           Device (PEGP)
            {
                Name (_ADR, 0x00010000)
                Device (GFX0)
                {
                    Name (_ADR, Zero)
                    Name (_SUN, One)
                    Method (_DSM, 4, NotSerialized)
                    {
                        Store (Package (0x16)
                            {
                                "@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"
                                },
                                "NVCAP",
                                Buffer (0x18)
                                {
                                        0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00,
                                        0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
                                        0x00, 0x00, 0x00, 0x00
                                },
                                "VRAM,totalsize",
                                Buffer (0x04)
                                {
                                    0x00, 0x00, 0x00, 0x10
                                },
                                "device_type",
                                Buffer (0x0D)
                                {
                                    "NVDA,GeForce"
                                },
                                "model",
                                Buffer (0x18)
                                {
                                    "Nvidia GeForce 9200M GS"
                                },
                                "rom-revision",
                                Buffer (0x1F)
                                {
                                    "Nvidia GeForce 9200M GS 256 MB"
                                }
                            }, Local0)
                        DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
                        Return (Local0)
                    }
                }
注意数下括号,是偶数一般没问题。奇数要肯定有问题。注意回车留个空行。
这个时候参考前面的几条原则,发现PEGP这玩意没注册呢,编译不认识它,所以我们搜素Method (_L0D, 0, NotSerialized),(一般在比较靠前的位置)在下面加入Notify (\_SB.PCI0.PEGP, 0x02) ,把PEGP给注册了。可以参考下我的,注册了好几个呢,因为我修改的多。
Method (_L0D, 0, NotSerialized)
        {
            Notify (\_SB.PCI0.EHC1, 0x02)
            Notify (\_SB.PCI0.EHC2, 0x02)
            Notify (\_SB.PCI0.PEGP, 0x02)
            Notify (\_SB.PCI0.HDEF, 0x02)
注册代码的意思就是说在PCI0下面有个PEGP设备,各单位注意,不要说见到了PEGP不认识它。编译器自然就认识了。
这个时候还没有结束,我们是新加入的DEVICE (PEGP)设备,而且Name (_ADR, 0x00010000)这个代码你自己本身DSDT的显卡描述中肯定有,所以我们要搜索Name (_ADR, 0x00010000),然后把它删掉,注意别删除了你刚加入显卡代码的这行,一个DSDT中保留一个Name (_ADR, 0x00010000)就行了。
这种加入方法,编译不太容易出错,因为不破坏你本身DSDT的结构。不会出乱七八糟的错误。
方法2:搜索Name (_ADR, 0x00010000),这个就是你显卡的位置,或者你自己查看MAC系统中,你的显卡在什么位置。
加入上面的代码,注意从DEVICE (GFX0)开始加入。以防万一,去上面那个位置注册下你的DEVICE名字,比如我的是加入PCI0.PVGA,0X02.不加入不知道会不会编译出错,我没去试。我只是这么一说,我也不懂编程之后的东西,所以可能描述的不是很正确。(勿拍砖)
注意括号要对应,自己慢慢数吧。
下面是NVCAP的值的获得和显卡代码中各个项的含义及其修改
1NVCAP
 串值
在显卡驱动的情况下,打开终端(一个跟黑电视差不多的东西,在应用程序里),输入 ioreg -l -w0 | grep NVCAP得到一串数字,比如这样04000000000003000c0000000000000700000000,然后2个两一组,一行8个,放入代码中”NVCAP“的位置。
如果你用KEXT没能驱动显卡,给你下面几组值测试下。
04000000000003001c0000000000000a00000000
0400000000000f00000000000000000700000000
05000000000003000c0000000000000b00000000
这些值是从威廉第三的帖子中找的,这里感谢下威廉,希望不要介意我拿过来用用。

2
NV的显卡上面的代码行几乎不要动,"model", 的数值修改下,本来是"Nvidia GeForce 9200M GS",你可以改成你自己的显卡型号,接着修改Buffer (0x18),这个是用来描述"Nvidia GeForce 9200M GS"这串字符占用的地址空间的。
这里面的0X18是如何获得呢?我们一起来计算以下,从N开始 字母+空格一共是23个字符,在加1就是24,转换成16进制就是0X18,其他的buffer一样,公式就是 字母+空格+1 转换成16进制输入就行了。"VRAM,totalsize", 0x00, 0x00, 0x00, 0x10代表256M显存,0x00, 0x00, 0x00, 0x20就是512了,0x00, 0x00, 0x00, 0x05就是128。根据自己的显存修改吧。 其他型号的显卡自己看着改吧。
上面工作全做完了还不够,因为我们还有一个最重要的东西没有定义,DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)),这个DTGP方法编译器找不到,我们要添加进去,很多地方修改DSDT都需要引用这个DTGP,所以我们加在开头的位置,搜索DefinitionBlock ("dsdt.aml", "DSDT", 1, "HPQOEM", "SLIC-MPC", 0x00000001)在第一个括号下面加入DTGP,代码如下:
Method (DTGP, 5, NotSerialized)
    {
        If (LEqual (Arg0, Buffer (0x10)
                {
                        0xC6, 0xB7, 0xB5, 0xA0, 0x18, 0x13, 0x1C, 0x44,
                        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)
    }
这下就可以编译了成AML了,没有意外的话0错误的AML就可以用了,如有意外参考234条原则,不用在意警告,完美主义的例外。
希望能帮到新手们驱动显卡。
2DSDT
首先要把xchobitsaml文件反编译,干吗?学习!!下载了iasl-win-20080729,反编译命令
01.
02.iasl  -d dsdt.aml
复制代码得到dsdt.dsl文件,一开始我一直用写字板编辑,后来发现用UltraEdit-32相当的方便,在视图里面选择查看方式选择perl
看到左边的加号了,确保了每个{   }都不会错,大大降低了出错的几率。
开始也不知道xchobits到底修改了哪里,就上网找教程,很多,就按教程修改!!
首先提取自己的dsdt,用everestultimate+ACPI Patcher,先用everestultimate导出acpi_dsdt.bin,然后用ACPI PatcherD/C按钮就得到dsl文件了。

GTGP 是最基本的一个方法,很多函数都需要它,加入的位置只要不是放在子函数块里就ok了,我插入的位置:
01.DefinitionBlock ("dsdt.aml", "DSDT", 2, "Intel ", "CANTIGA ", 0x06040000)
02.{
03.
04.Method (DTGP, 5, NotSerialized)  //dtgp函数
05.    {
06.        If (LEqual (Arg0, Buffer (0x10)
07.                {
08.                        0xC6, 0xB7, 0xB5, 0xA0, 0x18, 0x13, 0x1C, 0x44,
09.                        0xB0, 0xC9, 0xFE, 0x69, 0x5E, 0xAF, 0x94, 0x9B
10.                }))
11.        {
12.            If (LEqual (Arg1, One))
13.            {
14.                If (LEqual (Arg2, Zero))
15.                {
16.                    Store (Buffer (One)
17.                        {
18.                            0x03
19.                        }, Arg4)
20.                    Return (One)
21.                }
22.                If (LEqual (Arg2, One))
23.                {
24.                    Return (One)
25.                }
26.            }
27.        }
28.        Store (Buffer (One)
29.            {
30.                0x00
31.            }, Arg4)
32.        Return (Zero)
33.    }
34..........................................
35.    External (PDC1)
36.    External (PDC0)
37.    External (CFGD)
38.    External (\_PR_.CPU0._PPC)
复制代码RTC  听说这个是防止bios重置的,(我到现在也不知道bios重置是个什么东西)
01.
02.                Device (RTC)
03.                {
04.                    Name (_HID, EisaId ("PNP0B00"))
05.                    Name (BUF0, ResourceTemplate ()
06.                    {
07.                        IO (Decode16,
08.                            0x0070,             // Range Minimum
09.                            0x0070,             // Range Maximum
10.                            0x01,               // Alignment
11.                            0x02,               // Length  这里由0x08改成0x02
12.                            )
13.                    })
14.                    Name (BUF1, ResourceTemplate ()
15.                    {
16.                        IO (Decode16,
17.                            0x0070,             // Range Minimum
18.                            0x0070,             // Range Maximum
19.                            0x01,               // Alignment
20.                            0x08,               // Length  这个不知道改不改
21.                            )
22.//                        IRQNoFlags ()   直接用"//"屏蔽就是了
23.//                            {8}
24.                    })
25.                    Method (_CRS, 0, Serialized)
26.                    {
27.                       ...................................
28.                    }
29.                }
复制代码HPET  听说这个是能解决cpu电源管理的
01.                Device (HPET)
02.                {
03.                    Name (_HID, EisaId ("PNP0103"))
04.                    Name (_CID, EisaId ("PNP0C01"))
05.                    Name (BUF0, ResourceTemplate ()
06.                    {
07.                       IRQNoFlags ()  //就是加入这四行的东西
08.                            {0}           //
09.                        IRQNoFlags () //
10.                            {8}            //
11.                        Memory32Fixed (ReadOnly,
12.                            0xFED00000,         // Address Base
13.                            0x00000400,         // Address Length
14.                            )
15.                    })
16.                    Method (_STA, 0, NotSerialized)
17.                    {
18.                    ..................................//此处略
19.                     }
20.                    Method (_CRS, 0, Serialized)
21.                    {
22.                     .................................... // 此处略
23.                    }
24.                }
复制代码至于_WAK里面的两个Returnzero),我的dsdt里面自带了。

显卡的GFX0加入PEGP里面
01.            Device (PEGP)
02.            {
03.                Name (_ADR, 0x00010000)
04.                Device (GFX0)
05.                {
06.                    Name (_ADR, Zero)
07.                    Name (_SUN, One)
08.                    Method (_DSM, 4, NotSerialized)
09.                    {
10.                        Store (Package (0x1C) 
11.                            {
12.                                "AAPL,slot-name",
13.                                Buffer (0x0D)
14.                                {
15.                                    "PCI-E Slot-1"
16.                                },
17.                                "@0,compatible",
18.                                Buffer (0x0B)
19.                                {
20.                                    "NVDA,NVMac"
21.                                },
22.                                "@0,device_type",
23.                                Buffer (0x08)
24.                                {
25.                                    "display"
26.                                },
27.                                "@0,name",
28.                                Buffer (0x0F)
29.                                {
30.                                    "NVDA,Display-A"
31.                                },
32.                                "@1,compatible",
33.                                Buffer (0x0B)
34.                                {
35.                                    "NVDA,NVMac"
36.                                } 
37.                                "@1,device_type",
38.                                Buffer (0x08)
39.                                {
40.                                    "display"
41.                                },
42.                                "@1,name",
43.                                Buffer (0x0F)
44.                                {
45.                                    "NVDA,Display-B"
46.                                },
47.                                "NVCAP",
48.                                Buffer (0x18)
49.                                {
50.                                        0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00,
51.                                        0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
52.                                        0x00, 0x00, 0x00, 0x00
53.                                },
54.                                "NVPM",
55.                                Buffer (0x20)
56.                                {
57.                                        0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
58.                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
59.                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
60.                                        0x00, 0x00, 0x00, 0x00
61.                                },
62.                                "VRAM,totalsize",
63.                                Buffer (0x04)
64.                                {
65.                                    0x00, 0x00, 0x00, 0x10  //这里0x10代表256M显存,0x20代表512M
66.                                },
67.                                "device_type",
68.                                Buffer (0x0D)
69.                                {
70.                                    "NVDA,GeForce"
71.                                },
72.                                "model",
73.                                Buffer (0x1F) // 0x1F代表了"Nvidia GeForce 9300M GS 256 MB"的字数,一般按字数+空格+1然后在转16进制,Buffer的用法基本相同
74.                                {
75.                                    "Nvidia GeForce 9300M GS 256 MB"
76.                                },
77.                                "rom-revision",
78.                                Buffer (0x21)
79.                                {
80.                                    "DSDT ROM v1.0 by Echo #OS x86_64"
81.                                },
82.                                "reg",
83.                                Buffer (0x78)
84.                                {
85.                                        0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
86.                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
87.                                        0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x02,
88.                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
89.                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
90.                                        0x14, 0x00, 0x01, 0x42, 0x00, 0x00, 0x00, 0x00,
91.                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
92.                                        0x00, 0x00, 0x00, 0x10, 0x1C, 0x00, 0x01, 0x02,
93.                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
94.                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
95.                                        0x24, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
96.                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
97.                                       0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x01, 0x02,
98.                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
99.                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00
100.                                }
101.                            }, Local0)
102.                        DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
103.                        Return (Local0)
104.                    }
105.                    Device (VGA)
106.                    {
107.
108.                     .......................... //此处略
109.
110.                     }
111.                Method (_PRT, 0, NotSerialized)
112.                {
113.                     ...........................//此处略
114.                 }
115.               }
116.            }
复制代码这里要注意那个deviceVGA),本来他是在GFX0之外的,但是我把它放到GFX0之内了,所以就有两个调用到它的地方要由PEGP.VGA改成PEGP.GFX0.VGA  ,另外在VGA函数里面要调用之外的函数往往用^^^.LPC等等,此刻就要记得在前面多加个"^"了,前面就成了^^^^.LPC
网上还看到了加入一下代码让原生AppleLPC加载来实现硬件电源管理的
01.            Device (LPC)
02.            {
03.                Name (_ADR, 0x001F0000)
04.               
05.               
06.                Method (_DSM, 4, NotSerialized)
07.                {
08.                    Store (Package (0x02)
09.                        {
10.                            "device-id",
11.                            Buffer (0x04)
12.                            {
13.                                0x16, 0x29, 0x00, 0x00  //最主要的就是这里
14.                            }
15.                        }, Local0)
16.                    DTGP (Arg0, Arg1, Arg2, Arg3, Refof (Local0))
17.                    Return (Local0)
18.                }
19.               
20. 
复制代码0x16,0x29,0x00,0x00这个字符串可以在AppleLPC.kext里面看到,你可以改成里面有的任意一个

据说还要改两个地方,防止声音变形,不懂什么叫声音变形,照改就是了,这里是整个过程

http://bbs.pcbeta.com/viewthread.php?tid=594984&page=1&authorid=215483

顺便把声卡的也加了进去
01.                Method (_DSM, 4, NotSerialized)
02.                {
03.                    Store (Package (0x08)
04.                        {
05.                            "codec-id",
06.                            Buffer (0x04)
07.                            {
08.                                0x3e, 0x29, 0xEC, 0x10  //这里在用voodoo驱动时可以再ioreg里看到
09.                            },
10.                            "layout-id",
11.                            Buffer (0x04)
12.                            {
13.                                0x78, 0x03, 0x00, 0x00
14.                            },
15.                            "device-type",
16.                            Buffer (0x29)
17.                            {
18.                                "Realtek ALC888/1200 @ Intel 82801IB ICH9"
19.                            },
20.                            "PinConfigurations",
21.                            Buffer (0x00)
22.                            { } //这里清空
23.                        }, Local0)
24.                    DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
25.                    Return (Local0)
26.                }
复制代码以上代码加入到HDEF中,我的没有只有AZAL,于是就把AZAL改成了HDEF

好了,编译
01.iasl dsdt.dsl
复制代码放入Drawn里面,启动,照样五国,重启,正常进入,显卡声卡驱动,原生电源管理,关机再重启,还是五国,再重启,正常。
这里先说明一下,在编译我自己的dsdt文件时,发现原始的dsdt文件居然也有31Warnings, 11 Remarks,虽然无伤大雅,但我是个追求完美的人,通过反编译别人的aml文件以及在网上搜索用一下方式解决:
对于
01.11dsdt.dsl  1101:             Add (Local0, 0x02)
02.Warning  1105 -                         ^ Result is not used, operator has no effect
复制代码采用把(Local0, 0x02)改为 (Local0, 0x02, Local0)即可解决
对于
01.11dsdt.dsl  7080:                     Method (_GTM, 0, NotSerialized)
02.Warning  1087 -                                  ^ Not all control paths returna value (_GTM)
复制代码采用在判断语句后加入Return(Zero)方法解决,例如:
01.Method (_GTM, 0, NotSerialized)
02.                    {
03.                        If (LEqual (SCFG, Zero))
04.                        {
05.                            Name (PBUF, Buffer (0x14)
06.                            {
07.                                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
08.                                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
09.                                    0x00, 0x00, 0x00, 0x00
10.                            })
11.                            CreateDWordField (PBUF, Zero, PIO0)
12.                            CreateDWordField (PBUF, 0x04, DMA0)
13.                            CreateDWordField (PBUF, 0x08, PIO1)
14.                            CreateDWordField (PBUF, 0x0C, DMA1)
15.                            CreateDWordField (PBUF, 0x10, FLAG)
16.                            Store (GETP (PRIT), PIO0)
17.                            Store (GDMA (And (SYNC, One), And (ICR3, One),
18.                                And (ICR0, One), SDT0, And (ICR1, One)), DMA0)
19.                            If (LEqual (DMA0, Ones))
20.                            {
21.                                Store (PIO0, DMA0)
22.                            }
23.                            If (And (PRIT, 0x4000))
24.                            {
25.                                If (LEqual (And (PRIT, 0x90), 0x80))
26.                                {
27.                                    Store (0x0384, PIO1)
28.                                }
29.                                Else
30.                                {
31.                                    Store (GETT (PSIT), PIO1)
32.                                }
33.                            }
34.                            Else
35.                            {
36.                                Store (Ones, PIO1)
37.                            }
38.                            Store (GDMA (And (SYNC, 0x02), And (ICR3, 0x02),
39.                                And (ICR0, 0x02), SDT1, And (ICR1, 0x02)), DMA1)
40.                            If (LEqual (DMA1, Ones))
41.                            {
42.                                Store (PIO1, DMA1)
43.                            }
44.                            Store (GETF (And (SYNC, One), And (SYNC, 0x02),
45.                                PRIT), FLAG) 
46.                            Return (PBUF)
47.                        }
48.                            Else
49.                            {
50.                                Return (Zero)
51.                            }
52.                            Return (Zero)
53.                    }
复制代码最后两行Return(Zero)就是解决问题的两行了。
还有一种解决方法就是把Method (_GTM, 0, NotSerialized)改写成Method (_GTM),同样能去掉警告信息,不过我没有试过!!
对于
01.11dsdt.dsl 8623: Name (_T_0, Zero)
02.Remark 5110 - Use of compiler reserved name ^ (_T_0)
复制代码这样的问题,采用把"_T_0“改成"T_0"的方法来解决。
这样就可以做到
Compilation complete. 0 Errors, 0 Warnings, 0 Remarks, 35 Optimizations
鉴于每次进系统都要先五国一次才能正常进入,上论坛求助无果,决定用加法排查法找到问题所在,就是在原始dsdt的基础上每修改一处代码就编译一次,然后放入drawin进一次mac,最后查到是声卡代码的问题导致五国。删除声卡代码,用原始代码(AZAL+voodooHDA驱动,解决问题。
在排查过程中还发现了几个问题
1、防止bios重置的RTC代码无需修改,也未发现bios重置问题,故决定用自带的代码;
2、在HPET代码中也无需修改,只要加入了AppleLPC代码,一样可以加载原生cpu电源管理驱动,同时防止声音变形的那两处PNP0100PNP0000也不用修改,用voodooHDA驱动也不会出现声音变形。
3、在Device (LPC)函数内加入
01.
02.                Device (PNLF)
03.                {
04.                    Name (_HID, EisaId ("APP0002"))
05.                    Name (_CID, "backlight")
06.                    Name (_UID, 0x0A)
07.                    Name (_STA, 0x0B)
08.                }
复制代码可以使节能选项里面多出一个“睡眠前降低屏幕亮度的”的选项。

评论

热门博文