最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

原创DSDT最完整的修改教程

IT圈 admin 69浏览 0评论

2024年10月26日发(作者:郗庸)

DSDT修改教程

这就是重点了,实际上整个一个星期的工作绝大部分都是在如果驱动硬件上做文章了,虽然期间

重装了三遍系统,但感觉轻车熟路,玩一样的。

在驱动问题上确实走了很多的弯路,但是这个弯路有时候有事必须的,因为人总想做的完美一些,

只有不停地尝试才能找到更好的办法。

1、显卡

装完雪豹第一个想法就是希望能看到华丽的而且和windows不一样的界面,但事实又总是和想象

的有所区别,界面是变了,但是连进入系统式欢迎动画都是卡卡卡!!所以第一个想法也是把显

卡的驱动装上,于是google,一堆的驱动,一堆的方法,只是没有哪个具体说了怎样驱动 9300m

gs的,没办法只好一个一个的试了,几乎把所有的驱动都试过了(没找到的,不知道的,不算),

NVkushInstaller、NVinstaller v.52、NVIDIA_9000_Series_Driver_v2、

NVdarwinInstaller1.2.5、一样的不一样的都试了一遍,统统不行!!然后又试EFI

String,用OSX86Tools_1.0.150(这是个好东西),但是顶多就是强制分辨率,驱动的不能。

还有人介绍的就是在 里面加入

1. GraphicsEnabler

2. y

不知是不是人品不好,这个东东在别人那挺好,在我这统统不管用。pcbeta逛了逛才接触到通

过dsdt的修改来驱动显卡,让我兴奋的不得了,凭直觉觉得用dsdt来驱动硬件应该是比较完美

的方法,于是全身心投入到了dsdt的研究当中,由于之前一点都没有接触过dsdt(java编程还

是会的),只能在网上找方法然后依葫芦画瓢,但是开始根本不知道从何入手,比较简单的方法

就是威廉的acpi patch,但是又不支持我这个类型的bios,只能手动修改!彷徨中一个大侠的

出现让我看到了曙光,[url=?uid=487636]xchobits[/url]大侠把他自己的dsdt文件

给了我,因为我们的本子都是差不多的,我把他的放入drawn文件夹下后,奇迹出现

了,透明效果一下出来了,高兴的不得了!!!甚至安装了legacyHDA后,声卡也出声了!!!

但问题也接踵而来,就是每次进系统时总是先要五国一次,然后强制重启就能正常进入,郁闷的

不得鸟!!我分析,毕竟我的硬件不完全就是他的硬件,是不是某些地方的不同导致了五国,于

是我决定自己修改dsdt!!

==========================================================

2、DSDT

首先要把xchobits的 aml文件反编译,干吗?学习!!下载了iasl-win-20080729,反编译命

1.

2. iasl -d

得到 文件,一开始我一直用写字板编辑,后来发现用UltraEdit-32相当的方便,在

视图里面选择查看方式选择perl,

看到左边的加号了,确保了每个{ }都不会错,大大降低了出错的几率。

开始也不知道xchobits到底修改了哪里,就上网找教程,很多,就按教程修改!!

首先提取自己的dsdt,用everestultimate+ACPI Patcher,先用everestultimate导出

acpi_,然后用ACPI Patcher

点D/C按钮就得到dsl文件了。

GTGP 是最基本的一个方法,很多函数都需要它,加入的位臵只要不是放在子函数块里就ok了,

我插入的位臵:

DefinitionBlock ("", "DSDT", 2, "Intel ", "CANTIGA ", 0x06040000)

{

Method (DTGP, 5, NotSerialized) //dtgp函数

{

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)

}

.........................................

External (PDC1)

External (PDC0)

External (CFGD)

External (_PR_.CPU0._PPC)

RTC

听说这个是防止bios重臵的,(我到现在也不知道bios重臵是个什么东西)

Device (RTC)

{

Name (_HID, EisaId ("PNP0B00"))

Name (BUF0, ResourceTemplate ()

{

IO (Decode16,

0x0070, // Range Minimum

0x0070, // Range Maximum

0x01, // Alignment

0x02, // Length

)

})

Name (BUF1, ResourceTemplate ()

{

IO (Decode16,

0x0070, // Range Minimum

0x0070, // Range Maximum

0x01, // Alignment

0x08, // Length

)

// IRQNoFlags ()

// {8}

这里由0x08改成0x02

这个不知道改不改

直接用"//"屏蔽就是了

})

Method (_CRS, 0, Serialized)

{

...................................

}

}

