用到的工具:

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

linux 编辑dsdt,Surface pro 3 ALC288 的 AppleHDA 修改步骤相关推荐

  1. surface pro 3 linux,新闻|在Surface Pro 3上运行Ubuntu – 虽不完美但很有戏

    微软从5月21日起接受Surface Pro 3平板PC的预订,没过多久Linux爱好者们就在其上尝试了Ubuntu 14.04.结果是十分有戏的!Surface pro 3宣称其拥有还不错的硬件配置 ...

  2. surface pro 7 linux,微软正式发布Surface Pro 7

    微软正式拉开了新一代Surface Pro机型的序幕,正如预期的那样,这不是全新设备,而是对当前版本的相当细微的升级. 微软Surface Pro 7采用了同样的显示屏,分辨率为2736x1824像素 ...

  3. surface pro linux服务器,在Surface Pro上安装Ubuntu

    微软自家制的Windows 8电脑Surface Pro未开卖就已经搞得满城风雨,不但令昔日夥伴的电脑生产商颇有微言,号称64GB版的Surface Pro也被揭发可用空间只有23GB.但最近终于有一 ...

  4. surface pro linux服务器,在surface Pro 3上使用Linux的体验怎么?

    在surface 3 上使用 Photoshop 和Lightroom ,触控笔体验就像是一支普通的钢笔,可以轻松书写绘画.记录笔记甚至谱曲,体验梦寐以求的数字书写体验,按下一次 Surface 触控 ...

  5. 计算机入门书籍 装系统,Microsoft Surface Pro 7商业书如何重新安装系统U盘安装Win7教程...

    Microsoft SurfacePro7 Business Book是一款功能非常强大的商务办公书,它时尚,轻便,具有非常强大的性能,可以轻松解决用户的需求. 那么,该企业应如何重新安装Win10系 ...

  6. surface pro linux服务器,【如何在surface pro 4上安装linux系统?】-看准网

    匿名用户 这里要更新一下关于secure boot的问题评论里有小伙伴指出现在基本不用关掉secure boot,用signed shim搞起就行,各个主流发行版文档如下https://docs.fe ...

  7. surface pro3深度linux,Surface Pro 3 安装Ubuntu 18.04 体验

    最近把自己的surfacepro3全新安装了Ubuntu 18.04(删除了windows),记录一下 2019-08-02更新: Surface Laptop系列默认安装后不支持自带键盘和触摸板,所 ...

  8. surface pro3深度linux,Microsoft Surface Pro 3 (简体中文)

    翻译状态:本文是 Microsoft_Surface_Pro_3 的翻译.上次翻译日期:2016-01-28.如果英文版本有所更改,则您可以帮助同步翻译. This article or sectio ...

  9. surface pro linux服务器,Surface Pro平板电脑上安装Linux / Ubuntu的技巧

    嗯,Windows 10和Windows 8.1在Surface Pro上运行顺畅,但我认为有些用户想知道如何以及他们是否可以在上安装任何其他操作系统.您会很高兴听到答案是'是'.您始终可以将操作系统 ...

最新文章

  1. 计算机在线作业office,16春地大《计算机级等级考试Office》在线作业二.doc
  2. Moodle安全漏洞如何启动远程代码执行?
  3. 深度学习笔记5:Building Deep Networks for Classification
  4. Kubernetes的控制器类型即使用案例
  5. 用命令行CMD .bat 相关操作 如: 创建快捷方式 复制文件等
  6. Python中矩阵SVD分解及还原
  7. 缓存三大问题及解决方案
  8. 使用kibana或postman操作Elasticsearch的常用命令
  9. django-演练-老师列表页的显示-通过table显示
  10. 黄聪:AngularJS最理想开发工具WebStorm
  11. Android 显示原理简介
  12. 初学QTP系列视频教程
  13. 湖南科技大学计算机实力强吗,湖南省这2所重点大学,吉首大学和湖南科技大学,谁的实力更强...
  14. html如何提取图片颜色代码,解析CSS 提取图片主题色功能(小技巧)
  15. 【机器视觉】——焦距计算物体实际尺寸计算
  16. 网络:IP基础知识总结
  17. java中集合的概念
  18. win10升级助手_详解win7升级win10系统方法
  19. 城市大脑从起源到终极状态的7个阶段
  20. 湖南工程学院java期末考试_湖南工程学院 web java课程设计.docx

热门文章

  1. 获取美国gfs风向数据 转换成png与json 记录软件安装环境
  2. 带你了解地址分配DHCP,IP地址管理方式及分配原则
  3. 数据结构----严蔚敏
  4. 数值分析快速复习(1)——Matlab数值积分
  5. 对数组进行“整体赋值”
  6. python里的map是什么意思_map在python中什么意思
  7. 【Docker】Get Started with Solace
  8. 应用向左,理论向右,计算机2021的冰火两重天
  9. MySQL 批量修改库、表、列的排序规则
  10. [数据结构]头插法与尾插法