Win10论坛

Win10正式版系统下载主题平板

重定义Modern UI,打造完美Windows全新体验

Windows10下载|安装|新手宝典|必备软件

搜索
查看: 101245|回复: 1510

[教程] 完美原生加载AppleHDA     [复制链接]

远景FANS

UID
424619
帖子
4181
PB币
532
贡献
0
技术
741
活跃
2174

巡察使 我是大学生!

发表于 2016-4-3 18:55:35 |显示全部楼层

注意: 本文需要一定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:

  1. 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>


查看当前系统内核的命令是:

  1. uname -a | awk '{print $3}' | cut -c 1-2
复制代码

查看AppleALC.kext是否加载:

  1. 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


////


附件: 你需要登录才可以下载或查看附件。没有帐号?注册
26

查看全部评分

远景FANS

UID
424619
帖子
4181
PB币
532
贡献
0
技术
741
活跃
2174

巡察使 我是大学生!

发表于 2016-4-3 18:55:54 |显示全部楼层
本帖最后由 syscl 于 2016-5-23 18:32 编辑


当前AppleALC.kext原生支持的芯片以及需要设置的layoutID

厂商声卡芯片修订/layoutID兼容最旧的内核版本兼容最新的内核版本
CreativeCA01320x100918 layout 11, 1213 (10.9)
CirrusLogicCS42130x100100 layout 2813 (10.9)
RealtekALC233layout 313 (10.9)
RealtekALC235layout 313 (10.9)
RealtekALC255layout 313 (10.9)
RealtekALC260layout 1213 (10.9)
RealtekALC268layout 313 (10.9)
RealtekALC2690x100004, 0x100100, 0x100202, layout 1-8, 20, 27, 28, 2913 (10.9)
RealtekALC2700x100100, layout 3, 4, 27, 2813 (10.9)
RealtekALC2720x100001, layout 313 (10.9)
RealtekALC275layout 313 (10.9)
RealtekALC280layout 3, 413 (10.9)
RealtekALC2820x100003, layout 3, 4, 27, 28, 8613 (10.9)
RealtekALC283layout 3, 1113 (10.9)
RealtekALC284layout 313 (10.9)
RealtekALC288layout 313 (10.9)
RealtekALC290layout 313 (10.9)
RealtekALC292layout 1213 (10.9)
RealtekALC6620x100101, layout 5, 713 (10.9)
RealtekALC6630x100002, layout 3, 4, 2813 (10.9)
RealtekALC665layout 12, 1313 (10.9)
RealtekALC6680x100003, layout 3, 20, 27, 28, 2913 (10.9)
RealtekALC670layout 1213 (10.9)
RealtekALC8820x100101, layout 5, 713 (10.9)
RealtekALC8830x100002, layout 713 (10.9)
RealtekALC8850x100101, layout 1, 1213 (10.9)
RealtekALC8870x100302, layout 1, 2, 3, 5, 7, 11, 12, 13 ,14, 15, 9913 (10.9)
RealtekALC888/ALC12000x100101, 0x100001, 0x100202 layout 1, 2, 3, 5, 713 (10.9)
RealtekALC8890x100004 layout 1, 1213 (10.9)
RealtekALC8920x100302, layout 1, 2, 3, 5, 713 (10.9)
RealtekALC898/ALC8990x100003, layout 1, 2, 313 (10.9)
RealtekALC11500x100001 layout 1, 2, 3, 5, 712 (10.9)
AnalogDevicesAD1988Blayout 5, 7, 1213 (10.9)
AnalogDevicesAD2000Blayout 5, 713 (10.9)
ConexantCX20583layout 313 (10.9)
ConexantCX20585layout 313 (10.9)
ConexantCX20588layout 313 (10.9)
ConexantCX205900x100003, layout 3, 1213 (10.9)
ConexantCX20724layout 313 (10.9)
ConexantCX20751/20752layout 3, 2813 (10.9)
ConexantCX20756layout 313 (10.9)
ConexantCX20757layout 313 (10.9)
IDTIDT92HD66C3/65layout 313 (10.9)
IDTIDT92HD71B7Xlayout 313 (10.9)
IDTIDT92HD75B2X5layout 313 (10.9)
IDTIDT92HD75B3X5layout 3, 1113 (10.9)
IDTIDT92HD99BXXlayout 313 (10.9)
IDTIDT92HD87B1layout 313 (10.9)
IDTIDT92HD81B1X5layout 313 (10.9)
IDTIDT92HD87B1/3layout 1213 (10.9)
IDTIDT92HD87B2/4layout 1213 (10.9)
IDTIDT92HD91BXXlayout 313 (10.9)
IDTIDT92HD93BXX0x100203, layout 1213 (10.9)
IDTIDT92HD95layout 1213 (10.9)
VIAVT18020x100000, layout 313 (10.9)
VIAVT2020/20210x100100, layout 5, 713 (10.9)
IntelHD4600 HDMIig-platform-id 0x0d22000313 (10.9)
IntelHD4000 HDMIig-platform-id 0x01660003, 0x01660009, 0x0166000A13 (10.9)

