分享

新手DSDT修复系列(显卡)附完美DSDT,显卡,声卡,内建,网卡,原生电源管理,降频

 TK8213 2011-02-27
在拜读了论坛各位大大的帖子之后,做为一个新手成功的模仿了DSDT的修改,包括显卡,声卡,原生电源,自动降频,全部内建USB,网卡,无线网卡完美, 不过由于使用的BOOTTHINK for win版,关机断电重启还是需要OpenHaltRestart.kext。鉴于大家装完雪豹最希望的都是想看到SL华丽的界面(我就是这样),所以跟大 家分享下显卡DSDT的修补方法。我只能把我自己模仿的经验告诉新手,让你们知道如何去模仿,不算是教程,如果想了解更多请参考论坛里帖子。老手就随便看 看吧。(KEXT论坛自己搜索下)

我们先理解一些概念:
1.DSDT:DSDT是主板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部分。我是Insyde的BIOS,所以我会以这个BIOS为例子。其他主板修改方法类似。
修改之前要明白几个DSDT的架构,想详细了解的可以参考论坛紫米的帖子,我通俗的描述下我的思路

1 显卡在MAC里通常描述成PEGP,有些新手可能会发现,自己的DSDT中根本找不到PEGP,咋办呢~好办。

方法1,启动MAC系统,用IORegistryExplorer查看你显卡的位置,一般情况下都是PCI0的分支下,同样,它肯定也是在你DSDT中的 DEVICE (PCI0)分支下。具体的名字每个主板可能都不一样了,比如我的DSDT中叫PVGA。也有可能叫POP2,名字不重要。

方法2,intel的芯片组一般是Name (_ADR, 0x00010000)搜索这个关键字就可以找到显卡位置。在这个显卡项目下有可能出现GFX0、LCD、VGA、TV、PXS1 这些东西,不过既然是PC,一般GFX0是没有的,这个需要我们加入的,暂且理解为显卡,我不清楚这个,模仿就是了。

2 DSDT代码程序语言,我不知道怎么编写的,我不太懂编程。不过要想修改要有几个原则(我自己的理解,不知道对不对,重要的是结果)。
   1,修改一处就编译一次,直接O错误,警告可以不理会它,不影响DSDT的使用。
   2,你想使用一个你DSDT中没有的mothed(XX,XX,X)或者你引用了一个未定义的Device(***),比如,你发现你DSDT中没 PEGP,想手动加入,一旦你加上去了,编译肯定出错,因为编译器不知道你这个玩意PEGP从哪冒出来的,所以你要先定义它。在哪定义在后面说。
   3,注意加入新代码的时候括号要对应,不要让代码这部分漏出来,不然编译器又不知道你想表述什么意思了,出头鸟吗?
   4,注意两个代码之间加一个空行,还有DEVICE (PEGP)别顶在开头,用TAB键往后撤撤。   
   5,如果你遵循第1条原则编译之后出现的错误个数很多,那肯定是你新加入的代码有问题,不用看错误描述,按照2,3,4原则检查你的新加入代码。除非你网上复制的代码本身就有错误。

下面分两种方法加入代码

方法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)
                                {
                                    /* 0000 */    0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00,
                                    /* 0008 */    0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
                                    /* 0010 */    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)
                {
                    /* 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)
    }

这下就可以编译了成AML了,没有意外的话0错误的AML就可以用了,如有意外参考2,3,4条原则,不用在意警告,完美主义的例外。
希望能帮到新手们驱动显卡。

原帖:http://bbs./thread-686440-1-1.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多