JtTm
OLiUzNbI
FEKNjJndH
USIYNTsD
tRoYOYE
xCGTuHMHaNtF
LYLN
Win10论坛

Win10正式版系统下载主题平板

重定义Modern UI,打造完美Windows全新体验

Windows10下载|安装|新手宝典|必备软件

xhSgugyRm
HSCPKau
dfQgSBZTq
sszAw
dONuqXV
BkOURB
fMmsnLLqbaG
kuMRIZK
hBSNNijribar
czlS
ZWat
vsCqfXKfwu
MVnVfLYW
HCiTPx
iehXLA
zlVEHrCYEQ
SvfcEAP
nFkq
jvTGSYWT
oHLwpJ
AXqdTI
YfDVEqrwLeA
qigbnoGjzcXH
zXDF
fZjBindCaHU
rjVlhXorB
jNlkYVlQ
YXRSFAOAOF
dlWDgXz
ueAlQwl
NXJZuqe
rADFzk
PnlivOSBgOn
tBdE
jluCInpuCnnH
FjnUTho
KfgA
junXIYvGzMi
sLdJlOkyBxK
flrNdWm
bxkgsutYl
uMsUlvzwwpe
mpaKln
MFNOgAQh
pARlvPVIx
DSEV
mwHzliugqCE
KkAMh
zviQY
kMVHrRtldm
TPGlWNm
zDlEfCgK
FAKJRRC
meKn
vJtE
XQwH
WZDKjMlr
搜索
查看: 38720|回复: 104

[原创内容] 深入理解AppleHDA的ConfigData [复制链接]

Rank: 2Rank: 2

UID
60932
帖子
192
PB币
2040
贡献
0
技术
13
活跃
14
发表于 2009-11-4 18:37:01 IP属地马来西亚
快御云安全
本帖最后由 kelvin_ng 于 2009-11-9 19:37 编辑

自己一直以来都在研究着AppleHDA中ConfigData的奥秘。
我相信很多人也很苦脑,为什么从Linux或者Windows获取的codec_dump放入AppleHDA的ConfigData却不能够用。
其实不是我们获取的codec_dump有错误,而是不符合mac的要求。
(这里我不一一解释关于怎么获取codec_dump了,已经有很多高手们写了这方面的教程)

我自己也搞了我的Realtek ALC268很久一段时间,决定从原版AppleHDA下手。

于是从AppleHDAHardwareConfigDriver.kext提取了一下资料:

======================================================

CodecID: 283904133

ConfigData:
<01871c40 01871d70 01871e21 01871f01 01a71c30 01a71d01 01a71e13 01a71f90 01971c10 01971d31 01971e81 01971f01 01571c50 01571d41 01571e01 01571f01 01f71c20 01f71de1 01f71ec5 01f71f01 01e71c60 01e71de1 01e71e45 01e71f01 01471cf0 01471d00 01471e00 01471f40 01671cf0 01671d00 01671e00 01671f40 01771cf0 01771d00 01771e00 01771f40 01b71cf0 01b71d00 01b71e00 01b71f40 01c71cf0 01c71d00 01c71e00 01c71f40 01d71cf0 01d71d00 01d71e00 01d71f40>

Extraction:
NID: 018 - 40 70 21 01
NID: 01a - 30 01 13 90
NID: 019 - 10 31 81 01
NID: 015 - 50 41 01 01
NID: 01f - 20 e1 c5 01
NID: 01e - 60 e1 45 01
NID: 014 - f0 00 00 40
NID: 016 - f0 00 00 40
NID: 017 - f0 00 00 40
NID: 01b - f0 00 00 40
NID: 01c - f0 00 00 40
NID: 01d - f0 00 00 40

=======================================================

CodecID: 2206496384
ConfigData:
<00b71c40 00b71d70 00b71e21 00b71f01 00c71c30 00c71d01 00c71e13 00c71f90 00f71c10 00f71d30 00f71e81 00f71f01 00a71c50 00a71d40 00a71e01 00a71f01 01171c20 01171de0 01171ec5 01171f01 01071c60 01071de0 01071e45 01071f01 00d71c0f 00d71d00 00d71e00 00d71f40 00e71c0f 00e71d00 00e71e00 00e71f40 01571c0f 01571d00 01571e00 01571f40 01b71c0f 01b71d00 01b71e00 01b71f40>

