Dell Precision M4800 AppleALC声卡驱动修复教程

前言

对于我的Dell Precision M4800来说,用acidantheraAppleALC.kext并不能完全驱动,换了好几个layout-id都没鸟用,具体表现为:

  1. Dell Dock 底座的两个声音插孔不能用
  2. 左面板的耳机有严重杂音,耳机基本不能正常使用

因此,不得已只好自己修复,特此记录下修复过程如下。

 

准备工作

首先根据Apple的PinConfig规范自己用Excel(WPS兼容)做了个PinConfigData配置模板工具pinconfigs.xlsx以备用。

 

Linux环境 (需先确保Linux下声音正常)

 

工具准备:

安装hda-tools:
此工具我已经同步到我的仓库AppleALC_Dell_M4800. Linux下能用到的其实只有codecgraphverbit.sh,其他大部分Mac下才能用, 以下有几步也可以在Mac下执行。

git clone https://github.com/badfellow/AppleALC_Dell_M4800
chmod 755 -R ./AppleALC_Dell_M4800/hda-tools
sudo cp ./AppleALC_Dell_M4800/hda-tools/* /usr/local/bin/
rm -rf ./AppleALC_Dell_M4800        //删除

安装WPS: 命令行安装或者直接到WPS官网下载。(如果只想在Windows或者Mac上用Microsoft Office编辑Excel文件,此步骤略)

sudo dnf install https://wdl1.cache.wps.cn/wps/download/ep/Linux2019/10161/wps-office-11.1.0.10161-1.x86_64.rpm    //fedora
sudo apt install https://wdl1.cache.wps.cn/wps/download/ep/Linux2019/10161/wps-office_11.1.0.10161_amd64.deb    //ubuntu or debian
  1. 提取Codec

    我本来安装了Fedora双系统,所以就直接在Fedora下提取了. 为了纯净提取,先清除NVAM再进入BIOS恢复出厂设置,再在BIOS里手工配置下Fedora的EFI进入Fedora系统。
    进入终端Shell环境

    cp /proc/asound/card1/codec* ./   // 提取声卡codec到当前路径 (我的板载声卡在card1,有的可能是card0)
    
    
  2. 查找所有节点 (此步骤也可在Mac下执行)

    整理所有节点并记录到Excel模板pinconfigs.xlsx里, Linux环境可以安装个WPS。输入命令verbit.sh codec#0得到以下屏幕打印信息

    % ../hda-tools/verbit.sh codec#0
    
    Verbs from Linux Codec Dump File: codec#0
    
    Codec: Realtek ALC3226   Address: 0   DevID: 283902610 (0x10ec0292)
    
       Jack   Color  Description                  Node     PinDefault             Original Verbs
    --------------------------------------------------------------------------------------------------------
    Digital Unknown  Mic at Int N/A              18 0x12   0x90a60140   01271c40 01271d01 01271ea6 01271f90
       1/8   Black  Speaker at Ext Rear         19 0x13   0x411111f0   01371cf0 01371d11 01371e11 01371f41
    Analog Unknown  Speaker at Int N/A          20 0x14   0x90170110   01471c10 01471d01 01471e17 01471f90
       1/8   Green  HP Out at Ext Front         21 0x15   0x0221401f   01571c1f 01571d40 01571e21 01571f02
       1/8   Green  Line Out at Ext Rear        22 0x16   0x01014020   01671c20 01671d40 01671e01 01671f01
    Mic at Ext Front    0x18 0x18                        44142641 01871c31 01871d90     01871ea1 01871f02  
       1/8    Pink  Mic at Ext Rear             25 0x19   0x01a1903e   01971c3e 01971d90 01971ea1 01971f01
       1/8   Black  Speaker at Ext Rear         26 0x1a   0x411111f0   01a71cf0 01a71d11 01a71e11 01a71f41
       1/8   Black  Speaker at Ext Rear         27 0x1b   0x411111f0   01b71cf0 01b71d11 01b71e11 01b71f41
    Unknown Unknown  Modem Hand at Ext N/A       29 0x1d   0x40700001   01d71c01 01d71d00 01d71e70 01d71f40
       1/8   Black  Speaker at Ext Rear         30 0x1e   0x411111f0   01e71cf0 01e71d11 01e71e11 01e71f41
    --------------------------------------------------------------------------------------------------------
    
    
       Jack   Color  Description                  Node     PinDefault             Modified Verbs
    --------------------------------------------------------------------------------------------------------
    Digital Unknown  Mic at Int N/A              18 0x12   0x90a60140   01271c40 01271d00 01271ea6 01271f90
    Analog Unknown  Speaker at Int N/A          20 0x14   0x90170110   01471c10 01471d00 01471e17 01471f90
       1/8   Green  HP Out at Ext Front         21 0x15   0x0221401f   01571c50 01571d40 01571e21 01571f01
       1/8   Green  Line Out at Ext Rear        22 0x16   0x01014020   01671c20 01671d40 01671e01 01671f01
    Mic at Ext Front    0x18 0x18                        44142641 01871c30 01871d90     01871ea1 01871f01  
       1/8    Pink  Mic at Ext Rear             25 0x19   0x01a1903e   01971c60 01971d90 01971ea1 01971f01
    Unknown Unknown  Modem Hand at Ext N/A       29 0x1d   0x40700001   01d71c70 01d71d00 01d71e70 01d71f40
    --------------------------------------------------------------------------------------------------------
    
    Modified Verbs in One Line: 01271c40 01271d00 01271ea6 01271f90 01471c10 01471d00 01471e17 01471f90 01571c50 01571d40 01571e21 01571f01 01671c20 01671d40 01671e01 01671f01 01871c30 01871d90 01871ea1 01871f01 01971c60 01971d90 01971ea1 01971f01 01d71c70 01d71d00 01d71e70 01d71f40
    --------------------------------------------------------------------------------------------------------
    
    

    以上第一部分即列出来来了所有节点为 0x12, 0x13, 0x14, 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1b, 0x1d, 0x1e,记录到Excel模板的PinConfig生成模板工作表的第一列节点(HEX)<十六进制度>, 第二列节点(DEC)<十进制>Excel公式会自动生成。
    同时我们得到Address: 0,记录到地址列。这里的其他pinDefault/ModifiedVerbs等信息我们都不需要。

  3. 查找有效节点

    然后再执行命令dmesg | grep hdaaudio 得到有效节点:

       % dmesg | grep hdaudio
    [    6.890268] snd_hda_codec_realtek hdaudioC1D0: autoconfig for ALC3226: line_outs=1 (0x16/0x0/0x0/0x0/0x0) type:line
    [    6.890276] snd_hda_codec_realtek hdaudioC1D0:    speaker_outs=1 (0x14/0x0/0x0/0x0/0x0)
    [    6.890279] snd_hda_codec_realtek hdaudioC1D0:    hp_outs=1 (0x15/0x0/0x0/0x0/0x0)
    [    6.890282] snd_hda_codec_realtek hdaudioC1D0:    mono: mono_out=0x0
    [    6.890283] snd_hda_codec_realtek hdaudioC1D0:    inputs:
    [    6.890285] snd_hda_codec_realtek hdaudioC1D0:      Front Mic=0x18
    [    6.890288] snd_hda_codec_realtek hdaudioC1D0:      Dock Mic=0x19
    [    6.890290] snd_hda_codec_realtek hdaudioC1D0:      Headset Mic=0x1a
    [    6.890292] snd_hda_codec_realtek hdaudioC1D0:      Internal Mic=0x12
    

    得到有效节点为0x12, 0x14, 0x15, 0x16, 0x18, 0x19, 0x1a, 记录到Excel模板是否有效列, 有效填,无效填

  4. 查找EAPD节点 (此步骤也可以在Mac下执行)

    下一步再执行命令cat codec#0 | grep "EAPD 0x" | wc -l 得到返回值3,我们需要找到3个EAPD节点。运行vim codec#0查找EAPD所在的节点。

    % cat codec#0 | grep "EAPD 0x" | wc -l
          3
       vim codec#0
       :EAPD       //直接输入:EAPD回车查找,按’n'键查找下一个
    
    

    最终得到EAPD节点为0x14, 0x15, 0x16,填入Excel模板EAPD列, 有填,无填

  5. 整理有效路径 (此步骤也可以在Mac下执行)

    执行命令codecgraph codec\#0, 生成codec#0.svg,直接可以用浏览器打开,也可导入Excel。下图是我的Dell Precision M4800的路径图。

    为了方便我们导入Excel,新建一个工作表HDA Map,插入图片,将刚才生成的codec#0.svg插入到工作表HDA Map

    现在可以看到codec#0.svg节点都是十六进制,由于路径需要10进制,先将所有16进制记录到 PinConfig生成模板 Excel工作表的进制转换单元格,Excel公式HEX2DEC会一次性批量计算出对应的十进制数字备用。

    注意箭头方向,从左到右是输入到输出。所以左边麦克风>中间混响设备>右边耳机和喇叭。据此我们可以整理出声音输入路径。

     

    最终,历经以上步骤1到步骤5,我们在Excel模板里整理出以下表格.

    节点(HEX)节点(DEC)设备名称说明路径地址EAPD是否有效
    0x1218Digital Unknown Mic at Int N/A内置麦克风18>34>90
    0x13191/8 Black Speaker at Ext Rear无效0
    0x1420Analog Unknown Speaker at Int N/A内置喇叭2>12>200
    0x15211/8 Green HP Out at Ext Front左耳麦二合一3.5mm耳机插孔3>13>21, 2>12>210
    0x16221/8 Green Line Out at Ext Rear戴尔Dock底座耳机插孔2>12>22, 3>13>220
    0x1824Mic at Ext Front左耳麦麦克风插孔24>35>80
    0x19251/8 Pink Mic at Ext Rear戴尔Dock底座3.5mm麦克风插孔25>34>90
    0x1a261/8 Black Speaker at Ext Rear左耳麦二合一3.5mm麦克风插孔26>34>90
    0x1b271/8 Black Speaker at Ext Rear无效0
    0x1d29Modem Hand at Ext无效0
    0x1e301/8 Black Speaker at Ext Rear无效0

     

  6. 定制PinConfig

    Excel模板工作表PinConfig生成模板的以下几列,按照每个物理接口的实际情况,通过下拉菜单选择合适的类型(如下), 此Excel模板就会自动生成符合苹果设计规范的Final ConfigDataWakeConfigData两个参数。具体操作参见pinconfigs.xlsx

    节点说明默认关联序列插孔颜色插孔侦测设备类型连接类型端口端口位置
    0x12内置麦克风1. Mic0.后左与后右0=Unknown1=Jack Detect Disabled [内部设备]A=Mic6=Digital9=Internal Fixed Function Device [内 置设备]0=N/A
    0x13无效F. 屏蔽0.后左与后右0=Unknown0=Jack Detect Override [外接设备]0=Line Out0=Unknow4=External No Connection [屏蔽设备]0=N/A
    0x14内置喇叭4. IntSpeaker0.后左与后右0=Unknown1=Jack Detect Disabled [内部设备]1=Speaker7=0ther Analog9=Internal Fixed Function Device [内 置设备]0=N/A
    0x15左耳麦二合一3.5mm耳机插孔5. Headphone0.后左与后右4=Green0=Jack Detect Override [外接设备]2=HeadPhone OutB=Combination0=External Jack [外 接设备]2=Front
    0x16戴尔Dock底座耳机插孔8. Line Out0.后左与后右4=Green0=Jack Detect Override [外接设备]0=Line Out1=1/8 Stereo/Mono [也即3.5mm接口]0=External Jack [外 接设备]1=Rear
    0x18左耳麦麦克风插孔2. Line In0.后左与后右2=Gray0=Jack Detect Override [外接设备]8=Line In1=1/8 Stereo/Mono [也即3.5mm接口]0=External Jack [外 接设备]2=Front
    0x19戴尔Dock底座3.5mm麦克风插孔2. Line In0.后左与后右9=Pink0=Jack Detect Override [外接设备]8=Line In1=1/8 Stereo/Mono [也即3.5mm接口]0=External Jack [外 接设备]1=Rear
    0x1a左耳麦二合一3.5mm麦克风插孔2. Line In0.后左与后右1=Black0=Jack Detect Override [外接设备]F=0therB=Combination0=External Jack [外 接设备]2=Front
    0x1b无效F. 屏蔽0.后左与后右0=Unknown0=Jack Detect Override [外接设备]0=Line Out0=Unknow4=External No Connection [屏蔽设备]0=N/A
    0x1d无效F. 屏蔽0.后左与后右0=Unknown0=Jack Detect Override [外接设备]0=Line Out0=Unknow4=External No Connection [屏蔽设备]0=N/A
    0x1e无效F. 屏蔽0.后左与后右0=Unknown0=Jack Detect Override [外接设备]0=Line Out0=Unknow4=External No Connection [屏蔽设备]0=N/A

 

至此,我们得到Final ConfigDataWakeConfigData如下:

Final ConfigData      <01271C10 01271D01 01271EA6 01271F90 01371CF0 01371D00 01371E00 01371F40 01471C40 01471D01 01471E17 01471F90 01470C02 01571C50 01571D40 01571E2B 01571F02 01570C02 01671C80 01671D40 01671E01 01671F01 01670C02 01871C20 01871D20 01871E81 01871F02 01971C20 01971D90 01971E81 01971F01 01A71C20 01A71D10 01A71EFB 01A71F02 01B71CF0 01B71D00 01B71E00 01B71F40 01D71CF0 01D71D00 01D71E00 01D71F40 01E71CF0 01E71D00 01E71E00 01E71F40>

WakeConfigData    <01470C02 01570C02 01670C02>

Linux上能干的活儿我们都干完了,只待进入Mac改写AppleALC了, 因此让我们保存下我们的劳动成果,把这个Excel文件放在Mac系统也能访问的地方,重启电脑进入Mac。

 

Mac环境

 

由于我们已经成功得到了Final ConfigDataWakeConfigData,在Mac上操作就很简单了,唯一能做的事情就是改写AppleALC并编译。

  1. 同步AppleALC源码

    git clone git@github.com:acidanthera/AppleALC.git
    
    
  2. Xcode 打开AppleALC项目AppleALC.xcodeproj,根据自己的系统版本配置一下环境,测试编译通过。

  3. AppleALC/Resources/PinConfigs.kext/Contents/info.plist/IOKitPersonalities/HDAConfigDefault/下添加一组数据,新增一个原ALC292下没有用过的layout-id,我这里新增了layout-id 59.

    AFGLowPowerState  Data     <03000000>
    Codec             String   ALC 292 for Dell M4800 with Dock
    CodecID           Number   283,902,610                            //it's for ALC292
    Comment           String   ALC 292 for Dell M4800 with Dock
    ConfigData        Data     从Excel模板里生成的Final ConfigData复制过来即可
    FuncGroup         Number   1
    LayoutID          Number   59
    WakeConfigData    Data     从Excel模板里生成的Final ConfigData复制过来即可
    WakeVerbReinit    Boolean  1
    
  4. AppleALC/Resources/ALC292/Info.plist/Files/Layouts/下添加layout59.xml.zlib,同时在AppleALC/Resources/ALC292/Info.plist/Files/Platforms/下添加Platforms59.xml.zlib
    (注:此处IDlayoutid,但建议与layoutid保持一致)

    // AppleALC/Resources/ALC292/Info.plist/Files/Layouts/
    Comments    String      ALC 292 for Dell M4800 with Dock
    Id          Number      59
    Path        String      layout59.xml.zlib
    
    // AppleALC/Resources/ALC292/Info.plist/Files/Platforms/
    Comments    String      ALC 292 for Dell M4800 with Dock
    Id          Number      59
    Path        String      Platforms59.xml.zlib
    
  5. AppleALC/Resources/ALC292/路径中复制其他layout和Platforms文件改名为layout59.xmlPlatforms59.xml

  6. 根据我们前面Excel文件生成的路径, 改写 Platforms59.xml文件,填入我们自己的路径。(具体改写方法可参考其他Platforms文件的例子)

  7. 修改layout59.xml文件里的layoutidPathMapID为59。(注: PathMapID不一定需要和layoutid保持一致,但必须和AppleALC/Resources/ALC292/Info.plist/Files/Layouts/AppleALC/Resources/ALC292/Info.plist/Files/Platforms/ID保持一致)

    <key>LayoutID</key>
     <integer>59</integer>
    
    <key>PathMapID</key>
    <integer>59</integer>
    
    
  8. 自此,驱动修改已经全部完成,如果需要精简只留下你需要的声卡型号ALC292,可以删除AppleALC/Resources其他所有非ALC292的文件,同时删除AppleALC/Resources/PinConfigs.kext/Contents/info.plist/IOKitPersonalities/HDAConfigDefault/下非ALC292的几百个PinConfig配置。

  9. 编译打包,将生成的AppleALC.kext替换掉/EFI/OC/Kexts/下原来的驱动, 重启测试成功。

 

转载自我的github

 

致谢

 

部分参考黑果小兵的部落阁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值