美文网首页黑苹果
Surface pro 3 ALC288 的 AppleHDA

Surface pro 3 ALC288 的 AppleHDA

作者: Yao_Fairytale | 来源:发表于2017-07-26 10:34 被阅读1636次
    用到的工具:
    • 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即可,多声道需要分别设定

    1. 后左与后右
    2. 中央与重低音
    3. 前左与前右声道
    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补丁

                <dict>
                    <key>Comment</key>
                    <string>Zeroing 1983 codec </string>
                    <key>Disabled</key>
                    <false/>
                    <key>Find</key>
                    <data>
                    gxnUEQ==
                    </data>
                    <key>Name</key>
                    <string>AppleHDA</string>
                    <key>Replace</key>
                    <data>
                    AAAAAA==
                    </data>
                </dict>
                <dict>
                    <key>Comment</key>
                    <string>Zeroing 10ec0885 codec (patched by AppleHDA Patcher.app)</string>
                    <key>Disabled</key>
                    <false/>
                    <key>Find</key>
                    <data>
                    hQjsEA==
                    </data>
                    <key>Name</key>
                    <string>AppleHDA</string>
                    <key>Replace</key>
                    <data>
                    AAAAAA==
                    </data>
                </dict>
                <dict>
                    <key>Comment</key>
                    <string>Patching 11d41984 with 10ec0288 codec (patched by AppleHDA Patcher.app)</string>
                    <key>Disabled</key>
                    <false/>
                    <key>Find</key>
                    <data>
                    hBnUEQ==
                    </data>
                    <key>Name</key>
                    <string>AppleHDA</string>
                    <key>Replace</key>
                    <data>
                    iALsEA==
                    </data>
                </dict>
    

    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

    相关文章

      网友评论

        本文标题:Surface pro 3 ALC288 的 AppleHDA

        本文链接:https://www.haomeiwen.com/subject/zktwkxtx.html