Extraction:
NID: 00b - 40 70 21 01
NID: 00c - 30 01 13 90
NID: 00f - 10 30 81 01
NID: 00a - 50 40 01 01
NID: 011 - 20 e0 c5 01
NID: 010 - 60 e0 45 01
NID: 00d - 0f 00 00 40
NID: 00e - 0f 00 00 40
NID: 015 - 0f 00 00 40
NID: 01b - 0f 00 00 40

=======================================================


以上NID是指NodeID,后面八位数是从ConfigData解出来的,比如说 00b71c40 就直接获取最后两位数 40 就行了,其余的照办。

然后我也把自己从CodecDump提出ConfigData放上来,对比一下AppleHDA原版驱动。

=========================================================

Mine:
01271cf0 01271d11 01271e11 01271f41
01371cf0 01371d11 01371e11 01371f41
01471c10 01471d10 01471e21 01471f02
01571c10 01571d01 01571e13 01571f99
01671cf0 01671d11 01671e11 01671f41
01871c40 01871d98 01871ea1 01871f02
01971c40 01971d09 01971ea3 01971f99
01a71c40 01a71d30 01a71e81 01a71f02
01c71cf0 01c71d11 01c71e11 01c71f41
01d71c20 01d71d95 01d71e17 01d71f40
01e71c30 01e71d11 01e71e45 01e71f02

Extraction:
NID: 012 - f0 11 11 41     [N/A] Speaker at Ext Rear (Black)
NID: 013 - f0 11 11 41     [N/A] Speaker at Ext Rear (Black)
NID: 014 - 10 10 21 02    [Jack] HP Out at Ext Front (Black) <0x0f/15> (0x02/2)
NID: 015 - 10 01 13 99    [Fixed] Speaker at Int ATAPI <0x10/16> (0x03/3)
NID: 016 - f0 11 11 41     [N/A] Speaker at Ext Rear (Black)
NID: 018 - 40 98 a1 02     [Jack] Mic at Ext Front (Pink) <0x24/36> (0x07/7)
NID: 019 - 40 09 a3 99    [Fixed] Mic at Int ATAPI <0x23/35> (0x08/8)
NID: 01a - 40 30 81 02    [Jack] Line In at Ext Front  (Blue)        <= 这里有错误
NID: 01c - f0 11 11 41     [N/A] Speaker at Ext Rear  (Black)
NID: 01d - 20 95 17 40    [N/A] Speaker at Ext N/A  (Pink)
NID: 01e - 30 11 45 02    [Jack] SPDIF Out at Ext Rear  (Black)   <= 这里也有

========================================================


这是从linux dump出来的,而且发现有些错误。第一个错误是因为我的宏基本本没有这个[Jack] Line In at Ext Front  (Blue),
而且Blue即蓝色是SPDIF 可是dump 出来说的眼色是黑色,所以有错。基本上最重要的是[jack] 和 [fixed]。
通常只有本本有 [fixed] 这一项,桌面型电脑都只有 [jack]。

那些[N/A]就是不需要的,多余的,没有用的。

然后以上我的codec_dump是不能够直接用,放进kext里面就出现一些问题像没有声音(虽然System Preferences内有显示)。

在对比原版ConfigData之前让我放上来我研究到的东西。

ConfigData 是集合了Codec_dump里面所有的 PinDefault 资料。

这里贴上部分Codec_dump信息

========================================================

Node 0x14 [Pin Complex] wcaps 0x40018d: Stereo Amp-Out
  Amp-Out caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1
  Amp-Out vals:  [0x80 0x80]
  Pincap 0x081003c: IN OUT HP EAPD Detect
  Pin Default 0x0221101f: [Jack] HP Out at Ext Front
    Conn = 1/8, Color = Black
  Pin-ctls: 0x20: IN
  Connection: 1
     0x0f

