<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>DSP on lategege 的技术博客</title><link>https://lategege.com/tags/dsp/</link><description>Recent content in DSP on lategege 的技术博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 12 Nov 2026 09:20:00 +0800</lastBuildDate><atom:link href="https://lategege.com/tags/dsp/index.xml" rel="self" type="application/rss+xml"/><item><title>黑苹果内置麦克风修复实录：当 PDM 数字麦挂在 Intel SOF DSP 上</title><link>https://lategege.com/p/hackintosh-dsp-dmic/</link><pubDate>Thu, 12 Nov 2026 09:20:00 +0800</pubDate><guid>https://lategege.com/p/hackintosh-dsp-dmic/</guid><description>&lt;p&gt;黑苹果上&amp;quot;扬声器正常、耳机正常、就是内置麦克风没声&amp;quot;是很常见的一类问题。大多数教程会让你去换 AppleALC 的 &lt;code&gt;layout-id&lt;/code&gt;，但有一类机器换多少个 layout 都没用——因为它的麦克风根本不走 codec。&lt;/p&gt;
&lt;p&gt;这篇博客分两部分：先说清楚黑苹果上内置麦克风的两种硬件路径和通用的驱动配置方法（以 &lt;a class="link" href="https://github.com/labrouss/TGLDmic" target="_blank" rel="noopener"
 &gt;TGLDmic&lt;/a&gt; 为例），再完整记录我这台机器踩到的坑、定位过程和最终修复。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;结论先放这儿：&lt;code&gt;AppleALC + layout-id&lt;/code&gt; 只解决模拟麦克风；PDM 数字麦克风需要把 Intel SOF 固件跑在 cAVS DSP 上，而 TGLDmic 在部分 Comet Lake 机型上会因为&amp;quot;平台没把 DSP 状态归位&amp;quot;卡在第一步。补丁很小，但要知道去哪儿补。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一先搞清楚你的麦克风接在哪"&gt;一、先搞清楚：你的麦克风接在哪
&lt;/h2&gt;&lt;p&gt;笔记本内置麦克风有两条完全不同的通路：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;模拟麦克风&lt;/th&gt;
 &lt;th&gt;PDM 数字麦克风&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;物理连接&lt;/td&gt;
 &lt;td&gt;驻极体/MEMS → 模拟线 → HD Audio codec 的 ADC&lt;/td&gt;
 &lt;td&gt;MEMS 数字麦 → PDM 总线 → Intel SST/audio DSP&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;谁在驱动&lt;/td&gt;
 &lt;td&gt;AppleHDA + AppleALC（layout）&lt;/td&gt;
 &lt;td&gt;Intel SOF 固件，跑在 DSP 核上&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;macOS 原生支持&lt;/td&gt;
 &lt;td&gt;✅ 有&lt;/td&gt;
 &lt;td&gt;❌ 没有（Mac 不用这架构）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;黑苹果解法&lt;/td&gt;
 &lt;td&gt;选对 &lt;code&gt;layout-id&lt;/code&gt; / &lt;code&gt;alc-layout-id&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;TGLDmic 这类社区驱动&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;四麦克风阵列、远场拾音、Dolby Atmos 这类卖点的机器，内部麦几乎都是第二种。&lt;strong&gt;这类机器上 AppleALC 能给你一个叫 &amp;ldquo;Internal Microphone&amp;rdquo; 的输入设备，但它没有声音&lt;/strong&gt;——因为 codec 里根本没有接那条 ADC。&lt;/p&gt;
