配置 主板 Asus H67-M (rev 0003) 处理器 i3 3225 @3.30GHz 显卡 Intel Graphics HD4000 显示器 Sharp HDMI 46” @1920x1080p
BIOS 1. UEFIPatch 解锁MSR 0xE2 lock以开启原生电源管理(AppleIntelCPUPowerManagement或者XCPM).
2. MMTool 利用Ozmosis的Hermitcsmvideo升级/替换Csmvideo模块, 以修复HDMI的各种问题(后文会详细说明).
3. AMIBCP 解锁主板厂家(Asus)隐藏的BIOS菜单, 包括DVMT设置, 禁用休眠, CSM Support开关等.
4. Change OEM logo 更改相应分辨率的logo提高开机阶段的分辨率.
BIOS 设置 1. Ai Tweaker-->VT-d = Enabled 2. Advanced-->ACPI Settings-->Hibernate Mode = Disabled 3. Advanced-->System Agent Configuration-->Graphics Configuration-->iGPU Memory = 32MB 4. Advanced-->SATA Configuration-->SATA Mode = AHCI 5. Boot-->CSM Support = Disabled
Clover 安装 1. 仅安装 UEFI 主板专用的 Clover 版本 2. 安装 Clover 到目标磁区的 EFI 系统区 3. Drivers64UEFI: OsxAptioFixDrv-64.efi, DataHubDxe-64.efi 4. 如果出现开机禁行标志, 你需要这篇文章: [url=https://bbs.pcbeta.com/forum.php?mod=viewthread&tid=1687013]彻底解决开机禁行[/url]
Clover config.plist
1. ACPI 2. Boot 3. GUI 4. Graphics 5. KernelAndKextPatches 6. SMBIOS 7. SystemParameters
所需内核扩展 /EFI/CLOVER/kexts/10.11 1. FakeSMC.kext 2. AppleALC.kext 3. RealtekRTL8111.kext
ACPI tables/DSDT, SSDT 修正
1. 在Clover界面下按F4提取ACPI表(没有提示, ACPI表存放在/EFI/CLOVER/ACPI/origin/), 检查是否有重复的ssdt表 2. 若大小相同则可以进一步猜测SSDT表重复(因为大小不同SSDT表必然不相同) - cmp SSDT-2.aml SSDT-3x.aml
复制代码3. cmp命令没有输出不同, 表明SSDT-2和SSDT-3x是相同的, 删掉动态SSDT表, 即SSDT-3x.aml 4. 反编译aml文件得到可以编辑修改的dsl文件 5. 删掉所有动态SSDT表(即SSDT-4x.aml, SSDT-5x.aml, SSDT-6x.aml …)
DSDT.dsl
1. 12192, 6035, _HID suffix must be all hex digits (GH) 删掉错误所在行 Name (_HID, "ABCDEFGH") // _HID: Hardware ID
2. 2445, 3128, ResourceTag larger than Field (Size mismatch, Tag: 64 bits, Field: 32 bits) 修正类型警告(参考: ) CreateDWordField (BUF0, \_SB.PCI0._Y0F._LEN, MSLN) // _LEN: Length 改成 CreateQWordField (BUF0, \_SB.PCI0._Y0F._LEN, MSLN) // _LEN: Length
3. 3616, 3130, Result is not used, possible operator timeout will be missed 修正超时警告 改成 4. 插入LayoutID = 3 - # Inject Audio info
- into method label _DSM parent_label HDEF remove_entry;
- into device label HDEF insert
- begin
- Method (_DSM, 4, NotSerialized)\n
- {\n
- If (LEqual (Arg2, Zero)) { Return (Buffer() { 0x03 } ) }\n
- Return (Package()\n
- {\n
- "layout-id", Buffer() { 3, 0x00, 0x00, 0x00 },\n
- "hda-gfx", Buffer() { "onboard-1" },\n
- "PinConfigurations", Buffer() { },\n
- //"MaximumBootBeepVolume", 77,\n
- })\n
- }\n
- end;
复制代码5. 插入ig-platform-id = 0x01620005 - into method label _DSM parent_adr 0x00020000 remove_entry;
- into device name_adr 0x00020000 insert
- begin
- Method (_DSM, 4, NotSerialized)\n
- {\n
- If (LEqual (Arg2, Zero)) { Return (Buffer() { 0x03 } ) }\n
- Return (Package()\n
- {\n
- "AAPL,ig-platform-id", Buffer() { 0x05, 0x00, 0x62, 0x01 },\n
- "hda-gfx", Buffer() { "onboard-1" },\n
- })\n
- }\n
- end;
复制代码6. GFX0—>iGPU - # rename GFX0 -> IGPU for better power management
- into_all all code_regex GFX0\. replaceall_matched begin IGPU. end;
- into_all all code_regex \.GFX0 replaceall_matched begin .IGPU end;
- into_all all code_regex \sGFX0, replaceall_matched begin IGPU, end;
- into_all all code_regex \(GFX0 replaceall_matched begin (IGPU end;
- into_all all label GFX0 set_label begin IGPU end;
- into_all all label _SB.PCI0.GFX0 set_label begin _SB.PCI0.IGPU end;
- into_all all label \_SB.PCI0.GFX0 set_label begin \_SB.PCI0.IGPU end;
- into_all all label _SB.PCI0.GFX0.DD02 set_label begin _SB.PCI0.IGPU.DD02 end;
- into_all all label \_SB.PCI0.GFX0.DD02 set_label begin \_SB.PCI0.IGPU.DD02 end;
- into_all all label ^^^GFX0 set_label begin ^^^IGPU end;
- into_all all label ^^GFX0 set_label begin ^^IGPU end;
- into_all all label ^GFX0 set_label begin ^IGPU end;
复制代码7. 插入IMEI以驱动6系主板上的HD4000 - # For Ivy Bridge CPU on 6-series board
- into device label IMEI parent_label PCI0 remove_entry;
- into device label PCI0 insert
- begin
- Device (IMEI)\n
- {\n
- Name (_ADR, 0x00160000)\n
- Method (_DSM, 4, NotSerialized)\n
- {\n
- If (LEqual (Arg2, Zero)) { Return (Buffer() { 0x03 } ) }\n
- Return (Package()\n
- {\n
- "device-id", Buffer() { 0x3A, 0x1E, 0x00, 0x00 },\n
- "name", "pci8086,1e3a",\n
- })\n
- }\n
- }\n
- end;
复制代码8. 插入MCHC设备 - into device label MCHC parent_label PCI0 remove_entry;
- into device label PCI0 insert begin
- Device (MCHC)\n
- {\n
- Name (_ADR, Zero)\n
- }
- end;
复制代码9. 修复IRQ以避免声音变形 - into device name_hid PNP0000 code_regex IRQNoFlags\s\(\)\n\s+\{(\d+)\} remove_matched;
- into device name_hid PNP0100 code_regex IRQNoFlags\s\(\)\n\s+\{(\d+)\} remove_matched;
- into device name_hid PNP0B00 code_regex IRQNoFlags\s\(\)\n\s+\{(\d+)\} remove_matched;
- into device name_hid PNP0103 code_regex IRQNoFlags\s\(\)\n\s+\{.*\} removeall_matched;
- into device name_hid PNP0103 code_regex Name\s\(([^,]+),\sResourceTemplate\s\(\).*\n\s+\{((?:.|\n)*)\}\) replace_matched
- begin
- Name (%1, ResourceTemplate()\n
- {\n
- IRQNoFlags() { 0, 8, 11, 15 }\n
- %2
- })\n
- end;
复制代码10. 修正Darwin带来的问题 - into_all method code_regex If\s+\([\\]?_OSI\s+\(\"Windows\s2009\"\)\) replace_matched begin If(LOr(_OSI("Darwin"),_OSI("Windows 2009"))) end;
复制代码11. 修复重置BIOS的问题 - into device name_hid PNP0B00 code_regex (IO\s\((?:\s*[^,]+,\s*(?:\/\/\s.*)?\s*\n)+\s*)(\dx\d+)(,\s*(?:\/\/\s.*)?\s*\n\s*\)) replace_matched begin %10x02%3 end;
复制代码12. 插入SMBUS设备 - into device label BUS0 parent_adr 0x001F0003 remove_entry;
- into device name_adr 0x001F0003 insert
- begin
- Device (BUS0)\n
- {\n
- Name (_CID, "smbus")\n
- Name (_ADR, Zero)\n
- Device (DVL0)\n
- {\n
- Name (_ADR, 0x57)\n
- Name (_CID, "diagsvault")\n
- Method (_DSM, 4, NotSerialized)\n
- {\n
- If (LEqual (Arg2, Zero)) { Return (Buffer() { 0x03 } ) }\n
- Return (Package() { "address", 0x57 })\n
- }\n
- }\n
- }\n
- end;
复制代码自此DSDT的修复完成, 保存为aml文件即可.
SSDT*.dsl
1. 若SSDT.dsl 没有错误, 可以使用未编译前的SSDT文件, 例如在本例中, SSDT-0.aml可以直接使用而无需编译. 2. 255, 6126, syntax error, unexpected PARSEOP_PACKAGE 删掉多余的PSS表或者打入如下补丁 - into_all all code_regex Package\s+\(0x06\)\n.*\{\n(.*0x80000000.*\n){6}.*\} removeall_matched;
复制代码3. 保存为aml文件即可.
后期完善 1. 利用ssdtPRGen.sh 为i3 3225生成合适的变频文件. 替换掉SSDT中OEM Table ID为CpuPM的SSDT表. 参考:利用ssdtPRGen.sh生成适合的处理器的变频配置文件 2. 利用Xcode生成合适的声卡驱动, 参考: 完美原生加载AppleHDA 3. 去掉更新提示中的固件更新 - softwareupdate --ignore ThunderboltFirmwareUpdate1.2
复制代码4. 重建缓存 - sudo touch /S*/L*/E* && sudo touch /L*/E* && sudo kextcache -u /
复制代码自此, 6系列主板上HD4000的OS X完善工作就全部完成了.
各部分功能 1. XCPM + IvyBridge变频管理方式, 不再出现X86Platform.kext::Failed to send P-stepper错误. 2. 睡眠正常. 3. HDMI(编辑Framebuffer)音频开启, 通过Hermitcsmvideo修复第一次进入系统花屏, 也不需要依赖CsmVideoDxe-64.efi驱动. 4. AppStore安装软件. 5. 不再出现因为10.11.4升级带来的禁行问题. 6. 前面版USB, USB正常工作, 睡眠后USB设备不会弹出(参看问题描述: 解决唤醒后磁盘没有正确推出问题) 7. 系统盘完美原生(和苹果一样), 可以AppStore升级/更新.
尚不工作 1. VGA接口(因为Apple移除了HD4000对VGA的支持, 需要VGA的朋友建议使用HDMI转VGA. 如果你的显示器拥有DVI/DP口更建议的做法是采用HDMI转DVI/DP).
心得
组建这台配置的初衷是打造NAS和家庭媒体中心, 自然围绕着低功耗+集成显卡的方向走, 当然还有一条就是要有可玩性(便宜, 配置奇葩). 6系列主板驱动的关键是注入7系列的IMEI, 以达到正常工作的目的(同样的7系列HD3000则是注入6系列的IMEI设备).
在完善的过程中, 一个让人头疼的地方是, 虽然这台机子通过0x01620005正确驱动了显卡并实现了HDMI输出, 但是没有声音, 因此需要修改AppleIntelFramebufferCapri.kext来实现HDMI音频的输出, 在@0接口上面将DVI接口替换成HDMI接口 - 02050000 00040000 11000000 —> 02050000 00080000 06000000
复制代码但是随之而来出现了一个奇怪的问题, 即图片过扫描了, 并且无法调节, 只有睡眠唤醒后才可以调节. 关掉电视预设的HDMI过扫描功能后, 又遇到第一次进入系统花屏撕裂的问题, 完全无法使用, 只能通过睡眠来修复. 后来经过了一次Enoch的Resolution.dlyb驱动以及设置引导界面分辨率1920x1080后得到启示, 为Clover安装CsmVideoDxe-64.efi并设置引导界面分辨率1920x1080, 问题得到解决. 但是又引入了新的问题, 那就是这个驱动会导致长时间休眠有一定几率无法唤醒的问题. 并且BIOS中的CSM Support形同虚设, 无法关闭. 在一次无意间爬贴后得到启示, 利用Ozmosis中的Hermitcsmvideo.ffs替换掉Asus老旧的Csmvideo模块, 重启问题得到解决, 在BIOS阶段的分辨率就被提升了, 并且也不需要CsmVideoDxe-64.efi就能实现1920x1080的分辨率输出. 同时, 替换1920x1080的开机logo之后, 在BIOS阶段我们便得到了和显示器最大输出分辨率一样的分辨率, 而在这之前分辨率限定在1024x768上面. 通过Ozmosis的Hermitcsmvideo驱动不仅解决了没有UEFI GOP主板开机分辨率的问题, 而且解决了HDMI开机花屏的问题, 扔掉了不稳定的CsmVideoDxe-64.efi, 还提升了逼格一举两得. 6/7系主板的朋友可以尝试一下这个非常有趣的方法!
解决了上面的大问题之后, 另一方面就是解决大水怪PMHeart当时提出的XCPM能否在IvyBridge平台上顺利开启的问题(参见: syscl 你粗来 IVB的XCPM真的没救了咩). 这个问题的答案是正面的, 即IvyBridge确实是可以开启XCPM实现电源管理的, 但是需要下面三个条件: 1. 合适的变频文件, 即ssdtPRGen.sh生成的SSDT.aml文件. 参考:利用ssdtPRGen.sh生成适合的处理器的变频配置文件 2. 引导器向内核传递-xcpm参数, 强制开启XCPM模式. 3. 设置含有XCPM变频的机型来解决X86Platform.kext::Failed to send P-stepper 的错误/注入Frequencies Vectors. 支持XCPM变频机型的列表 - [ 1 ] Mac-031B6874CF7F642A.plist (iMac14,1)
- [ 2 ] Mac-06F11F11946D27C5.plist (MacBookPro11,5)
- [ 3 ] Mac-06F11FD93F0323C5.plist (MacBookPro11,4)
- [ 4 ] Mac-189A3D4F975D5FFC.plist (MacBookPro11,1)
- [ 5 ] Mac-27ADBB7B4CEE8E61.plist (iMac14,2)
- [ 6 ] Mac-2BD1B31983FE1663.plist (MacBookPro11,3)
- [ 7 ] Mac-35C1E88140C3E6CF.plist (MacBookAir6,1)
- [ 8 ] Mac-35C5E08120C7EEAF.plist (Macmini7,1)
- [ 9 ] Mac-3CBD00234E554E41.plist (MacBookPro11,2)
- [ 10 ] Mac-42FD25EABCABB274.plist (iMac15,1)
- [ 11 ] Mac-50619A408DB004DA.plist ()
- [ 12 ] Mac-65CE76090165799A.plist (iMac17,1)
- [ 13 ] Mac-77EB7D7DAF985301.plist (iMac14,3)
- [ 14 ] Mac-7DF21CB3ED6977E5.plist (MacBookAir6,2)
- [ 15 ] Mac-81E3E92DD6088272.plist (iMac14,4)
- [ 16 ] Mac-937CB26E2E02BB01.plist (MacBookAir7,2)
- [ 17 ] Mac-9AE82516C7C6B903.plist ()
- [ 18 ] Mac-9F18E312C5C2BF0B.plist (MacBookAir7,1)
- [ 19 ] Mac-A369DDC4E67F1C45.plist (iMac16,1)
- [ 20 ] Mac-B809C3757DA9BB8D.plist (iMac17,1)
- [ 21 ] Mac-BE0E8AC46FE800CC.plist (MacBook8,1)
- [ 22 ] Mac-DB15BD556843C820.plist (iMac17,1)
- [ 23 ] Mac-E43C1C25D4880AD6.plist (MacBookPro12,1)
- [ 24 ] Mac-F305150B0C7DEEEF.plist (MacBook8,2)
- [ 25 ] Mac-FA842E06C61E91C5.plist (iMac15,1)
- [ 26 ] Mac-FFE5EF870D7BA81A.plist (iMac16,2)
复制代码以上三个条件缺一不可. 因为IvyBridge的默认电源管理是AppleIntelCPUPowerManagement.kext. 但是, 我们可以通过向系统传递Frequency Vectors 加上强制-xcpm参数来实现IvyBridge上的XCPM电源管理. 可以猜测IvyBridge时期的电源管理经历过一段”混乱的“时期, 用IvyBridge来做XCPM的变频测试, 并最终为Haswell以后的平台铺路, 应该是Apple当时的策略. 因此IvyBridge才能这么幸运的完美的同时使用两个平台的变频管理(SandyBridge以及之前的平台不能使用XCPM).
好啦, 这就是6系列HD4000主板的完善过程, 这套奇葩的配置虽然问题多多, 但是一点一点想办法修缮的过程其实是最优意思的, 这是hackintosh里面最好玩的部分, 没有人知道最完美的黑苹果配置, 但是你的配置很有可能就是那个最完美的黑苹果配置, 这一切取决于你的努力和态度.
本文中需要改动BIOS的部分很多, 纯粹是因为自己想玩, 如果担心刷坏BIOS的朋友就当看看吧~~
祝好! syscl
|