跳到正文
原文
Hacker News· ErenayDev·· 2 小时前精选AI 评分50

作者用 Claude 逆向硬件,写出扫描仪 SANE 后端与 ThinkPad 摄像头补丁

Using AI to reverse engineer hardware

AI 导读

GNOME 博客作者发文介绍用 Claude code 与自制的 hw-harness 框架完成三项工程,为 Plustek OpticFilm 8200i(Genesys GL128。

推荐理由

文章把 AI 辅助逆向硬件驱动整理成一套可复用方法,把设备透传给 KVM 跑 Windows、用 usbmon 抓厂商流量再与自写驱动 diff,可迁移到其他缺 Linux 支持的设备上。

正文 · AI 翻译

我母亲去世后,我继承了一大箱旧胶片底片,里面装的是童年家庭旅行之类的照片。于是我决定买一台底片照片扫描仪,发现 Plustek 8200i 在 Linux 下有支持,就买了。结果却发现扫描仪里的芯片组已经换成了 Linux 不再支持的那种。我曾用 Claude code 成功为自己的一些硬件编写了 Linux 配置工具,比如我的Dell Camera controller app,所以我想,也许 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 复用我搭建好的工具链,尝试通过按需更新内核驱动和 libcamera 来修复笔记本上的 MIPI 摄像头。我早上一开工,到当天结束时,已经大大改善了情况,内核和 libcamera 两边的补丁都准备好了。

于是我觉得这件事值得与大家分享。虽然任何人都可以从零开始,但我还是请 Claude 把这套工具链做成通用版并加上文档,让其他想在自己硬件上尝试的人能少走点弯路。为没有文档的硬件编写驱动向来是件苦差事。你要捕获总线流量,对着一堆十六进制转储发呆,还要对每个寄存器或控制传输的作用提出猜想,然后一个一个去测试,往往要花上几周时间。这些事在概念上都不难,但需要极大的耐心和技巧。

这类工作恰好适合 AI 模型。它能读成千上万行 USB 捕获数据,注意到一个序列重复出现而只有一个字节变化,并推测该字节的含义。它能写出测试加以验证,而且不会觉得枯燥。人类仍然决定要做什么,并检查它在真实硬件上是否可用,但苦活累活被大幅压缩了。

hw-harness

请注意,我并没有以这种形式在项目中使用 hw-harness,因为那时的代码基本上都是定制的;这个项目旨在把我当时使用的脚本改造成更通用、可共享的 harness。hw-harness 旨在帮助你的 Claude 或 Codex 会话完成以下工作:

1. 录制参考会话。在 KVM 虚拟机中运行厂商的 Windows 驱动,并将真实设备透传给客户机。
2. 在虚拟机外进行捕获。在 Linux 宿主机上用 usbmon 录制流量。usbmon 位于透传层之下,因此客户机看不到这些流量。
3. 在 Linux 上用你自己的驱动重复同样的操作,并以相同方式进行捕获。
4. 对比两份跟踪数据。两份数据来自同一台仪器,因此可以直接对比。其差异就是你的驱动缺陷清单。

对于没有总线可以监听的设备(例如内置 MIPI 摄像头),harness 改用 Windows 端的检查方式,即查看 INF 文件、注册表数据、ACPI 表和设备属性。

这种方法的好处在于它不依赖复制任何代码,而是观察硬件的实际行为,仅从 Windows 驱动中提取配置数据,因此新驱动中的每个常量都可以追溯到某次记录。

所以有兴趣的人可以看看,我对自己做过的 3 个项目以及所需条件做了简短的介绍。

项目 1:为 Plustek OpticFilm 8200i 编写的 SANE 后端

comparison of two scanner drivers on same negative-

对比两个可获得的驱动的输出。

第一个项目是为较新的 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 摄像头

Showing MIPI output before and after fixes. Colors are better than they look as I was sitting in a relatively dark room by the end of the session.

显示修复前后的 MIPI 输出。实际颜色比看上去更好,因为会话最后我坐在一个相当昏暗的房间里。

我的 Lenovo ThinkPad X1 Carbon Gen 14(Aura Edition)搭载 Sony IMX471 传感器,搭配 Intel IPU7。在 Linux 上它输出的图像偏暗,存在明显的暗角,并带有强烈的黄绿色偏。mipi-fixes-x1-aura 收录了这些修复。由于它只和这台笔记本相关,所以没有做成更大的打包项目,不过我已经把内核补丁提交给了 Kate Hsuan,libcamera 补丁则正由 Wim Taymans 审阅,准备提交到 Libcamera。

内核(IMX471 驱动):

  • 裁剪选择的一个 bug 在存储裁剪矩形之前返回了错误,于是 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 包在发布页面。

我的收获

  • 参考采集是关键一步。让 AI 把一条已知的良好轨迹与一条失败的轨迹对比,可以把模糊的“它不工作”变成具体的差异清单。例如对 MIPI 摄像头来说,同时连接一台 USB 摄像头,让 Claude 能对比两者的采集,这一点至关重要。
  • AI 擅长处理繁琐事务。这包括解码采集数据、编写探测程序以及交叉核对常量。但物理硬件仍得由我本人亲手操作。
  • 真实硬件是唯一的裁判。上面的每一条结论都在实际扫描仪或笔记本上验证过。

如果你的硬件没有 Linux 驱动,可以试试 hw-harness。再次感谢 Glorious Eggroll 带来的启发。

注:我并不是说我的扫描或 MIPI 摄像头现在已经完美了,但扫描仪给出的扫描效果已经相当不错,MIPI 摄像头也明显比之前好得多。随着时间推移,我相信我们能够进一步调整和打磨,但即便缺乏这方面的深入知识,我也很高兴它让我把问题向前推进了一大步。

—

来源:Hacker News · blogs.gnome.org