DSDT修改教程这就是重点了,实际上整个一个星期的工作绝大部分都是在如果驱动硬件上做文章了,虽然期间重装了三遍系统,但感觉轻车熟路,玩一样的。
在驱动问题上确实走了很多的弯路,但是这个弯路有时候有事必须的,因为人总想做的完美一些,只有不停地尝试才能找到更好的办法。
1、显卡装完雪豹第一个想法就是希望能看到华丽的而且和windows不一样的界面,但事实又总是和想象的有所区别,界面是变了,但是连进入系统式欢迎动画都是卡卡卡!!所以第一个想法也是把显卡的驱动装上,于是google,一堆的驱动,一堆的方法,只是没有哪个具体说了怎样驱动 9300m gs的,没办法只好一个一个的试了,几乎把所有的驱动都试过了(没找到的,不知道的,不算),NVkushInstaller、NVinstaller v.52、NVIDIA_9000_Series_Driver_v2、NVdarwinInstaller1.2.5、Natit.kext一样的不一样的都试了一遍,统统不行!!然后又试EFI String,用OSX86Tools_1.0.150(这是个好东西),但是顶多就是强制分辨率,驱动的不能。
还有人介绍的就是在 com.apple.Boot.plist里面加入1.<key>GraphicsEnabler</key>2.<string>y</string>不知是不是人品不好,这个东东在别人那挺好,在我这统统不管用。
pcbeta逛了逛才接触到通过dsdt的修改来驱动显卡,让我兴奋的不得了,凭直觉觉得用dsdt来驱动硬件应该是比较完美的方法,于是全身心投入到了dsdt的研究当中,由于之前一点都没有接触过dsdt(java编程还是会的),只能在网上找方法然后依葫芦画瓢,但是开始根本不知道从何入手,比较简单的方法就是威廉的acpi patch,但是又不支持我这个类型的bios,只能手动修改!彷徨中一个大侠的出现让我看到了曙光,[url=space.php?uid=487636]xchobits[/url]大侠把他自己的dsdt文件给了我,因为我们的本子都是差不多的,我把他的dsdt.aml放入drawn文件夹下后,奇迹出现了,透明效果一下出来了,高兴的不得了!!!甚至安装了legacyHDA后,声卡也出声了!!!但问题也接踵而来,就是每次进系统时总是先要五国一次,然后强制重启就能正常进入,郁闷的不得鸟!!我分析,毕竟我的硬件不完全就是他的硬件,是不是某些地方的不同导致了五国,于是我决定自己修改dsdt!!==========================================================2、DSDT首先要把xchobits的 aml文件反编译,干吗?学习!!下载了iasl-win-20080729,反编译命令1.2.iasl -d dsdt.aml得到dsdt.dsl 文件,一开始我一直用写字板编辑,后来发现用UltraEdit-32相当的方便,在视图里面选择查看方式选择perl,看到左边的加号了,确保了每个{ }都不会错,大大降低了出错的几率。
开始也不知道xchobits到底修改了哪里,就上网找教程,很多,就按教程修改!!首先提取自己的dsdt,用everestultimate+ACPI Patcher,先用everestultimate导出acpi_dsdt.bin,然后用ACPI Patcher点D/C按钮就得到dsl文件了。
GTGP 是最基本的一个方法,很多函数都需要它,加入的位臵只要不是放在子函数块里就ok了,我插入的位臵:DefinitionBlock ("dsdt.aml", "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 Minimum0x0070, // Range Maximum0x01, // Alignment0x02, // Length 这里由0x08改成0x02 )})Name (BUF1, ResourceTemplate (){IO (Decode16,0x0070, // Range Minimum0x0070, // Range Maximum0x01, // Alignment0x08, // Length 这个不知道改不改)// IRQNoFlags () 直接用"//"屏蔽就是了// {8}})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之内了,所以就有两个调用到它的地方要由PEGP.VGA改成 PEGP.GFX0.VGA ,另外在VGA函数里面要调用之外的函数往往用^^^.LPC等等,此刻就要记得在前面多加个"^"了,前面就成了 ^^^^.LPC。