积分 77 最后登录 2016-7-19 精华 0 阅读权限 20 主题 7 UID 60932 帖子 192 PB币 2040 威望 0 贡献 0 技术 13 活跃 14
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 0x01 21101f
第三个数字:2
第三个数字代表:Default Device
2 代表 HP Out (耳机) -> 正确不需要更改 Pin Default 0x01 21101f
第四个数字:1
第四个数字代表:Connection Type
1 代表 1/8" stereo/mono -> 正确不需要修改 Pin Default 0x01 21101f
第五个数字:1
第五个数字代表:Color
1代表黑色,我这里的接口颜色的确是黑色 -> 正确不需要修改 Pin Default 0x01 21101f
第六个数字:0
第六个数字代表:Miscellaneous
0 代表检测到接口插入 -> 正确不需要修改 Pin Default 0x01 21101f
第七个数字:1
第七个数字代表:Default Association
1 代表 最高优先权 -> 这个不是很要紧的,只要和其他接口不一样就可以了 Pin Default 0x01 21101f
第八个数字:f
第八个数字代表:Sequence
Mac只能够识别 0 Sequence, 所以 f 改为 0 Pin Default 0x01 211010
这里更新一下,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
查看全部评分