这篇教程一直在OneNote上躺着,休息了好长时间也该见见眼光了!
一、准备工作
1. 所需文件与工具
(1) codec:在linux中提取的信息,cat /proc/asound/card1/card#0 > ~/Desktop/codec.txt
;
(2) codecgraph:用于整理出节点的路径图。在使用前要先安装brew和依赖 brew install graphviz
;
(3) verbit.sh:将codec中的有效节点提取出来;
(4) xcode:编译工具;
(5) AppleALC项目文件,git clone https://github.com/vit9696/AppleALC
;
(6) PlistEdit Pro:用于修改plist文件;
(7) Lilu.kext的Release版本,在vit9696大神的GitHub项目里。
2. 整理codec文件
2.1 生成路径图
在codec目录下执行命令:./codecgraph ../codec.txt
,会在codecgraph位置默认生成svg文件,打开可以看见节点路径图。
2.2 生成有效节点信息
首先给予verbit.sh
权限:sudo chmod +x verbit.sh
;然后是执行命令:./verbit.sh ../codec.txt > ../codec_dump.txt
,打开就能看见有效节点。
二、整理路径
1. 整理有效节点
我的有效节点如下所示
很明显0x17和0x1d为无效节点,并且去掉Modified Verbs,于是剩下的有效信息一如下
2. 推导路径
2.1 推导内置麦克风路径
打开最原始的codec.txt文件,查找包含内置麦克风对应的节点0x12,也就是说我们需要找的是Connection包含0x12的节点,显然发现是0x12是在0x11下的,同理再查找0x11在哪个节点包含之下。发现0x11之上没有,因此路径就是0x11 ~> 0x12。原因是0x12是麦克风节点,也就是说是最后接受声音的节点,而声音理所当然是从前一个节点传过来的,因此需要查找连接0x12的节点,也就是Connection包含0x12的节点,以此类推查找Connection包含0x11的节点,直到最后没有被Connection包含的节点,综上所得到的路径为0x11 ~> 0x12,转换成十进制就是17 ~> 18,查看svg路径图发现是0x12 ~> 0x11,不用担心,这个路径图是依据计算机从内到外的节点生成,因此路径就是推导的那样。
2.2 推导内置扬声器路径
由于扬声器是从内向外传出声音,因此与麦克风相反,第一个需要查找的节点不是Connection包含的节点,就是得到的扬声器有效节点本身,于是得到0x14,这个节点Connection包含0x0c,接着查看节点0x0c的Connection包含0x02和0x0b,一般取第一个即可,当然不放心的话可以去看看路径图,一般为0x02,再查找0x02不包含节点,同理因为0x14为最里面的节点,而扬声器声音是由内向外,因此路径0x14 ~> 0x0c ~> 0x02,转换成十进制为20 ~> 12 ~> 2。
2.3 推导耳机路径
推导耳机方式与内置扬声器差不多,最终得出的路径为0x21 ~> 0x0d ~> 0x03,转换成十进制为33 ~> 13 ~> 3。注意,在查找耳机节点时候Connection会查到0x0c等已经用过的,这些应当舍弃。
三、更正ConfigData
1. 数据位置调换
将得到的有效信息一的PinDefault数据改成如图所示,就是将0x去掉,然后数字两两一组,得到有效信息二
之后再将两两一组的数据从后向前调换过来,如图所示有效信息三
2. 数据修改
依据节点配置说明图对有效信息三进行修改,同时注意耳机第一个值设为3,因为这是外接设备,是接受声卡发出的声音,也就是对这个设备来说是输入,得到有效信息四
同时,在有效节点图上还有两个无效节点0x17和0x1d,因此需要给予屏蔽,屏蔽方法就是将此节点的ConfigData设为F0 00 00 40(F大小写均可,这是为了符合苹果规范),如有效信息五所示
3. 生成ConfigData
生成公式为Address+Node+71c/d/e/f+整理出来的PinDafult的两两一组的数字,得到有效信息六
然后考虑到输出节点上只有0x14有EAPD,且值为0x2,则需要在节点有EAPD的后面加上Address+Node+70c+EAPD值,故得到有效信息七
四、修改配置文件
1. 多余文件删除
首先进入下载好的AppleALC/Resources,将不属于自己声卡型号的文件删除,记得留下五个非文件夹的文件;然后进入留下的声卡型号ALC282文件夹,留下info.plist和一个layout文件和一个platform文件。分别如下所示
这样就可以修改layout和platform的文件名的数字,这里我设置成19,如下所示
2. Info.plist文件修改
修改前
修改后
3. Layout文件修改
修改前
修改后
4. Platforms文件修改
修改前
修改后
5. PinConfigs.kext/Contents/info.plist文件修改
打开这个文件,先搜索ALC282,只保留其中一个与你电脑型号接近的即可
准备好你的ConfigData数据,修改
五、编译和打补丁
1. 编译
将Release版本的Lilu.kext放到AppleALC目录下
2. 打补丁
2.1 DSDT
DSDT补丁用MacIASL打上IRQ补丁和HDEF补丁,打完后搜索LayoutID修改成19,同时在config.plist中把声卡注入改成19
2.2 Hotpatch
对于IRQ补丁来说,只需要在Clover Configurator的Acpi中勾选FixIPIC、FixHPET、FixRTC、FixTMR,在Patches加上
然后在SSDT-RMCF中将Name (AUDL, Zero)修改为Name (AUDL, 0x13)这里的0x13是LayoutID(上文中的19)的16进制,然后在SSDT-HDAU修改为
这里的0x13是LayoutID的16进制,然后在SSDT-HDEF修改
这里的0x13是LayoutID的16进制,同时在config.plist中把声卡注入改成19
至此用Xcode编译生成之后替换就可以了!!!