HPET 听说这个是能解决cpu电源管理的

Device (HPET)

{

Name (_HID, EisaId ("PNP0103"))

Name (_CID, EisaId ("PNP0C01"))

Name (BUF0, ResourceTemplate ()

{

IRQNoFlags () //就是加入这四行的东西

{0} //

IRQNoFlags () //

{8} //

Memory32Fixed (ReadOnly,

0xFED00000, // Address Base

0x00000400, // Address Length

)

})

Method (_STA, 0, NotSerialized)

{

..................................//此处略

}

Method (_CRS, 0, Serialized)

{

.................................... // 此处略

}

}

至于_WAK里面的两个Return(zero),我的dsdt里面自带了。

显卡的GFX0加入PEGP里面

Device (PEGP)

{

Name (_ADR, 0x00010000)

Device (GFX0)

{

Name (_ADR, Zero)

Name (_SUN, One)

Method (_DSM, 4, NotSerialized)

{

Store (Package (0x1C)

{

"AAPL,slot-name",

Buffer (0x0D)

{

"PCI-E Slot-1"

},

"@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

},

"NVPM",

Buffer (0x20)

{

/* 0000 */ 0x01, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00,

/* 0008 */ 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00,

/* 0010 */ 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00,

/* 0018 */ 0x00, 0x00, 0x00, 0x00

},

"VRAM,totalsize",

Buffer (0x04)

{

0x00, 0x00, 0x00, 0x10 //这里0x10代表256M

显存,0x20代表512M

},

"device_type",

Buffer (0x0D)

{

"NVDA,GeForce"

},

"model",

Buffer (0x1F) // 0x1F代表了"Nvidia GeForce 9300M

GS 256 MB"的字数,一般按字数+空格+1然后在转16进制,Buffer的用法基本相同

{

"Nvidia GeForce 9300M GS 256 MB"

},

"rom-revision",

Buffer (0x21)

{

"DSDT ROM v1.0 by Echo #OS x86_64"

},

"reg",

Buffer (0x78)

{

/* 0000 */ 0x00, 0x00, 0x01, 0x00, 0x00,

0x00, 0x00, 0x00,

/* 0008 */ 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00,

/* 0010 */ 0x00, 0x00, 0x00, 0x00, 0x10,

0x00, 0x01, 0x02,

/* 0018 */ 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00,

/* 0020 */ 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x01,

/* 0028 */ 0x14, 0x00, 0x01, 0x42, 0x00,

0x00, 0x00, 0x00,

/* 0030 */ 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00,

/* 0038 */ 0x00, 0x00, 0x00, 0x10, 0x1C,

0x00, 0x01, 0x02,

/* 0040 */ 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00,

/* 0048 */ 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x02,

/* 0050 */ 0x24, 0x00, 0x01, 0x01, 0x00,

0x00, 0x00, 0x00,

/* 0058 */ 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00,

/* 0060 */ 0x80, 0x00, 0x00, 0x00, 0x30,

0x00, 0x01, 0x02,

/* 0068 */ 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00,

/* 0070 */ 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x02, 0x00

}

}, Local0)

DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))

Return (Local0)

}

Device (VGA)

{

.......................... //此处略

}

Method (_PRT, 0, NotSerialized)

{

...........................//此处略

}

}

}

这里要注意那个 device(VGA),本来他是在GFX0之外的,但是我把它放到GFX0之内了,所以

就有两个调用到它的地方要由改成 ,另外在VGA函数里面要调用之

外的函数往往用^^^.LPC等等,此刻就要记得在前面多加个"^"了,前面就成了 ^^^^.LPC。

网上还看到了加入一下代码让原生AppleLPC加载来实现硬件电源管理的

Device (LPC)

