修改 NvidiaGraphicsFixup.kext 内建显示器

起因

关于内建显示器,主要有 DSDT 注入,DisplayMergeNub.kext,EFI String 等方法。

我的机器 P751DMG 之前因为无法使用 DSDT 注入(DSDT 或 SSDT 添加显卡相关代码花屏)一直使用的是 EFI String,但是在 10.13 后, EFI String 由于未知原因也失效了,而DisplayMergeNub.kext 因为签名问题无法加载,所以不得不寻找新的办法。

有一天调整音量的时候偶然发现 HDMI 音频竟然是启用的,而我本身没有用 EFI String 修正 HDMI 音频,赶紧去翻了下 NvidiaGraphicsFixup 的 changelog 发现竟然是它加入了 HDMI Audio 的支持,看到这里情况就很明显了,修改 HDMI 音频相关数据和内建屏幕所需修改的 connector 数据是在一起的,那么应该能够通过 NvidiaGraphicsFixup 修改 connector 相关信息以实现显示器内建。

过程

上 sourceforge 看了代码,最终确定在 kern_audio.cpp 文件中存在相关的 connector 修改代码,这时候修改这部分代码把正确的 connector 信息加入进去,编译,放入 Clover Kext 文件夹,重启确认屏幕已经正确内建。

以下是我的 connector 信息,不过这里记住,一定要按照自己机器的情况修改,比如我这里笔记本屏幕在 @3, @4 为 HDMI:

// ... 省略
uint8_t connectorType8[] { 0x00, 0x08, 0x00, 0x00 };
uint8_t connectorType4[] { 0x00, 0x04, 0x00, 0x00 };
// ... 省略
for (int i=0; i<MaxConnectorCount; ++i)
{
    connector_type[1] = '0' + i;
    if (!gpuService->getProperty(connector_type)) {
        DBGLOG("audio", "fixing %s in gpu", connector_type);
        if (i == 0 || i == 4) {
            gpuService->setProperty(connector_type, OSData::withBytes(connectorType8, sizeof(connectorType8)));
        } else if (i == 3) {
            // My internal display is connect to @3 via eDP
            unsigned char bootDisplay[] { 0x01 };
            unsigned char builtIn[] { 0x01 };
            uint8_t backlightControl[] { 0x01, 0x00, 0x00, 0x00 };
            unsigned char useBacklightBlanking[] { 0x01 };
            unsigned char pwmInfo[] {
                0x01, 0x14, 0x00, 0x64, 0xA8, 0x61, 0x00, 0x00,
                0x1E, 0x02, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00,
                0x00, 0x04, 0x00, 0x00
            };
            gpuService->setProperty("@3,AAPL,boot-display", OSData::withBytes(bootDisplay, sizeof(bootDisplay)));
            gpuService->setProperty("@3,built-in", OSData::withBytes(builtIn, sizeof(builtIn)));
            gpuService->setProperty("@3,backlight-control", OSData::withBytes(backlightControl, sizeof(backlightControl)));
            gpuService->setProperty("@3,use-backlight-blanking", OSData::withBytes(useBacklightBlanking, sizeof(useBacklightBlanking)));
            gpuService->setProperty("@3,pwm-info", OSData::withBytes(pwmInfo, sizeof(pwmInfo)));
            gpuService->setProperty("@3,connector-type", OSData::withBytes(connectorType4, sizeof(connectorType4)));
        } else {
            gpuService->setProperty(connector_type, OSData::withBytes(connectorType4, sizeof(connectorType4)));
        }
    } else {
        DBGLOG("audio", "found existing %s in gpu", connector_type);
    }
}

“修改 NvidiaGraphicsFixup.kext 内建显示器”的3个回复

  1. 你好 能提供一下efi信息吗,我是p751dm2 屏幕内建后亮度可以调节,就是内屏是黑的, 外接显示器正常 10.13.2

  2. connector_type 这个声明在啥地方 啥类型的
    不只是这两个吧
    uint8_t connectorType8[] { 0x00, 0x08, 0x00, 0x00 };
    uint8_t connectorType4[] { 0x00, 0x04, 0x00, 0x00 };

发表评论

电子邮件地址不会被公开。 必填项已用*标注