跳到正文
Hacker News· ErenayDev·· 2 天前AI 评分62

用 AI 逆向工程硬件:作者开源 hw-harness 驱动开发工具

Using AI to reverse engineer hardware

AI 导读

GNOME 开发者 ErenayDev 分享用 Claude 逆向工程硬件的实践,并开源了通用工具 hw-harness。

正文 · 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,因为当时这基本上是为特定需求定制的代码,所以这个项目是试图把我当时工作中使用的脚本中的测试框架变得更通用、更易于分享。hw-harness 旨在帮助你的 Claude 或 Codex 会话完成以下事项:

1. 录制参考会话。在 KVM 虚拟机中运行厂商的 Windows 驱动,并将真实设备直通给客户机。
2. 从虚拟机外部捕获。在 Linux 主机上用 usbmon 记录流量。它位于直通层之下,因此客户机无法看到它。
3. 在 Linux 上用你自己的驱动重复同样的操作,并以相同方式捕获。
4. 对比两份跟踪记录。两者来自同一套工具,因此可以直接比较。差异就是你的驱动 bug 列表。

对于没有总线可供探测的设备,例如内置 MIPI 摄像头,该测试框架改用 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。它是一个 GNOME 应用,用 Rust 编写,用于在任何支持胶片的 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)中的摄像头使用 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 在发布页面上。

我学到了什么

  • 参考捕获是一大步。让 AI 将已知良好的轨迹与失败的轨迹进行比较,可以把模糊的“它不工作”变成具体的差异列表。例如,对于 MIPI 摄像头,同时连接一个 USB 摄像头,以便 Claude 可以比较两次捕获,这一点至关重要。
  • AI 擅长处理枯燥的工作。这包括解码捕获、编写探针和交叉检查常量。我仍然必须是那个拿着实体硬件的人。
  • 真实硬件是唯一的裁判。上述每一项声明都在实际的扫描仪或笔记本电脑上检查过。

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

注意:我并不声称我的扫描或 MIPI 摄像头现在完美了,但扫描仪给了我看起来不错的扫描结果,MIPI 摄像头看起来也比以前好多了。所以随着时间的推移,我相信我们能够进一步调整和完善,但我很高兴它让我在缺乏这类工作深入知识的情况下仍能推动进展。

—

来源:Hacker News · blogs.gnome.org