积土而为山,积水而为海

黑苹果定制声卡驱动(ALC892为例)转载

 教程以ALC892为例,主要针对笔记本的声卡。由于笔记本声卡经常同一型号的声卡驱动并不能通用,往往需要自己定制。台式机大多没有这个问题,只需要用AppleALC-master生成通用声卡即可,通用声卡不好用的可以借鉴本篇文章的思路。(台式机或者嫌麻烦的,可以直接跳到第八节,直接进行编译,如果不完美再进行定制)

目录:

一、定制驱动目标文件

二、定制声卡信息提取

三、所需工具

四、codec提取方法

五、修改configdata信息

六、推导节点及Platforms.xml修改

七、制作辅助文件

八、编译声卡驱动

九、实现声卡驱动

十、总结

一、定制驱动目标文件

完全自制声卡驱动,主要是要制作4个文件:
1.Applealc-master——resources——alc892
Platforms.xml.zlib(节点文件)
2.Applealc-master——resources——alc892
layout1.xml.zlib(layoutID文件)
3.Applealc-master—>resources—>alc892—>info.Plist
(
描述声卡以及对layoutPlatforms文件位置、id的说明)
4.Applealc-master—>resources—>pinconfigs.kext—>contents—>info.Plist
(
包含codecIDlayoutID相关值)

二、定制声卡信息提取

1、提取声卡codec
2
verbit获取你的声卡configdata和节点信息
3
、推导自己的Platforms节点

三、所需工具

1Ubuntu系统。
2
verbit
codec生成verbs.txt文件。
链接:verbit.zip
3
zlib转换器
链接:已包含修改好的Platforms.xml以及zlib转换器
4
AppleALC-master声卡驱动
链接:vit9696大神最新AppleALC-master
需要最新lilu.kext配合,并且需要完整lilu才行(lilu中不能缺少Resources文件夹)
链接:vit9696大神最新Lilu-master

四、codec提取方法

1U盘安装Ubuntu系统
网上很多需要在U盘中写入镜像,其实现在的Ubuntu也有类似WinPE的功能,将下载好的安装包解压到U盘中即可。
开机启动时引导进入U盘的Ubuntu系统
出现Ubuntu的系统选项,选择Try Ubuntu without installing


ubuntu系统选项.jpg

进入Ubuntu系统的桌面打开我的电脑,进入路劲proc/asound/card1,将文件夹里面的所有名为codec#开头的文件都复制出来,其中一个就是你的声卡codec,千万不要把HDMI音频的文件复制出来了(如果card1没有就一定在card0文件夹,笔记本一般都在card1中)

2、进入macOS系统中,将提取的Codec.txt改名为codec_dump.txt放在桌面上,将verbit.zip解压到桌面,打开终端输入:
cd desktop
./verbit codec_dump.txt > verbs.txt
获得verbs.txt(部分朋友获取的为空白,是因为两个命令一起使用的结果)
注意:部分声卡终端输入命令会得到一个错误文件,
文件的内容如下:

Codec: Realtek ALC269VC

Address: 0

AFG Function
Id: 0x1 (unsol 1)

需要删除codec_dump.txt文件中的这行数据AFG Function Id: 0x1 (unsol 1),也要把空格删除完。再执行一次命令,得到正确的verbit.txt文件。(感谢Lenged发现问题)


verbs.png

打开codec.txt搜索上面的红框中的Node,找到每个Node下面的Pin Default那行,看看中间是否有[N/A],将有[N/A]的将节点信息中的一行删除。

删除后,红框中的modified verbs每行四个数,一共7组就是需要的configdatacodec.txt内搜索EAPD字样,存在EAPD,必须在configdata最后加入一组01470C02

五、修改configdata信息

①第一组


第一组.png

红框中是接口的顺序。数字越低那么优先权就越高。如果有 [N/A] 的接口既是无用的接口可以设成 f

