linux驱动编译成kext,Hackintosh:制作AppleALC以驱动原生AppleHDA

这篇教程一直在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. 整理有效节点

我的有效节点如下所示

23691012b358

有效节点

很明显0x17和0x1d为无效节点,并且去掉Modified Verbs,于是剩下的有效信息一如下

23691012b358

有效信息一

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去掉,然后数字两两一组,得到有效信息二

23691012b358

有效信息二

之后再将两两一组的数据从后向前调换过来,如图所示有效信息三

23691012b358

有效信息三

2. 数据修改

23691012b358

节点配置说明

依据节点配置说明图对有效信息三进行修改,同时注意耳机第一个值设为3,因为这是外接设备,是接受声卡发出的声音,也就是对这个设备来说是输入,得到有效信息四

23691012b358

有效信息四

同时,在有效节点图上还有两个无效节点0x17和0x1d,因此需要给予屏蔽,屏蔽方法就是将此节点的ConfigData设为F0 00 00 40(F大小写均可,这是为了符合苹果规范),如有效信息五所示

23691012b358

有效信息五

3. 生成ConfigData

生成公式为Address+Node+71c/d/e/f+整理出来的PinDafult的两两一组的数字,得到有效信息六

23691012b358

有效信息六

然后考虑到输出节点上只有0x14有EAPD,且值为0x2,则需要在节点有EAPD的后面加上Address+Node+70c+EAPD值,故得到有效信息七

23691012b358

有效信息七

四、修改配置文件

1. 多余文件删除

首先进入下载好的AppleALC/Resources,将不属于自己声卡型号的文件删除,记得留下五个非文件夹的文件;然后进入留下的声卡型号ALC282文件夹,留下info.plist和一个layout文件和一个platform文件。分别如下所示

23691012b358

留下的文件

23691012b358

留下的文件

这样就可以修改layout和platform的文件名的数字,这里我设置成19,如下所示

23691012b358

重命名

2. Info.plist文件修改

修改前

23691012b358

修改前

修改后

23691012b358

修改后

3. Layout文件修改

修改前

23691012b358

修改前

修改后

23691012b358

修改后

4. Platforms文件修改

修改前

23691012b358

修改前

修改后

23691012b358

修改后

5. PinConfigs.kext/Contents/info.plist文件修改

打开这个文件,先搜索ALC282,只保留其中一个与你电脑型号接近的即可

23691012b358

搜索保留数据

准备好你的ConfigData数据,修改

23691012b358

修改

五、编译和打补丁

1. 编译

将Release版本的Lilu.kext放到AppleALC目录下

23691012b358

放置位置

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加上

23691012b358

Patches添加

然后在SSDT-RMCF中将Name (AUDL, Zero)修改为Name (AUDL, 0x13)这里的0x13是LayoutID(上文中的19)的16进制,然后在SSDT-HDAU修改为

23691012b358

SSDT-HDAU修改

这里的0x13是LayoutID的16进制,然后在SSDT-HDEF修改

23691012b358

SSDT-HDEF修改

这里的0x13是LayoutID的16进制,同时在config.plist中把声卡注入改成19

至此用Xcode编译生成之后替换就可以了!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值