使用 AI 逆向工程硬體驅動
Using AI to reverse engineer hardware
AI 透過 Windows 虛擬機器與 USB 捕捉,協助作者快速開發 Plustek 8200i 及 ThinkPad MIPI 相機的 Linux 驅動。
本文示範 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,因為那時基本上是客製化程式碼,所以此專案嘗試將 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
比較兩個可用驅動程式的輸出。
第一個專案是為更新版 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 相機
顯示修正前後的 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 相機也比以前好很多。隨著時間,我相信我們能進一步調整與打磨,但我很高興它讓我能在缺乏深入知識的情況下取得進展。
—