内置麦克风 —— Mic at Int N/A
内置扬声器 ——Speaker at Int N/A
线路输出 —— line out
外置麦克风 —— Mic at Ext Rear
线路输入 —— Line In at Ext Rear
耳机 —— HP Out at Ext Rear
SPDIFOut —— SPDIF Out at Ext Rear

如果你的声卡有line out 节点那么

Mic at Int N/A =5
Speaker at Int N/A =1
line out =2
Mic at Ext Rear =6
Line In at Ext Rear =5
HP Out at Ext Rear =3
SPDIF Out at Ext Rear =4

如果无line out

Mic at Int N/A =4
HP Out at Ext Rear =2
Mic at Ext Rear = 5
Line In at Ext Rear =4
Speaker at Int N/A =1
SPDIF Out at Ext Rear =3

(耳机优先级一定要低于内置扬声器,外置麦克风一定要低于内置麦克风,默认开启的是内置扬声器和麦克风,第四组数据把耳机设置为0,既插入检测。这样就可以实现自动切换了。)

②第二组


第二组.png

line out设置为f,其余皆为0

③第三组


第三组.png

第三组为接口颜色,这个改不改无所谓,我是默认没改

0 = Unknown
1 = Black
2 = Grey
3 = Blue
4 = Green
5 = Red
6 = Orange
7 = Yellow
8 = Purple
9 = Pink
A – D = Reserved
E = White
F = Other

④第四组


第四组.png

接口为 0,表示当接口被检测到时使用。如果是笔记本的话内建的麦克风和扬声器要设成1,即当耳机插入时,内建扬声器静音,耳机0 接口被检测到就是用耳机。

Mic at Int N/A =1
Speaker at Int N/A =1
line out =0
Mic at Ext Rear =0
Line In at Ext Rear =0
HP Out at Ext Rear =0
SPDIF Out at Ext Rear =1

⑤第五组


第五组.png

设定接口功能信息,按照以下进行修改

0 = Line Out
1 = Speaker
2 = HP Out
3 = CD
4 = SPDIF Out
5 = Digital Other Out
6 = Modem Line Side
7 = Modem Handset Side
8 = Line In
9 = AUX
A = Mic In
B = Telephone
C = SPDIF In
D = Digital Other In
E = Reserved
F = Other

Mic at Int N/A =a
Speaker at Int N/A =1
line out =0
Mic at Ext Rear =8
ALC892需要通过line in实现外置mic
Line In at Ext Rear =8
HP Out at Ext Rear =2
SPDIF Out at Ext Rear =4

⑥第六组


第六组.png

连接装置类型

0 = Unknown
1 = 1/8″ stereo/mono
2 = 1/4′ stereo/mono
3 = ATAPI internal
4 = RCA
5 = Optical
6 = Other Digital
7 = Other Analog
8 = Multichannel Analog (DIN)
9 = XLR/Professional
A = RJ-11 (Modem)
B = Combination
F = Other
通常接口是 1/8″ stereo/monoSPDIF Optical。笔记本内建的接口是 ATAPI internal。(这只是描述,对驱动没有本质影响,我默认没有修改。)

⑦第七组


第七组.png

0为插入接口的,如外置麦克风、耳机等。
(
如果codec_dump出来有 [N/A] 的就是无用的port,数字为4)
9
为给笔记本內建,像内置扬声器、内置麦克风等

Mic at Int N/A =9
Speaker at Int N/A =9
line out =0
Mic at Ext Rear =0
Line In at Ext Rear =0
HP Out at Ext Rear =0
SPDIF Out at Ext Rear =0

⑧第八组


第八组.png

插口所在位置
0 = Rear
(后)
1 = Front
(前)
8=HDMI
9=ATAPI
(內建)
(这只是描述,对驱动没有本质影响,我默认没有修改。)

