Surface pro 3 ALC288 的 AppleHDA 修改步骤

用到的工具:
  • 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即可,多声道需要分别设定

  1. 后左与后右
  2. 中央与重低音
  3. 前左与前右声道
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补丁

            <dict>
                <key>Comment</key>
                <string>Zeroing 1983 codec </string>
                <key>Disabled</key>
                <false/>
                <key>Find</key>
                <data>
                gxnUEQ==
                </data>
                <key>Name</key>
                <string>AppleHDA</string>
                <key>Replace</key>
                <data>
                AAAAAA==
                </data>
            </dict>
            <dict>
                <key>Comment</key>
                <string>Zeroing 10ec0885 codec (patched by AppleHDA Patcher.app)</string>
                <key>Disabled</key>
                <false/>
                <key>Find</key>
                <data>
                hQjsEA==
                </data>
                <key>Name</key>
                <string>AppleHDA</string>
                <key>Replace</key>
                <data>
                AAAAAA==
                </data>
            </dict>
            <dict>
                <key>Comment</key>
                <string>Patching 11d41984 with 10ec0288 codec (patched by AppleHDA Patcher.app)</string>
                <key>Disabled</key>
                <false/>
                <key>Find</key>
                <data>
                hBnUEQ==
                </data>
                <key>Name</key>
                <string>AppleHDA</string>
                <key>Replace</key>
                <data>
                iALsEA==
                </data>
            </dict>

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容