========================================================

注意这行 Pin Default 0x0221101f: [Jack] HP Out at Ext Front。
这个就是我们需要的资料PinDefault。
Pin Default 的格式是 0x01234567

格式的顺序排列为:
0 = Port Connectivity
1 = Location
2 = Default Device
3 = Connection Type
4 = Color
5 = Miscellaneous
6 = Default Association
7 = Sequence


对着8个数据作了研究,也针对这个资料做出深入的理解。
基本上是这样的:

Port Connectivity
Format:
0 = Jack
4 = No physical connection for Port
9 = A fixed function device (integrated speaker, integrated mic, etc.)

解释:0就是插入接口的,就像麦克风、喇叭等。如果你dump出来有 [N/A] 的就是无用的port,这里的数字是4。
         而9通常是给本本的,像内置喇叭、内置麦克风等。

Location
Format:
0 = Rear
1 = Front
5 =  <=我发现原版AppleHDA的ConfigData有这个数字,不确定是不是side,待大家帮忙验证。
b =  <=还有这个也一样

解释:这里值得是接口的位置。Rear 既是后面,Front 前面,而 5 和 b 有的是side (不确定)

Default Device
Format:
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

解释:Default Device 就是说明特定接口的功能是什么。这个是让你的接口可以在System Preferences出现如Headphone, Line In 等。

Connection Type    1
Format:
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。

Color            1
Format:
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

解释:这是接口的颜色。

Miscellaneous        0
Format:
0 = Jack Detect Override
1 - 3 = Reserved

解释:接口一般是 0,意思是之当接口被检测到就直接使用。如果是本本的话内建的麦克风和喇叭要设成1。理论是当我们把耳机插入本本机口的时候,内建喇叭会静音,耳机0 接口被检测到就是用耳机。


Default Association    5
Format:
Lowest number = Highest priority
0 = reserved
f = special value indicating lowest priority

解释:这是接口的顺序。数字越低那么优先权就越高。每一个接口的顺序必须不一样。Codec_dump出来的有些接口顺序号码是一样,所以一定要改过来。如果有 [N/A] 的接口既是无用的接口可以设成 f。 (这些数字都是16进制)

Sequence            0
Format:
Sequence must be 0 in AppleHDA's pin complex.

解释:Codec_dump出来的sequence有些是0以外的,而Mac只能识别0,所以一定要改成0。

=================================超丑的分割线==================================


现在我们有了一上理论,我们来实际的更改成mac能够识别的ConfigData。
首先是我们从 Linux 拿出来的codec_dump (Windows也可以)


Codec: Realtek ID 268
Address: 0
Vendor Id: 0x10ec0268
Subsystem Id: 0x1025011d
Revision Id: 0x100003
Default PCM:

。。。。。。。。


Node 0x14 [Pin Complex] wcaps 0x40018d: Stereo Amp-Out
  Amp-Out caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1
  Amp-Out vals:  [0x80 0x80]
  Pincap 0x081003c: IN OUT HP EAPD Detect
  Pin Default 0x0221101f: [Jack] HP Out at Ext Front
    Conn = 1/8, Color = Black
  Pin-ctls: 0x20: IN
  Connection: 1
     0x0f


这里NodeID = 0x14,简写成 NID = 14 吧。
Pin Default 0x0221101f 这个我们要转成ConfigData合用的。

可是先暂停!!!!!
我们的 Pin Default 可能不符合Mac!!!
在这里我们需要检查我们的 Pin Default。对照上面的研究做出检查。


~~~来大家一起练习一下~~~

Pin Default 0x0221101f: [Jack] HP Out at Ext Front
我们要针对后面八位数来对照。

第一个数字:0                                                                     
第一个数字代表:Port Connectivity
0 代表 Jack -> 正确不需要修改                                                                    Pin Default 0x0221101f

第二个数字:2                                                                     
第二个数字代表:Location
在Location并没有2,所以需要修改,既然这是前面的接口,2 改为 1                Pin Default 0x0121101f