将八组数据修改后进行整理得到configdata(每个参数中保留一位空格)
01271c50 01271d01 01271ea6 01271f90 01471c10 01471d01 01471e17 01471f90 01771c20 01771d10 01771e01 01771f01 01871c60 01871d10 01871ea1 01871f01 01a71c50 01a71d10 01a71e81 01a71f01 01b71c30 01b71d10 01b71e21 01b71f01 01e71c40 01e71d11 01e71e45 01e71f01 01470C02

六、推导节点及Platforms.xml修改

链接:已包含修改好的Platforms.xml以及zlib转换器
1
、推导节点


接口的节点信息.png


红框中为接口节点。

想要实现接口功能需要推导节点,一般为3个节点实现一个接口功能,且节点一般不重复。其中输入为反向推导,输出为正向推导,即输入时接口节点是最后一个节点,输出时接口节点是第一个节点(codec中的节点值为16进制,Platforms.xml中需要转换成10进制)

输入以Mic at int(内置麦克风)为例在codec_dump.txt搜索0x12
搜索到20x12,一个为节点本身即Node 0x12,一个在关联节点0x22


0x22节点.png


0x12节点.png

然后在codec_dump.txt搜索0x22,搜索到20x22,一个为节点本身即Node 0x22,一个在关联节点0x09


0x09节点.png


0x22节点.png

按照输入节点反向推导,获得内置麦克风的节点为:
十六进制:0x09 → 0x22 → 0x12
十进制:9 → 34 → 18

②输出以Speaker at Int N/A(内置扬声器)为例在codec_dump.txt搜索0x14
搜索到40x14,首先找到节点本身即Node 0x14


0x14节点.png

找到connection中有关联节点0x0c

codec_dump.txt搜索0x0c,搜索到60x0c,首先找到节点本身即Node 0x0c


0x0c节点.png


找到connection中有关联节点0x020x0b,在已选节点不重复的前提下,优先选择数字小,即0x02节点
按照输出节点正向推导,获得内置扬声器的节点为:
十六进制:0x14 → 0x0c → 0x02
十进制: 20 → 12 → 2

由此推导出所有节点,由于节点很多,可能出现有共同关联的节点,且没有其他节点,则更换上个节点,重新推导,直到没有重复的为止。


推导节点.png

2、修改Platforms.xml
根据我的Platforms.xml进行修改即可


Platforms.png

PathMap下一共三大项:
0
为输入,1为输出,2SPDIF

输入项分为三大项:
0
为内置mic1linein2为外置micALC892外置mic通过linein实现,由此删除外置mic项)

输出项分为三大项:
0
为耳机,1为内置扬声器,2lineout

以内置mic为例:内置mic底层三项代表三个节点,将之前推导的三个节点按顺序输入到NodeID中,在内置mic节点添加boost项,设置为3,可以减少mic杂音的情况(外置miclinein的节点也可以添加boost项)。


屏幕快照 2017-12-01 12.16.04.png

以此类推,所有节点修改完毕后,在PathMapID中输入你的声卡型号,Platforms.xml完毕,保存后用zlib转换器转换成Platforms.xml.zlib格式。

七、制作辅助文件

1Applealc-master——resources——alc892中的info.Plist
用来描述你的声卡以及对layoutPlatforms文件位置、id的说明
ALC892
codecID283904146,这是0x10ec0892十六进制转换过来的。在codec_dump开头中可以找到,macos的计算器有进制转换功能。
然后修改layouts第一项,修改id1path地址改为你做好的layouts.xml.zlib文件,Platforms设置方式一样。(全篇LayoutID统一为1,也可统一为其他数字)


info.png

2Applealc-master——resources——pinconfigs.kext——contents中的info.Plist
集合了所有声卡的信息,我们只用保留需要的,为防止冲突,只修改第一项,其他都可以删除。第一项中修改codecalc892codecID283904146,这是0x10ec0892十六进制转换过来的。在codec_dump开头中可以找到,macos的计算器有进制转换功能。configData中修改为自己的configdata即可。LayoutID修改为1(全篇LayoutID所有统一为1,也可统一为其他数字)