{

Name (_ADR, 0x001F0000)

/* ===加载原生

==================================================================

*/

Method (_DSM, 4, NotSerialized)

{

Store (Package (0x02)

{

"device-id",

Buffer (0x04)

{

0x16, 0x29, 0x00, 0x00 //最主要的就是这里

}

}, Local0)

DTGP (Arg0, Arg1, Arg2, Arg3, Refof (Local0))

Return (Local0)

}

/*

==============================================================================

*/

0x16,0x29,0x00,0x00这个字符串可以在里面看到,你可以改成里面有的任意一

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

/?tid=594984&page=1&authorid=215483

顺便把声卡的也加了进去

Method (_DSM, 4, NotSerialized)

{

Store (Package (0x08)

{

"codec-id",

Buffer (0x04)

{

0x3e, 0x29, 0xEC, 0x10 //

可以再ioreg里看到

},

"layout-id",

Buffer (0x04)

{

0x78, 0x03, 0x00, 0x00

},

"device-type",

Buffer (0x29)

{

"Realtek ALC888/1200 @ Intel 82801IB ICH9"

},

"PinConfigurations",

Buffer (0x00)

{ } //

}, Local0)

这里在用voodoo驱动时

这里清空

DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))

Return (Local0)

}

以上代码加入到HDEF中,我的没有只有AZAL,于是就把AZAL改成了HDEF。

好了,编译

1. iasl

放入Drawn里面,启动,照样五国,重启,正常进入,显卡声卡驱动,原生电源管理,关机再重

启,还是五国,再重启,正常。

这里先说明一下,在编译我自己的dsdt文件时,发现原始的dsdt文件居然也有31个Warnings,

11 个Remarks,虽然无伤大雅,但我是个追求完美的人,通过反编译别人的aml文件以及在网上

搜索用一下方式解决:

对于

1101: Add (Local0, 0x02)

Warning 1105 - ^ Result is not used, operator has no

effect

采用把 (Local0, 0x02)改为 (Local0, 0x02, Local0)即可解决

对于

7080: Method (_GTM, 0, NotSerialized)

Warning 1087 - ^ Not all control paths returna

value (_GTM)

采用在判断语句后加入Return(Zero)方法解决,例如:

Method (_GTM, 0, NotSerialized)

{

If (LEqual (SCFG, Zero))

{

Name (PBUF, Buffer (0x14)

{

/* 0000 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00,

/* 0008 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00,

/* 0010 */ 0x00, 0x00, 0x00, 0x00

})

CreateDWordField (PBUF, Zero, PIO0)

CreateDWordField (PBUF, 0x04, DMA0)

CreateDWordField (PBUF, 0x08, PIO1)

CreateDWordField (PBUF, 0x0C, DMA1)

CreateDWordField (PBUF, 0x10, FLAG)

Store (GETP (PRIT), PIO0)

Store (GDMA (And (SYNC, One), And (ICR3, One),

And (ICR0, One), SDT0, And (ICR1, One)), DMA0)

If (LEqual (DMA0, Ones))

{

Store (PIO0, DMA0)

}

If (And (PRIT, 0x4000))

{

If (LEqual (And (PRIT, 0x90), 0x80))

{

Store (0x0384, PIO1)

}

Else

{

Store (GETT (PSIT), PIO1)

}

}

Else

{

Store (Ones, PIO1)

}

Store (GDMA (And (SYNC, 0x02), And (ICR3, 0x02),

And (ICR0, 0x02), SDT1, And (ICR1, 0x02)), DMA1)

If (LEqual (DMA1, Ones))

{

Store (PIO1, DMA1)

}

Store (GETF (And (SYNC, One), And (SYNC, 0x02),

PRIT), FLAG)

Return (PBUF)

}

Else

{

Return (Zero)

}

Return (Zero)

}

最后两行Return(Zero)就是解决问题的两行了。

还有一种解决方法就是把Method (_GTM, 0, NotSerialized)改写成Method (_GTM),同样能去

掉警告信息,不过我没有试过!!

对于

1. 8623: Name (_T_0, Zero)

2. 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电源管理驱

动,同时防止声音变形的那两处PNP0100和 PNP0000也不用修改,用voodooHDA驱动也不会出

现声音变形。

3、在Device (LPC)函数内加入

1.

Device (PNLF)

{

Name (_HID, EisaId ("APP0002"))

Name (_CID, "backlight")

Name (_UID, 0x0A)

Name (_STA, 0x0B)

}

可以使节能选项里面多出一个“睡眠前降低屏幕亮度的”的选项。

关于用原生AppleHDA+dsdt代码驱动声卡导致五国的问题,我也是百思不得其解,代码应该是没

问题,驱动是大家都在用的,唯一的就是layout-id,我不知道是不是所有的alc888的layout-id

都是 0x78,0x03,只有这个我在ioreg里面看不到,其他的又不需要看到,所以这个方法驱动声

卡对我来说暂时是不适用了!!

另外,我又加入了网卡信息代码,虽然我的网卡直接被sl支持,但是在以太网那里看不到网卡