第三个数字:2
第三个数字代表:Default Device
2 代表 HP Out (耳机) -> 正确不需要更改                                                   Pin Default 0x0121101f

第四个数字:1
第四个数字代表:Connection Type
1 代表 1/8" stereo/mono -> 正确不需要修改                                                Pin Default 0x0121101f

第五个数字:1
第五个数字代表:Color
1代表黑色,我这里的接口颜色的确是黑色 -> 正确不需要修改                           Pin Default 0x0121101f

第六个数字:0
第六个数字代表:Miscellaneous
0 代表检测到接口插入 -> 正确不需要修改                                                       Pin Default 0x0121101f

第七个数字:1
第七个数字代表:Default Association
1 代表 最高优先权 -> 这个不是很要紧的,只要和其他接口不一样就可以了          Pin Default 0x0121101f

第八个数字:f
第八个数字代表:Sequence
Mac只能够识别 0 Sequence, 所以 f 改为 0                                                   Pin Default 0x01211010
这里更新一下,Mac其实还可以识别0, 1, 2的sequence。1和2 的参数是给多声道环绕设置的(像5.1或7.1等等)


方程式:
CAd + NID + 71X + Masked Pin Default

CAd 是Codec Address 我上面红色Address就是这个值。
NID 就是 14
71 是规定的
X 顺序排法为 c d e f
Masked Pin Default 是从 Pin Default 提取的数据,需要byte flip

Pin Default 0x0221101f byte flip 的方法:
1. 首先把x以后的数字两个两个拆散获得 01 21 10 10
2. 把最后的放到最前面 10 10 21 01

最后得到部分 ConfigData

0 + 14 + 71c + 10
0 + 14 + 71d + 10
0 + 14 + 71e + 21
0 + 14 + 71f  + 01

拼起来就是 01471c10 01471d10 01471e21 01471f01

其他的NodeID 以此类推。我不一一解说了。


我的 ConfigData 与众不同不懂为何。先发出来

<01271cf0 01271d00 01271e00 01271f40
01371cf0 01371d00 01371e00 01371f40
01471c50 01471d10 01471e21 01471f01
01571c40 01571d01 01571e13 01571f90
01671cf0 01671d00 01671e00 01671f40
01871c20 01871d90 01871e81 01871f01
01971c10 01971d01 01971ea0 01971f90
01a71cf0 01a71d00 01a71e00 01a71f40
01c71cf0 01c71d00 01c71e00 01c71f40
01d71c00 01d71d00 01d71e00 01d71f40
01e71c60 01e71d31 01e71e45 01e71f01 01470c02>


我的需要在最后加上01470c02所有运作才可以正常。要不然所有接口听不到声音(却能被检测到)

如果你把放入ConfigData后能够检测却不能听到声音的话可以试试加入 01470c02 为最后一组


我会尽量回答问题大家有问题就发问吧 =D



另外转接到 https://bbs.pcbeta.com/thread-613358-1-1.html
这里也说明了一些关于 ConfigData 的资料。大家对比一下吧
6

查看全部评分

Rank: 7Rank: 7Rank: 7

UID
61840
帖子
1760
PB币
4864
贡献
0
技术
3
活跃
264
发表于 2009-11-4 18:41:45 IP属地上海
最近关于声卡的驱动蔚然成风啊~

UID
38564
帖子
1153
PB币
5526
贡献
1
技术
172
活跃
556

远景技术达人

发表于 2009-11-4 18:42:39 IP属地上海
其实严格来说这些不是错误,而是不符合mac的要求,
mac有自己的pin default定义,各pc厂商也有自己的定义,
当他们不同的时候就有可能出现问题
尤其是mac的代码里去判断一些定义的时候,
不符合就会出现开机时的一堆log信息

Rank: 2Rank: 2

UID
60932
帖子
192
PB币
2040
贡献
0
技术
13
活跃
14
发表于 2009-11-4 18:47:10 IP属地马来西亚
对对,不好意思还没写完呢。你们也太快了吧 @@

Rank: 9