info.png

3Applealc-master——resources——alc892layout1.xml.zlib
描述声卡型号以及声卡ID信息
首先向zlib文件转换为xml文件才可以编辑
LayoutID
修改为1(全篇LayoutID所有统一为1,也可统一为其他数字),修改codecID283904146,这是0x10ec0892十六进制转换过来的。在codec_dump开头中可以找到,macos的计算器有进制转换功能。
pathmapID
修改为892。部分声卡需要删除lineout项才能驱动,需要自行尝试。


layout.png

最后确认一共需要修改和定制的为4个文件:
1.Applealc-master——resources——alc892—>Platforms.xml.zlib
2.Applealc-master——resources——alc892—>layout1.xml.zlib
3.Applealc-master—>resources—>alc892—>info.Plist
4.Applealc-master—>resources—>pinconfigs.kext—>contents—>info.Plist
全篇所有的layoutID都为1,如果需要修改其他数字,需要注意layout文件名也需要修改,如layout25.xmI.zlib

这四个文件保存好以后,系统升级驱动失效时可获取最新的AppleALC-master文件重新编译即可,十分方便。

八、编译声卡驱动

下载好最新的AppleALC-master文件,由于10.12.6之后需要lilu.kext才能编译并驱动声卡,还需要下载最新的lilu.kext放置在AppleALC-master的根目录,需要注意的是lilu.kext中必须包含有Resources(部分lilu.kext缺少该文件)
将之前定制好的四个文件,放置在对应的位置,运行AppleALC-master中的AppleALC.xcodeproj


运行xcode.png

如果出现红色叹号报错,可能出现以下问题:
1
、缺少lilu.kext文件或lilu.kext中缺少resources下的文件(查找最新lilu.kext,并确保必须包含有Resources


报错1.png


2
、显示缺少liluAPI,说明lilu.kextAppleALC-master版本不对应,在下载时确保最新或者版本说明中相互对应,确保相互兼容。


报错2.png

九、实现声卡驱动

将做好驱动和对应版本的lilu.kext放到EFI—>CLOVER—>kexts—>10.13文件夹中。
然后在config.plist中加入以下代码:

<dict>

<key>Audio</key>

<dict>

<key>Inject</key>

<string>1</string>

</dict>

clover注入ID不能让这个声卡驱动正常工作所以这里必须采用DSDT注入ID
打开DSDT搜索HDEF插入函数

Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method`

{

Store (Package (0x0A)

{


“hda-gfx”,

Buffer (0x0A)

{


“onboard-1”

},


“codec-id”,

Buffer (0x04)

{


0x92, 0x08, 0xEC, 0x10
//
修改为自己的声卡型号

},


“layout-id”,

Buffer (0x04)

{


0x01, 0x00, 0x00, 0x00//
修改为自己的layoutID

},


“device-type”,

Buffer (0x07)

{


“ALC892”//
修改为自己的声卡型号

},


“PinConfigurations”,

Buffer (Zero) {}

}, Local0)

DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))


Return (Local0) }

十、总结

以这种仿冒方式定制的声卡,对于笔记本十分友好,同时也能很好的解决唤醒无声以及杂音问题。以上教程是通过学习远景贴并总结个人经验写成的,我个人定制声卡驱动后没有出现唤醒无声以及杂音等问题,如果由以上问题没有解决的,可以参考一下帖子参考。

评论

还没有任何评论,你来说两句吧

发表评论

没有什么能够阻挡
你对自由的向往
天马行空的生涯
你的心了无牵挂
穿过幽暗的岁月
也曾感到彷徨
当你低头的瞬间
才发觉脚下的路
心中那自由的世界
如此的清澈高远
盛开着永不凋零…… -

黔ICP备15016215号 Copyright © 2015 - 2025 蓝莲花 All Rights Reserved.