点评

zchecb  两个字,好, 好  发表于 2017-10-15 22:07
gujiangjiang  有新的支持声卡了。。  发表于 2016-4-7 23:31
6

查看全部评分

远景FANS

UID
424619
帖子
4181
PB币
532
贡献
0
技术
741
活跃
2174

巡察使 我是大学生!

发表于 2016-4-3 18:56:00 |显示全部楼层
本帖最后由 syscl 于 2016-6-27 17:44 编辑

在我的建议下vit9696 增加了M3800/XPS9530 ALC668的支持,LayoutID=27.参见更新日志:https://github.com/vit9696/AppleALC/commit/878c2083497262938eeb2b406de5daac699f571b



根据andything 的反馈,再给各位提醒一下: DSDT/SSDT/引导程序中需要注入对应的LayoutID.(虽然本文假定各位熟悉AppleHDA.kext, 但是切记不要漏了注入对应的LayoutID).


感谢andything 在#140的反馈,新版本可以手动删除多余的platforms.xml.zlib, layoutXX.xml.zlib文件而不会出错了. 这样使得AppleALC.kext 的体积由848KB缩小到340KB.


感谢ic005k在#303的反馈, 现在Clover可以注入CodecCommander.kext了, 也就是说我们可以把CodecCommander.kext 放在/EFI/Clover/kexts/中而让系统盘(/)彻底干净了. 附上M3800的截图:

  





根据部分景友的反馈, 由于网速和没有Xcode的问题, 增加最新编译的AppleALC.kext(供网络访问异常的朋友下载).

[1.0.12] AppleALC.kext
[1.0.10] AppleALC.kext
[1.0.7] AppleALC.kext

////




附件: 你需要登录才可以下载或查看附件。没有帐号?注册
2

查看全部评分

远景FANS

UID
424619
帖子
4181
PB币
532
贡献
0
技术
741
活跃
2174

巡察使 我是大学生!

发表于 2016-4-3 18:56:15 |显示全部楼层
本帖最后由 syscl 于 2016-4-11 11:55 编辑

关于PatchesCount参数的设置:




Count - 表明需要替换二进制补丁的次数, 以M3800 HD4600(ig-platform-id=0x0A2E0008)开启HDMI音频为例:
  • Hex Fiend打开AppleHDA.kext/Contents/PlugIns/AppleHDAController/Contents/MacOS/AppleHDAController
  • 我们的目标是将AppleHDAController中"3d0c0a00 00"替换成"3d0c0c00 00", 因此我们要填入"3d0c0a00 00"出现的次数.
  • Hex Fiend中搜索3d0c0a00 00 记录其出现的次数, 填入到Count中.

同时在Clover中打开UseIntelHDMI参数。


部分朋友可能需要在Clover中打开如下参数 FixHDA_8000。


