又一流水账。
基本信息
1.声卡型号:Realtek ALC269VC
2.提取声卡 codec
- Ubuntu Desktop 刻录 U 盘镜像,直接在试用模式操作键鼠提取文件,路径
/proc/asound/card*
。 - Clover 提取需要驱动 AudioDxe.efi,界面按 F8,保存路径
EFI/CLOVER/misc
。 - 建议两种模式各提取一次。
有效节点 + 路径信息
Ubuntu 提取有效 Node 节点
1.在 Ubuntu Shell 输入代码提取
ubuntu@ubuntu:~$ dmesg | grep snd
[ 14.589033] snd_hda_codec_realtek hdaudioC0D0: autoconfig for ALC269VC: line_outs=1 (0x14/0x0/0x0/0x0/0x0) type:speaker
[ 14.589036] snd_hda_codec_realtek hdaudioC0D0: speaker_outs=0 (0x0/0x0/0x0/0x0/0x0)
[ 14.589038] snd_hda_codec_realtek hdaudioC0D0: hp_outs=1 (0x15/0x0/0x0/0x0/0x0)
[ 14.589039] snd_hda_codec_realtek hdaudioC0D0: mono: mono_out=0x0
[ 14.589040] snd_hda_codec_realtek hdaudioC0D0: dig-out=0x1e/0x0
[ 14.589041] snd_hda_codec_realtek hdaudioC0D0: inputs:
[ 14.589042] snd_hda_codec_realtek hdaudioC0D0: Mic=0x18
[ 14.589044] snd_hda_codec_realtek hdaudioC0D0: Internal Mic=0x12
2.可在 Ubuntu 设置-声音面板查看硬件:内外扬声器、内外麦克风的切换 & 使用是否正常,这个操作对后续提供判断很有作用。
3.从命令日志获得节点:0x14
0x15
0x1e
0x18
0x12
,配合下面手工提取会更准确。
Windows 提取有效 Node 节点 + PathMap 路径信息
1.先恢复微软或官方原始声卡驱动
2.安装 Windows 工具 High Definition Audio Utility,进入 File => Local Machine Codecs => 选择声卡
查看中栏信息
Static device -> 静态设备 - 内置
Dynamic device -> 动态设备 - 外置
1.音频输出
RedirectedHpSpeaker (Static)
0x14 0x2->0xC->0x14
0x15 0x2->0xC->0x15
SpdifOut (Static)
0x1E 0x6->0x1E
2.音频输入
MicIn (Dynamic)
0x18 0x8->0x23->0x18
MicIn (Static)
0x12 0x9->0x22->0x12
5 个有效节点0x14,0x15,0x1E,0x18,0x12
整理数据得到
节点(16 进制) 10 进制 路径修正(音频输出从右向左推,输入从左向右推) 设备确定
0x14 0x2->0xC->0x14 20 2->12->20 20->12->2 Speaker 内置扬声器
0x15 0x2->0xC->0x15 21 2->12->21 21->12->2 HP Out 外置扬声器
0x1E 0x6->0x1E 30 6->30 30->6 SPDIF 数字传输
0x18 0x8->0x23->0x18 24 8->35->24 8->35->24 Mic In 外置麦克风
0x12 0x9->0x22->0x12 18 9->34->18 9->34->18 Mic In 内置麦克风
提取左栏 5 个节点信息,用于信息对比 (展开 Audio -> Widgets -> 0x1* 节点 -> Controls -> Pin Configuration)
多研究这个工具,一定会得到更多的声卡信息。
0x14 misc: 0x1
color: Unknow
connection type: Other analog
DefaultDevice: Speaker
Directional Location: N/A
Location: Internal
Port Connectivity: Fixed Function Device
0x15 misc: 0x0
color: Black
connection type: 1/8" stereo/mono ==> 3.5mm 接口
DefaultDevice: HP Out
Directional Location: Front
Location: External
Port Connectivity: Jack
0x1E misc: 0x1
color: Black
connection type: RCA
DefaultDevice: SPDIF
Directional Location: Front
Location: External
Port Connectivity: Jack
0x18 misc: 0x0
color: Black
connection type: 1/8" stereo/mono ==> 3.5mm 接口
DefaultDevice: Mic In
Directional Location: Front
Location: External
Port Connectivity: Jack
0x12 misc: 0x1
color: Unknow
connection type: Other Digital
DefaultDevice: Mic In
Directional Location: N/A
Location: Internal
Port Connectivity: Fixed Function Device
获取 configData
macOS 打开 PinConfigurator.app 导入 codec#0
选择修补 -> 删除无效节点,剩下的数量明显多于整理出的有效节点,手动移除那些没见过、很奇怪、从未使用的节点。
(类似 Other、ATAPI、Modern、CD,移除操作具体情况具体分析)
修正插口位置
修正设备类型
笔记本外置麦克风 Mic Ext
需设置为 Line In
,按照白苹果规范设定,否则不能正常工作。
记录 EAPD 字样的节点 (下面会用到):0x14
0x15
点击获取 ConfigData:
01471C10 01471D01 01471E17 01471F99 01470C02 01571C1F 01571D10 01571E21 01571F01 01570C02 01E71C20 01E71D11 01E71E44 01E71F01 01871C30 01871D10 01871E81 01871F01 01271C40 01271D01 01271EA6 01271F99
整理数组,直观分析
01471C10 01471D01 01471E17 01471F99 01470C02
01571C1F 01571D10 01571E21 01571F01 01570C02
01E71C20 01E71D11 01E71E44 01E71F01
01871C30 01871D10 01871E81 01871F01
01271C40 01271D01 01271EA6 01271F99
1.带 EAPD 字样的两个节点多出 01470C02 01570C02,等下直接丢到最后。
(测试只放 01470C02 也能用,分析原生 AppleHDA 驱动也是这么做的,01570C02 放不放貌似没有硬性要求)
2.多出数值可以在 AppleALC/Resources/PinConfigs.kext/Contents/Info.plist
找到 WakeConfigData。
(AppleALC_v1.2.5 更新日志里有提及,应该和睡眠唤醒无声有关 https://www.insanelymac.com/forum/topic/311293-applealc-%E2%80%94-dynamic-applehda-patching/?do=findComment&comment=2609221)
整理数据
0x14 节点数据 <01470C02> 放到最后,
0x15 节点数据 <01570C02> 放到最后(存疑),
得到最终 configData:
01471C10 01471D01 01471E17 01471F99 01571C1F 01571D10 01571E21 01571F01 01E71C20 01E71D11 01E71E44 01E71F01 01871C30 01871D10 01871E81 01871F01 01271C40 01271D01 01271EA6 01271F99 01470C02 01570C02
获取源码 AppleALC
cd desktop && git clone https://github.com/acidanthera/AppleALC.git
1.声卡型号 ALC269 可用 layoutID 有:
0x100004, 0x100100, 0x100202, 0x100203,1-21, 27-33, 35, 40, 45, 55, 58, 66, 76, 88, 93, 99, 100, 127, 188
2.进入 AppleALC/Resources/ALC269
,这里选择 layout29.xml。
3.需要修改的文件:
|____AppleALC
|...
|____Resources(删除其它声卡 文件夹)
|____ALC269 (删除其它声卡 xml)
| |____Info.plist (已修改)
| |____Platforms29.xml (已修改)
| |____layout29.xml (已修改)
|____Controllers.plist
|____Kexts.plist
|____Vendors.plist
|____PinConfigs.kext (已修改)
|____Contents
|____Info.plist
修改下列四个文件:
Platforms29.xml、Platforms29.xml、info.plist、PinConfigs.kext/Contents/info.list
1.PlistEdit 修改 Platforms29.xml(PathMap 映射文件)
- 先修改
PathMapID
为 29,然后逐级展开,只修改 NodeID。其它保持原样,后期微调才动。 清晰结构图 (0、1 非二进制,仅仅是 item 0、item 1)
PathMap |____0 (音频输入) | |____0 (内置麦克风 PathMap:9->34->18) | | |____0 | | |____0 | | | |____AMP Amplifier(音频功率放大器,可将低功率电子音频信号放大到足以驱动扬声器或耳机的电平) | | | | |____Channels | | | | | |____0 | | | | | | |____Bind 1 (声道数(0 单声道,1&2 双声道)) | | | | | | |____Channel 1 (设定声道位置(1 后左,2 后右,3 前置中央,4 重低音,5 前左,6 前右)) | | | | | |____1 | | | | | |____Bind 2 | | | | | |____Channel 2 | | | | |____MuteInputAmp 是 (该选项对麦克风静音是否有效未知,但是对扬声器静音是有用的,所以扬声器建议都选 true) | | | | |____PublishMute 否 (显示静音控制选项,在 音频 MIDI 设置输入选项能看到) | | | | |____PublishVolume 否 (显示左右声道选项) | | | | |____VolumeInputAmp 是 (显示输入音量控制选项,在偏好设置-声音-输入能看到) | | | |____MinimumSampleRate 48000 (采样率) | | | |____NodeID 9 | | |____1 | | | |____AMP | | | | |____Channels | | | | | |____0 | | | | | | |____Bind 1 | | | | | | |____Channel 1 | | | | | |____1 | | | | | |____Bind 2 | | | | | |____Channel 2 | | | | |____MuteInputAmp 是 | | | | |____PublishMute 否 | | | | |____PublishVolume 否 | | | | |____VolumeInputAmp 否 | | | |____NodeID 34 | | |____2 | | |____Boost 1(默认 1,看过一些资料,可能是某些声卡驱动麦克风的关键点,范围值 1~3) | | |____NodeID 18 | | | |____1 (外置麦克风 PathMap:8->35->24) | |____0 | |____0 | | |____AMP | | | |____Channels | | | | |____0 | | | | | |____Bind 1 | | | | | |____Channel 1 | | | | |____1 | | | | |____Bind 2 | | | | |____Channel 2 | | | |____MuteInputAmp 是 | | | |____PublishMute 否 | | | |____PublishVolume 否 | | | |____VolumeInputAmp 是 | | |____MinimumSampleRate 48000 | | |____NodeID 8 | |____1 | | |____AMP | | | |____Channels | | | | |____0 | | | | | |____Bind 1 | | | | | |____Channel 1 | | | | |____1 | | | | |____Bind 2 | | | | |____Channel 2 | | | |____MuteInputAmp 是 | | | |____PublishMute 否 | | | |____PublishVolume 否 | | | |____VolumeInputAmp 否 | | |____MinimumSampleRate 48000 | | |____NodeID 35 | |____2 | |____Boost 2(音量增益,有其它说法:Mic Ext 外置 = 1,Mic Int 内置 = 3,但看过白苹果很多参数内外都设定 3,建议先不改看是否正常。) | |____NodeID 24 | |____1 (音频输出) | |____0 (内置扬声器 PathMap: 20->12->2) | | |____0 | | |____0 | | | |____AMP | | | | |____Channels | | | | | |____0 | | | | | | |____Bind 1 | | | | | | |____Channel 1 | | | | | |____1 | | | | | |____Bind 2 | | | | | |____Channel 2 | | | | |____MuteInputAmp 是 | | | | |____PublishMute 是 | | | | |____PublishVolume 是 | | | | |____VolumeInputAmp 否 (该选项应该只针对麦克风,功能是显示:音量界面-输入-输入电平,和显示噪音分呗差不多) | | | |____NodeID 20 | | |____1 | | | |____AMP | | | | |____Channels | | | | | |____0 | | | | | | |____Bind 1 | | | | | | |____Channel 1 | | | | | |____1 | | | | | |____Bind 2 | | | | | |____Channel 2 | | | | |____MuteInputAmp 是 | | | | |____PublishMute 是 | | | | |____PublishVolume 是 | | | | |____VolumeInputAmp 否 | | | |____NodeID 12 | | |____2 | | |____AMP | | |____Channels | | | |____0 | | | | |____Bind 1 | | | | |____Channel 1 | | | |____1 | | | |____Bind 2 | | | |____Channel 2 | | |____MuteInputAmp 是 | | |____PublishMute 是 | | |____PublishVolume 是 | | |____VolumeInputAmp 否 | | |____NodeID 2 | | | |____1 (外置扬声器 PathMap:21->12->2) | |____0 | |____0 | | |____AMP | | | |____Channels | | | | |____0 | | | | | |____Bind 1 | | | | | |____Channel 1 | | | | |____1 | | | | |____Bind 2 | | | | |____Channel 2 | | | |____MuteInputAmp 是 | | | |____PublishMute 是 | | | |____PublishVolume 是 | | | |____VolumeInputAmp 否 | | |____NodeID 21 | |___1 | | |____AMP | | | |____Channels | | | | |____0 | | | | | |____Bind 1 | | | | | |____Channel 1 | | | | |____1 | | | | |____Bind 2 | | | | |____Channel 2 | | | |____MuteInputAmp 是 | | | |____PublishMute 是 | | | |____PublishVolume 是 | | | |____VolumeInputAmp 否 | | |____NodeID 12 | |___2 | |____AMP | | |____Channels | | | |____0 | | | | |____Bind 1 | | | | |____Channel 1 | | | |____1 | | | |____Bind 2 | | | |____Channel 2 | | |____MuteInputAmp 是 | | |____PublishMute 是 | | |____PublishVolume 是 | | |____VolumeInputAmp 否 | |____NodeID 2 | |____2 (SPDIF Out 数字传输 PathMap:30->6) 暂时不理 |____0 | |____0 | |____0 | |____AMP | | |____Channels | | | |____0 | | | | |____Bind 1 | | | | |____Channel 1 | | | |____1 | | | |____Bind 2 | | | |____Channel 2 | | |____MuteInputAmp 是 | | |____PublishMute 是 | | |____PublishVolume 是 | | |____VolumeInputAmp 否 | |____NodeID 30 |____1 |____0 |____1 |____AMP | |____Channels | | |____0 | | | |____Bind 1 | | | |____Channel 1 | | |____1 | | |____Bind 2 | | |____Channel 2 | |____MuteInputAmp 是 | |____PublishMute 是 | |____PublishVolume 是 | |____VolumeInputAmp 否 |____NodeID 6
补充
MuteInputAmp,PublishMute,PublishVolume,VolumeInputAmp
参数定义可从 Amp-In 或 Amp-Out:nsteps & mute 入手。
# 引用 Code#0 样例
Amp-Out caps ofs=0, nsteps=0, stepsize=0, mute=1 Nsteps=0 => PublishVolume=false Mute=1 => PublishMute=true
Amp-In caps ofs=0, nsteps=0, stepsize=0, mute=1 Nsteps=0 => MuteInputAmp= false Mute=1 => VolumeInputAmp=true
Amp-Out caps ofs=64, nsteps=64, stepsize=3, mute=0 Nsteps=64 => PublishVolume=true Mute=0 => PublishMute=false
Amp-In caps ofs=16, nsteps=46, stepsize=3, mute=1 Nsteps=46 => MuteInputAmp= true Mute=1 => VolumeInputAmp=true
Amp-In caps ofs=0, nsteps=0, stepsize=0, mute=1 Nsteps=0 => PublishVolume=false Mute=1 => PublishMute=true
Amp-In caps ofs=0, nsteps=3, stepsize=39, mute=0 Nsteps=3 on the pin-output complex means Boosts=3
完成 Platforms29.xml 修改。
2.PlistEdit 修改 layout29.xml(电压,底噪,增益,多声道等参数文件)
- 先修改
PathMapID
为 29 打开 codec#0 搜索:
Vendor Id: 0x10ec0269 (16 转 10 进制 => 283902569) 填入 CodecID
搜索 NodeID 0x18 (外置麦克风)
1.该节点 VRef 为 VREF_80 (全名:Voltage Reference 参考电压_模拟电压的百分比。) (10 转 16 进制 => 50)。 2.计算 muteGPIO 数值格式:50 + 0100 + NodeID 18 => 50010018 (16 转 10 进制 => 1342242840,填入 LineIn/MuteGPIO)。 (为什么填这里?记得前面 PinConfigurator.app 中有把外置麦克风设置为 Line In 吗?) 3.外置麦克风需修改 VRef 参考电压实现驱动。 一般有 Vref caps: HIZ 50% Ground(0V) 80% 100% (都是十进制)。
搜索 NodeID 0x12 (内置麦克风)
1.如果数值为 VREF_HIZ,则直接 muteGPIO=0,填入 Mic/MuteGPIO。 2.但是本机的该节点没有 VREF 字样,暂时也设定为 muteGPIO=0 试试。
完成 layout29.xml 修改。
3.PlistEdit 修改 info.list
修改
CodecID
同上Vendor Id: 0x10ec0269 (16 转 10 进制得 283902569) 填入 CodecID
完成 info.list 修改。
4.PlistEdit 修改 PinConfigs.kext/Contents/info.list
- 直接搜索
CodecID
为 283902569,并且为 LayoutID=29 的项目节点,仔细看,满足这两个条件才行。本机器搜索到的是 118 项目节点。[全部删掉也行,照葫芦画瓢] 把前面整理的 ConfigData 数据:
01471C10 01471D01 01471E17 01471F99 01571C1F 01571D10 01571E21 01571F01 01E71C20 01E71D11 01E71E44 01E71F01 01871C30 01871D10 01871E81 01871F01 01271C40 01271D01 01271EA6 01271F99 01470C02 01570C02
填入到
ConfigData
:
完成 PinConfigs.kext/Contents/info.list 修改。
5.xml 转 xml.zlib
- 这步 Xcode 编译时会自动转换无需干预。
- 如需手动转换,脚本在
AppleALC/Tools
目录。
6.编译 AppleALC.kext
- 安装 Xcode
把 lilu.kext DEBUG 版本拷贝到 AppleALC 源码根目录。
提示:请勿使用 RELEASE 版本,会报错:AppleALC/Lilu.kext/Contents/Resources/Library/plugin_start.cpp' (in target 'AppleALC' from project 'AppleALC')
Xcode 打开 AppleALC.xcodeproj
开始编译:Product -> Archive -> Distribute Content -> Built Products,保存到桌面,完成。最后:
- 把 AppleALC.kext 放到
EFI/CLOVER/kexts/Other
。 - Clover Configurator 修改:Devices -> Audio -> Inject 填写 29。
- 重启系统即可。
- 把 AppleALC.kext 放到
进系统查看声卡注入信息:
macos@macosdeMBP ~ % ioreg -l | grep ALC | grep HDAConfigDefault | | | | "HDAConfigDefault" = ({"AFGLowPowerState"=<03000000>,"CodecID"=283902569,"Comment"="Custom ALC269VC Clevo N650DU by Leeyr","ConfigData"=<01470c0201470c0201570c02>,"FuncGroup"=1,"BootConfigData"=<01471c1001471d0101471e1701471f9901571c1f01571d1001571e2101571f0101e71c2001e71d1101e71e4401e71f0101871c3001871d1001871e8101871f0101271c4001271d0101271ea601271f9901470c0201570c02>,"WakeVerbReinit"=Yes,"LayoutID"=7}) # 显示 LayoutID=7 原因是定制 ALC 的 LayoutID 以白苹果的方式运行?未知具体。
完成状态
已完成:
扬声器:内外功放清晰不破音 + 切换正常
麦克风:内外切换正常(手机耳机四段插头),内置录音清晰无杂音,电平显示正常,可调节。
睡眠唤醒均正常,HDMI 输出正常。
未完成:
麦克风:手机四段插头外置麦克风输入不正常,居然把耳机绕线组电流转成了麦克风输入,不清晰。没别的硬件测试。
SPDIF Out:无硬件测试
其它
1.SPDIF、HDMI 等数码输出音频端口,不可调节音量,而由解码设备调节。
https://discussions.apple.com/thread/1214940
https://discussions.apple.com/thread/2529122
2.如果开机后发现小喇叭图标是灰色,初步判断是节点路径问题;偏好设置音频管理界面输入/输出设备未发现,说明是 configData 问题。
3.精简文件 AppleACL.kext:
修改 PinConfigs.kext/Contents/info.list 时搜索到对应的项目节点是 118,其它删除,编译出来 AppleALC.kext 整体文件就会只保留 1 个项目节点,文件容量会大大减小。
4.案例分析(内容是精髓,工具是基础)
https://mega.nz/#!y9lVGSLB (已失效)
提取:CJc3_3Bjv1n8rEhZTA7qG7NsI2S4XH5oPcIdXsSATH4
学习
紫米
http://bbs.pcbeta.com/viewthread-623626-1-1.html
英文解析制作 AppleALC
https://github.com/F0x1c/AppleALC_Instructions
文末分析
1.这段内容放后面是为了不影响前面操作,否则复杂程度会直线上升。
2.其实前面获取 configData 过程交给了 PinConfigurator.app 处理。如果这个工具生成的 configData 不能驱动声卡或存在其他问题,可根据下面内容手工排雷,仔细调整每个标识的不同数值。
3.这部分既复杂也简单,也易出错。最后拿到的 configData 能用还好,不能用得慢慢修改。
4.笔记本台式机暂时先按标识处理,具体情况具体分析,最小化分块处理。
5.这部分挺重要,理解完了会发现前面数值、接口、设备修正可能都不是正确的,虽然当时能用。
6.数据已从 Intel HDA (Revision 1.0a, June 17, 2010) 规范和 High Definition Audio Utility 工具提取并修正。
标识法
第二种方式获取 configData + MapPatch
前面是用工具对 codec#0 进行快速处理,下面是手工从 codec#0 提取 configData + MapPatch。
制作 MapPatch
1.如果 codec#0 里面有 AFG Function Id: 0x1 (unsol 1)
删掉。
2.生成 codec#0.svg
安装依赖,Linux 环境
apt install graphviz
安装依赖,macOS 环境
# 安装 Homebrew + graphviz
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install graphviz
准备工具
wget http://helllabs.org/codecgraph/codecgraph-20120114.tar.gz
tar zxvf codecgraph-20120114
cd codecgraph-20120114
cp codecgraph /usr/local/bin
cp codecgraph.py /usr/local/bin
cp getdump /usr/local/bin
cp hda-verb /usr/local/bin
cp verbit.sh /usr/local/bin
#cp convert_hex_to_dec.rb /usr/local/bin
#chmod +x /usr/local/bin/*
#rm -fr /usr/local/bin/codecgraph
#rm -fr /usr/local/bin/codecgraph.py
#rm -fr /usr/local/bin/getdump
#rm -fr /usr/local/bin/hda-verb
#rm -fr /usr/local/bin/verbit.sh
#rm -fr /usr/local/bin/convert_hex_to_dec.rb
建立 codec#0.svg
codecgraph codec\#0
生成的 SVG 只能作为参考,根据 codec 信息对比,标注内容错误多,但线路无问题。
3.分析 SVG 路径获取信息
可以用 Chrome 打开 codec#0.svg 自由放大缩小。
识图:
蓝色椭圆形:音频输出路径
红色椭圆形:音频输入路径
蓝色三角形:可能是优选通道(有些声卡测试并非如此)
黑色的实线:可能是优选路线(有些声卡测试并非如此)
复制前面部分信息:
0x12 Mic at Int
0x14 Speaker at Int
0x15 HP Out at Ext
0x18 Mic at Ext
推导路径:
音频输入 [从左到右摘取信息]
0x12 12 22 09 | 9 34 18 十进制
0x18 18 23 08 | 8 35 24 十进制
音频输出 [从右到左摘取信息]
0x14 14 0c 02 | 20 12 2 十进制
14 0d 03* | 20 13 3 十进制
0x15 15 0c 02* | 21 12 2 十进制
15 0d 03 | 21 13 3 十进制
# 1.星号代表实线优选
# 2.线路尽量唯一选择
这样就完成了所有信息提取。
其它
dump 信息
verbit.sh codec#0 > codec#XXX_dump.txt
这个不准确,只能参考。
试试能不能用。
看了过程,太棒了。现在想定制一下自己的本子声卡。特来学习
谢谢分享,非常好
谢谢分享,学习到了
写的非常好非常清楚,比起那些旧教程误导人好多了。
最近正在研究这个,写的非常棒。
写得不错,早点看到就好了
写得很好,学习到了
学习一下 内容比那些大神细致,工具太重要了
教程非常详细