华硕 VM510LI 黑苹果手记

前言

装完我那台老掉牙的 Dell 笔记本黑苹果系统后,嫌弃它分辨率太低了,我又将我的目光转向老婆公司送的华硕 VM510LI 笔记本。😝

准备工作

趁目前 Windows 平台还在的时候,先下载 AIDA64 Engineer,导出以下内容:

导出显卡 Bios 备用

方法:

  1. 打开 AIDA64 Engineer;
  2. 查看,勾上状态栏。(此时软件下方应该会出现了一个框。)
  3. 右键状态栏 Video Debug。
  4. Video Bios Dump
  5. 点开显示设备→图形处理器(GPU)查看 PCI 设备的 ID(8086-1616)
  6. 将导出的 bin 文件重命名为 8086-1616.rom 备用。

导出 ACPI 的 DSDT 和 SSDT(Windows)

建议使用 Ubuntu 方法提取

DSDT 和 SSDT 是必须导出的,但是有很多方法,我比较喜欢在 Linux 导出,不知道为啥感觉它纯正点(其实是一样的,就是个人感觉 Linux 好一点而已。)

新版的 AIDA64 Engineer 可以在 WIN10 下导出 DSDT 和 SSDT 了。老板好像是不可以的。

本笔记的 AIDA64 Engineer 版本为 5.80.4000

方法:

  1. 菜单栏工具
  2. ACPI 浏览器
  3. Save DSDT
  4. Save Table
  5. 一个一个 SSDT 保存。SSDT 开头才需要保存,其他不需要管。

导出 EDID 参数

这个只是备用,看远景上扒贴看到很多人驱动核心显卡后内置屏幕无法显示,只能接入 HDMI 接外屏,这时候就需要注入 EDID 参数了(还有上面提取到的 Video Bios)

方法:

  1. 安装 EDID Viewer
  2. 菜单栏 Read EDID
  3. 选择 @monitor.inf 开头的选项,按 Show EDID Informations 按钮。
  4. 滚到最下面,选中 RAW Data 下方的所有16进制字符。
  5. 打开记事本粘贴进去,并去掉所有换行符和空格,开头的0x00-0x70这一段全部不要。

记下 AMD 的显卡 VEN 和 DEV 的 ID

  1. 设备管理器
  2. 显示适配器
  3. AMD Radeon(TM)R5 M320
  4. 属性切换到硬件 ID
  5. PCI\VEN 1002&DEV6665&SUBSYS_192D1043&REV_83

这个记下来,因为我目前不知道笔记本到底能不能驱动独立显卡,这个显卡虽然不牛,但是有比没有好嘛。

一般笔记本的做法都是屏蔽独显,但是如果能用上独显就更好。先记下,日后扒帖子找办法驱动。

妈蛋,打完上面那句话后,上网查了下我的 R5 M320,网上说比我核心显卡 HD5500更差,看来是没必要驱动了,果断屏蔽掉,浪费电。

Windows 最后

以上都做完后,基本上就可以和 Windows 说拜拜了。当然我只会将 Windows 做一个镜像,等黑苹果吃不下的时候,或者急需要使用 Windows 系统的时候迅速还原。

最后你可以下载个鲁大师,保存一下配置截图,方便有啥问题到远景论坛求助。

AIDA64 则可以导出详细报告,这样可以快速确定鲁大师搞不清楚的一些芯片型号,例如我这个笔记本,鲁大师显示的是 Intel 的声卡,估计是 HDMI 搞鬼,但是实际上是 Realtek ALC233 这个声卡 AppleALC 项目有驱动,只是要慢慢试 ID 了。

Ubuntu 下提取 ACPI 下的 DSDT 和 SSDT

我是不太放心 Windows 下提取的 DSDT 和 SSDT,总觉得不够全,故此我又做了个 Ubuntu 的 Live CD 启动盘,来获取 DSDT 和 SSDT。

方法见我另一篇博客:[转载][教程] [授权翻译] 使用补丁修改DSDT/SSDT [DSDT/SSDT综合教程]

