跳到正文
Hacker News (official RSS)(blogs.gnome.org)·· 3 小時前精選AI 評分68

使用 AI 逆向工程硬體驅動

Using AI to reverse engineer hardware

AI 導讀

AI 透過 Windows 虛擬機器與 USB 捕捉,協助作者快速開發 Plustek 8200i 及 ThinkPad MIPI 相機的 Linux 驅動。

推薦理由

本文示範 AI 如何協助快速撰寫硬體驅動,降低手動逆向工程成本。

正文 · AI 翻譯

譯文尚未完整,完整內容請切換至原文。

在母親過世後,我得到了一大盒舊電影負片,裡面有童年家庭旅行等照片。因此我決定購買一臺負片掃描器,發現 Plustek 8200i 在 Linux 上受支援,於是買下來。但後來發現掃描器的晶片已改為 Linux 不再支援的型號。於是我利用 Claude 程式碼為我的部分硬體製作 Linux 設定工具,例如我的 Dell Camera controller app,所以我想也許 Claude 能幫我得到一個可用的 SANE 驅動。結果我基本上卡住了很久,最終甚至放棄了這個專案好幾個月。

然後我看到一則來自 Tom Crider(又名 Glorious Eggroll)的 X 上的貼文,說他利用 AI 工具修復了一個滑鼠驅動。他大致說明瞭如何設定 AI 代理擁有 Windows 例項的完整控制權,以捕捉修復驅動所需的資料。於是我將他的推文貼進 Claude,請它幫我設定一臺 Windows 虛擬機器,做跟 Tom 為掃描器所做的相同操作。我覺得能在 Windows 上執行掃描並同時捕捉 USB 資料的組合效果驚人,結合 Claude 程式碼的改進,差距顯著。幾小時內,我就完成了首個在 Linux 上可運作的掃描,雖有些品質問題,但 100% 可辨識為負片中的影像。幾天後,我擁有了幾乎完美的驅動程式,甚至支援紅外線掃描已準備就緒,卻發現從我放棄到再次嘗試之間,已有人提交程式碼至 SANE 以支援該掃描器……偶爾會發生這種事。我還利用 Claude 撰寫了一個負片掃描應用程式,命名為 Negative Vibes,覺得這個名字很可愛。

總之,在掃描器專案成功後,我想或許可以用這個方法最終解決筆電上 MIPI 相機支援的最後問題。於是我告訴 Claude 重新使用我已建立的 harness,嘗試透過更新 kernel 驅動與 libcamera 來修復筆電上的 MIPI 相機。我在早上開始這個工作,傍晚時分已經有 情況大幅改善,kernel 與 libcamera 的補丁已準備好。

於是我覺得把這件事分享給全世界可能很有價值,雖然任何人都可以從頭開始,但我還請 Claude 讓 harness 成為通用並加以檔案化,方便其他想在自己硬體上嘗試的人更輕鬆。為未檔案化硬體寫驅動一直很繁瑣。你需要捕捉匯流排流量、凝視十六進位轉儲,並推測每個暫存器或控制傳輸的功能。然後你會逐一測試,通常需要數週。雖然概念上並不困難,但需要大量耐心與技巧。

這類工作非常適合 AI 模型。它能閱讀數千行 USB 捕捉資料,注意到序列重複但有一個位元改變,並提出該位元的意義。它能寫測試以確認,並不會感到無聊。人類仍決定要構建什麼並檢查它在實際硬體上是否運作,但整個繁瑣過程大幅縮短。

hw-harness

請注意,我在當時的專案中並未以此形式使用 hw-harness,因為那時基本上是客製化程式碼,所以此專案嘗試將 harness 做得更通用且可分享,來自我在工作時使用的指令碼。hw-harness 的目的是協助您的 Claude 或 Codex 會話:

1. 記錄參考會話。將供應商的 Windows 驅動程式執行於 KVM 虛擬機器中,並將實體裝置直通至客戶端。
\n2. 從 VM 外捕獲。使用 usbmon 在 Linux 主機上記錄流量。它位於直通層以下,客戶端無法看到。
\n3. 在 Linux 上以您自己的驅動程式重複相同操作,並以相同方式捕獲。
\n4. 比對兩個追蹤。兩者皆來自同一儀器,直接可比較。差異即為您的驅動程式錯誤清單。

對於沒有可供監控的匯流排的裝置,例如內部 MIPI 相機,harness 會改用 Windows 端檢查。這表示 INF 檔、登錄檔資料、ACPI 表格以及裝置屬性。

這種做法應該沒問題,因為它並不依賴複製任何程式碼,而是觀察硬體行為,並僅從 Windows 驅動程式中擷取設定資料,因此新驅動程式中的每個常數都可追溯到已記錄的內容。

因此,對於感興趣的人,我提供了三個簡短的專案說明以及所需的內容。

Project 1: a SANE backend for the Plustek OpticFilm 8200i

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 上負片掃描的選項並不多。

Upstream SANE’s genesys backend also gained support for this scanner in September 2026, so I compared the two. Both resolve the same fine detail at 3600 dpi. Mine is faster at full resolution (34.6 s against 54.4 s) and supports infrared dust removal. Upstream offers more resolution steps. The webpage has an interactive side-by-side comparison you can check out. These are single-unit, single-frame results, so treat them as one data point. Check out the interactive page I made showing the current state of the two drivers, hopefully the discoveries I made can be used by the SANE project to fix some smaller items in the upstream driver. Anyway, I put this project up more as a proof of concept due to that since I expect everyone including myself will use the upstream driver once it reaches parity with this one.

Project 2: Negative Vibes

完成負片全掃描,包括影像的紅外線清潔。

僅有驅動程式並不多大用處,若掃描負片仍然痛苦,我就開發了 Negative Vibes。它是一款 GNOME 應用程式,使用 Rust 編寫,可在任何支援膠卷的 SANE 掃描器上掃描彩色與黑白負片與幻燈片。

掃描保持與掃描器交付的一致:16 位、線性、含紅外平面。其餘皆為非破壞性設定堆疊,可調整外觀並再次匯出。內容包括:

  • 密度空間負反轉,配合膠片底材與染料互相干擾校正
  • 全幅設定,並可為每一幀覆寫
  • 紅外與軟體除塵
  • 透過 ArgyllCMS 進行 IT8 校正
  • 匯出至 TIFF、JPEG、PNG 與 DNG,並附帶 ICC 配置檔與 metadata

它以 Flatpak 形式釋出,內含掃描器後端。目前已於 8200i 上測試。目標是支援 SANE 所支援的任何膠片掃描器。為此,SANE 需要一個標準方式來公開紅外通道,但目前尚未具備。

Project 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 驅動):

  • 裁切選擇錯誤在儲存裁切矩形前回傳錯誤,導致 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 (official RSS) (blogs.gnome.org)
開啟原文