注意: 本文需要一定AppleHDA的基础。
在开始之前,景友应该对一劳永逸!更新不再替换Kext(Kexts to patch)教程一文有所了解,在里面我们 介绍了如何利用Clover,以及制作Info.plist(FakeSMC.kext/Contents/Info.plist/IOKitPersonalities)的例子来达到尽量不改动系统内核扩展的目的,这样做的好处有三个: 1. 避免内核扩展中的“签署方”失效。 2. 系统盘(/)更贴近白苹果原生, 系统更稳定。 3. 除非内核扩展有重大的结构变化,我们可以轻松的更新操作系统,达到一劳永逸的目的。
也就是黑苹果后期的任务除了修缮bugs,另一个主要的精力便是化少为多(less is more), 尽可能的在最少改动系统的情况下达到完善系统功能。
在一劳永逸!更新不再替换Kext(Kexts to patch)教程一文当中,我们始终没有彻底解决的一个问题是如何彻底加载原声的声卡驱动,即在签署方没有任何变动的情况下驱动声卡,之前较好的解决方法是Pikeralpha的提议, 制作链接文件(ln -s)来驱动声卡并安装到/S*/L*/E* (或者/L*/E*),但这个做法还是没有办法避免引入新的第三方内核扩展, 这也是我们不愿意看到的. 一旦苹果彻底废除SIP(System Integrity Protection)开关, 之前所有对AppleHDA.kext进行破解的方法都会失效. 如果能够像FakeSMC.kext 那样经由引导工具注入系统,便可以绕过SIP以达到原生驱动AppleHDA的目的,这也是vit9696设计AppleALC.kext的目的。
前期准备 1. 安装Xcode (with C++14) 2. 下载AppleALC: - git clone https://github.com/vit9696/AppleALC
复制代码
参数设置 驱动AppleHDA的几个条件: 1. CodecID 2. LayoutID 以及修改好的layoutXX.xml.zlib 3. PlatformsID以及对应的Platform.zlib 4. ALC的二进制补丁
下面我们以M3800上面的ALC668为例探讨如何用vit9696的方法原生加载AppleHDA.kext:
./AppleALC/Resources/ALC668/Info.plist: 1. CodecID=283903592(与ALC668对应) 2. Files/Layouts/Item0/ ID=1 Path=layout1.xml.zlib 3. Patches: 熟悉 一劳永逸!更新不再替换Kext(Kexts to patch) 教程的朋友直接将二进制补丁复制粘贴到Patches下面,并删掉除了Find, Name, Replace以外的所有条目即可。关于Patches更详细的设置,我们会在这个例子展示完后详细陈述。 4. 移除掉./AppleALC/Resources/ALC668/layout3.xml.zlib和PlatformsM.xml.zlib 5. 复制已经制作好的layout1.zml.zlib 和 Platforms.xml.zlib到./AppleALC/Resources/ALC668/目录下 6. 打开./AppleALC/Resources/PinConfigs.kext/Contents/Info.plist, 用制作好的HDAConfigDefault项目粘贴到IOKitPersonalities中。 7. 打开 ./AppleALC.xcodeproj : Xcode->Product->Build For->Running; 8. 将编译好的AppleALC.kext复制到引导工具(Clover: /EFI/CLOVER/kexts/10.11, Chameleon: /Extra/Extensions/)目录下,并且移除掉之前所有的二进制补丁和HDA注射驱动(Injector), 重启即可. 附件中包含了我制作ALC668驱动所需要的最小模板. 可以看到,AppleHDA已经变成了漂亮的加载,系统签署方也变成了"Software Signing, Apple Code Signing Certification Authority, Apple Root CA".
关于Patches条目设置详述 1. 可以部分替代Clover的kexts to patch功能, 主要针对AppleHDA: 以开启M3800的HDMI音频输出为例. 开启M3800/XPS15(9530)的HDMI音频需要把AppleHDAController中”3d0c0a00 00”替换成“3d0c0c00 00“,由于HD4600是在10.9(13)开始支持的, 最新的支持系统是10.11(15),因此这个补丁的作用范围是MinKernel=13~MaxKernel=15. 那么这个补丁就是: <dict> <key>MinKernel</key> <integer>13 </integer> <key>MaxKernel</key> <integer>15 </integer> <key>Find</key> <data> PQwKAAA= </data> <key>Name</key> <string>AppleHDAController</string> <key>Replace</key> <data> PQwMAAA= </data> </dict>
查看当前系统内核的命令是: - uname -a | awk '{print $3}' | cut -c 1-2
复制代码查看AppleALC.kext是否加载: - kextstat | grep -i "AppleALC"
复制代码至此我们便完成了所有的操作步骤。不得不提一下, 由于这个驱动还在迅速的完善中, 仍旧有很多的bug, 例如在本例中需要删除同样数量的配置文件来达到编译不出错的目的. 在我的GitHub上面有已经编译好的可供M3800/XPS15(9530)ALC668使用的AppleALC.kext,也可以作为模板参考。至此M3800彻底抛弃Injector驱动声卡的日子。
遇到耳机杂音的朋友仍然需要CodeCommander.kext来解决杂音问题.
参考 http://www.insanelymac.com/forum/topic/311293-applealc-—-dynamic-applehda-patching/
https://github.com/syscl/M3800/commit/2cdb7f920d3fe88fe26a0de366a66c232a663eef
////
|