从《制作Ubuntu启动U盘》看起。

我这台 VM510LI 在 Windows 下提取的 SSDT 就12个,但是在 Linux 下,dynamic 文件夹下还有三个 SSDT,总共14个。

Ubuntu 下提取 codec

codec 是制作仿冒声卡必备,虽然我这个声卡 AppleALC 项目支持,但既然已经到 Ubuntu 下了,顺手也备份下来,或许以后用得着。

方法同上。

安装 macOS Sierra

一切准备好后,我们就可以开始抛弃 Windows 系统,投入 macOS Sierra 的怀抱了,当然装之前先用 PE 备份 C盘,以后需要Windows 的时候可以立刻恢复,不需要装系统,装软件那么麻烦。

安装思路构想

我想法是把 Clover 安装到 U盘的 EFI 分区中,再将安装镜像也写入到 U盘中,那么以后修改了 mac 下的驱动什么的,进不去系统了,也可以用恢复盘搞回来。

实验证明,我的 U盘没法这样做,好像是需要量产后才可以一个 U盘两个分区,故此采用传统方案,将 Clover 做到 U盘里面,再将安装镜像写到硬盘里。

下载必要的软件

安装必备的驱动文件

NullCPUPowerManagement.kext 和 FakeSMC.kext 是必须的,第一个禁用苹果原生电源驱动,第二个是骗过 macOS install 告诉他运行在一台白苹果当中。

VoodooPS2Controller.kext 是键盘驱动,不放的话,安装盘内无法用触摸板和键盘。

将 Clover 安装到 U盘

  1. 打开 BootDiskUtility 选择自己的 U盘。
  2. 点击菜单栏的 Options → Configuration
  3. 【Check at Satrtup】 勾上
  4. 【Save after DL】 勾上
  5. 点击 【Check Now】 按钮获取最新版的 Clover
  6. 点击 【OK】按钮
  7. 点击 【Format Disk】按钮【确定】等待软件写入,提示 All done 表示制作完成。

将 macOS 安装盘写入系统硬盘中(Win10为例)

  1. 右键【开始】按钮,【磁盘管理】。
  2. 选择 D盘右键【压缩卷】输入【11264】(也就是11GB)【确定】
  3. 右键压缩出来的11G 空间【新建简单卷】,点三次【下一步】,选择【不要格式化这个卷】→【下一步】→【完成】
  4. 管理员权限运行 Leopard hd install helper v0.3 文件夹下的 ddmac.exe
  5. 选择镜像文件为下载的 Clover3961_U_macOS S 10.12.2正式版(16C67),取消所有的勾,目标分区选择刚刚压缩的卷,我这里是 E盘,注意别选错,否则会丢失数据。点击【开始】
  6. 此时程序进度条在动,中途会无响应,无需理会,等待恢复即可。

安装 macOS

  1. 插入已经安装好 Clover 的U盘。
  2. Bios 选择此 U盘启动。
  3. 移动光标到 macOS,回车。
  4. 但是进入后立即重启,猜测是和苹果原生电源管理问题,将 NullCPUPowerManagement.kext 放入 EFI/CLOVER/kexts/10.12(10.12这个文件夹需要自己新建)
  5. 五国处理,见下一章节。
  6. 进入后点下一步,一直到选择硬盘地方,此时应当无法看到可安装的盘,点击上方菜单栏,工具,磁盘工具,找到我们需要安装的 SSD 盘,分区图选择 GUID,点击确定抹掉。后面就可以选择这个磁盘安装了。

五国处理

can’t perform kext scan: no kext summary

进入进行入安装盘出现五国 can’t perform kext scan: no kext summary。

can't perform kext scan: no kext summary

出现以上五国信息,我上网查了下,有几个可能。

  • 下载的安装镜像盘有问题,后来我校验我的镜像盘的 md5 和对方发布的时候写的一样,而且我 dell 也是用这个盘来装的,故此不应该出现这样的问题。
  • 主板 Bios 设置问题,需要关闭 VT-d,但是我关闭了问题依旧。
  • 内存问题,MacOS 无法正确识别笔记本的内存导致的。