&lt;h3 id="怎么判断自己属于哪一类"&gt;怎么判断自己属于哪一类
&lt;/h3&gt;&lt;p&gt;我用了三个互相独立的证据：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Windows 侧驱动&lt;/strong&gt;（最硬）。挂载 NTFS 分区只读，看 &lt;code&gt;Windows/System32/DriverStore/FileRepository&lt;/code&gt;：出现 &lt;code&gt;intcaudiobus.inf&lt;/code&gt;、&lt;code&gt;intcdmic.inf&lt;/code&gt;、&lt;code&gt;lnvsst.inf&lt;/code&gt; 这类包，说明这台机器的麦克风走 Intel SST 数字麦。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linux 侧 dmesg&lt;/strong&gt;。Live USB 启动后看 &lt;code&gt;dmesg | grep -i sof&lt;/code&gt;，出现 &lt;code&gt;DMICs detected in NHLT tables: 4&lt;/code&gt; 之类，就是 PDM 阵列。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;macOS 侧&amp;quot;假麦克风&amp;quot;检测&lt;/strong&gt;。选中 Built-in Input 录一段，用 &lt;code&gt;ffmpeg&lt;/code&gt; 看电平：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ffmpeg -f avfoundation -i &lt;span class="s2"&gt;&amp;#34;:2&amp;#34;&lt;/span&gt; -t &lt;span class="m"&gt;5&lt;/span&gt; -ar &lt;span class="m"&gt;48000&lt;/span&gt; -ac &lt;span class="m"&gt;1&lt;/span&gt; bi.wav
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ffmpeg -i bi.wav -af volumedetect -f null - 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -E &lt;span class="s1"&gt;&amp;#39;mean_volume|max_volume&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;我的机器结果：开头一声爆音（&lt;code&gt;max -6 dB&lt;/code&gt;），之后全是 &lt;code&gt;±1 / ±2&lt;/code&gt; 的数字静音。看起来设备存在、有电平表，其实是假的。&lt;/p&gt;
&lt;p&gt;只有第 1、2 条成立时才值得折腾 DSP 驱动；否则应该回去调 AppleALC。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="二tgldmic-是什么怎么配"&gt;二、TGLDmic 是什么，怎么配
&lt;/h2&gt;&lt;p&gt;TGLDmic 是一个社区项目，由两部分组成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;TGLDmic.kext&lt;/code&gt;&lt;/strong&gt;：内核驱动。加载 Intel 官方签名的 SOF 固件（&lt;code&gt;sof-tgl.ri&lt;/code&gt; / &lt;code&gt;sof-cml.ri&lt;/code&gt;）到 cAVS DSP，按 Linux SOF 的 IPC 序列配置 DMIC 采集链路，再用 DMA 把 4 通道 48 kHz 音频搬到 ring buffer。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;TGLDmic.driver&lt;/code&gt;&lt;/strong&gt;：Core Audio HAL 插件，把这个 ring buffer 包装成输入设备 &amp;ldquo;Internal Microphone (TGLDmic)&amp;quot;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;支持平台：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;平台&lt;/th&gt;
 &lt;th&gt;cAVS&lt;/th&gt;
 &lt;th&gt;PCI ID&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Comet Lake / Cannon Lake / Coffee Lake&lt;/td&gt;
 &lt;td&gt;1.8&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;8086:02C8&lt;/code&gt; &lt;code&gt;8086:9DC8&lt;/code&gt; &lt;code&gt;8086:06C8&lt;/code&gt; &lt;code&gt;8086:A348&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Tiger Lake&lt;/td&gt;
 &lt;td&gt;2.5&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;8086:A0C8&lt;/code&gt; &lt;code&gt;8086:43C8&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="安装四步"&gt;安装四步
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;code&gt;TGLDmic.kext&lt;/code&gt; 放进 &lt;code&gt;EFI/OC/Kexts/&lt;/code&gt;，在 &lt;code&gt;Kernel → Add&lt;/code&gt; 里加在 &lt;strong&gt;AppleALC 之后&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NVRAM → boot-args&lt;/code&gt; 加 &lt;code&gt;-tgldmic&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;装 release 里的 pkg（装 HAL 插件）；&lt;/li&gt;
&lt;li&gt;系统设置 → 声音 → 输入，选 &amp;ldquo;Internal Microphone (TGLDmic)&amp;quot;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;扬声器和耳机仍然由 AppleALC 负责，两边是并行的，不需要二选一。&lt;/p&gt;
&lt;h3 id="自检"&gt;自检
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ioreg -l -w0 -c TGLDmic &lt;span class="p"&gt;|&lt;/span&gt; grep -E &lt;span class="s1"&gt;&amp;#39;&amp;#34;BootResult&amp;#34;|&amp;#34;TGLDmicPhase&amp;#34;|&amp;#34;Streaming&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;正常应该看到：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;BootResult&amp;#34; = &amp;#34;OK FW_READY&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;TGLDmicPhase&amp;#34; = 4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;Streaming&amp;#34; = No # 空闲时 DSP 是掉电的，有人录音才上电
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;TGLDmicPhase&lt;/code&gt; 是模式：1 = 只读观察，2 = 启动一次 DSP 自检，3 = 采集测试，4 = 常驻服务。日常用 4。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="三通用的排错顺序不针对某台机器"&gt;三、通用的排错顺序（不针对某台机器）
&lt;/h2&gt;&lt;p&gt;出问题时不要一上来就换固件、换 boot-args，按这个顺序看信息量最大：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;kext 有没有加载、认成哪个平台&lt;/strong&gt;
&lt;code&gt;ioreg -l -w0 -c TGLDmic&lt;/code&gt; 里看 &lt;code&gt;TGLDmicVersion&lt;/code&gt;、&lt;code&gt;Platform&lt;/code&gt;、&lt;code&gt;BootResult&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;失败在哪一步&lt;/strong&gt;
&lt;code&gt;BootResult&lt;/code&gt; 后面括号里的值就是失败时寄存器的原始值，比日志还直接。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;看最后 128 行日志&lt;/strong&gt;
&lt;code&gt;ioreg -l -w0 -c TGLDmic | tr ',' '\n' | grep -E '&amp;quot;(boot|fix|cap):'&lt;/code&gt; —— 驱动自己维护了一个环形缓冲区，&lt;code&gt;log show&lt;/code&gt; 里不一定能看到。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;区分&amp;quot;软件没配好&amp;quot;和&amp;quot;硬件没给你&amp;rdquo;&lt;/strong&gt;
DSP 相关失败绝大多数是后者：固件没跑起来之前，改什么都白搭。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用 Linux 做对照&lt;/strong&gt;
这个项目自带了 &lt;code&gt;linux/capture-sof-dmic.sh&lt;/code&gt;，Ubuntu Live 跑一遍就能知道同一台机器上 Linux SOF 能不能点亮 DSP。能 → kext 的差距；不能 → BIOS/平台层，别在 macOS 里死磕。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;常见失败点大致长这样（按流程顺序）：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;code&gt;BootResult&lt;/code&gt;&lt;/th&gt;
 &lt;th&gt;含义&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;FAIL ADSPCS unreadable&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;BAR4 没映射上 / 控制器不在 D0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;FAIL core0 power up (CPA)&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;DSP 核没上电&lt;/strong&gt;（本文的情况）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;FAIL ROM IPC ack&lt;/code&gt; / &lt;code&gt;ROM init done&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;核起来了，ROM 没响应&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;FAIL FW_ENTERED&lt;/code&gt; + ROM error 44&lt;/td&gt;
 &lt;td&gt;固件没通过 CSE 验签（多半用错/改过的固件）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;FAIL FW_READY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;固件跑起来了但没回就绪消息&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;看到一个失败值，先去和能用的机器比同一条日志，差异通常就藏在里面。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="四我这台机器从-0x001d003c-说起"&gt;四、我这台机器：从 &lt;code&gt;0x001d003c&lt;/code&gt; 说起
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;机器&lt;/strong&gt;：联想 Comet Lake-U（i7-10710U），HDA &lt;code&gt;8086:02C8&lt;/code&gt;，SSID &lt;code&gt;17aa:380f&lt;/code&gt;，codec &lt;strong&gt;ALC257&lt;/strong&gt;，SMBIOS 伪装 &lt;code&gt;MacBookAir9,1&lt;/code&gt;，OpenCore REL-104，macOS 14.8.5。（从 EFI 里 &lt;code&gt;SSDT-OCBAT1-lenovoPRO13&lt;/code&gt; 这套 ACPI 命名推测是联想小新 Pro 13 一代的配置，仅供参考。）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;版本&lt;/strong&gt;：TGLDmic v0.5.0。这里有个关键背景——Comet Lake 支持是 &lt;strong&gt;2026-10-30 的 v0.5.0 才合入的&lt;/strong&gt;，作者验证的机器是 ThinkPad X1 Carbon Gen 7（ALC285，SSID &lt;code&gt;17aa:2292&lt;/code&gt;），和我的不是同一块主板。&lt;/p&gt;
&lt;h3 id="现象"&gt;现象
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;BootResult&amp;#34; = &amp;#34;FAIL core0 power up (CPA) (0x001d003c)&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;TGLDmicPhase&amp;#34; = 4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;Streaming&amp;#34; = No
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;日志：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ADSPCS&lt;/span&gt; &lt;span class="mh"&gt;0x001d003c&lt;/span&gt; &lt;span class="n"&gt;PPCTL&lt;/span&gt; &lt;span class="mh"&gt;0x00000000&lt;/span&gt; &lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="n"&gt;boot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sof&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ri&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cAVS&lt;/span&gt; &lt;span class="mf"&gt;1.8&lt;/span&gt; &lt;span class="n"&gt;Comet&lt;/span&gt; &lt;span class="n"&gt;Lake&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;557824&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="mi"&gt;557056&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;clock&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;power&lt;/span&gt; &lt;span class="n"&gt;gating&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CGCTL&lt;/span&gt; &lt;span class="mh"&gt;0x007b09ff&lt;/span&gt; &lt;span class="n"&gt;PGCTL&lt;/span&gt; &lt;span class="mh"&gt;0x00000000&lt;/span&gt; &lt;span class="n"&gt;EM2&lt;/span&gt; &lt;span class="mh"&gt;0x84806000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PPCTL&lt;/span&gt; &lt;span class="mh"&gt;0x00008000&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PROCEN&lt;/span&gt; &lt;span class="n"&gt;bit&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FAIL&lt;/span&gt; &lt;span class="n"&gt;core0&lt;/span&gt; &lt;span class="n"&gt;power&lt;/span&gt; &lt;span class="n"&gt;up&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CPA&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x001d003c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="读懂-adspcs"&gt;读懂 ADSPCS
&lt;/h3&gt;&lt;p&gt;cAVS 的 &lt;code&gt;ADSPCS&lt;/code&gt;（DSP BAR + 0x04）每个核占 4 个位段：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;位段&lt;/th&gt;
 &lt;th&gt;名称&lt;/th&gt;
 &lt;th&gt;含义&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[7:0]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;CRST&lt;/td&gt;
 &lt;td&gt;核心复位&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[15:8]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;CSTALL&lt;/td&gt;
 &lt;td&gt;核心停顿&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[23:16]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;SPA&lt;/td&gt;
 &lt;td&gt;请求上电&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[31:24]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;CPA&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;已上电&lt;/strong&gt;（硬件置位）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;0x001d003c&lt;/code&gt; → CRST=&lt;code&gt;0x3c&lt;/code&gt;、CSTALL=&lt;code&gt;0x00&lt;/code&gt;、SPA=&lt;code&gt;0x1d&lt;/code&gt;、&lt;strong&gt;CPA=&lt;code&gt;0x00&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;参考机器的正常空闲值 → &lt;code&gt;0x00000f0f&lt;/code&gt;：4 个核都处于 stall + reset、未上电&lt;/li&gt;
