linux 编辑dsdt,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 并不完全正确 ,仍然需要手动进行更改。

f6b8bc6e69ea

原始的 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

f6b8bc6e69ea

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编辑。

f6b8bc6e69ea

Platforms结构图

PathMapID 改为你要修改的 LayoutID 一致,surface pro 3 的选择是3。不改也没关系,可以在clover中注入LayoutID,之后在dsdt补丁中也会添加。

输入设备的 PathMap,按照上面确定的节点数字修改:

f6b8bc6e69ea

输入设备的 PathMap

输入设备的 PathMap设定:[Mic Int]的Boost值设为3,但关于[Mic Ext]的Boost值设定有争议,1或者3我也不是很清楚。

f6b8bc6e69ea

输入设备的 PathMap设定

加入备选路径后的PathMap设定

f6b8bc6e69ea

修改后输入设备的 PathMap设定.png

输出设备的 PathMap:

f6b8bc6e69ea

输出设备的 PathMa

输出设备的 PathMap设定:

f6b8bc6e69ea

输出设备的 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:

如图:

f6b8bc6e69ea

Screen Shot 2017-07-25 at 8.35.32 PM.png

另外记得为外置 Mic添加 LineIn选项,LineIn就是我们的外置麦克

f6b8bc6e69ea

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添加设置即可。

f6b8bc6e69ea

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值