AI 说明:本文由 AI 撰写,修复过程中的故障诊断、固件分析、恢复方案、程序编写和软件执行也均由 AI 完成。 我根据 AI 的指导完成了拆机、接线、探测、测量电压以及断电重连等实物操作,并在修复后确认了结果。
此前,我曾把一台初代 Solid State Logic SSL 2+ 强行刷入 SSL 2 / SSL 2+ MKII 系列的固件,导致它无法正常使用。设备仍能通过 USB 被电脑识别,但报告的身份已经不再对应实际硬件,正常的恢复入口也无法可靠响应。
最终的修复过程包括拆开机壳、在不拆焊芯片的情况下读取串行闪存、分析启动结构,以及擦除错误升级映像中的一个 4 KiB 扇区。原有启动程序和工厂固件其实一直保留着。错误升级映像不再被启动程序选中后,声卡重新运行起自身的 SSL 2+ 工厂固件。
这段经历值得记录的部分,是如何一步步得出这个结论。整个过程经过多轮诊断、反复核对实物连接、取得可靠备份,以及不断区分“观察到了什么”和“这能说明什么”。
从一次改文件名开始
当时的错误操作很直接:我把 SSL2-2+_A067.bin 改名为 SSL2+_A060.bin,然后将它用于原本期待后一个文件的更新流程。文件内部仍然是 MKII 固件,改名没有改变其硬件要求、USB 描述符或实际程序代码。
此后,初代 SSL 2+ 开始报告 MKII 身份。原来的硬件运行了不匹配的固件,并没有因此变成新一代声卡。
这里还涉及一个容易混淆的问题:更新工具包的版本、设备显示的固件版本、文件名后缀,以及启动程序内部使用的映像序号,是不同的标识。SSL 的公开更新说明区分了初代设备显示的 1.10 固件和 MKII 的 1.16 固件,不能把这些数字当成可以互换的升级选项。SSL 官方固件更新说明。
为什么先尝试 USB 恢复
在拆机之前,AI 先分析了现有驱动、更新工具和工厂恢复工具,尝试确认能否通过 USB 进入可用的恢复模式。
一个很有迷惑性的线索是设备显示过 “Solid State Logic DFU”。DFU 指设备固件升级,但名称中出现 DFU,并不代表设备此刻已经能接收固件下载。实际观察到的配置中,音频接口与 DFU 的 runtime 接口同时存在。
为了区分“启动音频时出问题”和“处理恢复请求时出问题”,测试中暂时阻止了音频流自动启动。每次重新上电后,普通 USB 描述符和字符串读取可以成功;随后在独立测试中发送 DFU 状态查询,或者厂商扩展的 0xF2 恢复入口请求,却会发生超时,紧接着普通读取也会失败。没有观察到设备重新枚举为可用的 DFU 模式。
USB 抓包与驱动日志帮助确认了实际发出的请求,也暴露了证据的局限:主机侧某条完成记录看似成功时,应用层 API 仍可能报告超时。设备还留在缓存列表里,或者某条完成状态显示成功,都不足以说明设备固件已经完成模式切换。
之后,在另一台运行原生 Linux 的电脑上,保持音频接口不参与测试,又复现了同样的核心现象:普通读取先成功,恢复请求卡住,随后通信失败。对设备声明的两个配置索引进行直接读取,返回的配置内容也相同,没有找到另一个可以直接选择的恢复配置。
跨系统对照明显削弱了“只是 Windows 驱动有问题”的解释,更支持设备端固件处理异常的方向。但这些结果并没有定位到某条具体死锁指令,也没有排除所有未公开的恢复机制。继续重复同一个请求已经难以增加有效信息,因此诊断转向了闪存芯片。
台架准备与最初的误导性结果
公开的拆解照片帮助定位了串行闪存,并提供了电路板布局参考。现有拆解针对的是相关型号 SSL 2,因此照片中的标注和器件识别都只是线索,仍要与手中这台 SSL 2+ 的实际电路板核对。SSL 2 拆解参考。
板上的闪存是一颗八引脚、3.3 V 串行 NOR Flash,主存储区容量为 8 Mbit,也就是 1 MiB。最初的目标是保持芯片焊在板上,先取得一份可信的完整主存储区备份。
辅助设备按所需能力选择:
| 设备类型 | 本次使用的能力 |
|---|---|
| USB SPI 编程器 | 支持 3.3 V 操作,引出片选和 SPI 信号,并能通过程序调用 |
| 八引脚测试夹与短连接线 | 在不拆焊闪存的情况下接触引脚 |
| 数字万用表 | 测量供电电压,并在断电时检查通断 |
| USB 混合信号仪器 | 四路数字输入监听 SPI,两路模拟通道测量实际电压 |
| 无源探头与细针测试接点 | 进行高阻抗测量,接触包括复位节点在内的测点 |
| 电阻 | 在已确认的复位节点上施加经测量验证、限制电流的下拉 |
通过编程器给电路板供电期间,声卡自身的 USB 始终断开。混合信号仪器只并联监听,输出功能关闭;监听线也没有取代编程器原来的信号连接。
早期结果并不顺利。芯片识别有时返回 FF FF FF。测试夹接触受到怀疑,也尝试更换了夹子;一次看似异常的供电读数,需要在确认万用表设置后重新测量。信号线连接同样经历了修正。
无效的全一识别结果,不能证明闪存主存储区已经被擦空。输入线断开、命令信号没有到达芯片、接触不良,或者总线正被其他器件驱动,都可能产生类似现象。
因此,AI 先让编程器脱离声卡进行独立检查。输出接回输入的环回测试验证了数据通路;缓慢的高—低—高电平测试,则让万用表可以直接检查片选输出。这些检查在 Windows 等环境下通过,帮助缩小了问题范围,但仍不能证明从编程器到电路板的整条连接已经正确。
给闪存供电也唤醒了板上主控
一个关键的电气观察来自对照实验:断开编程器的四根 SPI 信号线,只保留供电和地线后,被动仪器仍然观察到了时钟活动。一次上电采集中,还捕获到了由板上电路发起的读取命令。
这说明闪存供电接通时,板上主控也处于活动状态。外部读取闪存需要考虑另一个可能驱动总线的主设备。时钟和模拟电压的观察支持了总线争用或负载影响的判断,但不能因此把之前所有失败都归结为同一个原因。
接下来的任务是让主控保持复位。这要求找到真正的系统复位连接,不能假设某个相邻测试点或调试复位信号具有同样作用。芯片朝向和可接触的连接关系经过了电气核对,最后找到了一个可操作的测试点,它到已确认复位引脚的电阻接近表笔自身阻值。
先接入 4.7 kΩ 下拉时,复位节点仍然约为 1.15 V。虽然采样中的时钟活动停止了,但这个电压仍高于该主控所采用的保证低电平上限。仅凭“看不到时钟”还不能认定复位条件可靠。
换成 1 kΩ 后,实测复位电压降到约 0.29 V,板上供电维持在约 3.2 V,模拟采样也支持复位处于低电平。这些阻值反映的是这块板上实际测得的结果,其适用性取决于具体复位电路。
此后还发现了一处接线问题:一次失败的识别事务中,软件请求发送 0x9F,目标端捕获到的命令线却一直处于低电平。编程器的输出连接存在遗漏或错接。修正这条连接后,才终于读到了预期的芯片身份。
这一区分非常重要:程序要求发送的字节,并不自动等于芯片实际收到的字节。波形把中间缺失的连接暴露了出来。
先证明备份可信
芯片识别和短范围重复读取一致后,AI 对 1 MiB 主存储区进行了三次完整读取。三份文件逐字节完全相同,SHA-256 校验值也一致。
这一阶段的闪存命令仅限于读取身份、状态和主存储区。取得备份不需要发送写使能、擦除、编程或更改保护位的命令。
文件和校验记录在进一步分析前就已保存。这些备份覆盖主存储区,不包括独立的一次性可编程存储区域。
重复读取一致,证明了读取结果具有可重复性。内容的结构是否有效,以及一个有效映像是否属于正确的硬件型号,仍然需要另行分析。
闪存里究竟保留了什么
离线比对在原始闪存偏移 0x012000 找到了完整的错误 MKII 升级包。更重要的是,闪存开头仍然存在启动程序和另一份独立的工厂映像。
以下布局来自这台设备经过验证的备份。地址均为原始 SPI 字节偏移,区间包含首尾两个地址。
| 地址范围 | 本机备份中的内容 | 恢复时的处理 |
|---|---|---|
0x000000–0x000AD3 | 启动记录与压缩的启动程序 | 保留 |
0x000AD4–0x01144F | 初代 SSL 2+ 工厂映像 | 保留 |
0x011450–0x011FFF | 对齐填充 | 保留 |
0x012000–0x024413 | 错误的 MKII 升级包,包含包尾 | 仅擦除其第一个 4 KiB 扇区 |
0x024414–0x0244FF | 用途尚未确认的额外尾随字节 | 保留 |
0x024500–0x0BFFFF | 已擦除空间 | 保留 |
0x0C0000–0x0FFFFF | 位于升级扫描范围之外的数据或保留区 | 保留 |
数据区域没有被视为可以随意清除的内容。由于没有完整解释它的含义,恢复时逐字节保留,也没有把它擅自描述成已确认的校准数据、序列号区域或无用填充。
通过解码内容和 USB 描述符,分析区分了三份固件的身份:
| 映像 | 分析确认的身份 |
|---|---|
| 保留下来的工厂映像 | 初代 SSL 2+,版本 0.61 |
正确的 SSL2+_A060.bin 升级包 | 初代 SSL 2+,版本 1.10 |
错误的 SSL2-2+_A067.bin 升级包 | MKII 系列固件,版本 1.16 |
工厂映像与正确的升级包本来就是不同版本。因此,备份中没有找到一份与较新初代升级包完全相同的连续字节,并不意味着工厂固件已经丢失。
SSL 官方工厂恢复说明提到初代设备可回到 0.61,这也与本次实际找到的工厂映像一致。SSL 官方工厂恢复说明。
校验机制与启动选择
分析没有停留在搜索产品字符串。对于本次检查的启动和固件结构,需要先把每个字节内部的比特顺序反转,再按小端读取其中的 32 位字段。这只是用于理解内容的分析视图,原始备份和官方升级包仍保留其原有存储字节形式。
AI 检查了启动记录、映像头、映像主体以及独立的程序段。启动程序和三份待比较固件中的 16 项校验全部通过,还用独立的逐位实现交叉核对了计算结果。
CRC 使用反射多项式 0xEDB88320,但移位输入规则和覆盖范围同样关键。对本次分析的已解码区域,结果与 zlib.crc32(data, 0x2144DF1C) 一致,而不是默认种子的调用。程序段校验还需要包含定义好的长度前缀。把熟悉的 CRC 函数直接套到整个原始文件上,无法复现这些校验。
压缩程序也经过了重建。一个独立、有界的解释器执行映像内的解压指令,其结果与另一套解码器在启动程序和六个固件程序上完全一致。这使后续对实际启动逻辑的分析有了更可靠的基础。
启动逻辑会扫描升级区,检查映像结构和 CRC,并根据内部序号选择符合条件的升级映像。如果没有选出有效升级,才回退到工厂映像。
错误的 MKII 映像在内部结构和校验上是自洽的,其升级序号也让它能够优先于工厂映像被选中。CRC 正确只能说明数据与其校验值相符,不能说明这份数据适合初代 SSL 2+ 硬件。
离线模拟进一步表明,擦除错误升级映像的第一个扇区后,它的有效映像头就会消失。扫描区域内没有找到其他有效升级候选,因此启动选择会回到仍然完整的工厂映像。
本节中的地址和启动行为属于这份已验证备份,不能直接假定它们适用于所有电路板版本,或者所有症状相似的声卡。
选择并执行最小的已验证修改
最终采用的恢复操作是擦除 0x012000–0x012FFF,也就是完全位于错误升级映像内部的一个 4 KiB 扇区。剩余 MKII 数据可以留在原处,因为启动程序不会再把该位置识别为有效升级映像的起点。
这样就不需要替换启动程序、重写工厂映像,或者拿一个升级包去重建整个闪存。是否安装较新的初代升级包,留待恢复成功后另行决定。
AI 编写了专用执行脚本,固定擦除地址和预期备份校验值,并通过持久记录阻止自动重复执行。脚本没有通用的固件编程功能。13 项离线测试覆盖了异常命令与地址拒绝、原始数据不符、通信结果不确定、忙状态超时,以及目标范围外数据变化等情况。
在我明确授权实施后,执行顺序如下:
- 重新核对回报的供电与复位电压、芯片身份、状态寄存器和被动复位采样。
- 再完整读取一次闪存,要求与此前保存的原始备份逐字节相同。
- 单独保存即将擦除扇区的原始内容。
- 发送一次写使能,再发送一次针对固定 4 KiB 扇区的擦除命令。
- 观察操作完成,确认写使能已经清除,并回读目标扇区。
- 再进行两次完整主存储区读取,逐字节核对是否与预期结果相同。
执行过程不会自动重复擦除,也不会扩大修改范围。如果命令可能已经到达芯片、通信结果却不确定,就必须先检查已记录的状态。
在第一次正常启动前完成验证
两次恢复后的完整读取完全一致。目标扇区全部变为 FF,整片校验值与操作前预测的结果一致。
逐字节比较给出了清楚的修改边界:
- 3,900 个字节发生变化,全部位于授权的目标扇区。
- 该扇区另外 196 个字节原本就是
FF。 - 扇区之外的 1,044,480 个字节完全没有变化。
- 保留的启动程序和工厂映像 CRC 仍然全部通过。
这些比较是在主控仍被保持复位时完成的,早于正常固件运行、并可能自行保存运行参数的时刻。
复位电压在擦除前后及各组读取之间进行了采样,但这些样本并不是覆盖整个擦除过程的连续波形。完整闪存回读提供了更强的结果证据:预期的数据修改已经发生,目标范围之外的数据也被保留下来。
随后,我才断开电源,撤除测试夹、探头、编程连接线和复位下拉电阻,再用声卡自身的 USB 接口重新连接电脑。
SSL 2+ 回来了
Windows 再次识别出 SSL 2+ USB Audio Device。驱动报告运行的是 0.61 工厂固件,并处于 APP 正常运行模式。音频输入、输出 1/2、输出 3/4 和 MIDI 设备均正常枚举。
AI 还分别打开两组输出,完成了短时的 48 kHz、双声道、16 位静音音频流,没有报告缓冲欠载;输入格式检查也通过了。这些自动化检查确认了设备身份、正常运行模式、格式接受情况和输出流完成情况,不等同于模拟音频性能的实验室测量或完整的 MIDI 环回测试。
随后,我也确认了修复成功。声卡保留在恢复后的工厂固件上,本次修复无需再写入 SSL2+_A060.bin。
整个过程中没有拆焊闪存,也没有使用替换芯片或其他设备的整片备份。恢复利用的是这台声卡本身一直保留着的有效工厂映像。
这次与 AI 一起修复设备的体会
AI 负责驱动与固件分析、诊断程序编写、测量结果解释、受限恢复脚本测试,以及授权后的软件操作。实际电路板的状态,仍然取决于人的细致操作和准确回报。
过程中有不少假设需要修正:设备名称不能替代运行模式验证;全一返回不能替代闪存内容验证;编程器环回成功不能替代芯片连接验证;时钟安静不能替代复位电压验证;软件请求发送命令,也不能替代目标端实际收到命令的证据。
有效的推进方式,是把每个不确定的解释转化为具体检查,保存结果,并在证据与原先假设冲突时调整下一步。只有物理访问、原始数据、映像结构和预期修改都得到确认后,才真正改变闪存内容。
最终让 SSL 2+ 恢复工作的修改很小,而支撑它的验证工作很多:一个扇区让错误升级失去启动资格,声卡便重新使用了始终保留着的完整工厂固件。