История началась с плёнки

После смерти матери остался большой ящик со старыми фотоплёнками из детства и семейных поездок. Один из них решил купить сканер для негативов и нашёл поддерживаемый под Linux Plustek 8200i. Но открыв коробку, обнаружил, что чипсет в сканере поменялся на неподдерживаемый.

Раньше удавалось с помощью Claude создавать конфигурационные утилиты для своего оборудования — например, приложение для управления веб-камерой Dell. Казалось, Claude сможет помочь и с драйвером SANE. Но попытка застряла, и в итоге проект забросили на несколько месяцев.

Переломный момент наступил, когда нашёл пост Tom Crider (GloriousEggroll) в X о том, как он использовал ИИ для исправления драйвера мыши. Суть была простая: дал агенту полный контроль над Windows VM, чтобы тот захватил нужные данные для исправления драйвера. Пропустил твит через Claude и попросил помощь в настройке виртуальной машины для похожего эксперимента со сканером.

Результат превзошёл ожидания. Возможность запускать сканы под Windows и одновременно захватывать USB-данные произвела чудо. За несколько часов получил первый рабочий скан под Linux — с дефектами, но на 100% узнаваемый. Через несколько дней драйвер был почти идеален, с поддержкой инфракрасного сканирования. Но потом выяснилось: за время, пока проект был заброшен, кто-то уже добавил поддержку этого сканера в SANE. Таково уж бывает.

Параллельно Claude помог написать приложение для сканирования негативов — Negative Vibes. Название показалось забавным.

Расширение на MIPI камеру

Вдохновившись успехом со сканером, решил попробовать наконец-то исправить последние проблемы с поддержкой MIPI камеры на ноутбуке. Попросил Claude переиспользовать созданный инструмент и исправить MIPI камеру, обновив драйвер ядра и libcamera. Работа началась с утра, а к концу дня было готово значительное улучшение — патчи и для ядра, и для libcamera.

Тогда и возникла идея поделиться этим с миром. Попросил Claude сделать инструмент универсальным и документировать процесс, чтобы другим было легче попробовать то же на своём оборудовании.

Почему ИИ здесь эффективен

Разработка драйвера для недокументированного оборудования всегда была рутинной работой: захватить трафик шины, вглядываться в hex-дампы, формулировать гипотезы о том, что делает каждый регистр или управляющий пакет. Затем проверить гипотезы одну за другой — обычно это занимает недели. Работа не сложна концептуально, но требует огромного терпения и навыков.

Такая работа отлично подходит для модели ИИ. Она может прочитать тысячи строк захвата USB, заметить повторяющуюся последовательность с изменением одного байта, и предложить его значение. Может написать тест для проверки и не скучает в процессе. Человек остаётся тем, кто решает, что строить, и проверяет, что всё работает на реальном железе, но сам мучительный процесс значительно сокращается.

hw-harness: обобщённый инструмент

hw-harness — результат попытки сделать более универсальным и пригодным для обмена то, что использовалось в проектах. Изначально это было специализированным кодом, теперь же инструмент предназначен помочь Claude или Codex сессии с:

  1. Записью эталонной сессии. Запустить оригинальный драйвер поставщика в KVM VM с передачей реального устройства гостю.
  2. Захватом вне VM. Записать трафик на хосте Linux с помощью usbmon. Утилита располагается ниже слоя passthrough, поэтому гость её не видит.
  3. Повторением той же операции в Linux с собственным драйвером и захватом того же способом.
  4. Сравнением двух трасс. Обе из одного устройства, поэтому сравниваются напрямую. Различия — это список ошибок драйвера.

Для устройств без доступной шины (вроде встроенной MIPI камеры) инструмент использует инспекцию со стороны Windows: INF файлы, данные реестра, таблицы ACPI и свойства устройства.

Подход не требует копирования кода — он просто наблюдает, что делает оборудование, и извлекает конфигурационные данные из драйверов Windows. Каждая константа в новом драйвере основана на записанном.

Три проекта: детали

Проект 1: SANE backend для Plustek OpticFilm 8200i

Сравнение двух драйверов сканера на одном негативе

Первый проект — SANE backend для более новой версии Plustek OpticFilm 8200i. Сканер использует контроллер Genesys GL128 (USB 07b3:1825) и не имел поддержки в Linux. Старая модель с тем же названием работала на GL845 и уже поддерживалась SANE.

