作者:LF落风
链接:https://www.jianshu.com/p/29a74f0664f1
來源:简书
教程以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
(描述声卡以及对layout和Platforms文件位置、id的说明)
4.Applealc-master—>resources—>pinconfigs.kext—>contents—>info.Plist
(包含codecID和layoutID相关值)
二、定制声卡信息提取
1、提取声卡codec
2、verbit获取你的声卡configdata和节点信息
3、推导自己的Platforms节点
三、所需工具
1、Ubuntu系统。
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提取方法
1、U盘安装Ubuntu系统
网上很多需要在U盘中写入镜像,其实现在的Ubuntu也有类似WinPE的功能,将下载好的安装包解压到U盘中即可。新版ubuntu出现了解压后无法引导的情况,用制作U盘启动盘的方法把镜像写入U盘就可以(记得提前把U盘数据转移,会格盘的)。
开机启动时引导进入U盘的Ubuntu系统
出现Ubuntu的系统选项,选择Try Ubuntu without installing
进入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发现问题)
打开codec.txt搜索上面的红框中的Node,找到每个Node下面的Pin Default那行,看看中间是否有[N/A],将有[N/A]的将“节点信息”中的一行删除。
删除后,红框中的modified verbs每行四个数,一共7组就是需要的configdata(codec.txt内搜索EAPD字样,存在EAPD,必须在configdata最后加入一组01470C02)
五、修改configdata信息
①第一组
红框中是接口的顺序。数字越低那么优先权就越高。如果有 [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,既插入检测。这样就可以实现自动切换了。)
②第二组
line out设置为f,其余皆为0
③第三组
第三组为接口颜色,这个改不改无所谓,我是默认没改
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
④第四组
接口为 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
⑤第五组
设定接口功能信息,按照以下进行修改
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
⑥第六组
连接装置类型
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/mono,SPDIF 是 Optical。笔记本内建的接口是 ATAPI internal。(这只是描述,对驱动没有本质影响,我默认没有修改。)
⑦第七组
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
⑧第八组
插口所在位置
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、推导节点
红框中为接口节点。想要实现接口功能需要推导节点,一般为3个节点实现一个接口功能,且节点一般不重复。其中输入为反向推导,输出为正向推导,即输入时接口节点是最后一个节点,输出时接口节点是第一个节点(codec中的节点值为16进制,Platforms.xml中需要转换成10进制)
①输入以Mic at int(内置麦克风)为例在codec_dump.txt搜索0x12,
搜索到2个0x12,一个为节点本身即Node 0x12,一个在关联节点0x22下
然后在codec_dump.txt搜索0x22,搜索到2个0x22,一个为节点本身即Node 0x22,一个在关联节点0x09下
按照输入节点反向推导,获得内置麦克风的节点为:
十六进制:0x09 → 0x22 → 0x12
十进制:9 → 34 → 18
②输出以Speaker at Int N/A(内置扬声器)为例在codec_dump.txt搜索0x14,
搜索到4个0x14,首先找到节点本身即Node 0x14
找到connection中有关联节点0x0c
在codec_dump.txt搜索0x0c,搜索到6个0x0c,首先找到节点本身即Node 0x0c
找到connection中有关联节点0x02,0x0b,在已选节点不重复的前提下,优先选择数字小,即0x02节点
按照输出节点正向推导,获得内置扬声器的节点为:
十六进制:0x14 → 0x0c → 0x02
十进制: 20 → 12 → 2
由此推导出所有节点,由于节点很多,可能出现有共同关联的节点,且没有其他节点,则更换上个节点,重新推导,直到没有重复的为止。
2、修改Platforms.xml
根据我的Platforms.xml进行修改即可
PathMap下一共三大项:
0为输入(第一输入项,外置mic可以实现自动切换的只需要一个输入项,无法实现的需要第二输入项),1为输出(第一输出项),2为SPDIF
输入项分为三大项:
0为内置mic,1为linein,2为外置mic(ALC892外置mic通过linein实现,由此删除外置mic项)
输出项分为三大项:
0为耳机,1为内置扬声器,2位lineout
以内置mic为例:内置mic底层三项代表三个节点,将之前推导的三个节点按顺序输入到NodeID中,在内置mic节点添加boost项(设置电平增效数值为1、2、3,数值3最大),设置为3,可以减少mic杂音的情况(外置mic和linein的节点也可以添加boost项)
部分机器会出现插入外置mic不识别的情况,其实只是外置mic无法自动切换导致无法显示出来,需要调整将节点到第二类输入项中来实现手动切换,如图
以此类推,所有节点修改完毕后,在PathMapID中输入你的声卡型号,Platforms.xml完毕,保存后用zlib转换器转换成Platforms.xml.zlib格式。
七、制作辅助文件
1、Applealc-master——resources——alc892中的info.Plist
用来描述你的声卡以及对layout和Platforms文件位置、id的说明
ALC892的codecID为283904146,这是0x10ec0892十六进制转换过来的。在codec_dump开头中可以找到,macos的计算器有进制转换功能。
然后修改layouts第一项,修改id为1,path地址改为你做好的layouts.xml.zlib文件,Platforms设置方式一样。(全篇LayoutID统一为1,也可统一为其他数字)
2、Applealc-master——resources——pinconfigs.kext——contents中的info.Plist
集合了所有声卡的信息,我们只用保留需要的,为防止冲突,只修改第一项,其他都可以删除。第一项中修改codec为alc892,codecID为283904146,这是0x10ec0892十六进制转换过来的。在codec_dump开头中可以找到,macos的计算器有进制转换功能。configData中修改为自己的configdata即可。LayoutID修改为1(全篇LayoutID所有统一为1,也可统一为其他数字)
3、Applealc-master——resources——alc892中layout1.xml.zlib
描述声卡型号以及声卡ID信息
首先向zlib文件转换为xml文件才可以编辑
LayoutID修改为1(全篇LayoutID所有统一为1,也可统一为其他数字),修改codecID为283904146,这是0x10ec0892十六进制转换过来的。在codec_dump开头中可以找到,macos的计算器有进制转换功能。
pathmapID修改为892。部分声卡需要删除lineout项才能驱动,需要自行尝试。
外置mic需要修改电压控制值来实现外置mic驱动。
搜索codec中外置mic下的vref值,vref含义为初始电压基础上增加的百分比,如图为vref为50。当vref不为Hiz时,muteGPIO={(vref转换为16进制)+"0100"+node id}转换为10进制,codec中vref表示的是十进制,计算时转为16进制。如:在节点 0x18发现vref_50,50转换为16进制=32,则muteGPIO=(32010018)转换为10进制=838926360;如果vref为Hiz,则muteGPIO=0
由于外置mic需要通过linein实现,因此修改linein中的muteGPIO为838926360
最后确认一共需要修改和定制的为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
如果出现红色叹号报错,可能出现以下问题:
1、缺少lilu.kext文件或lilu.kext中缺少resources下的文件(查找最新lilu.kext,并确保必须包含有Resources)
2、显示缺少liluAPI,说明lilu.kext与AppleALC-master版本不对应,在下载时确保最新或者版本说明中相互对应,确保相互兼容。
九、实现声卡驱动
将做好驱动和对应版本的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) }
十、总结
以这种仿冒方式定制的声卡,对于笔记本十分友好,同时也能很好的解决唤醒无声以及杂音问题。以上教程是通过学习远景贴并总结个人经验写成的,我个人定制声卡驱动后没有出现唤醒无声以及杂音等问题,如果由以上问题没有解决的,可以参考一下帖子参考。这里附上原贴,以及我个人的帖子
文章评论