后来经过排查,发现我的笔记本共8G内存,4GX2。但是其中有一条内存是直接焊在主板上,根本没法拆下来的,我再翻查了下我用 AIDA64 生成的 Reports,SDP 也只能看到添加的那条三星内存,焊接在主板上的内存是看不到的。

RAM

后来搜索后发现 Clover 是可以解决这种情况,仅需要将 SMBIOS>Trust 勾上就可以解决这个五国问题了。

ACPI Error: [_DSM] Namespace lookup failure

这个 _DSM 是与显卡相关的错误,遇到这个错误我们就要利用之前在 Ubuntu 提取的 DSDT 和 SSDT 来解决了。

反编译得到的 SSDT.aml 和 DSDT.aml 文件,最终得到的是 *.dsl 文件。

用 MaciASL 打开 DSDT.dsl,点击界面上方的 Patch 按钮,找到 [syn] Remove _DSM methods,点击它,再点击 Apply 应用。

修改 DSDT 和 SSDT 的方法请参考我上一篇转载的博文 :[转载][教程] [授权翻译] 使用补丁修改DSDT/SSDT [DSDT/SSDT综合教程]

将编译好的 DSDT 和 SSDT 放入到 U盘的 EFI/CLOVER/ACPI/patched 目录,**注意:SSDT的命名方式必须为 SSDT-1.aml、SSDT-2.aml。

在 Clover 的配置文件加入 SSDT 的排列顺序,ACPI>SortedOrder。从 SSDT-1.aml 排序下去。DSDT name 填写 DSDT.aml。

最后勾上 Drop OEM,我理解的意思应该就是拒绝所有主板提供的 SSDT 和 DSDT。

其实去除了这个 _DSM methods 后,后面要驱动显卡还得加回来,但是这个函数的内容肯定不是原始那样,具体 ASL 编程我也不懂,都是依葫芦画瓢。

DSDT 与 SSDT 的错误修复及常用补丁应用。

在利用 DSDT 和 SSDT 帮我们解决我们的驱动问题的之前,我们需要修复反编译带来的错误。

我使用 iasl -da -dl *.aml 反编译后得到的 dsl 遇到几个错误的问题这里记录一下。

首先需要将 MaciASL 的编译器改成6.1,Preference>iASL>ACPI 6.1。

DSDT.dsl 错误修复

  • 4500, 6126, syntax error, unexpected PARSEOP_ZERO
    这里有一大段 Zero,我猜测是反编译出来的垃圾,这里可以全部删掉。

  • 4525, 6126, syntax error, unexpected PARSEOP_ZERO
    同上

  • 11019, 6126, syntax error, unexpected ‘}’

出错代码段如下:

1
2
3
4
5
6
7
8
9
10
Method (ADBG, 1, Serialized)
{
If (CondRefOf (MDBG))
{
Return (MDBG)
Arg0
}
Return (Zero)
}

ADBG 错误,利用 [syn]Fix ADBG Error 修复。

修复后:

1
2
3
4
5
6
Method (ADBG, 1, Serialized)
{
Return(0)
}

SSDT-3.dsl 错误修复

  • 477, 6126, syntax error, unexpected PARSEOP_ADD

错误代码段如下

1
2
3
4
5
6
7
8
If (ECON)
{
Store (\_SB.PCI0.LPCB.H_EC.ECRD, RefOf (\_SB.PCI0.LPCB.H_EC.PLMX))
Local0 //是这行导致错误
Add (0x0AAC, Multiply (Local0, 0x0A), Local0)
Store (Local0, PTMP)
Return (Local0)
}

修改为

1
2
3
4
5
6
7
If (ECON)
{
Store (\_SB.PCI0.LPCB.H_EC.ECRD (RefOf (\_SB.PCI0.LPCB.H_EC.PLMX)), Local0) //改法
Add (0x0AAC, Multiply (Local0, 0x0A), Local0)
Store (Local0, PTMP)
Return (Local0)
}
  • 549, 6126, syntax error, unexpected PARSEOP_MULTIPLY

