• 显卡


    在拜读了论坛各位大大的帖子之后,做为一个新手成功的模仿了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条原则,不用在意警告,完美主义的例外。
    希望能帮到新手们驱动显卡。

    今天去丈母娘家酒喝多了,语无伦次了。就先写到这吧。
    上传我的DSDT,0错误,0警告,0标记,加入了显卡,声卡,USB内建,网卡,无线网卡,原生电源管理,降频代码。供大家参考。
    <IGNORE_JS_OP nodeIndex="186"> dcpdsdt.zip (33.03 KB, 下载次数: 2220)

  • 相关阅读:
    PHP 速度测试函数
    ajax的简单应用之快速入门
    PHP漏洞详解
    jQuery Ajax 实例 全解析
    2007年最后的一天
    近来心情格外的郁闷
    使用 Ajax 实现 lightbox
    GridView删除,编辑应用
    完美的wsus客户端注册表文件
    VISTA桌面显示Internet Explorer
  • 原文地址:https://www.cnblogs.com/anbylau2130/p/3387613.html
Copyright © 2020-2023  润新知