的型号,于是在Device (EXP3)内加入以下代码

Device (GIGE)

{

Name (_ADR, 0x00)

Name (_PRW, Package (0x02)

{

0x09,

0x03

})

Method (_DSM, 4, NotSerialized)

{

Store (Package (0x08)

{

"codec-id",

Buffer (0x04)

{

0x68, 0x81, 0x00, 0x00

},

"built-in",

Buffer (One)

{

0x01

},

"device_type",

Buffer (0x09)

{

"ethernet"

},

"name",

Buffer (0x36)

{

"Realtek RTL8168C/8111C PCI-E Gigabit

Ethernet Adapter"

}

}, Local0)

DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))

Return (Local0)

}

Method (EWOL, 1, NotSerialized)

{

If (LEqual (Arg0, 0x01))

{

Or (GP9, 0x01, GP9)

}

Else

{

And (GP9, 0x00, GP9)

}

If (LEqual (Arg0, GP9))

{

Return (0x00)

}

Else

{

Return (0x01)

}

}

}

这样做主要是为了好看,对驱动来说没什么意义。

关于GP9的定义在这里:

Field (GPIO, ByteAcc, NoLock, Preserve)

{

Offset (0x2C),

Offset (0x2D),

, 3,

LPDL, 1, //加入GP9后,后面补","

GP9, 1

}

注意:原来的LPDL, 1后面是没有","的,加入GP9, 1后,他后面就要补充一个","

现在sl的状态是:

1、显卡完美驱动

2、声卡用voodooHDA驱动(自认为比dsdt效果要好)

3、原生电源管理,风扇声音很小,温度低

4、摄像头完美驱动

5、指纹识别完美驱动(只是没有装指纹识别软件)

6、内臵蓝牙完美驱动,蓝牙开关按键完美支持;

7、音量旋钮完美支持,播放控制键在iTunes内完美支持;

8、关机、重启正常。

现在剩下的问题就是:

1、内臵的读卡器没有驱动;

2、睡眠不能,现象和重启一样;

3、PCI设备中还有4个ExpressCard设备不知道是个啥

4、触摸板可以驱动,但是不能使用轻击,仅能移动鼠标

5、Intel的5100无线网卡只有等待了

2024年10月26日发(作者:郗庸)

DSDT修改教程

这就是重点了,实际上整个一个星期的工作绝大部分都是在如果驱动硬件上做文章了,虽然期间

重装了三遍系统,但感觉轻车熟路,玩一样的。

在驱动问题上确实走了很多的弯路,但是这个弯路有时候有事必须的,因为人总想做的完美一些,

只有不停地尝试才能找到更好的办法。

1、显卡

装完雪豹第一个想法就是希望能看到华丽的而且和windows不一样的界面,但事实又总是和想象

的有所区别,界面是变了,但是连进入系统式欢迎动画都是卡卡卡!!所以第一个想法也是把显

卡的驱动装上,于是google,一堆的驱动,一堆的方法,只是没有哪个具体说了怎样驱动 9300m

gs的,没办法只好一个一个的试了,几乎把所有的驱动都试过了(没找到的,不知道的,不算),

NVkushInstaller、NVinstaller v.52、NVIDIA_9000_Series_Driver_v2、

NVdarwinInstaller1.2.5、一样的不一样的都试了一遍,统统不行!!然后又试EFI

String,用OSX86Tools_1.0.150(这是个好东西),但是顶多就是强制分辨率,驱动的不能。

还有人介绍的就是在 里面加入

1. GraphicsEnabler

2. y

不知是不是人品不好,这个东东在别人那挺好,在我这统统不管用。pcbeta逛了逛才接触到通

过dsdt的修改来驱动显卡,让我兴奋的不得了,凭直觉觉得用dsdt来驱动硬件应该是比较完美

的方法,于是全身心投入到了dsdt的研究当中,由于之前一点都没有接触过dsdt(java编程还

是会的),只能在网上找方法然后依葫芦画瓢,但是开始根本不知道从何入手,比较简单的方法

就是威廉的acpi patch,但是又不支持我这个类型的bios,只能手动修改!彷徨中一个大侠的

出现让我看到了曙光,[url=?uid=487636]xchobits[/url]大侠把他自己的dsdt文件

给了我,因为我们的本子都是差不多的,我把他的放入drawn文件夹下后,奇迹出现

