本人笔记本电脑是一台联想v480c,声卡为alc269VC ,为了追求完美驱动声卡,不想用万能声卡,经过一段时间的摸索,只能做到让内置扬声器和外置耳机发声,但是内置麦克虽有驱动,但是不正常为杂音,而外置麦完全检测不到,外置接口为二合一的接口,一共参考过多位大神的贴子,一直不得入其门,所以决定将整个定制过程以贴子发出,请求各路大神指点迷津,如能成功或此贴可成为其他还在探索中的另一指引,在此先行谢谢大家,再次希望能够在这里多多交流。
先把自己得到的资源打包分享,以方便大家下载使用:https://pan.baidu.com/s/1RJb2GtS_xqoRmcnMfIIB6w 密码: 8rxd以上网盘我会将各种我搜集到的工具软件、苹果镜像、和我自己电脑提取到的code,dsdt等资源都放到里面,所有有需要的都可以去看看。 其它的话不多说了,正式进入声卡驱动的DIY吧。 首先,可能需要的工具有:1、ubuntu启动U盘。2、iDSDT工具。3、dsdt相关文件(主要是注入ID用,因为我的声卡用clover 的ID 驱动不了,关于DSDT会另外立贴讨论,就不在这里啰嗦了)
第一步、提取声卡code文件,我这里是通过ubuntu的启动U盘进入ubuntu试用提取的,懂的人还可以通过hjmac的启动U盘(我的网盘里有)和windows注册表去提取code,效果都差不多的。
第二步、提取到code后,搜索Pin Default,把所有带Pin Default的那行数据提取出来,并找到此行上面最近的那行Node地址,记得录下来。我的code得到结果如下 0x12 Pin Default 0x411111f0: [N/A] Speaker at Ext Rear 0x14 Pin Default 0x90170110: [Fixed] Speaker at Int N/A 0x15 Pin Default 0x0321101f: [Jack] HP Out at Ext Left 0x17 Pin Default 0x411111f0: [N/A] Speaker at Ext Rear 0x18 Pin Default 0x03a11830: [Jack] Mic at Ext Left VREF_80(Pin Default行后面几行内容如果有 VREF_数字串、这样的一并提取出来,列在同一行) 0x19 Pin Default 0x90a7093f: [Fixed] Mic at Int N/A VREF_80 0x1a Pin Default 0x411111f0: [N/A] Speaker at Ext Rear 0x1b Pin Default 0x411111f0: [N/A] Speaker at Ext Rear 0x1d Pin Default 0x40130605: [N/A] Speaker at Ext N/A 0x1e Pin Default 0x411111f0: [N/A] Speaker at Ext Rear
第三步、根据以下说明整理以上数据。参考https://bbs.pcbeta.com/viewthread-614489-1-2.html 深入理解AppleHDA的ConfigData 1、0X后的第一位数字,0表示外接插入接口,4表示无用的接口,9表示笔记本的内置接口 2、0X后的第二位数字,0表示rear(后面的接口,笔记本为内置接口),1表示front(前面的接口、笔记本为外接接口),其它的上面原贴还说了5和b,我并没有看懂是什么,但我的笔记本用不上,所以暂时不管,有兴趣的可以跟贴讨论。 3、0X后的第三位数字,说明接口功能属性,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(有资料说笔记本的这个接口和外接MIC会有冲突,外接接口要改成8Line in才行),B为Telephone,C为SPDIF in,E为Reserved F为Other 4、0X后的第四位数字,连接类型说明,0为unknow(第一位数字为4表示无用的端口,这里就可以设为0),1为 1/8" stereo/mono(在code文件里会有相关说明根据情况定,我的CODE里都是1/8" ),2为1/4' stereo/mono(说明同前)、3为ATAPI internal(笔记本内建接口类型)、4为RCA、5为optical、6为Other Digital、7为Other Analog、8为Mulitchanner Analog(DIN)、9为XLR/Professional、A为RJ-11 (Modem)、B为Combination、F为Other 5、0X后的第五位数字,接口颜色说明。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 = Othe(笔记本外置接口都给黑色、内置都为0、无用接口也设为0,或都不改) 6、0X后的第六位数字,接口检测。0 = Jack Detect Override、1 - 3 = Reserved(笔记本内建麦克风和喇叭设为1) 7、0X后的第七位数字,接口的顺序,数字越高优先权越高,建议按内置mic为1、外置mic为2、内置扬声器为3,外接耳机接口均为4(多声道接口可以有多个4),无用接口全部设为f 8、0X后的第七位数字,MAC只认0,1、2,因为是笔记本电脑,只有两声道所以通通改为0就可以。 最后得到结果: |
0x12 Pin Default 0x400000f0: [N/A] Speaker at Ext Rear 0x14 Pin Default 0x90130130: [Fixed] Speaker at Int N/A 0x15 Pin Default 0x01211040: [Jack] HP Out at Ext Left 0x17 Pin Default 0x400000f0: [N/A] Speaker at Ext Rear 0x18 Pin Default 0x01811020: [Jack] Mic at Ext Left 0x19 Pin Default 0x90a30110: [Fixed] Mic at Int N/A 0x1a Pin Default 0x400000f0: [N/A] Speaker at Ext Rear 0x1b Pin Default 0x400000f0: [N/A] Speaker at Ext Rear 0x1d Pin Default 0x400000f0: [N/A] Speaker at Ext N/A 0x1e Pin Default 0x400000f0: [N/A] Speaker at Ext Rear
第四步、将以上数字从后到前,(比如 aabbccdd,转换后就得到 dd,cc,bb,aa)每两位为一组提取出来得到以下结果 0x12 Pin Default 0x400000f0: [N/A] Speaker at Ext Rear f0 00 00 40 0x14 Pin Default 0x90130130: [Fixed] Speaker at Int N/A 30 01 13 90 0x15 Pin Default 0x01211040: [Jack] HP Out at Ext Left 40 10 21 01 0x17 Pin Default 0x400000f0: [N/A] Speaker at Ext Rear f0 00 00 40 0x18 Pin Default 0x01811020: [Jack] Mic at Ext Left 20 10 81 01 MuteGPIO值 = VREF + 0100 + NodeID = 0x50010018 = 1342242840 0x19 Pin Default 0x90a30110: [Fixed] Mic at Int N/A 10 01 a3 90 MuteGPIO值 = VREF + 0100 + NodeID = 0x50010019 = 1342242841 0x1a Pin Default 0x400000f0: [N/A] Speaker at Ext Rear f0 00 00 40 0x1b Pin Default 0x400000f0: [N/A] Speaker at Ext Rear f0 00 00 40 0x1d Pin Default 0x400000f0: [N/A] Speaker at Ext N/A f0 00 00 40 0x1e Pin Default 0x400000f0: [N/A] Speaker at Ext Rear f0 00 00 40
根据紫米的教程,转换为最终的Config: Address + Node + 71c + 【dd】、Address + Node + 71d + 【cc】、Address + Node + 71e + 【bb】、Address + Node + 71f + 【aa】 以上得到每行四组,每组8位的一串数字的16进制数字(我的地址都是0,NODE取后两位,最后一组数字串(01470c02),如果在你的code里有EAPD字样,就加上) 01271cf0 01271d00 01271e00 01271f40 01471c30 01471d01 01471e13 01471f90 01571c40 01571d10 01571e21 01571f01 01771cf0 01771d00 01771e00 01771f40 01871c20 01871d10 01871e81 01871f01 01971c10 01971d01 01971ea3 01971f90 01a71cf0 01a71d00 01a71e00 01a71f40 01b71cf0 01b71d00 01b71e00 01b71f40 01d71cf0 01d71d00 01d71e00 01d71f40 01e71cf0 01e71d00 01e71e00 01e71f40 01470c02
去掉回车符,得到最终的config值
01271cf0 01271d00 01271e00 01271f40 01471c30 01471d01 01471e13 01471f90 01571c40 01571d10 01571e21 01571f01 01771cf0 01771d00 01771e00 01771f40 01871c20 01871d10 01871e81 01871f01 01971c10 01971d01 01971ea3 01971f90 01a71cf0 01a71d00 01a71e00 01a71f40 01b71cf0 01b71d00 01b71e00 01b71f40 01d71cf0 01d71d00 01d71e00 01d71f40 01e71cf0 01e71d00 01e71e00 01e71f40 01470c02
疑点一、config里无用的端口值需不需要保留,另外每一行config数据有没有顺序要求?
第五步、推导节点 按照紫米的教程,两个输出端口都是正向推导查找(如Node 值为 0x14,则0x14就是第一个节点,然后找0x14,找到后查看Connection下一行的值,推导出第二个节点值,然后再查找Node 值为第二个节点值的值,可以推导出第三个节点值。) 0x14 Pin Default 0x90130130: [Fixed] Speaker at Int N/A 此为内置扬声器,属于音频输出,在code里查找0x14,只找到一个值如下 - Node 0x14 [Pin Complex] wcaps 0x40058d: Stereo Amp-Out
- Control: name="Speaker Playback Switch", index=0, device=0
- ControlAmp: chs=3, dir=Out, idx=0, ofs=0
- Amp-Out caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1
- Amp-Out vals: [0x00 0x00]
- Pincap 0x00010014: OUT EAPD Detect
- EAPD 0x2: EAPD
- Pin Default 0x90170110: [Fixed] Speaker at Int N/A
- Conn = Analog, Color = Unknown
- DefAssociation = 0x1, Sequence = 0x0
- Misc = NO_PRESENCE
- Pin-ctls: 0x40: OUT
- Unsolicited: tag=00, enabled=0
- Power states: D0 D1 D2 D3 EPSS
- Power: setting=D0, actual=D0
- Connection: 2
- 0x0c 0x0d*
复制代码
取Connection: 2下面0x0c 做为第二个节点。 0x14>0x0c 再查0x0c - Node 0x0c [Audio Mixer] wcaps 0x20010b: Stereo Amp-In
- Amp-In caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1
- Amp-In vals: [0x00 0x00] [0x80 0x80]
- Connection: 2
- 0x02 0x0b
复制代码0x0c 作为node节点的只有一个,取最小的0x02 ,得到第三个节点,最终得到内置扬声器节点为 0x14>0x0c>0x02 转为10进制为 20>12>2
同样的耳机输出口,0x15 Pin Default 0x01211040: [Jack] HP Out at Ext Left 在code里查找0x15,只找到一个值如下 - Node 0x15 [Pin Complex] wcaps 0x40058d: Stereo Amp-Out
- Control: name="Headphone Playback Switch", index=0, device=0
- ControlAmp: chs=3, dir=Out, idx=0, ofs=0
- Amp-Out caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1
- Amp-Out vals: [0x80 0x80]
- Pincap 0x0001001c: OUT HP EAPD Detect
- EAPD 0x2: EAPD
- Pin Default 0x0321101f: [Jack] HP Out at Ext Left
- Conn = 1/8, Color = Black
- DefAssociation = 0x1, Sequence = 0xf
- Pin-ctls: 0xc0: OUT HP
- Unsolicited: tag=01, enabled=1
- Power states: D0 D1 D2 D3 EPSS
- Power: setting=D3, actual=D3
- Connection: 2
- 0x0c* 0x0d
复制代码0x0c用过的,不能用重复的,所以取0x0d为第二个节点,接着查0x0d - Node 0x0d [Audio Mixer] wcaps 0x20010b: Stereo Amp-In
- Amp-In caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1
- Amp-In vals: [0x00 0x00] [0x80 0x80]
- Connection: 2
- 0x03 0x0b
复制代码x0d 作为node节点的只有一个,取最小的0x03,得到第三个节点,最终得到外接耳机的节点为 0x15>0x0d>0x03 转为10进制为 21>13>3
接下来,0x18 Pin Default 0x01811020: [Jack] Mic at Ext Left 为外置麦克风接口,属于音频输入接口,所以要反推,即找Connection下一行为0x18的值,然后向上反推node节点,即为中部的这个节点。 分别找到(0x0b、0x22、0x23) 找到以上值后先不管,接着往下找另一个内置麦克风接口节点。 同理0x19 Pin Default 0x90a30110: [Fixed] Mic at Int N/A 找Connection下一行为0x19的值,然后向上反推node节点,即为中部的这个节点。 一样分别找到(0x0b、0x22、0x23) 直接推导出问题了,于是用iDSDT工具生成的驱动中的Platforms.xml文件中的PathMaps值,得到9>34>24和8>35>25,转为16进制为9>22>18和8>23>19 最终得出 内置扬声器[Fixed] Speaker at Int N/A 节点为 20>12>2 (由IDSDT工具生成的为 20>13>3) 外接耳机[Jack] HP Out at Ext Left 节点为 21>13>3 (由IDSDT工具生成的为 21>12>2) 外置麦克风[Jack] Mic at Ext Left 节点为 8>34>24 (由IDSDT工具生成的) 内置麦克风[Fixed] Mic at Int N/A 节点为 9>35>25 由IDSDT工具生成的)
疑点二、这里出现了两个疑点,第一个疑点是正向推导输出时,得到的0x0c 0x0d*这两个值是取带*号的值,还是取最小值?参考紫米的教程,当输出下面有两个以上的值时,其中一个节点有*号出现,只接选带*号的值为节点,另外一个教程则说的是当都没有带*号的节点时,则选取最小值为节点。所以最终输出接口的节点应该以由IDSDT工具生成的为准。 第二个疑点是,当输入找出的节点有多个时,如何处理。这个时候可以用排除法,输入接口三个接口一般是都有以下字样 Audio input>Audio Mixer>Mic,因为是反推,所以我这里mic字样应该是对应0x18,推导出0x0b、0x22、0x23都为Audio Mixer值,而0x0b反推却找不到Audio input值,所以,排除掉0x0b,而0x22、0x23分别对应查到09和08对应都是Audio input值,接下来我的理解是,可以按照优先等级,数字较小的分配给优先级别高的,或者是按node值大小对应,node值大的对应大的节点,node值小的对应更小的节点,node值为0x18(10进制为24,对应的Audio Mixer值为34)
|