Backend поддерживает:

  • Режимы цветной, чёрно-белой, инфракрасной и комбинированной съёмки
  • Разрешение от 300 до 7200 DPI, 8 или 16 бит на канал
  • Удаление пыли и царапин через инфракрасный канал
  • Множитель экспозиции для плотных негативов

Упакован как Fedora RPM с автоматической сборкой на каждый push. Тестирован в основном через собственное приложение Negative Vibes — под Linux не так много опций для сканирования негативов.

Upstream SANE также добавил поддержку этого сканера в сентябре 2026. Сравнение показало: оба разрешают одинаковые мелкие детали на 3600 DPI. Собственный драйвер быстрее на полном разрешении (34,6 с против 54,4 с) и поддерживает инфракрасное удаление пыли. Upstream предлагает больше вариантов разрешения. На интерактивной странице можно сравнить результаты рядом. Это одна рамка, один скан — относитесь как к одной точке данных. Надеюсь, обнаруженные моменты помогут SANE проекту исправить мелкие вещи. Проект выложен как proof of concept — когда upstream драйвер достигнет функциональной паритета, все будут использовать его.

Проект 2: Negative Vibes

Полный скан негатива после завершения, включая инфракрасную очистку

Сам по себе драйвер мало полезен, если сканирование негативов остаётся мучительным. Поэтому создали Negative Vibes — приложение GNOME, написанное на Rust, для сканирования цветных, чёрно-белых негативов и слайдов на любом совместимом SANE сканере.

Скан хранится ровно таким, как доставил его сканер: 16-бит, линейный, с инфракрасной плоскостью. Всё остальное — стек неразрушающих настроек сверху, так что можно менять вид и экспортировать заново. Включает:

  • Инверсию негатива в пространстве плотностей с коррекцией основы плёнки и перекрытия красителей
  • Настройки по всей рулону с переопределением для отдельных кадров
  • Инфракрасное и программное удаление пыли
  • Калибровку IT8 через ArgyllCMS
  • Экспорт в TIFF, JPEG, PNG и DNG с ICC профилями и метаданными

Распространяется как Flatpak, включающий backend сканера. Тестирован на 8200i. Цель — поддержать любой сканер, который знает SANE. Для этого SANE нужен стандартный способ предоставлять инфракрасные каналы, чего пока нет.

Проект 3: Исправление MIPI камеры на ThinkPad

Вывод 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 software ISP:

  • Коррекция виньеткирования линзы вообще отсутствовала, оставляя углы примерно на 2,7 стопа темнее
  • Статистика белого баланса суммировалась на родной разрядности сенсора против 8-бит чёрного уровня. Это искажало баланс, и исправление применимо к любому RAW10/RAW12 сенсору

В контролируемом тесте при слабом свете яркость кадра выросла с 31,1 до 90,9. Отношения красного/зелёного и синего/зелёного изменились с 0,890 и 0,672 на 1,047 и 0,823 — близко к эталону USB веб-камеры. Синий при слабом свете всё ещё примерно на 17% ниже — это вероятно grey-world белый баланс. Fedora 44 RPM находятся на странице releases.

Выводы

  • Эталонные захваты — большой шаг. Если дать ИИ сравнить заведомо хороший трафик с неработающим, из размытого "это не работает" возникает конкретный список различий. Например, для MIPI камеры наличие подключённой USB камеры для сравнения захватов было критично.
  • ИИ хорош в рутине. Это декодирование захватов, написание проб и перепроверка констант. Но физическое оборудование держать все ещё приходится человеку.
  • Реальное оборудование — единственный судья. Каждое утверждение выше проверено на реальном сканере или ноутбуке.

Если у вас есть оборудование без драйвера под Linux — попробуйте hw-harness. И спасибо ещё раз GloriousEggroll за вдохновение.

ПРИМЕЧАНИЕ: Не утверждаю, что теперь сканы и MIPI камера идеальны, но сканер даёт приличные результаты и камера выглядит намного лучше, чем раньше. Со временем можно будет подстроить и отполировать дальше, но я доволен, что смог сдвинуть иглу, несмотря на отсутствие глубоких знаний в такого рода работе.