错误代码段如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
If (ECON)
{
Store (\_SB.PCI0.LPCB.H_EC.ECRD, RefOf (\_SB.PCI0.LPCB.H_EC.PECH))
Local0 //语法错误
Multiply (Local0, 0x0A, Local0)
Store (\_SB.PCI0.LPCB.H_EC.ECRD, RefOf (\_SB.PCI0.LPCB.H_EC.PECL))
Local1 //语法错误
ShiftRight (Local1, 0x02, Local1)
Store (Divide (Multiply (Local1, 0x0A), 0x40, ), Local1)
Add (Local0, Local1, Local0)
Add (0x0AAC, Local0, Local0)
Store (Local0, PTMP)
Return (Local0)
}

修改为

1
2
3
4
5
6
7
8
9
10
11
12
If (ECON)
{
Store (\_SB.PCI0.LPCB.H_EC.ECRD (RefOf (\_SB.PCI0.LPCB.H_EC.PECH)),Local0)
Multiply (Local0, 0x0A, Local0)
Store (\_SB.PCI0.LPCB.H_EC.ECRD (RefOf (\_SB.PCI0.LPCB.H_EC.PECL)),Local1)
ShiftRight (Local1, 0x02, Local1)
Store (Divide (Multiply (Local1, 0x0A), 0x40, ), Local1)
Add (Local0, Local1, Local0)
Add (0x0AAC, Local0, Local0)
Store (Local0, PTMP)
Return (Local0)
}
  • 475, 6086, Not a control method, cannot invoke (_SB.PCI0.LPCB.H_EC.ECRD is a Integer)
  • 547, 6086, Not a control method, cannot invoke (_SB.PCI0.LPCB.H_EC.ECRD is a Integer)
  • 549, 6086, Not a control method, cannot invoke (_SB.PCI0.LPCB.H_EC.ECRD is a Integer)

这三个错误其实是一个意思,就是没有找到引入的模块(瞎猜的),我的解决办法。

搜索 H_EC.ECRD 找到头部附近 External

1
External (_SB_.PCI0.LPCB.H_EC.ECRD, IntObj) // Warning: Unknown object

H_EC.ECRD 应该是一个方法,但是这里引入方法方式不对,应该是 MethodObj 才对。

修改为:

1
External (_SB_.PCI0.LPCB.H_EC.ECRD, MethodObj)

其余 SSDT 均无错误。

常用补丁应用

[转载][教程] [授权翻译] 使用补丁修改DSDT/SSDT [DSDT/SSDT综合教程] 中,常用补丁里面提及了一些常用补丁,并且这些补丁一般不会造成什么问题,后来我翻查了 RehabMan 的原帖,有两个补丁是有条件限制的,这些补丁要看自己的情况而添加。

引用原话

1
2
3
4
5
6
7
8
9
"Fix _WAK Arg0 v2"
"HPET Fix"
"SMBUS Fix"
"IRQ Fix"
"RTC Fix"
"OS Check Fix"
"Fix Mutex with non-zero SyncLevel"
"Fix PNOT/PPNT" (use only if you're dropping CPU related SSDTs) 仅适用于删除了 CPU 的 SSDT 使用。
"Add IMEI" (do not use if your DSDT or SSDTs already have IMEI/HECI/MEI device) 如果你的 DSDT 或 SSDT 存在 IMEI/HECI/MEI 的 device 的话,就不要用这个补丁。

最终我只应用了以下补丁

1
2
3
4
5
6
7
"Fix _WAK Arg0 v2"
"HPET Fix"
"SMBUS Fix"
"IRQ Fix"
"RTC Fix"
"OS Check Fix"
"Fix Mutex with non-zero SyncLevel"

注意,一般应用 RehabMan 大神写的补丁不会造成编译错误,但是也会有例外情况,故此应用补丁,每应用一个后都需要编译(Compile)一下,看看是否有错误。