用到的工具:
Verbit: 用来自动生成 ConfigData, 免去了一个个节点手动整理的过程
codecgraph: 生成节点间关系图,用来制作 PathMap
convert_hex_to_dec.rb: 用于将十六进制值转换为十进制
zlib: 解压/压缩 zlib 文件,修改 Layout 和 PathMap 会用到
一. 从 Linux 中提取 codec (两种方法,任选一种)
1. 命令行
进入Ubuntu系统的桌面打开终端terminal:
输入 cat /proc/asound/card0/codec#0 > ~/Desktop/codec_dump.txt
或者 cat /proc/asound/card0/codec#1 > ~/Desktop/codec_dump.txt
或者 cat /proc/asound/card0/codec#2 > ~/Desktop/codec_dump.txt
直到将你要的文件拷出,偶尔会多一个HDMI音频相关的文件,不要拷错了。
2. 直接拷贝
打开我的电脑(相当于windows的C盘),进入路径proc/asound/card0,将文件夹里面的所有名为codec#开头的文件都复制出来,其中一个就是你的声卡codec,千万不要把HDMI音频的文件复制出来了(如果card0没有就一定在card1文件夹。
二. 使用 verbit 自动生成原始的 ConfigData
输入命令行:
./verbit codec_dump.txt> verbs.txt
注意这一步生成的 ConfigData 中可能会有数字错误显示为了10进制,可以用系统
内置的计算器转换回16进制数。生成并换算16进制以后的结果,无用的节点已经被
自动剔除:
另外这一步生成的 ConfigData 并不完全正确 ,仍然需要手动进行更改。
原始的 ConfigData
三. 修改 ConfigData
4.1 ConfigData 各位定义
Address + Node + 71c +【12】
Address + Node + 71d +【34】
Address + Node + 71e +【56】
Address + Node + 71f +【78】
Address 在你的 codec_dump.txt 开头定义,而 Node 则是对应的接口序号,
71c,71d,71e,71f 是固定的,所以需要改的内容分别是每组的最后两位数,一共是8位置:
Jack Color Description Node PinDefault Modified Verbs
--------------------------------------------------------------------------------------------------------
Digital Unknown Mic at Int N/A 18 0x12 0x90a60140 01271c40 01271d00 01271ea6 01271f90
Unknown Unknown Line Out at Ext N/A 19 0x13 0x40000000 01371c00 01371d00 01371e00 01371f40
Unknown Speaker at Int N/A 20 0x14 0x90170110 01471c50 01471d00 01471e17 01471f90
1/8 Black Mic at Ext Left 24 0x18 0x03a11030 01871c30 01871d10 01871ea1 01871f00
Optical Purple Modem Line at Ext N/A 29 0x1d 0x4065822d 01d71c20 01d71d80 01d71e65 01d71f40
1/8 Black HP Out at Ext Left 33 0x21 0x03211020 02171c60 02171d10 02171e21 02171f00
--------------------------------------------------------------------------------------------------------
Line Out at Ext 0x13 和Modem Line at Ext 0x1d是屏蔽设备,应该是用不到的,但是先放在里面一起把ConfigData改正确。
1. Default Association
和 Sequence 一起用来表示设备间的关联,用来处理多声道,按照之前提取的 codec_dump.txt 信息选择。也可以按次序安排,只要每个设备独立不一样就可以。
2. Sequence:
一般设置为0即可,多声道需要分别设定
后左与后右
中央与重低音
前左与前右声道
Description
Origin ConfigData
Revised ConfigData
Mic at Int
01271c40
01271c10
Line Out at Ext N/A
01371c00
01371c20
Speaker at Int
01471c50
01471c30
Mic at Ext Left
01871c30
01871c40
Modem Line at Ext N/A
01d71c20
01d71c50
HP Out at Ext Left
02171c60
02171c60
3. Color
接口颜色,依然按照上面提取的 codec_dump.txt 设置
Color
Encoding
Unknown
0
Black
1
Grey
2
Blue
3
Green
4
Red
5
Orange
6
Yellow
7
Purple
8
Pink
9
Reserved
A-D
White
E
Other
F
4. Miscellaneous
插口侦测设置,定义如下
0=Jack Detect Override [外接设备]
1=Jack Detect Disabled [内置设备]
修改:
Description
Origin ConfigData
Revised ConfigData
Mic at Int
01271d00
01271d01
Line Out at Ext N/A
01371d00
01371d00
Speaker at Int
01471d00
01471d01
Mic at Ext Left
01871d10
01871d10
Modem Line at Ext N/A
01d71d80
01d71d80
HP Out at Ext Left
02171d10
02171d10
5. Default Device
有教程说外置麦克风 Mic Ext 设置为Line In,但是surface pro 3是combination设备,我个人觉得没什么用,沿用了本来的。
Default Device
Encoding
Line Out
0
Speaker
1
HP Out
2
CD
3
SPDIF Out
4
Digital Other Out
5
Modem Line Side
6
Modem Handset Side
7
Line In
8
AUX
9
Mic In
A
Telephony
B
SPDIF In
C
Digital Other In
D
Reserved
E
Other
F
6. Connection Type
注意这里的外置麦克风 Mic Ext 设置为 Combination 设备
连接类型,圆形的 3.5 mm 接口设为1,笔记本内置的设备如果标有 ATAPI 则设为3,其他内置未知的设为0,屏蔽的设备也设置为0
Connection
Type Encoding
Unknown
0
1/8" stereo/mono
1
1/4" stereo/mono
2
ATAPI internal
3
RCA
4
Optical
5
Other Digital
6
Other Analog
7
Multichannel Analog (DIN)
8
XLR/Professional
9
RJ-11 (Modem)
A
Combination
B
Other
F
修改:
Description
Origin ConfigData
Revised ConfigData
Mic at Int
01271ea6
01271ea6
Line Out at Ext N/A
01371e00
01371e00
Speaker at Int
01471e17
01471e17
Mic at Ext Left
01871ea1
01871eab
Modem Line at Ext N/A
01d71e65
01d71e65
HP Out at Ext Left
02171e21
02171e2b
7. Port
端口,用来确定是否有外部接口
0=External Jack [外接设备]
4=External No Connection [屏蔽设备]
9=Internal Fixed Function Device [内置设备]
修改:
8. Location
外部插孔所在位置,一般设为1,屏蔽的装置设为0
Encoding
Location
0
N/A
1
Rear
2
Front
3
Left
4
Right
5
Top
6
Bottom
7
Special
8
Special (HDMI 01)
9
Special (ATAPI 01)
A-F
Reserved
修改:
Description
Origin ConfigData
Revised ConfigData
Mic at Int
01271f90
01271f90
Line Out at Ext N/A
01371f40
01371f40
Speaker at Int
01471f90
01471f90
Mic at Ext Left
01871f00
01871f03
Modem Line at Ext N/A
01d71f40
01d71f40
HP Out at Ext Left
02171f00
02171f03
最后得到的正确结果为:
01271c10 01271d01 01271ea6 01271f90
01371c20 01371d00 01371e00 01371f40
01471c30 01471d01 01471e17 01471f90
01871c40 01871d10 01871eab 01871f03
01d71c50 01d71d80 01d71e65 01d71f40
02171c60 02171d10 02171e2b 02171f03
移除0x, 整理, 如果你的 codec_dump.txt 文件里面出现过 EAPD 字样的节点后加上Address+节点+71c+02,找到EAPD节点的方法:那就是它通常会位于Speaker Out和HP Out这两个输出节点上..
01271c10 01271d01 01271ea6 01271f90
01371c20 01371d00 01371e00 01371f40
01471c30 01471d01 01471e17 01471f90 01470c02
01871c40 01871d10 01871eab 01871f03
01d71c50 01d71d80 01d71e65 01d71f40
02171c60 02171d10 02171e2b 02171f03
最终修正过的 ConfigData:
<01271c10 01271d01 01271ea6 01271f90 01371c20 01371d00 01371e00 01371f40 01471c30 01471d01 01471e17 01471f90 01470c02 01871c40 01871d10 01871eab 01871f03 01d71c50 01d71d80 01d71e65 01d71f40 02171c60 02171d10 02171e2b 02171f03>
Line Out at Ext 0x13 和 Modem Line at Ext 0x1d是屏蔽设备 为了更符合苹果规范用f0000040修饰
改为
<01271c10 01271d01 01271ea6 01271f90 01371cf0 01371d00 01371e00 01371f40 01471c30 01471d01 01471e17 01471f90 01470c02 01871c40 01871d10 01871eab 01871f03 01d71cf0 01d71d00 01d71e00 01d71f40 02171c60 02171d10 02171e2b 02171f03>
如果加上所有屏蔽设备,configdata为
01271c10 01271d01 01271ea6 01271f90
01371cf0 01371d00 01371e00 01371f40
01471c30 01471d01 01471e17 01471f90 01470c02
01771cf0 01771d00 01771e00 01771f40
01871c40 01871d10 01871eab 01871f03
01971cf0 01971d00 01971e00 01971f40
01a71cf0 01a71d00 01a71e00 01a71f40
01d71cf0 01d71d00 01d71e00 01d71f40
01e71cf0 01e71d00 01e71e00 01e71f40
02171c60 02171d10 02171e2b 02171f03
01271c10 01271d01 01271ea6 01271f90 01371cf0 01371d00 01371e00 01371f40 01471c30 01471d01 01471e17 01471f90 01470c02 01771cf0 01771d00 01771e00 01771f40 01871c40 01871d10 01871eab 01871f03 01971cf0 01971d00 01971e00 01971f40 01a71cf0 01a71d00 01a71e00 01a71f40 01d71cf0 01d71d00 01d71e00 01d71f40 01e71cf0 01e71d00 01e71e00 01e71f40 02171c60 02171d10 02171e2b 02171f03
修改 AppleHDAHardwareConfigDriver.kext
打开 AppleHDA.kext/Contents/PlugIns/AppleHDAHardwareConfigDriver.kext/Contents/Info.plist文件,找到IOPersonalities -> HDA Hardware Config Resource -> HDAConfigDefault -> Item 0这一项的子项:
ConfigData: 如果没有这项则新建,类型为 Data; 如果已经有了,把上面的 ConfigData 填入;
CodecID: 根据 codec_dump.txt 文件中的 Vendor Id 的十六进制值转换为十进制:0x10ec0288 = 283,902,600, 填入即可;
FuncGroup: 按照 codec_dump.txt 中的值填写(就是前面删去那行的内容),一般为1
LayoutID: 需要选一个已经存在的 LayoutID, 这里我选择了 3.
至此 ConfigData 相关修改完成。
四. 使用 codecgraph 生成描述 PathMap 的 sag 矢量图
先把第一步的到的 codec_dump.txt 里的AFG Function Id: 0x1 (unsol 0)一行删除,然后在terminal中进入你保存 codec_dump.txt 文件所在文件夹输入:
./codecgraph codec_dump.txt
用于生成节点图
用 convert_hex_to_dec.rb 脚本将其中的十六进制数字转换为十进制
./convert_hex_to_dec.rb codec_dump.txt.svg > codec_dump_dec.txt.svg
Surface pro 3 音频节点路径图
从图中可以得到我们在后面步骤中修改 Platforms.xml.zlib 文件所需要的路径(尽量选择实线)。
为我们四个有效节点分配路径
对于输入设备:AudioInput -> Audio Mixer/Audio Selector -> Pin Complex
对于输出设备:Pin Complex -> Audio Mixer -> Audio Output
[Mic Int] 9 -> 34 -> 18 (十六进制:0x09 -> 0x23 -> 0x12) 17-> 36-> 18 备选
[Mic Ext] 9 -> 34 -> 24 (十六进制:0x09 -> 0x23 -> 0x18) 8 -> 35-> 24 备选
[Speaker] 20 -> 13 -> 3 (十六进制:0x14 -> 0x0d -> 0x03)
[HeadPhone] 33 -> 12 -> 2 (十六进制:0x21 -> 0x0c -> 0x02)
实际规则是尽量保持路径的独立性,尽量不要共用节点和路径。这里 [Mic Int]和[Mic Ext]选择相同节点的路径的原因是,由于 surface pro 3 的耳机插口是二合一设备,这种耳机插口 Hackintosh的 Ext Mic 驱动处理起来很麻烦,于是插入带Mic耳机时,我让它直接用内置Mic输入声音。同时像 MacBook Pro 5 , 2,内外Mic路径是 7 -> 36 ->然后才是各自的节点。之后我将所有备选方案也都放入了platform中。所以Mic 下共有四个路径。
知道路径后,修改 Platforms.xml.zlib。将文件Platforms.xml.zlib拖入Zlib软件可以得到Platforms.xml文件,这个文件可以打开编辑,我是直接使用 Xcode编辑。
Platforms结构图
PathMapID 改为你要修改的 LayoutID 一致,surface pro 3 的选择是3。不改也没关系,可以在clover中注入LayoutID,之后在dsdt补丁中也会添加。
输入设备的 PathMap,按照上面确定的节点数字修改:
输入设备的 PathMap
输入设备的 PathMap设定:[Mic Int]的Boost值设为3,但关于[Mic Ext]的Boost值设定有争议,1或者3我也不是很清楚。
输入设备的 PathMap设定
加入备选路径后的PathMap设定
修改后输入设备的 PathMap设定.png
输出设备的 PathMap:
输出设备的 PathMa
输出设备的 PathMap设定:
输出设备的 PathMap设定
修改完成后,重新拖入 Zlib 软件压缩为 zlib 文件。
五. Layout文件修改
由 codec_dump.txt 文件计算出 layout 相关数值
计算 MuteGPIO:
MuteGPIO = VREF(Hex) + 0100 + NodeID
当你的 codec_dump.txt 对应节点信息中存在 VREF_HIZ 时, MuteGPIO = 0。
例如:
Node 18 = 50(VREF 80) + 0100 + 18 = 0x50010018 = 1342242840
HeadsetMic_dBV为1,088,421,888
解压 LayoutXX.xml.zlib, 我这里是 Layout03.xml.zlib:
如图:
Screen Shot 2017-07-25 at 8.35.32 PM.png
另外记得为外置 Mic添加 LineIn选项,LineIn就是我们的外置麦克
Layout3.png
修改完成后,重新压缩为 zlib:
六. 打补丁
1. config 文件kexts to patch补丁
Comment
Zeroing 1983 codec
Disabled
Find
gxnUEQ==
Name
AppleHDA
Replace
AAAAAA==
Comment
Zeroing 10ec0885 codec (patched by AppleHDA Patcher.app)
Disabled
Find
hQjsEA==
Name
AppleHDA
Replace
AAAAAA==
Comment
Patching 11d41984 with 10ec0288 codec (patched by AppleHDA Patcher.app)
Disabled
Find
hBnUEQ==
Name
AppleHDA
Replace
iALsEA==
2. dsdt 补丁
HDEF_Patch
#Automatically adjusted by AppleHDA Patcher.app
# original by RehabMan
# Inject Audio info
into method label _DSM parent_label HDEF remove_entry;
into device label HDEF insert
begin
Method (_DSM, 4, NotSerialized)\n
{\n
If (LEqual (Arg2, Zero)) { Return (Buffer() { 0x03 } ) }\n
Return (Package()\n
{\n
"AAPL,slot-name", Buffer() { "Built in" },\n
"layout-id", Buffer() { 0x03, 0x00, 0x00, 0x00 },\n
"device_type", Buffer() { "Audio Controller" },\n
"built-in", Buffer() { 0x00 },\n
"PinConfigurations", Buffer() { },\n
"hda-gfx", Buffer() { "onboard-1" }\n
})\n
}\n
end
system_IRQ
#Maintained by: RehabMan for: Laptop Patches
#system_IRQ.txt
# This can fix non-working audio and also has an affect on HPET.
#
# Use this if you have issues with patched AppleHDA (required on almost all laptops)
# or if you have issues with HPET (restart after wake).
# IRQ fix
into device name_hid PNP0000 code_regex IRQNoFlags\s\(\)\n\s+\{(\d+)\} remove_matched;
into device name_hid PNP0100 code_regex IRQNoFlags\s\(\)\n\s+\{(\d+)\} remove_matched;
into device name_hid PNP0B00 code_regex IRQNoFlags\s\(\)\n\s+\{(\d+)\} remove_matched;
into device name_hid PNP0103 code_regex IRQNoFlags\s\(\)\n\s+\{.*\} removeall_matched;
into device name_hid PNP0103 code_regex Name\s\(([^,]+),\sResourceTemplate\s\(\).*\n\s+\{((?:.|\n)*)\}\) replace_matched
begin
Name (%1, ResourceTemplate()\n
{\n
IRQNoFlags() { 0, 8, 11, 15 }\n
%2
})\n
end;
经过实验测试后的一些精细修改
从windows中查到的configdata并改为苹果的格式
01271c40 01271d01 01271ea6 01271f90
01371cf0 01371d00 01371e00 01371f40
01471c10 01471d01 01471e17 01471f90 01470c02
01771cf0 01771d00 01771e00 01771f40
01871c30 01871d10 01871ea1 01871f03
01971cf0 01971d00 01971e00 01971f40
01a71cf0 01a71d00 01a71e00 01a71f40
01d71cf0 01d71d00 01d71e00 01d71f40
01e71cf0 01e71d00 01e71e00 01e71f40
02171c20 02171d10 02171e21 02171f03
外置Mic 和耳机输出改为combination ,并且将外置Mic 改为LineIn与前面layoutid里 设置匹配
01271c40 01271d01 01271ea6 01271f90
01371cf0 01371d00 01371e00 01371f40
01471c10 01471d01 01471e17 01471f90 01470c02
01771cf0 01771d00 01771e00 01771f40
01871c30 01871d10 01871e8b 01871f03
01971cf0 01971d00 01971e00 01971f40
01a71cf0 01a71d00 01a71e00 01a71f40
01d71cf0 01d71d00 01d71e00 01d71f40
01e71cf0 01e71d00 01e71e00 01e71f40
02171c20 02171d10 02171e2b 02171f03
01271c40 01271d01 01271ea6 01271f90 01371cf0 01371d00 01371e00 01371f40 01471c10 01471d01 01471e17 01471f90 01470c02 01771cf0 01771d00 01771e00 01771f40 01871c30 01871d10 01871e8b 01871f03 01971cf0 01971d00 01971e00 01971f40 01a71cf0 01a71d00 01a71e00 01a71f40 01d71cf0 01d71d00 01d71e00 01d71f40 01e71cf0 01e71d00 01e71e00 01e71f40 02171c20 02171d10 02171e2b 02171f03
Mic 路径设置 内置于外置分开最后为
9 -> 34 -> 18
8 -> 35-> 24
其实主要是匹配设置,如果你在configdata里的Mic 设为Mic 而不是LineIn,你在layoutID为ExtMic添加设置即可。
SPDIF
直接提取windows的Codec 也可以,唯一要改的就是把二合一插孔相关的两个节点,改为Combination,并且外置Mic改为LineIn,最后的config为
01271c40 01271d01 01271ea6 01271f90 01371c00 01371d00 01371e00 01371f40 01471c10 01471d01 01471e17 01471f90 01470c02 01771cf0 01771d11 01771e11 01771f41 01770c02 01871c30 01871d10 01871e8b 01871f03 01971cf0 01971d11 01971e11 01971f41 01970c02 01a71cf0 01a71d11 01a71e11 01a71f41 01d71c2d 01d71d82 01d71e65 01d71f40 01e71cf0 01e71d11 01e71e11 01e71f41 02171c20 02171d10 02171e2b 02171f03
AFGLowPowerState 为3