修改NVCAP让Hackintosh支持双屏显示

阅读本文需要有一定的黑苹果基础知识,这些可以到远景论坛学习。另:本文需要你有一个已经可以正常驱动显卡的DSDT,基于这个DSDT修改NVCAP就简单多了。

首先了解一下NVCAP,网上有篇文章非常全面,直接摘抄过来了:

————————————————————

译文:水平有限,有问题的地方请提出,以便完善。

感 谢Arti以及上周我们在hackintoshes和ppcMacintoshes 上所做的大量NVIDIA 显卡实验。 目前 NVCAP 值已经基本掌握。在论坛我已说过,NVCAP 值不能解决所有问题,但它可以让 你获得正确的 VGA,DVI 显示输出。TV 输出和笔 记本显示可能需要进一步的破解。 首先,讲解下 NVCAP 的重要部分以及它们怎么工作的:

04000000 0000xx00 xx000000 00000000 00000000

粗体字节定义了输出通道,它们使用一种“位图”设置来定义哪个输出设在哪个通道上,但实 际上对于常用的显卡并没有那么多的组合。 大多数显卡使用 4 或 5 种输出:

1/ DVI – 2/ VGA, 3/ VGA, 4/ TV out

1/ DVI – 2/ VGA, 3/ DVI – 4/ VGA, 5/ TV out

接下来,讲解下在 GeForce 5/6/7/8 系列 PC NVIDIA ROM(显卡 bios)中是怎么定义的。

-大多双 DVI 显卡的通道使用这种设置(5 种输出):

通道 1:

DVI + VGA –> bitmap 0 0 0 1 1 –> hex 03

通道 2:

DVI + VGA + TV –> bitmap 1 1 1 0 0 –> hex 1c

或者

通道 1:

DVI + VGA + TV –> bitmap 1 0 0 1 1 –> hex 13

通道 2:

DVI + VGA + TV –> bitmap 0 1 1 0 0 –> hex 0c

在 VGA ROM 中 TV 输出一般被定义在最后一个输出口,这就是为什么它使用最后的位置。(双 DVI 显卡的第五个,或者 DVI+VGA 显卡的第四个)。

-对于 DVI+VGA 显卡(4 种输出):

通道 1 :

DVI + VGA –> bitmap 0 0 1 1 –> hex 03

通道 2 :

VGA + TV –> bitmap 1 1 0 0 –> hex 0c

或者

通道 1 :

DVI + VGA + TV–> bitmap 1 0 1 1 –> hex 0b

通道 2 :

VGA –> bitmap 0 1 0 0 –> hex 04

(如你所看到的,TV 输出在最后的可用位置,即 4 种可用输出的第四位置)

或者

通道 1 :

VGA –> bitmap 0 0 0 1 –> hex 01

通道 2 :

DVI + VGA + TV –> bitmap 1 1 1 0 –> hex 0e

或者

通道 1 :

VGA + TV –> bitmap 1 0 0 1 –> hex 09

通道 2 :

DVI + VGA –> bitmap 0 1 1 0 –> hex 06

对于窗口化系统,最大的不同就是 Windows 下的 NVIDIA 驱动可以动态定义哪一个通道用于 TV 输出,而 OS X 驱动使用固定位置来输出,NVCAP 值被定义在显卡 bios 中,并存储于输入 输出设备的注册文件内。这样的设置导致一旦驱动被加载到 OS X 中就不能改变。

标准显卡的 NVCAP 值一般为:

双DVI显卡:

04000000 00000300 0c000000 00000000 00000000 –>

取消第五个位置, 没有 TV 输出.

04000000 00001300 0c000000 00000000 00000000 –>

第五个位置用于 TV 输出设在通道 1, 当没有其他显示连接到通道 1 时 TV 输出可用.

04000000 00000300 1c000000 00000000 00000000 –>

第五个位置用于 TV 输出设在通道 2, 当没有其他显示连接到通道 2 时 TV 输出可用.

 

DVI+VGA 显卡:

04000000 00000100 06000000 00000000 00000000 –>

取消第四位置, 没有 TV 输出, 只有 1 个输出设在通道 1, DVI + VGA 输出设在通道 2.

04000000 00000300 04000000 00000000 00000000 –>

取消第四位置, 没有 TV 输出, 只有 1 个输出设在通道 2, DVI + VGA 输出设在通道 1.

04000000 00000300 0e000000 00000000 00000000 –>

VGA 输出设在通道 1, 第四位置用于 TV 输出设在通道 2,当没有其他显示连接到通道 2 时 TV 输出可用.

04000000 00000900 06000000 00000000 00000000 –>

VGA 输出设在通道 1, 第四位置用于 TV 输出设在通道 1,当没有其他显示连接到通道 1 时 TV 输出可用. (DVI + VGA 输出设在通道 2 使用第二第三位置,位图 0 1 1 0)

对于内置面板笔记本一般将通道 1 用于 1 种输出,即主显示,在第一位置,当有其他输出可 用时,通道 2 可以使用位置 2,3,4:

04000000 00000100 02000000 00000000 00000000

04000000 00000100 06000000 00000000 00000000

04000000 00000100 0e000000 00000000 00000000

————————————————————

然后就是根据这篇文章写出你所需要的nvcap,然后找到DSDT中显卡那一段,一般在AGP或PEGP 或GFX0等附近。

比如我的显卡是双DVI的GTX260,之前用一个软件获得的nvcap是(用这个nvcap单显示器输出可以,双屏不行):

"NVCAP", 
Buffer (0x18)
{
    /* 0000 */    0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 
    /* 0008 */    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 
    /* 0010 */    0x00, 0x00, 0x00, 0x00
}, 
 
修改成:
"NVCAP", 
Buffer (0x18)
{
   /* 0000 */    0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 
   /* 0008 */    0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
   /* 0010 */    0x00, 0x00, 0x00, 0x00
}, 
 
就可以了,双屏显示很简单就搞定了,如果一个nvcap不行可以换其他的试试。
–以上–