clover 显卡注入功能详细讲解
GraphicsInjector功能源于变色龙,不过比变色龙更加灵活,定制性更加强大。Intel的显卡 GMA950, X3100, HD300, HD4000被证实可以很好的工作。你仅仅只要在config.plist打开显卡侦测功能,特别是对于N卡。 在新版中显卡参数分开:intel、ati、nv区分开来。
<key>Inject</key>
<dict>
<key>ATI</key>
<false/>
<key>Intel</key>
<false/>
<key>NVidia</key>
<true/>
</dict>
但是要注意一点,有些笔记本(比如我的(Ermac) Dell Inspiron 1525)进入就是黑屏。这时你可以用睡眠的小窍门(意思是说睡以后重新唤醒就不会黑屏??)或者在dsdt中删除Device(CRT) 装置。在现在的clover版本中,你可以使用 DsdtFixMask
值修复,其值是 0x0100
即Display Fix
, N卡:这是被广泛支持的显卡,其数据库由ErmaC不断更新。这是在config.plist
中参数:
<key>Graphics</key>
<dict>
<key>GraphicsInjector</key>
<string>Yes</string>
<key>LoadVBios</key>
<string>No</string>
<key>VideoPorts</key>
<string>3</string>
<key>NVCAP</key>
<string>04000000000003000C0000000000000700000000</string>
<key>display-cfg</key>
<string>03010300FFFF0001</string>
</dict>
其中VideoPort为你的显卡接口数,nvcap值是你自己显卡的nvcap值,display-cfg无关紧要,默认就是这个值。 一般N卡只需打开显卡注入功能即可即:
<key>NVidia</key>
<true/>
其他接口数,显卡内存什么的全部不需要. 其会自动侦测,并采用默认的nvcap和其他值,clover现在用的默认nvcap值就是上面这组:
040000000000
03
000C
0000000000000700000000
这个你可以在clover源码中找到:rEFI_UEFI—》》Platform—》NVIDIA.C中。 遇到黑屏或自动重启才启用定制nvcap值,nvcap值可由idsdt+显卡rom,勾选生成显卡驱动点击开始生成,在运行信息中可以看到。Nvmaker这个软件有些机子无法运行。当然并不是非要自己获取自己显卡的nvcap值。在下表的值大家都可以试试。
要多屏输出可能要修改nvcap值,关于nvcap值的定义不再此累述,因为我也不清楚。更多的认为03(十六进制数0x03)和0C这两个位置的所在的数字在取作用,03是主屏,0c是扩展屏,0x03=0011,1就是打开接口的意思.为了不重复在主屏和扩展屏中同时打开某接口,可以使03所在位数值和0c数字所在位置数值加起来刚好等于F(十六进制)。 以下常用的nvcap值组合:
找到正确的nvcap值后可以把其值写入源码,自己编译自己的clover:N卡信息在:rEFI_UEFI—》》Platform—》》NVIDIA.C中。 当然不要那么费事,直接clover config中注入nvcap值即可。
关于ATI/AMD显卡
这里要做个特别的讨论。对以原生支持的5xxx and 6xxxA卡,在不开启显卡注入功能的情况下用共同的ATIRadeonFramebuffer可进入桌面并且opengl可用但并不理想,如打开DVDPlayer它会崩溃。
如果你开启显卡注入功能: GI = Yes,进入mac可能遇到黑屏或者白屏因为所有的信息已经在第二屏显示 所以你需要修改接口参数,即FB使得其正确对应接口输出。 国外帖:http://www.insanelymac.com/forum/topic/249642-editing-custom-personalities-for-ati-radeon-hd45xxx/ 以我的ATI HD6670为例,config配置如下:
<key>Graphics</key>
<dict>
<key>GraphicsInjector</key>
<string>Yes</string>
<key>FBName</key>
<string>Ipomoea</string>
<key>LoadVBios</key>
<string>No</string>
<key>VideoPorts</key>
<string>3</string>
</dict>
接口数为三,使用的ati config值为Ipomoea,并修正原始的接口参数:
<key>KernelAndKextPatches</key>
<dict>
<key>KernelCpu</key>
<string>No</string>
<key>ATIConnectorsController</key>
<string>6000</string>
<key>ATIConnectorsData</key>
<string>000400000403000000010000120401050008000004020000000100001102040310000000100000000001000000000002</string>
<key>ATIConnectorsPatch</key>
<string>040000000403000000010000100001061000000010000000000100000000000100080000040200000001000012040403</string></dict>
ATIConnectorsData为原始的接口参数,下文会介绍如何获取。 ATIConnectorsPatch为修正的接口参数,同样下文会叙述如何修改。 对于移动版显卡,还得设置一个值:
<key>LoadVBios</key>
<string>Yes</string>
具体在config中的设置请看config-sample.plist文件
关于intel显卡
对于HD4000,显卡注入打开,然后注入合适的ig-platform-id以下是可选的值:对于笔记本
ig-platform-id: 01660000
ig-platform-id: 01660001
ig-platform-id: 01660002
ig-platform-id: 01660003
ig-platform-id: 01660004
g-platform-id: 01660008
ig-platform-id: 01660009
ig-platform-id: 0166000A
ig-platform-id: 0166000B
台式:
ig-platform-id: 01620005
ig-platform-id: 01620006
ig-platform-id: 01620007
一个个试,找到自己合适的。笔记本常用的4,a。 同时为避免因AppleIntelSNBGraphicsFB.kext使得 AppleIntelFramebufferCapri.kext加载出错(五国),要注入IMEI:
0x1e3a8086
即在fixes dsdt的new way勾选addIMEI。同时FAKEI的IMEI值填入0x1e3a8086。 同时fixes dsdt中勾选FIX INTEL GFX 和FIX DISPlay,当然addDTGP是必须的。同时注入EDID开启。 如黑屏 、重影、双分屏、花屏换ig-platform-id
. 在安装的时候可以填写FAKEID的intel GFX的值由g-platform-id替代,可以跳过intel 显卡。但要驱动intel 显卡此项只能填 HD4000: 0x01668086
(笔记本)0x01628086
(台式)。HD2500
是0x01528086
0x01568086
或不填,用系统自动侦测的。
EDID注入
在某些情况下你需要注入EDID,如某些sony本本senseid为07,和笔记本内屏黑屏的情况。你也可以自己定制EDID.
<key>InjectEDID</key>
<string>Yes</string>
用这种方法通过bios获取EDID是可用的。Osx获取的不是总是对的。如果你的显示器没有描述DDC的信息什么是DDC?显示器和主机的通信协议:http://wenku.baidu.com/view/1f635435a32d7375a4178043.html
你可以注入显示器官方的edid
<key>CustomEDID</key>
<data>AP///////wAyDADfAAAAAAASAQOAIRV4CunVmVlTjigmUFQAAAABAQEBAQEBAQEBAQEBAQEB3iGgcFCEHzAgIFYAS88QAAAY3iGgcFCEHzAgIFYAS88QAAAAAAAA/gBXNjU3RwAxNTRXUDEKAAAA/gAjMz1IZYSq/wIBCiAgAJo=</data>
更具体简单的看这边:http://bbs.pcbeta.com/viewthread-1473634-1-1.htmlAAPL,DualLink参数设置 DualLink参数可解决高分辨率显示器黑边,花屏等问题。 其值只有0和1,0不启用,1开启。
<key>DualLink</key>
<string>1</string>
有些卡必须设置为0,如ATI HD1600,否则你将看到四个桌面。
ATI 显卡接口参数修正
首先,感谢bcc9提供方法,pcj实现这个path,dmazar使之工作。
开始正题: 1. 下载radeon_bios_decoder和ati_personality.pl 传送门:http://pan.baidu.com/s/1o62SAk6
MD5:3052fa7872f93a826f9e8c0867309816
对于10.8.3这个可能无法获取信息,试试新版:
传送门:http://pan.baidu.com/s/1qWDDT1M
MD5:c928fc9f01ce99c000ae54e130a2e5ad
感谢bcc9的维护,xhcnb提供附件 radeon_bios_decode+redsock_bios_decoder传送门:http://pan.baidu.com/s/1c0gSv3i
MD5:973e0e18584906989a3c9457ff84fb0d
新版的:ati-personality.0.12传送门:http://pan.baidu.com/s/1gd1fczD
MD5:c70c2bcc48cee7f9198ba4a1f8421afe
2.在win下查看你的显卡id(设备管理,属性)或用system info查看。 我的DeviceID= 0x6758,这是6000系列的卡, 你的是什么系列的?皮卡丘的帖子有收集请看这:
http://bbs.pcbeta.com/viewthread-1060313-1-1.html 找到你的显卡id或找到接近的。 例如,你的显卡的设备id:DeviceID=0x68B2
,并不在原生支持的显卡里头,只能找到相近的0x68B1,所以你可以确定你的显卡是5系列的,这时你必须在AMDRadeonAccelerator.kext/Contens/Info.plist
和ATI5000Controller.kext/Contents/Info.plist
中添加自己的显卡ID。id位置靠近和你相似的id。 例如:
<key>IOPCIMatch</key>
<string>0x68981002 0x68991002 0x68E01002 0x68E11002 0x68D81002 0x68C010020x68C11002 0x68D910020x68B21002 0x68B810020x68B01002 0x68B11002 0x68A01002 0x68A11002 </string>
3.用ati_personality.pl或取原生支持显卡接口的参数信息(此步可省去直接附上:ATIFramebuffer原版参数
传送门:http://pan.baidu.com/s/18aLT8
MD5:1e84c29b7d7723890083992dfd7dca63
10.8.3下的FB参数由xhcnb提供:10.8.3 FrameBuffer
传送门:http://pan.baidu.com/s/1gdsX4zT
MD5:3b8c075825d541a20f4104af5d3e5066
具体用法如下: 假设你把ati-personality.pl放在桌面,确定终端已经用cd命令切换工作目录到桌面,则运行如下命令:
./ati-personality.pl ATI5000Controller.kext
这个命令获取原生支持的5系列的显卡接口参数,请确定S/L/E下有ATI5000Controller.kext这个kext 这边已经搜集好啦5系列和6系列的接口参数(ATIFramebuffer原版参数上文已给)以上命令可免:
Kext /System/Library/Extensions//ATI5000Controller.kext/Contents/MacOS/AMD5000Controller
Personality: Douc
ConnectorInfo count in decimal: 2
Disk offset in decimal 165856
0000000 02 00 00 00 00 05 00 00 09 03 00 00 21 03 02 02
0000010 00 04 00 00 04 02 00 00 00 03 00 00 11 02 01 01
0000020
打开可以看到形如上面的信息。 那么如何选择ATI config值(Framebuffers,就是原版参数中的Personality值)呢? 其实我认为任意一个都是可以的(个人认为,也许我是错的) 对于5系列:Baboon常用于桌面版 , Galago 用于移动版 对于6系列: Ipomoea用于桌面版, Osmunda 用于移动版 注意这只是推荐使用…… 你也可以在变色龙的源码中发现各个型号显卡变色龙采用的 ati config值:http://forge.voodooprojects.org/p/chameleon/source/tree/HEAD/trunk/i386/libsaio/ati.c同样ctrf+f搜索页面,直接输入你的显卡型号或显卡id如上文提到的0x68B1,直接搜索得到(不一定搜索得到,类似的也是可以的):
{0x68B1,0x00000000,CHIP_FAMILY_JUNIPER,"ATI Radeon HD 5770Series",kHoolock}
那么其ati config值就是Hoolock(注意去掉前面的字母k) so,你也可以采用变色龙推荐的ati config值,但,凡是没有绝对…… 现在我已 HD6670为例,其DevID=0x6758,采用aticonfig值为Ipomoea 其原始接口信息(搜索上文所给的ATIFramebuffer原版参数.rtf文件):
Personality: Ipomoea
ConnectorInfo count in decimal: 3
Disk offset in decimal 180112
0000000 00 04 00 00 04 03 00 00 00 01 00 00 12 04 01 05
0000010 00 08 00 00 04 02 00 00 00 01 00 00 11 02 04 03
0000020 10 00 00 00 10 00 00 00 00 01 00 00 00 00 00 02
其中
0000000 00 04 00 00 04 03 00 00 00 01 00 00 12 04 01 05
0000010 00 08 00 00 04 02 00 00 00 01 00 00 11 02 04 03
0000020 10 00 00 00 10 00 00 00 00 01 00 00 00 00 00 02
这一系列数子就是我们要更改的数据,即:
<key>ATIConnectorsData</key>
<string>*****</string>
的值 那么如何修正这组数据呢? 4.运行radeon_bios_decoder获取自己的显卡信息 首先你得获取自己的显卡bios(显卡rom),在win下你可以用像GPU-Z,everest等如果你已经安装啦clover,clover也可提取
启动clover后在引导界面(选择启动分区界面)按F6后进入mac后你将在/EFI/misc/c0000.bin找到你的显卡rom文件,前提是你的EFI分区得是fat32格式。
现在假设你获取到显卡rom(命名为c0000.bin)并和radeon_bios_decoder都放在同一个文件夹,终端已经用cd 命令切换到该文件夹:
iMac:test slice$ ./radeon_bios_decode c0000.bin
ATOM BIOS Rom:
SubsystemVendorID: 0x1458 SubsystemID: 0x2557
IOBaseAddress: 0xe000
Filename: R667D32I.F1
BIOS Bootup Message:
GV-R667D3-2GI/F1
PCI ID: 1002:6758
Connector at index 0
Type [@offset 44282]: HDMI-A (11)
Encoder [@offset 44286]: INTERNAL_UNIPHY2 (0x21)
i2cid [@offset 44356]: 0x92, OSX senseid: 0x3
Connector at index 1
Type [@offset 44292]: DVI-D (3)
Encoder [@offset 44296]: INTERNAL_UNIPHY (0x1e)
i2cid [@offset 44383]: 0x95, OSX senseid: 0x6
Connector at index 2
Type [@offset 44302]: VGA (1)
Encoder [@offset 44306]: INTERNAL_KLDSCP_DAC1 (0x15)
i2cid [@offset 44410]: 0x90, OSX senseid: 0x1
iMac:test slice$
以上信息我们只需要每个接口的senseid值:
DVI-D: 06
VGA: 01
HDMI: 03
以上我们知道有3个接口,DVI-D,VGA, HDMI,而Ipomoea原始接口信息如下:
0000000 00 04 00 00 04 03 00 00 00 01 00 00 12 04 01 05
0000010 00 08 00 00 04 02 00 00 00 01 00 00 11 02 04 03
0000020 10 00 00 00 10 00 00 00 00 01 00 00 00 00 00 02
这组数据中,绿色的就是描述接口类型的,红色部分就是senseid值. 其中我们已经了解到不同接口对应的值:
0004- DP
0008 - HDMI
1000 - VGA
0400 - DVI-D
0200 - LCD - for notebooks
笔记本内屏也有写成LVDS的 而由上可知该显卡只有三个接口DVI-D,VGA,HDMI,分别对应的描述接口类型的值为:0400,1000,0008;对应的senseid值分别为:06
,01
,03
所以00
04
应改为0400,对应的senseid值也得修改。
修改后:
0000000 04 00 00 00 04 03 00 00 00 01 00 00 12 04 01 06 DVI-D
0000010 00 08 00 00 04 02 00 00 00 01 00 00 11 02 04 03 HDMI
0000020 10 00 00 00 10 00 00 00 00 01 00 00 00 00 00 01 VGA
我也可以交换第三和第二行:
0000000 04 0000 00 04 03 00 00 00 01 00 00 12 04 01060000010 10 00 00 00 10 00 00 00 00 01 00 00 00 00 00 010000020 00 08 00 00 04 02 00 00 00 01 00 00 11 02 04 03
现在可以把修正的Fb参数写入config啦:
<key>KernelAndKextPatches</key>
<dict>
<key>ATIConnectorsController</key>
<string>6000</string>
<key>ATIConnectorsData</key>
<string>000400000403000000010000120401050008000004020000000100001102040310000000100000000001000000000002</string>
<key>ATIConnectorsPatch</key>
<string>040000000403000000010000100001061000000010000000000100000000000100080000040200000001000012040403</string>
6.这个补丁工作在两种情况下;KernelCache开启(默认开启),或boot-args 包含”WithKexts”值。 要注意你所选择的修改framebuffer要和写入config.plist对应。
<key>Graphics</key>
<dict>
<key>GraphicsInjector</key>
<string>Yes</string>
<key>FBName</key>
<string>Ipomoea</string>
测试在我的 HD6670、HD5570,dvd正常,可以播放4K分辨率的视频。 其他信息:
0000000 04 00 00 00 04 03 00 00 00 01 00 00 12 04 01 06
0000010 10 00 00 00 10 00 00 00 00 01 00 00 00 00 00 01
0000020 00 08 00 00 04 02 00 00 00 01 00 00 11 02 05 03
如果遇到睡眠问题,改变vga输出的encoderid 值为00
如果hdmi接口有问题改变HotPlugID值为05
任意kext打补丁(KextsToPatch)
你可以给很多kext打补丁,用这种方法,可免以直接用二进制修改工具像hexedit,oxED修改kext的二进制字典,info同样也是可以修改。真的很方便。 给一个非常有趣的例子: 我研究voodoohda这个kext,发现字符串
"Headphones"= 48 65 61 64 70 68 6F 6E 65 73 00
其中后面一排数字是其各个字母对应的ASCII码(十六进制) 我想把他重命名为”Telephones” =54 65 6C 65 70 68 6F 6E 65 73 00 写入config是这样子:
<key>KextsToPatch</key>
<array><key>0</key>
<dict>
<key>Name</key>
<string>VoodooHDA</string>
<key>Find</key>
<data>SGVhZHBob25lcwA=</data>
<key>Replace</key>
<data>VGVsZXBob25lcwA=</data>
</dict>
</array>
重启就可以看到效果。
这是给kext中二进制文件patch,也可以给info.plist:
<key>0</key>
<dict>
<key>Name</key>
<string>AirPortAtheros40</string>
<key>InfoPlistPatch</key>
<string>Yes</string>
<key>Find</key>
<string>pci168c,2a</string>
<key>Replace</key>
<string>pci168c,2b</string>
</dict>
如上是给AirPortAtheros40.kext的info.plist增加id。要特别注意的是patch info.plist是,注意你要path的值是string(字符型),还是data(数据),对应string,find值和repalce值如上可不转换为hex(十六进制)data则要转换而且还是64进制。如fakesmc的patch:
AWgPAACW就是01680f00 0096 转换后的结果。这个直接用plist edit pro编辑fakesmc的info.plist信息是在下方同步的结果就是转换后的情况。 再来一个:
<dict>
<key>Name</key>
<string>AppleHDAController</string>
<key>Comment</key>
<string>Patch_to_not_load_this_driver</string>
<key>InfoPlistPatch</key>
<true/>
<key>Find</key>
<string>0x04020000</string>
<key>Replace</key>
<string>0x44220000</string>
</dict>
现在来几个有实用的价值的补丁方法。 其中一个就是ATIConnectors patch为5系列和6系列的A卡。例如对以os 10.6,ATI RadeonX1650的显卡DeviceID=0x71cd不是通用的(不是公版?),所以你不仅必须在ATIRadeonX1000.kext的info.plist中写入显卡id,还得修改其二进制文件。以前你可能要用oxed或hexeditor来编辑替换二级制文件中的内容,现在你只要这么做:
<key>0</key>
<dict>
<key>Name</key>
<string>ATIRadeonX1000</string>
<key>Find</key>
<string>81fa87710000</string>
<key>Replace</key>
<string>81facd710000</string>
</dict>
这边罗列几个已经定义好的path: 1. Patch for AppleIntelCPUPowerManagement because of ASUS BIOSbreak MSR register 0xE2
<key>AsusAICPUPM</key>
<string>Yes</string>
2.path for AppleRTC防cmos重置
<key>AppleRTC</key>
<string>Yes</string>
3.开启TRIM支持
4.timeouton AHCI by bcc9 Waitingfor root device when kernel cache used; only with some disks +FIX
5.hd3000接口修正
<dict>
<key>Name</key>
<string>AppleIntelSNBGraphicsFB</string>
<key>Find</key> <data>AQIEABAHAAAQBwAABQMAAAIAAAAwAAAAAgUAAAAEAAAHAAAAAwQAAAAEAAAJAAAABAYAAAAEAAAJAAAA</data>
<key>Replace</key> <data>AQIDABAHAAAQBwAAAwQAAAAEAAAJAAAAAgUAAAAEAAAHAAAABAYAAAAEAAAJAAAAAAAAAAAAAAAAAAAA</data>
</dict>
hd3000接口的修改教程:前往 6.磁盘内建,可解决橙色磁盘等问题。
<key>3</key>
<dict>
<key>Find</key>
<data>
RXh0ZXJuYWw=
</data>
<key>Name</key>
<string>AppleAHCIPort</string>
<key>Replace</key>
<data>
SW50ZXJuYWw=
</data>
</dict>
- AppleTyMCEDriver patch to use MacPro5,1 。这个patch后可设置机型为 MacPro5,1,而不需要删掉ecc校验驱动。
<key>Name</key>
<string>AppleTyMCEDriver</string>
<key>Find</key>
<data>cgoATWFjUHJvNCwxAE1hY1BybzUsMQBY</data>
key>Replace</key>
<data>cgoAAAAAAAAAAAAAAAAAAAAAAAAAAABY</data>
定制EDID
在两种情况下你可能需要这个功能 1.显示器不是DDC monitor 2.显示器是DDC monitor但是mac无法获取edid。 注入Edid有助于解决笔记本内屏黑屏的问题。 你仅仅需要设置 InjectEDID = yes。而对于第一种情况我们必须从其他地方获取edid并下入config.plist. 如何获取EDID呢,论坛常用提到的工具是这个: EDID Manager 我以前的帖子有提供下载和方法:http://bbs.pcbeta.com/viewthread-1031060-1-1.html 还有这个更简单:http://bbs.pcbeta.com/viewthread-1473634-1-1.html
本作品由 maoshu 创作,采用 CC BY-NC-SA 3.0 许可协议 进行许可。