关于声卡唤醒无声的问题,可以在AppleALC的Patch中增加如下配置
  1. <key>KextsToPatch</key>
  2. <array>
  3.   <dict>
  4.     <key>Comment</key>
  5.     <string>Sound wake (iMac) @chrome - applelife.ru</string>
  6.     <key>Find</key>
  7.     <data>
  8.     QcaGQwEAAAA=
  9.     </data>
  10.     <key>Name</key>
  11.     <string>AppleHDA</string>
  12.     <key>Replace</key>
  13.     <data>
  14.     QcaGQwEAAAE=
  15.     </data>
  16.   </dict>
  17.   <dict>
  18.     <key>Comment</key>
  19.     <string>Sound wake (MacPro) @chrome - applelife.ru</string>
  20.     <key>Find</key>
  21.     <data>
  22.     QcYGAEiLu2g=
  23.     </data>
  24.     <key>Name</key>
  25.     <string>AppleHDA</string>
  26.     <key>Replace</key>
  27.     <data>
  28.     QcYGAUiLu2g=
  29.     </data>
  30.   </dict>
  31. </array>
复制代码



////

附件: 你需要登录才可以下载或查看附件。没有帐号?注册

Vanilla.

UID
4568967
帖子
13792
PB币
32244
贡献
0
技术
94
活跃
2691

十一周年

发表于 2016-4-3 18:58:03 来自手机 |显示全部楼层
5F咯= =
为了达到“专业化” 也可以额外制作注入configdata的空壳kext吧?
然后用Clover注入这个空壳kext

远景FANS

UID
424619
帖子
4181
PB币
532
贡献
0
技术
741
活跃
2174

巡察使 我是大学生!

发表于 2016-4-3 18:59:10 |显示全部楼层
口袋妖怪heart 发表于 2016-4-3 18:58
5F咯= =
为了达到“专业化” 也可以额外制作注入configdata的空壳kext吧?
然后用Clover注入这个空壳kext

PinConfigs.kext就是你说的那个空壳,但是注入的方式的都是一样的。

////

Rank: 2Rank: 2

UID
4113735
帖子
420
PB币
57
贡献
0
技术
4
活跃
647
发表于 2016-4-3 18:59:30 |显示全部楼层
前排前排。请问 alc272 可以这样搞嘛?

远景FANS

UID
424619
帖子
4181
PB币
532
贡献
0
技术
741
活跃
2174

巡察使 我是大学生!

发表于 2016-4-3 19:00:33 |显示全部楼层
tanpengsccd 发表于 2016-4-3 18:59
前排前排。请问 alc272 可以这样搞嘛?

可以,只要你之前成功驱动了(非voodooHDA.kext),就可以这样搞.

////

Vanilla.

UID
4568967
帖子
13792
PB币
32244
贡献
0
技术
94
活跃
2691

十一周年

发表于 2016-4-3 19:01:13 来自手机 |显示全部楼层
syscl 发表于 2016-4-3 18:59
PinConfigs.kext就是你说的那个空壳,但是注入的方式的都是一样的。

////

嗯 估计还是改了高版本 比如999.99.9什么的
好处就是 configdata可以通过Clover注入
算了懒得换方法 反正我的kext也都是放LE的 Injector也一样~

远景FANS

UID
424619
帖子
4181
PB币
532
贡献
0
技术
741
活跃
2174

巡察使 我是大学生!

发表于 2016-4-3 19:10:41 |显示全部楼层
口袋妖怪heart 发表于 2016-4-3 19:01
嗯 估计还是改了高版本 比如999.99.9什么的
好处就是 configdata可以通过Clover注入
算了懒得换方法 反 ...

没有改高版本,什么都没有改。这个驱动的目的就是原生加载AppleHDA
////

Rank: 5Rank: 5Rank: 5

UID
4592702
帖子
838
PB币
545
贡献
0
技术
26
活跃
1283
发表于 2016-4-3 19:13:01 |显示全部楼层
这个以后升级系统会丢失声卡么?

