用 AI 逆向硬件驱动:hw-harness 实践与三个项目
Using AI to reverse engineer hardware
GNOME 博客作者用 Claude Code 在 KVM 透传下录制 Windows 驱动参考会话、再用 usbmon 在 Linux 端抓相同操作的包并做 diff,从零为 Plustek OpticFilm 8200i 写出新 SANE 后端、在一天内修复 ThinkPad X1 Carbon Gen 14 MIPI 摄像头的内核与 libcamera 通路。
整理出用 Claude Code 对比参考驱动与自写驱动抓包差异来定位硬件 bug 的可复用流程,适合做硬件逆向或 Linux 驱动开发的读者照搬。
我母亲去世后,我得到了一个装满老式胶片底片的大盒子,里面是童年家庭旅行之类的照片。所以我决定买一台底片照片扫描仪,发现 Plustek 8200i 在 Linux 下有支持,就买了。结果发现扫描仪里的芯片组已经换成了 Linux 不再支持的型号。我之前用 Claude code 成功为一些硬件做过 Linux 配置工具,比如我的 Dell Camera 控制器应用,于是我想,也许 Claude 能帮我搞到一个能用的 SANE 驱动。我基本上卡住了,很长一段时间毫无进展,甚至有几个月基本上放弃了这个项目。
后来我看到了 Tom Crider(又名 Glorious Eggroll)在 X 上发的一篇帖子,讲他如何用 AI 工具修好了一个鼠标驱动。他基本上描述了如何设置让 AI 代理完全控制一个 Windows 实例来捕获修复驱动所需的数据。于是我把他的推文粘贴到 Claude,请它帮我搭建一个 Windows 虚拟机来做 Tom 为我扫描仪做的那些事情。我觉得能在 Windows 下运行扫描并同时捕获 USB 数据的组合效果惊人,可能再加上 Claude code 的改进带来了巨大的差异。几个小时之内,我就在 Linux 下得到了第一张可用的扫描图,虽然有一些质量问题,但 100% 能认出来就是底片里的图像。几天后,我就有了一个近乎完美的驱动,还包括红外扫描的支持,准备就绪,却发现在我放弃和再次尝试之间的那段时间里,已经有人提交了支持该扫描仪的 SANE 代码……有时候就是会这样。我还让 Claude 写了一个做底片扫描的应用,命名为 Negative Vibes,觉得这名字挺可爱的。
不管怎样,扫描仪的成功让我想,我能不能用这个办法最终修复我笔记本上 MIPI 摄像头的最后一些问题呢。于是我让 claude 复用我创建好的 harness,按需更新内核驱动和 libcamera 来尝试修复笔记本上的 MIPI 摄像头。我早上开始这项工作,到一天结束时,我已经 大大改善了情况,内核和 libcamera 的补丁都准备好了。
所以我想这或许值得与全世界分享,虽然任何人都可以从头开始,但我还是请 Claude 把 harness 做成通用的并写好文档,让其他想在自己硬件上尝试的人更容易上手。为没有文档的硬件写驱动一直是很枯燥的。你要捕获总线流量,盯着 hex dumps,对每个寄存器或控制传输的作用形成假设,然后一个一个测试,通常要花上几周时间。这些事在概念上都不难,但需要大量的耐心和技能。
这类工作很适合 AI 模型。它可以读上千行 USB 抓包数据,注意到一个序列在重复但有一个字节在变化,并提出这个字节的含义。它可以写测试来验证,也不会觉得无聊。人类仍然决定要做什么,并检查在真实硬件上是否能用,但苦活大大减少了。
请注意,我当时并未以这种形式在自己的项目中使用 hw-harness,因为那基本上是定制代码,所以这个项目旨在把我做这些工作时使用的脚本整理成更通用、可共享的测试框架。hw-harness 旨在帮助你的 Claude 或 Codex 会话完成以下工作:
1. 录制参考会话。在 KVM 虚拟机中运行厂商的 Windows 驱动,将真实设备直通给客户机。
2. 在虚拟机外部抓取。用 Linux 主机上的 usbmon 记录流量。它位于直通层之下,所以客户机看不到它。
3. 在 Linux 上用你自己的驱动重复同样的操作,并用同样的方式抓取。
4. 对比两份抓取记录。两者来自同一台仪器,所以可以直接比较。差异就是你的驱动缺陷清单。
对于没有可监听总线的设备(例如内部 MIPI 摄像头),测试框架改用 Windows 端的检查方式,即 INF 文件、注册表数据、ACPI 表以及设备属性。
这种方法应该没问题,因为它不依赖复制任何代码,而是观察硬件的实际表现,只从 Windows 驱动中提取配置数据,因此新驱动中的每一个常量都能追溯到某条记录。
因此,对于感兴趣的人,我准备了 3 个我所做项目的简短说明以及所需的准备工作。
项目 1:为 Plustek OpticFilm 8200i 开发的 SANE 后端
比较两个可用驱动的输出。
第一个项目是为较新的 Plustek OpticFilm 8200i 开发的 SANE 后端。它使用 Genesys GL128 控制器(USB 07b3:1825),此前没有 Linux 支持。同名的旧款型号使用 GL845,已由 SANE 支持。
该后端支持:
- 彩色、灰度、红外以及彩色+红外模式
- 分辨率从 300 到 7200 dpi,每通道 8 位或 16 位
- 通过红外通道去除灰尘和划痕
- 针对浓重负片的曝光倍率
它被打包为 Fedora RPM,每次推送都会自动构建。我大部分测试都用自己的 Negative Vibes 应用完成,因为 Linux 下负片扫描的可选项并不多。
上游 SANE 的 genesys 后端也于 2026 年 9 月增加了对该扫描仪的支持,因此我对两者进行了比较。两者在 3600 dpi 下都能解析出相同的细节。我的版本在全分辨率下更快(34.6 秒对比 54.4 秒),并支持红外除尘。上游版本提供了更多的分辨率档位。网页提供了一个可交互的并排对比供你查看。这些是基于单台设备、单帧的结果,因此只能作为一个数据点参考。可以看看我做这个可交互页面,它展示了两个驱动的当前状态,希望我的成果能被 SANE 项目用来修复上游驱动中的一些小问题。总之,我把这个项目更多地作为概念验证发布,因为我预计包括我在内的所有人都会在上游驱动达到与本驱动同等水平后转向上游。
项目 2:Negative Vibes
已完成负片的完整扫描,包括图像的红外清洁。
如果扫描负片仍然很痛苦,那么仅有一个驱动作用不大,所以我开发了 Negative Vibes。它是一款用 Rust 编写的 GNOME 应用,用于在任何支持胶片的 SANE 扫描仪上扫描彩色和黑白负片以及幻灯片。
扫描结果与扫描仪输出一模一样:16 位、线性,保留红外通道。其他一切都叠加在此之上,是一层无损设置,因此你可以重新调整外观并再次导出。它包括:
- 带有胶片基底和染料串扰校正的密度空间负片反转
- 整卷设置,并允许逐帧覆盖
- 红外除尘与软件除尘
- 通过 ArgyllCMS 进行 IT8 校色
- 导出为 TIFF、JPEG、PNG 和 DNG,并附带 ICC 配置和元数据
它以 Flatpak 形式发布,其中包含扫描仪后端。目前只在 8200i 上测试过。目标是支持 SANE 所支持的所有胶片扫描仪。为此,SANE 需要一种标准的方式来暴露红外通道,而它目前还没有。
项目 3:修复我的 ThinkPad 上的 MIPI 摄像头
展示修复前后的 MIPI 输出。色彩比实际看起来更好,因为到了拍摄后期,我坐在一个相当昏暗的房间里。
我的 Lenovo ThinkPad X1 Carbon Gen 14(Aura 版)上的摄像头采用的是 Intel IPU7 后面的 Sony IMX471 传感器。在 Linux 上,它输出的图像偏暗,并带有严重的暗角和强烈的黄绿色偏色。mipi-fixes-x1-aura 收集了这些修复。它只与这台笔记本相关,所以它不是较大的打包项目之一,但我已经把内核补丁提交给了 Kate Hsuan,libcamera 的补丁正在由 Wim Taymans 审核,准备提交到 Libcamera。
内核(IMX471 驱动):
- 一个裁剪选择错误在存储裁剪矩形之前就返回了错误,导致 libcamera 假设使用的是完整的像素阵列。
- 测试图样寄存器的位宽声明错误。
- 模拟增益上限设置过低,损失了大约 1.8 档感光度。
libcamera 软件 ISP:
- 完全缺失镜头阴影校正,导致画面四角暗了大约 2.7 档。
- 白平衡统计是在传感器的原生位深下相对于 8 位黑电平进行累加的。这导致白平衡出现偏差,此修复适用于任何 RAW10/RAW12 传感器。
在一次受控的弱光测试中,画面亮度从 31.1 提升到 90.9。红绿比和蓝绿比从 0.890 和 0.672 变为 1.047 和 0.823,接近 USB 网络摄像头的参考值。蓝色在弱光下仍偏低约 17%,我认为这是由于灰世界白平衡造成的。Fedora 44 的 RPM 包已经发布在 releases 页面。
我的心得
- 参考采集是一个很大的进步。让 AI 把一份已知正常的轨迹与一份失败的轨迹进行对比,把模糊的「它不工作」变成一份具体的差异清单。例如对于 MIPI 摄像头来说,同时连接一台 USB 摄像头,让 Claude 能够对比这两份采集,是至关重要的。
- AI 擅长处理那些琐碎的事情。这包括解码采集数据、编写探针以及交叉核对常量。但我仍然得是那个手持真实硬件的人。
- 真实硬件是唯一的裁判。上面的每项声明都在实际的扫描仪或笔记本上验证过。
如果你有硬件找不到 Linux 驱动,可以试试 hw-harness。再次感谢 Glorious Eggroll 带来的启发。
注意:我并不是说我的扫描或 MIPI 摄像头现在已经完美了,但扫描仪能给出看起来相当不错的扫描结果,MIPI 摄像头也比之前好多了。所以我相信随着时间的推移我们一定能进一步调整和打磨,但令我感到高兴的是,尽管我对这类工作缺乏深入的了解,它还是帮我把事情向前推进了一步。
—
来源:Hacker News · blogs.gnome.org


