在拜读了论坛各位大大的帖子之后,做为一个新手成功的模仿了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)