了,透明效果一下出来了,高兴的不得了!!!甚至安装了legacyHDA后,声卡也出声了!!!

但问题也接踵而来,就是每次进系统时总是先要五国一次,然后强制重启就能正常进入,郁闷的

不得鸟!!我分析,毕竟我的硬件不完全就是他的硬件,是不是某些地方的不同导致了五国,于

是我决定自己修改dsdt!!

==========================================================

2、DSDT

首先要把xchobits的 aml文件反编译,干吗?学习!!下载了iasl-win-20080729,反编译命

1.

2. iasl -d

得到 文件,一开始我一直用写字板编辑,后来发现用UltraEdit-32相当的方便,在

视图里面选择查看方式选择perl,

看到左边的加号了,确保了每个{ }都不会错,大大降低了出错的几率。

开始也不知道xchobits到底修改了哪里,就上网找教程,很多,就按教程修改!!

首先提取自己的dsdt,用everestultimate+ACPI Patcher,先用everestultimate导出

acpi_,然后用ACPI Patcher

点D/C按钮就得到dsl文件了。

GTGP 是最基本的一个方法,很多函数都需要它,加入的位臵只要不是放在子函数块里就ok了,

我插入的位臵:

DefinitionBlock ("", "DSDT", 2, "Intel ", "CANTIGA ", 0x06040000)

{

Method (DTGP, 5, NotSerialized) //dtgp函数

{

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)

}

.........................................

External (PDC1)

External (PDC0)

External (CFGD)

External (_PR_.CPU0._PPC)

RTC

听说这个是防止bios重臵的,(我到现在也不知道bios重臵是个什么东西)

Device (RTC)

{

Name (_HID, EisaId ("PNP0B00"))

Name (BUF0, ResourceTemplate ()

{

IO (Decode16,

0x0070, // Range Minimum

0x0070, // Range Maximum

0x01, // Alignment

0x02, // Length

)

})

Name (BUF1, ResourceTemplate ()

{

IO (Decode16,

0x0070, // Range Minimum

0x0070, // Range Maximum

0x01, // Alignment

0x08, // Length

)

// IRQNoFlags ()

// {8}

这里由0x08改成0x02

这个不知道改不改

直接用"//"屏蔽就是了

})

Method (_CRS, 0, Serialized)

{

...................................

}

}

HPET 听说这个是能解决cpu电源管理的

Device (HPET)

{

Name (_HID, EisaId ("PNP0103"))

Name (_CID, EisaId ("PNP0C01"))

Name (BUF0, ResourceTemplate ()

{

IRQNoFlags () //就是加入这四行的东西

{0} //

IRQNoFlags () //

{8} //

Memory32Fixed (ReadOnly,

0xFED00000, // Address Base

0x00000400, // Address Length

)

})

Method (_STA, 0, NotSerialized)

{

..................................//此处略

}

Method (_CRS, 0, Serialized)

{

.................................... // 此处略

}

}

至于_WAK里面的两个Return(zero),我的dsdt里面自带了。

显卡的GFX0加入PEGP里面

Device (PEGP)

{

Name (_ADR, 0x00010000)

Device (GFX0)

{

Name (_ADR, Zero)

Name (_SUN, One)

Method (_DSM, 4, NotSerialized)

{

Store (Package (0x1C)

{

"AAPL,slot-name",

Buffer (0x0D)

{

"PCI-E Slot-1"

},

"@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

},

"NVPM",

Buffer (0x20)

{

/* 0000 */ 0x01, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00,

/* 0008 */ 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00,

/* 0010 */ 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00,

/* 0018 */ 0x00, 0x00, 0x00, 0x00

},

"VRAM,totalsize",

Buffer (0x04)

{

0x00, 0x00, 0x00, 0x10 //这里0x10代表256M

显存,0x20代表512M

},

"device_type",

Buffer (0x0D)

{

"NVDA,GeForce"

},

"model",

Buffer (0x1F) // 0x1F代表了"Nvidia GeForce 9300M

GS 256 MB"的字数,一般按字数+空格+1然后在转16进制,Buffer的用法基本相同

{

"Nvidia GeForce 9300M GS 256 MB"

},

"rom-revision",

Buffer (0x21)

{

"DSDT ROM v1.0 by Echo #OS x86_64"

},

"reg",

Buffer (0x78)

{

/* 0000 */ 0x00, 0x00, 0x01, 0x00, 0x00,

0x00, 0x00, 0x00,

/* 0008 */ 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00,

/* 0010 */ 0x00, 0x00, 0x00, 0x00, 0x10,

0x00, 0x01, 0x02,

/* 0018 */ 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00,

/* 0020 */ 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x01,

/* 0028 */ 0x14, 0x00, 0x01, 0x42, 0x00,

0x00, 0x00, 0x00,

/* 0030 */ 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00,

/* 0038 */ 0x00, 0x00, 0x00, 0x10, 0x1C,

0x00, 0x01, 0x02,

/* 0040 */ 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00,

/* 0048 */ 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x02,

/* 0050 */ 0x24, 0x00, 0x01, 0x01, 0x00,

0x00, 0x00, 0x00,

/* 0058 */ 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00,

/* 0060 */ 0x80, 0x00, 0x00, 0x00, 0x30,

0x00, 0x01, 0x02,

/* 0068 */ 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00,

/* 0070 */ 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x02, 0x00

}

}, Local0)

DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))