Vanilla.

UID
4568967
帖子
13792
PB币
32244
贡献
0
技术
94
活跃
2691

十一周年

发表于 2016-4-3 19:13:16 来自手机 |显示全部楼层
syscl 发表于 2016-4-3 19:10
没有改高版本,什么都没有改。这个驱动的目的就是原生加载AppleHDA
////

嗯 got it.
那个kext把版本移除了 与改高版本Info类似

远景FANS

UID
424619
帖子
4181
PB币
532
贡献
0
技术
741
活跃
2174

巡察使 我是大学生!

发表于 2016-4-3 19:14:07 |显示全部楼层
MemX 发表于 2016-4-3 19:13
这个以后升级系统会丢失声卡么?

除非是结构有重大改动,否则不用担心.

////

远景FANS

UID
424619
帖子
4181
PB币
532
贡献
0
技术
741
活跃
2174

巡察使 我是大学生!

发表于 2016-4-3 19:14:21 |显示全部楼层
口袋妖怪heart 发表于 2016-4-3 19:13
嗯 got it.
那个kext把版本移除了 与改高版本Info类似

没有= =

////

Vanilla.

UID
4568967
帖子
13792
PB币
32244
贡献
0
技术
94
活跃
2691

十一周年

发表于 2016-4-3 19:19:08 来自手机 |显示全部楼层
syscl 发表于 2016-4-3 19:14
没有= =

////

QQ上给你发下PM吧= =

搞机砖家

UID
4743356
帖子
2016
PB币
1399
贡献
0
技术
0
活跃
818
发表于 2016-4-3 19:22:49 |显示全部楼层
好贴,赞一个

Vanilla.

UID
4568967
帖子
13792
PB币
32244
贡献
0
技术
94
活跃
2691

十一周年

发表于 2016-4-3 19:32:27 来自手机 |显示全部楼层
以下内容均为个人理解 & 猜测:
对二进制文件打补丁 应该是和clover的kextpatch功能类似 给kernelcache打补丁 也就是间接修改了二进制文件。
节点与configdata的方式 应该与dummy法无异。(zlib节点通过AppleALC.kext注入 configdata用PinConfigs.kext注入 只是这种“dummy”方式可以用Clover的kext注入功能吧

Vanilla.

UID
4568967
帖子
13792
PB币
32244
贡献
0
技术
94
活跃
2691

十一周年

发表于 2016-4-3 19:38:43 来自手机 |显示全部楼层
Additionally:
我觉得Apple应该不会废除SIP的开关 毕竟开发者们调试还是需要关闭掉许多保护 比如dtrace等等
而且 2015年的iOS 9、OS X 10.11注重的是安全性的更新(最典型的就是SIP)UI上并没有太大的革新。
今年就是iOS X了 我想今年应该就是会朝着UI的改革了。OS X应该也会随之有很大变动。毕竟root不会变成administrator的 不是咩?lol
Anyway,who knows?Everything will be clear after WWDC 2016.

Rank: 2Rank: 2

UID
2722434
帖子
199
PB币
465
贡献
0
技术
0
活跃
263
发表于 2016-4-3 19:58:38 来自手机 |显示全部楼层
仿冒驱动还没搞定

远景FANS

UID
424619
帖子
4181
PB币
532
贡献
0
技术
741
活跃
2174

巡察使 我是大学生!

发表于 2016-4-3 20:01:29 |显示全部楼层
口袋妖怪heart 发表于 2016-4-3 19:38
Additionally:
我觉得Apple应该不会废除SIP的开关 毕竟开发者们调试还是需要关闭掉许多保护 比如dtrace等等 ...

这个不好说,从现在9.3以后强制升级来看,Apple真的要丸
关闭

站长推荐

已经开启实名认证了哟
这里可以进行实名操作:点我点我点我
回顶部
Copyright (C) 2005-2019 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛 | 电脑硬件 | 安卓软件