&lt;li&gt;这次写入 SPA 后的正常值 → &lt;code&gt;0x0f0f0f0f&lt;/code&gt;：SPA/CPA 全部置位&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;三个观察让方向变得很明确：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;本机的初始值不是&amp;quot;干净空闲&amp;rdquo;，而是一个半复位的残留状态&lt;/strong&gt;（core0 甚至不在 reset 里，SPA 却已经有位）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对 ADSPCS 的写入全部无效&lt;/strong&gt;——连 &lt;code&gt;corePowerDown()&lt;/code&gt; 里的 CSTALL/CRST 都改不动它，每次重试读回的还是同一个 &lt;code&gt;0x001d003c&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;PPCTL&lt;/code&gt; 是 &lt;code&gt;0x00000000&lt;/code&gt;&lt;/strong&gt;，而参考机器的日志里是 &lt;code&gt;0x40000000&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;固件一个字节都还没写进去，所以这不是 &lt;code&gt;sof-cml.ri&lt;/code&gt; 的问题，也不是 AppleALC、boot-args、HAL 插件的问题：&lt;strong&gt;平台没把 DSP 从被按住的状态里放开&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="五对照-linux-sof-源码找差异"&gt;五、对照 Linux SOF 源码找差异
&lt;/h2&gt;&lt;p&gt;TGLDmic 的启动序列是照着 Linux &lt;code&gt;sound/soc/sof/intel/hda-loader.c&lt;/code&gt; 写的，但它省略了两步&amp;quot;通常 AppleHDA 已经替它做过&amp;quot;的操作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;PPCTL.GPROCEN = 1&lt;/code&gt;&lt;/strong&gt;
Linux 在 &lt;code&gt;hda_dsp_probe()&lt;/code&gt; 里调用 &lt;code&gt;hda_dsp_ctrl_ppcap_enable(sdev, true)&lt;/code&gt;，也就是给 &lt;code&gt;PPCTL&lt;/code&gt; 的 bit30 置位（Global Processing Enable）。TGLDmic 只设置了 loader stream 自己的 &lt;code&gt;PROCEN&lt;/code&gt; 位，从来没设过 &lt;code&gt;GPROCEN&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一个干净的核状态&lt;/strong&gt;
Linux 的 &lt;code&gt;hda_dsp_pre_fw_run()&lt;/code&gt; 会先检查 DSP 是否已经使能，若使能先完整掉电；然后关掉 clock/power gating。&lt;code&gt;cl_dsp_init()&lt;/code&gt; 再对 &lt;code&gt;host_managed_cores_mask&lt;/code&gt;（CML 是 &lt;code&gt;0xF&lt;/code&gt;）置 SPA、等 CPA。TGLDmic 只在 &lt;code&gt;CPA(CORE0)&lt;/code&gt; 已经置位时才会尝试复位，本机 CPA=0，所以直接跳过了。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在作者那台 X1C7 上，AppleHDA 留下的状态恰好是干净的 &lt;code&gt;0x0f0f&lt;/code&gt;，这两步没做也没事。在我的机器上不是，于是 SPA 写下去永远等不到 CPA。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="六补丁在启动前把状态归位"&gt;六、补丁：在启动前把状态归位
&lt;/h2&gt;&lt;p&gt;思路很直接：把 Linux 会做的那两步补上，并加上足够的读回日志和重试。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;TGLDmic&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;preBootFix&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;fix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wide&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gctl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;PE_parse_boot_argn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;tgldmicfix&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;fix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fix&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// =0 关闭补丁，用于 A/B
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;PE_parse_boot_argn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;tgldmicwide&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;wide&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wide&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// =1 连保留的 core 4..7 一起复位
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;PE_parse_boot_argn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;tgldmicgctl&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gctl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gctl&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// =1 额外复位 HDA 控制器（有副作用）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fix&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;fix: disabled (tgldmicfix=0)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cm"&gt;/* 1. 全局处理使能：Linux 在 probe 时一定会设 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;uint32_t&lt;/span&gt; &lt;span class="n"&gt;pp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ppOffset&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;HDA&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;PP_PPCTL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pp&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;HDA&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;PPCTL_GPROCEN&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;w32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ppOffset&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;HDA&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;PP_PPCTL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pp&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;HDA&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;PPCTL_GPROCEN&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;fix: GPROCEN set, PPCTL 0x%08x -&amp;gt; 0x%08x&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ppOffset&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;HDA&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;PP_PPCTL&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cm"&gt;/* 2. stall -&amp;gt; reset -&amp;gt; 清 SPA，回到 Linux 期望的干净状态 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;uint32_t&lt;/span&gt; &lt;span class="n"&gt;mask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;targetCoreMask&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;uint32_t&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wide&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="mh"&gt;0xFFu&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;uint32_t&lt;/span&gt; &lt;span class="n"&gt;cs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;d32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DSP&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ADSPCS&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dw32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DSP&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ADSPCS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cs&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;SPA&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xFFu&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;CSTALL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;CRST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pollDsp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DSP&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ADSPCS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CRST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;CRST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;50000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dw32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DSP&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ADSPCS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DSP&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ADSPCS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;SPA&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xFFu&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pollDsp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DSP&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ADSPCS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CPA&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;配合两处改动：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bootDsp()&lt;/code&gt; 里在 &lt;code&gt;gating(false)&lt;/code&gt; 之后、&lt;code&gt;prepareLoaderStream()&lt;/code&gt; 之前调用 &lt;code&gt;preBootFix()&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;corePowerUp()&lt;/code&gt; 改成最多重试 3 次，每次写 SPA 前后都打印 &lt;code&gt;ADSPCS&lt;/code&gt;，失败时重新 &lt;code&gt;preBootFix()&lt;/code&gt; 再试。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;另外把 &lt;code&gt;gating(false)&lt;/code&gt; 之后 &lt;code&gt;CGCTL/PGCTL/EM2&lt;/code&gt; 的&lt;strong&gt;读回值&lt;/strong&gt;也打印出来——这能直接判断 PCI 配置空间的写到底生效没有：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;boot: clock/power gating off (CGCTL 0x007b09ff PGCTL 0x00000000 EM2 0x84806000)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;boot: gating read-back CGCTL 0x007b09fd PGCTL 0x00000004 EM2 0x84804000
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="编译与安装"&gt;编译与安装
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 需要 Xcode Command Line Tools&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone --depth &lt;span class="m"&gt;1&lt;/span&gt; https://github.com/acidanthera/MacKernelSDK
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; TGLDmic/kext &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make &lt;span class="nv"&gt;SDK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/path/to/MacKernelSDK
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 产物：build/TGLDmic.kext&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;装回 EFI 前先把原版备份出来，出问题一条命令就能退回：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;diskutil mount disk0s6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo rm -rf /Volumes/Untitled/EFI/OC/Kexts/TGLDmic.kext
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cp -R build/TGLDmic.kext /Volumes/Untitled/EFI/OC/Kexts/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;diskutil unmount /Volumes/Untitled
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;只改了 kext 本身，&lt;code&gt;config.plist&lt;/code&gt;、boot-args、AppleALC、HAL 插件都不用动。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="七结果"&gt;七、结果
&lt;/h2&gt;&lt;p&gt;重启后：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;BootResult&amp;#34; = &amp;#34;OK FW_READY&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;TGLDmicVersion&amp;#34; = &amp;#34;0.5.0-test1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;Streaming&amp;#34; = No
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;ADSPCS&amp;#34; = 3855 # 0x00000f0f，空闲时正常掉电
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;启动日志：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ADSPCS&lt;/span&gt; &lt;span class="mh"&gt;0x00000f0f&lt;/span&gt; &lt;span class="n"&gt;PPCTL&lt;/span&gt; &lt;span class="mh"&gt;0x40000000&lt;/span&gt; &lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="n"&gt;boot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;GPROCEN&lt;/span&gt; &lt;span class="n"&gt;already&lt;/span&gt; &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PPCTL&lt;/span&gt; &lt;span class="mh"&gt;0x40000000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;stall&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;reset&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt; &lt;span class="mh"&gt;0xf&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;ADSPCS&lt;/span&gt; &lt;span class="mh"&gt;0x00000f0f&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mh"&gt;0x00000f0f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;power&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;up&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ADSPCS&lt;/span&gt; &lt;span class="mh"&gt;0x00000f0f&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mh"&gt;0x0f0f0f0f&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;want&lt;/span&gt; &lt;span class="n"&gt;CPA&lt;/span&gt; &lt;span class="mh"&gt;0x0f000000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;core&lt;/span&gt; &lt;span class="n"&gt;powered&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ADSPCS&lt;/span&gt; &lt;span class="mh"&gt;0x0f0f0f0f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;core0&lt;/span&gt; &lt;span class="n"&gt;running&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ADSPCS&lt;/span&gt; &lt;span class="mh"&gt;0x0f0f0e0e&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ROM&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FSR&lt;/span&gt; &lt;span class="mh"&gt;0x05000001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="n"&gt;loader&lt;/span&gt; &lt;span class="n"&gt;FW_ENTERED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FSR&lt;/span&gt; &lt;span class="mh"&gt;0x00000005&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DPIB&lt;/span&gt; &lt;span class="mi"&gt;557056&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SUCCESS&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;SOF&lt;/span&gt; &lt;span class="n"&gt;firmware&lt;/span&gt; &lt;span class="n"&gt;running&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FW_READY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;录音实测（两次独立会话，间隔十几秒，DSP 会自动重新上电）：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;会话&lt;/th&gt;
 &lt;th&gt;格式&lt;/th&gt;
 &lt;th&gt;mean&lt;/th&gt;
 &lt;th&gt;max&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;第 1 次&lt;/td&gt;
 &lt;td&gt;48 kHz 立体声&lt;/td&gt;
 &lt;td&gt;-30.7 dB&lt;/td&gt;
 &lt;td&gt;-9.3 dB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;第 2 次&lt;/td&gt;
 &lt;td&gt;48 kHz 立体声&lt;/td&gt;
 &lt;td&gt;-38.7 dB&lt;/td&gt;
 &lt;td&gt;-25.5 dB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;安静房间里的真实环境声，不是数字静音。扬声器和耳机不受影响。&lt;/p&gt;