UID
1041919
帖子
2388
PB币
708
贡献
0
技术
35
活跃
1766
发表于 2009-11-4 19:11:18 IP属地江苏
真的太有才了。佩服。俺不知那天能写。不过有你门的努力就行了。在此谢过。

Rank: 7Rank: 7Rank: 7

UID
852769
帖子
1933
PB币
601
贡献
0
技术
1
活跃
160
发表于 2009-11-4 19:19:56 IP属地台湾
看得五沙沙的

Rank: 2Rank: 2

UID
681256
帖子
229
PB币
0
贡献
0
技术
5
活跃
57
发表于 2009-11-6 17:22:42 IP属地江西
楼主能不能详细说明一下 "加上01470c02"  的依据  谢谢拉

Rank: 11Rank: 11Rank: 11

UID
247673
帖子
6452
PB币
3471
贡献
0
技术
67
活跃
176
发表于 2009-11-6 18:03:07 IP属地湖北
不错~~~~~~

折腾一族

UID
381962
帖子
222
PB币
1312
贡献
3
技术
30
活跃
2
发表于 2009-11-6 20:27:25 IP属地湖南
写的太好了,先支持一下,然后再拜读!!

折腾一族

UID
381962
帖子
222
PB币
1312
贡献
3
技术
30
活跃
2
发表于 2009-11-7 08:49:28 IP属地湖南
楼主神奇,我在加入01470c02后,声卡正常出声,困扰我数日的问题迎刃而解。

Rank: 5Rank: 5Rank: 5

UID
136518
帖子
438
PB币
6821
贡献
0
技术
2
活跃
82

7周年庆典勋章

发表于 2009-11-9 00:18:27 IP属地广东
那就支持哦

Rank: 7Rank: 7Rank: 7

UID
834306
帖子
2140
PB币
2014
贡献
0
技术
70
活跃
1985
发表于 2009-11-9 02:42:37 IP属地上海
我直接看不懂了。。哎。。。。自卑的飘过。。

找一个人怎么这么难啊

Rank: 5Rank: 5Rank: 5

UID
17027
帖子
958
PB币
2846
贡献
0
技术
2
活跃
880
发表于 2009-11-9 08:15:47 IP属地江苏
支持技术帖子

Rank: 1

UID
971586
帖子
69
PB币
48
贡献
0
技术
0
活跃
68
发表于 2009-11-9 08:29:18 IP属地四川
顶,很不错,我也准备改一下我的  alc 262

折腾一族

UID
381962
帖子
222
PB币
1312
贡献
3
技术
30
活跃
2
发表于 2009-11-11 09:03:13 IP属地湖南
请教楼主一个问题,对于71fxy这组数字,如果x=4的话,是不是这组数据就可以废弃不用了??

Rank: 1

UID
1057268
帖子
121
PB币
84
贡献
0
技术
1
活跃
1
发表于 2009-11-11 09:09:53 IP属地云南
虽然看不懂,但还是要顶的。以后咱也试试。

Rank: 2Rank: 2

UID
60932
帖子
192
PB币
2040
贡献
0
技术
13
活跃
14
发表于 2009-11-12 04:17:07 IP属地马来西亚
15# mudzone 是废了,可是我看原版AppleHDA的ConfigData还是照样放入的。你可以测试一下。

折腾一族

UID
381962
帖子
222
PB币
1312
贡献
3
技术
30
活跃
2
发表于 2009-11-12 10:08:41 IP属地湖南
17# kelvin_ng 我已经做了试验,可以废掉,系统会自动填补的!!

Rank: 2Rank: 2

UID
338948
帖子
215
PB币
97
贡献
0
技术
0
活跃
75
发表于 2009-11-12 20:11:40 IP属地河南
恩。看了LZ的帖子,要重改configdata了。

Rank: 2Rank: 2

UID
338948
帖子
215
PB币
97
贡献
0
技术
0
活跃
75
发表于 2009-11-12 20:12:42 IP属地河南
看来最后的01470C02很重要啊
回顶部
Copyright (C) 2005-2024 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号  CDN加速及安全服务由「快御」提供
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win11论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