Return (Local0)

}

Device (VGA)

{

.......................... //此处略

}

Method (_PRT, 0, NotSerialized)

{

...........................//此处略

}

}

}

这里要注意那个 device(VGA),本来他是在GFX0之外的,但是我把它放到GFX0之内了,所以

就有两个调用到它的地方要由改成 ,另外在VGA函数里面要调用之

外的函数往往用^^^.LPC等等,此刻就要记得在前面多加个"^"了,前面就成了 ^^^^.LPC。

网上还看到了加入一下代码让原生AppleLPC加载来实现硬件电源管理的

Device (LPC)

{

Name (_ADR, 0x001F0000)

/* ===加载原生

==================================================================

*/

Method (_DSM, 4, NotSerialized)

{

Store (Package (0x02)

{

"device-id",

Buffer (0x04)

{

0x16, 0x29, 0x00, 0x00 //最主要的就是这里

}

}, Local0)

DTGP (Arg0, Arg1, Arg2, Arg3, Refof (Local0))

Return (Local0)

}

/*

==============================================================================

*/

0x16,0x29,0x00,0x00这个字符串可以在里面看到,你可以改成里面有的任意一

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

/?tid=594984&page=1&authorid=215483

顺便把声卡的也加了进去

Method (_DSM, 4, NotSerialized)

{

Store (Package (0x08)

{

"codec-id",

Buffer (0x04)

{

0x3e, 0x29, 0xEC, 0x10 //

可以再ioreg里看到

},

"layout-id",

Buffer (0x04)

{

0x78, 0x03, 0x00, 0x00

},

"device-type",

Buffer (0x29)

{

"Realtek ALC888/1200 @ Intel 82801IB ICH9"

},

"PinConfigurations",

Buffer (0x00)

{ } //

}, Local0)

这里在用voodoo驱动时

这里清空

DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))

Return (Local0)

}

以上代码加入到HDEF中,我的没有只有AZAL,于是就把AZAL改成了HDEF。

好了,编译

1. iasl

放入Drawn里面,启动,照样五国,重启,正常进入,显卡声卡驱动,原生电源管理,关机再重

启,还是五国,再重启,正常。

这里先说明一下,在编译我自己的dsdt文件时,发现原始的dsdt文件居然也有31个Warnings,

11 个Remarks,虽然无伤大雅,但我是个追求完美的人,通过反编译别人的aml文件以及在网上

搜索用一下方式解决:

对于

1101: Add (Local0, 0x02)

Warning 1105 - ^ Result is not used, operator has no

effect

采用把 (Local0, 0x02)改为 (Local0, 0x02, Local0)即可解决

对于

7080: Method (_GTM, 0, NotSerialized)

Warning 1087 - ^ Not all control paths returna

value (_GTM)

采用在判断语句后加入Return(Zero)方法解决,例如:

Method (_GTM, 0, NotSerialized)