&lt;h3 id="一点诚实的说明"&gt;一点诚实的说明
&lt;/h3&gt;&lt;p&gt;补丁里放了两步（GPROCEN + 强制复位），但第一次打补丁那轮启动的日志已经被 128 行环形缓冲区顶掉了，现在能看到的每一轮开机都已经是干净状态。所以我能确认的是：&lt;strong&gt;补丁兼容、机器从此每次都能正常启动&lt;/strong&gt;；但我没法百分百断言是哪一步起的作用，也排除不了&amp;quot;换 kext 时那次完整断电顺带清掉了卡死状态&amp;quot;。&lt;/p&gt;
&lt;p&gt;真要归因，做一次 A/B 就行：把原版 0.5.0 装回去、重启，看 &lt;code&gt;0x001d003c&lt;/code&gt; 会不会回来。这一步我留着当后续实验——毕竟现在麦克风能用，能不折腾就不折腾。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="八给后来人的-checklist"&gt;八、给后来人的 checklist
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;先判断麦克风类型&lt;/strong&gt;，再决定要不要折腾 DSP。Windows 驱动目录 / Linux dmesg / &amp;ldquo;假麦&amp;rdquo; 录音测试，三个里凑够两个再动手。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;先读 &lt;code&gt;BootResult&lt;/code&gt; 的括号值&lt;/strong&gt;。它是失败时的寄存器原值，信息量比任何描述都大。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;和已知可用的机器比同一条日志&lt;/strong&gt;。我这次的突破口就是 &lt;code&gt;ADSPCS&lt;/code&gt; 和 &lt;code&gt;PPCTL&lt;/code&gt; 两行和作者机器对不上。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;写入是否生效要读回&lt;/strong&gt;。寄存器写下去、读回不变，说明问题根本不在你写的值上。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;别在 DSP 没点亮时换固件&lt;/strong&gt;。&lt;code&gt;ROM error 44&lt;/code&gt; 才是固件/验签问题，&lt;code&gt;CPA&lt;/code&gt; 不上电跟固件无关。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保留原版 kext 和 patch 源码&lt;/strong&gt;。上游更新会覆盖补丁；我这台机器一旦装回官方的 0.5.0，麦克风就回到原形。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;失败时 TGLDmic 会抢默认输入&lt;/strong&gt;，而且从它录音可能直接卡住（我实测 ffmpeg 打开设备两分钟无响应）。修好之前先把默认输入切回 Built-in Input，或者卸掉 HAL 插件。&lt;/li&gt;
&lt;li&gt;DSP 只在录音时上电，空闲时日志里 &lt;code&gt;Streaming = No&lt;/code&gt; 是正常现象，不代表坏了。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考"&gt;参考
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/labrouss/TGLDmic" target="_blank" rel="noopener"
 &gt;labrouss/TGLDmic&lt;/a&gt; —— 项目主页、安装与测试文档&lt;/li&gt;
&lt;li&gt;Linux 内核 &lt;code&gt;sound/soc/sof/intel/&lt;/code&gt;：&lt;code&gt;hda-ctrl.c&lt;/code&gt;（&lt;code&gt;hda_dsp_ctrl_ppcap_enable&lt;/code&gt;）、&lt;code&gt;hda-dsp.c&lt;/code&gt;（&lt;code&gt;hda_dsp_core_power_up&lt;/code&gt;、&lt;code&gt;hda_dsp_core_stall_reset&lt;/code&gt;）、&lt;code&gt;hda-loader.c&lt;/code&gt;（&lt;code&gt;cl_dsp_init&lt;/code&gt;）、&lt;code&gt;hda.c&lt;/code&gt;（&lt;code&gt;hda_dsp_pre_fw_run&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;Intel High Definition Audio 规范中的 &lt;code&gt;ADSPCS&lt;/code&gt; 定义&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>