DSDT的入门知识.docx
- 文档编号:3635145
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:19
- 大小:23.81KB
DSDT的入门知识.docx
《DSDT的入门知识.docx》由会员分享,可在线阅读,更多相关《DSDT的入门知识.docx(19页珍藏版)》请在冰豆网上搜索。
DSDT的入门知识
:
DSDT是主板BIOS用来描述主板上硬件设备的代码集合,通过代码告诉操作系统自己的主板上插有什么样的设备,以及对设备具体的描述。
想使用DSDT驱动显卡的前提是,你必须使用第三方KEXT驱动了你的显卡,然后获得了一些关于你显卡的具体技术数据。
完美驱动还是不完美驱动并不重要,我们需要的是得到NVCAP的值。
2.退一步,如果你找不到KEXT来驱动你的显卡,你需要做的就是用相似的显卡NVCAP的值加入DSDT,运气好的话也能驱动。
善用论坛搜索
的作用仅仅是描述你硬件(包括硬件位置,ID,型号,一些必须的值比如NVCAP),告诉MAC系统你有显卡这么个东西,MAC系统然后检查下自己的驱动库里有这么个硬件的驱动没,如果有的话就驱动了,没有的话,你DSDT写的再好,MAC也会告诉你,对不起,我不认识你的东西。
当然,MAC系统也可能认错,比如你的显卡是256MNV9200MGS,放入,驱动之后系统概述里显示的是8400GT,显存只有128,这并不影响你使用,这个时候你就要在DSDT里加入代码告诉他你是9200的不是8400,它读到之后就正确显示了。
后面会告诉你如何获得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是没有的,这个需要我们加入的,暂且理解为显卡,我不清楚这个,模仿就是了。
2DSDT代码程序语言,我不知道怎么编写的,我不太懂编程。
不过要想修改要有几个原则(我自己的理解,不知道对不对,重要的是结果)。
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)
{
"NvidiaGeForce9200MGS"
},
"rom-revision",
Buffer(0x1F)
{
"NvidiaGeForce9200MGS256MB"
}
},Local0)
DTGP(Arg0,Arg1,Arg2,Arg3,RefOf(Local0))
Return(Local0)
}
}
注意数下括号,是偶数一般没问题。
奇数要肯定有问题。
注意回车留个空行。
这个时候参考前面的几条原则,发现PEGP这玩意没注册呢,编译不认识它,所以我们搜素Method(_L0D,0,NotSerialized),(一般在比较靠前的位置)在下面加入Notify(\0x02),把PEGP给注册了。
可以参考下我的,注册了好几个呢,因为我修改的多。
Method(_L0D,0,NotSerialized)
{
Notify(\0x02)
Notify(\0x02)
Notify(\0x02)
Notify(\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名字,比如我的是加入,0X02.
不加入不知道会不会编译出错,我没去试。
我只是这么一说,我也不懂编程之后的东西,所以可能描述的不是很正确。
(勿拍砖)
注意括号要对应,自己慢慢数吧。
下面是NVCAP的值的获得和显卡代码中各个项的含义及其修改
1NVCAP串值
在显卡驱动的情况下,打开终端(一个跟黑电视差不多的东西,在应用程序里),输入ioreg-l-w0|grepNVCAP
得到一串数字,比如这样000003000c00000000000000,然后2个两一组,一行8个,放入代码中”NVCAP“的位置。
如果你用KEXT没能驱动显卡,给你下面几组值测试下。
000003001c0000000000000a00000000
00000f000000000000000000
000003000c0000000000000b00000000
这些值是从威廉第三的帖子中找的,这里感谢下威廉,希望不要介意我拿过来用用。
2,NV的显卡上面的代码行几乎不要动,"model",的数值修改下,本来是"NvidiaGeForce9200MGS",你可以改成你自己的显卡型号,接着修改Buffer(0x18),这个是用来描述"NvidiaGeForce9200MGS"这串字符占用的地址空间的。
这里面的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",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条原则,不用在意警告,完美主义的例外。
希望能帮到新手们驱动显卡。
2、DSDT
首先要把xchobits的aml文件反编译,干吗?
学习!
!
下载了iasl-win-,反编译命令
01.
-d
复制代码得到文件,一开始我一直用写字板编辑,后来发现用UltraEdit-32相当的方便,在视图里面选择查看方式选择perl,
下载KB)
2009-10-2022:
04
看到左边的加号了,确保了每个{}都不会错,大大降低了出错的几率。
开始也不知道xchobits到底修改了哪里,就上网找教程,很多,就按教程修改!
!
首先提取自己的dsdt,用everestultimate+ACPIPatcher,先用everestultimate导出,然后用ACPIPatcher
下载KB)
2009-10-2022:
40
点D/C按钮就得到dsl文件了。
GTGP是最基本的一个方法,很多函数都需要它,加入的位置只要不是放在子函数块里就ok了,我插入的位置:
("","DSDT",2,"Intel","CANTIGA",0x06040000)
02.{
03.
(DTGP,5,NotSerialized){
06.If(LEqual(Arg0,Buffer(0x10)
07.{
08./*0000*/0xC6,0xB7,0xB5,0xA0,0x18,0x13,0x1C,0x44,
09./*0008*/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(\复制代码RTC听说这个是防止bios重置的,(我到现在也不知道bios重置是个什么东西)
01.
02.Device(RTC)
03.{
04.Name(_HID,EisaId("PNP0B00"))
05.Name(BUF0,ResourceTemplate()
06.{
07.IO(Decode16,
08.0x0070,0x0070,0x01,0x02,)
13.})
14.Name(BUF1,ResourceTemplate()
15.{
16.IO(Decode16,
17.0x0070,0x0070,0x01,0x08,)
22./{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(){0}IRQNoFlags(){8}Memory32Fixed(ReadOnly,
12.0xFED00000,0x00000400,)
15.})
16.Method(_STA,0,NotSerialized)
17.{
18...................................}
20.Method(_CRS,0,Serialized)
21.{
22.....................................}
24.}
复制代码至于_WAK里面的两个Return(zero),我的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.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DSDT 入门 知识
![提示](https://static.bdocx.com/images/bang_tan.gif)