{

If (LEqual (SCFG, Zero))

{

Name (PBUF, Buffer (0x14)

{

/* 0000 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00,

/* 0008 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00,

/* 0010 */ 0x00, 0x00, 0x00, 0x00

})

CreateDWordField (PBUF, Zero, PIO0)

CreateDWordField (PBUF, 0x04, DMA0)

CreateDWordField (PBUF, 0x08, PIO1)

CreateDWordField (PBUF, 0x0C, DMA1)

CreateDWordField (PBUF, 0x10, FLAG)

Store (GETP (PRIT), PIO0)

Store (GDMA (And (SYNC, One), And (ICR3, One),

And (ICR0, One), SDT0, And (ICR1, One)), DMA0)

If (LEqual (DMA0, Ones))

{

Store (PIO0, DMA0)

}

If (And (PRIT, 0x4000))

{

If (LEqual (And (PRIT, 0x90), 0x80))

{

Store (0x0384, PIO1)

}

Else

{

Store (GETT (PSIT), PIO1)

}

}

Else

{

Store (Ones, PIO1)

}

Store (GDMA (And (SYNC, 0x02), And (ICR3, 0x02),

And (ICR0, 0x02), SDT1, And (ICR1, 0x02)), DMA1)

If (LEqual (DMA1, Ones))

{

Store (PIO1, DMA1)

}

Store (GETF (And (SYNC, One), And (SYNC, 0x02),

PRIT), FLAG)

Return (PBUF)

}

Else

{

Return (Zero)

}

Return (Zero)

}

最后两行Return(Zero)就是解决问题的两行了。

还有一种解决方法就是把Method (_GTM, 0, NotSerialized)改写成Method (_GTM),同样能去

掉警告信息,不过我没有试过!!

对于

1. 8623: Name (_T_0, Zero)

2. 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电源管理驱

动,同时防止声音变形的那两处PNP0100和 PNP0000也不用修改,用voodooHDA驱动也不会出

现声音变形。

3、在Device (LPC)函数内加入

1.

Device (PNLF)

{

Name (_HID, EisaId ("APP0002"))

Name (_CID, "backlight")

Name (_UID, 0x0A)

Name (_STA, 0x0B)

}

可以使节能选项里面多出一个“睡眠前降低屏幕亮度的”的选项。

关于用原生AppleHDA+dsdt代码驱动声卡导致五国的问题,我也是百思不得其解,代码应该是没

问题,驱动是大家都在用的,唯一的就是layout-id,我不知道是不是所有的alc888的layout-id

都是 0x78,0x03,只有这个我在ioreg里面看不到,其他的又不需要看到,所以这个方法驱动声

卡对我来说暂时是不适用了!!

另外,我又加入了网卡信息代码,虽然我的网卡直接被sl支持,但是在以太网那里看不到网卡

的型号,于是在Device (EXP3)内加入以下代码

Device (GIGE)

{

Name (_ADR, 0x00)

Name (_PRW, Package (0x02)

{

0x09,

0x03

})

Method (_DSM, 4, NotSerialized)

{

Store (Package (0x08)

{

"codec-id",

Buffer (0x04)

{

0x68, 0x81, 0x00, 0x00

},

"built-in",

Buffer (One)

{

0x01

},

"device_type",

Buffer (0x09)

{

"ethernet"

},

"name",

Buffer (0x36)

{

"Realtek RTL8168C/8111C PCI-E Gigabit

Ethernet Adapter"

}

}, Local0)

DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))

Return (Local0)

}

Method (EWOL, 1, NotSerialized)

{

If (LEqual (Arg0, 0x01))

{

Or (GP9, 0x01, GP9)

}

Else

{

And (GP9, 0x00, GP9)

}

If (LEqual (Arg0, GP9))

{

Return (0x00)

}

Else

{

Return (0x01)

}

}

}

这样做主要是为了好看,对驱动来说没什么意义。

关于GP9的定义在这里:

Field (GPIO, ByteAcc, NoLock, Preserve)

{

Offset (0x2C),

Offset (0x2D),

, 3,

LPDL, 1, //加入GP9后,后面补","

GP9, 1

}

注意:原来的LPDL, 1后面是没有","的,加入GP9, 1后,他后面就要补充一个","

现在sl的状态是:

1、显卡完美驱动

2、声卡用voodooHDA驱动(自认为比dsdt效果要好)

3、原生电源管理,风扇声音很小,温度低

4、摄像头完美驱动

5、指纹识别完美驱动(只是没有装指纹识别软件)

6、内臵蓝牙完美驱动,蓝牙开关按键完美支持;

7、音量旋钮完美支持,播放控制键在iTunes内完美支持;

8、关机、重启正常。

现在剩下的问题就是:

1、内臵的读卡器没有驱动;

2、睡眠不能,现象和重启一样;

3、PCI设备中还有4个ExpressCard设备不知道是个啥

4、触摸板可以驱动,但是不能使用轻击,仅能移动鼠标

5、Intel的5100无线网卡只有等待了

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论