AI를 사용하여 하드웨어 역설계하기
요약
필름 네거티브 스캐너와 노트북 MIPI 카메라 등 문서화되지 않은 하드웨어의 드라이버 개발 과정에 AI(Claude)를 활용한 경험을 공유합니다. AI가 USB 데이터 캡처 및 커널 레벨 패치 작성 과정을 자동화하여, 복잡하고 시간이 많이 걸리는 하드웨어 역설계 작업을 크게 간소화할 수 있음을 보여줍니다.
핵심 포인트
- AI 에이전트가 드라이버 수정에 필요한 데이터를 캡처하도록 설정 가능합니다.
- Claude를 활용해 Windows 가상 머신에서 USB 데이터 캡처 및 스캔을 성공적으로 수행했습니다.
- AI는 복잡한 하드웨어 역설계 과정(패치 작성 등)의 고된 노동(slog)을 줄여줍니다.
어머니가 돌아가신 후 저는 어린 시절 가족 여행 사진 등이 담긴 오래된 필름 네거티브들이 가득한 큰 상자를 갖게 되었습니다. 그래서 네거티브 사진 스캐너를 사기로 결정했고, Plustek 8200i 모델이 Linux에서 지원된다는 것을 알아내서 구매했습니다. 그런데 스캐너의 칩셋이 더 이상 Linux에서 지원되지 않는 것으로 바뀌었다는 사실을 알게 되었습니다. 저는 Claude 코드를 사용하여 Dell 카메라 컨트롤러 앱과 같은 일부 하드웨어에 대한 Linux 설정 도구를 만드는 데 어느 정도 성공했었기 때문에, 혹시 Claude가 작동하는 SANE 드라이버를 얻는 데 도움을 줄 수 있을까 생각했습니다. 기본적으로 막혀서 오랫동안 아무것도 할 수 없었고, 심지어 프로젝트를 몇 달 동안 포기할 뻔하기도 했습니다.
그러다가 Tom Crider(별명 Glorious Eggroll)가 AI 도구를 사용하여 마우스 드라이버를 수정하는 방법을 설명한 X 게시물을 보게 되었습니다. 그는 기본적으로 AI 에이전트가 드라이버를 수정하는 데 필요한 데이터를 캡처하기 위해 Windows 인스턴스를 완전히 제어하도록 설정했다고 설명했습니다. 그래서 그의 트윗을 Claude에 붙여넣고, Tom이 스캐너에 대해 한 것과 같은 작업을 수행할 수 있도록 Windows 가상 머신을 설정하는 것을 도와달라고 요청했습니다. Windows 환경에서 스캔을 실행하고 동시에 USB 데이터를 캡처할 수 있는 조합이 기적처럼 작동했다고 생각하며, 아마도 Claude 코드의 개선 사항이 큰 차이를 만들었을 것입니다. 몇 시간 만에 처음으로 작동하는 스캔을 Linux에서 얻었는데, 물론 품질 문제가 좀 있었지만 네거티브 속 이미지로 100% 인식 가능했습니다. 며칠 후에는 적외선(Infrared) 스캐닝 지원까지 갖춘 거의 완벽한 드라이버를 가지게 되었는데, 포기했던 시점과 다시 시도하는 사이에 누군가 이미 SANE에 해당 스캐너를 지원하는 코드를 커밋했다는 것을 알게 되었습니다. 가끔 이런 일이 생깁니다. 또한 저는 네거티브 스캔을 하는 애플리케이션을 작성하기 위해 Claude를 사용했고, 그 이름을 Negative Vibes라고 지었는데, 귀여운 이름이라고 생각했습니다.
어쨌든, 스캐너 작업이 성공하면서, 이걸 사용해서 노트북의 MIPI 카메라 지원 마지막 문제들을 드디어 해결할 수 있을까 궁금해졌습니다. 그래서 제가 만들어 둔 하네스(harness)를 클로드에게 재사용하게 하고, 필요한 경우 커널 드라이버와 libcamera를 업데이트하여 노트북의 MIPI 카메라 문제를 고치도록 시켰습니다. 아침에 작업을 시작했고, 하루가 끝날 무렵에는 커널과 libcamera 모두에 적용할 패치가 준비되어 훨씬 개선된 상황이었습니다.
그래서 이걸 세상과 공유하는 게 가치가 있을 것 같아 생각했습니다. 누구나 처음부터 시작할 수 있겠지만, 저는 클로드에게 이 하네스를 범용적으로 만들고 문서화해 달라고 요청해서, 자신들의 하드웨어에 이걸 시도하고 싶은 다른 사람들에게 과정을 조금 더 쉽게 만들어 주도록 했습니다. 문서화되지 않은(undocumented) 하드웨어를 위한 드라이버를 작성하는 것은 항상 지루한 작업입니다. 버스 트래픽을 캡처하고, 헥스 덤프(hex dumps)를 들여다보며, 각 레지스터나 제어 전송이 무엇을 의미할지에 대한 가설을 세워야 합니다. 그런 다음 하나씩 테스트하며, 보통 몇 주가 걸립니다. 개념적으로 어렵지는 않지만, 엄청난 인내심과 기술이 필요합니다.
그런 종류의 작업은 AI 모델에게 적합합니다. 수천 줄에 달하는 USB 캡처를 읽고, 한 바이트만 바뀌면서 반복되는 시퀀스를 알아차리며, 그 바이트가 무엇을 의미할지 제안할 수 있습니다. 그리고 그것을 확인하기 위한 테스트 코드를 작성할 수도 있고, 지루해하지도 않습니다. 인간은 여전히 무엇을 만들지 결정하고 실제 하드웨어에서 작동하는지 확인하지만, 고된 과정(slog)이 많이 줄어듭니다.
다만, 제가 이 프로젝트를 진행하면서 hw-harness를 이런 형태로 사용한 적은 없다는 점을 알려드립니다. 당시에는 기본적으로 맞춤형 코드였기 때문에, 이번 프로젝트는 제가 작업하는 동안 사용했던 스크립트들을 통해 하네스를 더 범용적이고 공유 가능하게 만들려는 시도입니다. hw-harness가 Claude나 Codex 세션에 도움을 주는 방법은 다음과 같습니다:
-
참조 세션을 기록합니다. 벤더의 Windows 드라이버를 KVM 가상 머신에서 실행하고, 실제 장치를 게스트로 패스스루(passed through)합니다.
-
VM 외부에서 캡처합니다. usbmon으로 리눅스 호스트에서 트래픽을 기록합니다. 이는 패스스루 계층 아래에 위치하므로, 게스트는 이를 볼 수 없습니다.
-
리눅스에서 자체 드라이버로 동일한 작업을 반복하고, 그 결과를 동일하게 캡처합니다.
-
두 트레이스를 비교(Diff)합니다. 둘 다 같은 장비에서 나왔기 때문에 직접 비교할 수 있습니다. 여기서 발견되는 차이점들이 바로 드라이버 버그 목록입니다.
버스에 연결하여 측정할 곳이 없는 내부 MIPI 카메라와 같은 장치의 경우, 하네스(harness)는 윈도우 측 검사(Windows-side inspection)를 사용합니다. 이는 INF 파일, 레지스트리 데이터, ACPI 테이블 및 장치 속성 등을 의미합니다.
이 접근 방식은 코드를 복사하는 것에 의존하지 않기 때문에 괜찮습니다. 대신 하드웨어가 무엇을 하는지를 관찰하고 윈도우 드라이버에서 설정 데이터만 추출하기 때문에, 새로운 드라이버의 모든 상수는 기록된 무언가에 근거를 두고 있습니다.
관심 있는 분들을 위해 제가 진행했던 프로젝트 세 가지와 필요한 사항들에 대한 짧은 설명을 드리겠습니다.
프로젝트 1: Plustek OpticFilm 8200i용 SANE 백엔드
첫 번째 프로젝트는 최신 Plustek OpticFilm 8200i를 위한 SANE 백엔드입니다. 이 장치는 Genesys GL128 컨트롤러(USB 07b3:1825)를 사용하며 리눅스 지원이 없었습니다. 같은 이름의 구형 모델은 GL845를 사용하며 이미 SANE에서 처리하고 있습니다.
이 백엔드는 다음을 지원합니다:
- 컬러, 그레이, 적외선 및 컬러+적외선 모드
- 300dpi부터 7200dpi까지의 해상도, 채널당 8비트 또는 16비트
- 적외선 채널에서의 먼지 및 스크래치 제거 기능
- 밀집된 네거티브를 위한 노출 승수(exposure multiplier)
이것은 Fedora RPM으로 패키징되었으며, 푸시할 때마다 자동으로 빌드됩니다. 저는 주로 자체 Negative Vibes 애플리케이션으로 테스트했는데, 리눅스 환경에서 네거티브 스캐닝을 할 수 있는 옵션이 많지 않았기 때문입니다.
Upstream SANE의 genesys 백엔드도 2026년 9월에 이 스캐너를 지원하게 되어, 저는 두 가지를 비교해 보았습니다. 둘 다 3600 dpi에서 동일한 미세 디테일을 해상합니다. 제 것이 전체 해상도(54.4초 대비 34.6초)에서 더 빠르고 적외선 먼지 제거 기능을 지원합니다. Upstream은 더 많은 해상도 단계를 제공합니다. 웹페이지에 상호작용적인 나란히 비교 기능이 있으니 확인해 보세요. 이것들은 단일 장치, 단일 프레임 결과물이므로 하나의 데이터 포인트로 간주하세요. 현재 두 드라이버의 상태를 보여주는 제가 만든 상호작용 페이지를 확인해 보시고, 제가 발견한 내용들이 SANE 프로젝트가 업스트림 드라이버의 일부 사소한 문제들을 수정하는 데 사용될 수 있기를 바랍니다. 어쨌든, 저는 이 프로젝트를 개념 증명(proof of concept)으로 올렸습니다. 왜냐하면 저 자신을 포함하여 모두가 이 드라이버가 이것과 동등해지면 업스트림 드라이버를 사용할 것이라고 예상하기 때문입니다.
프로젝트 2: Negative Vibes
스캐닝 네거티브 과정이 여전히 고통스럽다면, 단순히 드라이버만으로는 큰 도움이 되지 않기 때문에 저는 Negative Vibes를 만들었습니다. 이것은 GNOME 앱이며, Rust로 작성되었고, 모든 필름 지원 SANE 스캐너에서 컬러 및 흑백 네거티브와 슬라이드를 스캔할 수 있습니다.
스캔 결과는 스캐너가 제공한 그대로 유지됩니다: 16비트, 선형(linear), 적외선 평면을 포함합니다. 다른 모든 것은 비파괴적 설정들의 스택으로 구성되어 있어, 모양을 변경하고 다시 내보낼 수 있습니다. 여기에는 다음이 포함됩니다:
- 필름 베이스 및 염색 교차 간섭 보정 기능이 적용된 밀도 공간 네거티브 반전(Density-space negative inversion)
- 프레임별 재정의가 가능한 롤 전체 설정(Roll-wide settings with per-frame overrides)
- 적외선 및 소프트웨어 먼지 제거
- ArgyllCMS를 통한 IT8 보정
- ICC 프로파일 및 메타데이터와 함께 TIFF, JPEG, PNG, DNG로 내보내기
이것은 스캐너 백엔드를 포함하는 Flatpak으로 배포됩니다. 현재 8200i에서 테스트되었습니다. 목표는 SANE가 지원하는 모든 필름 스캐너를 지원하는 것입니다. 그러기 위해서는 SANE가 적외선 채널을 노출할 표준 방식이 필요한데, 아직 그런 것이 없습니다.
프로젝트 3: ThinkPad의 MIPI 카메라 수정하기

수정 전후의 MIPI 출력을 보여드립니다. 색상은 세션 막바지에 비교적 어두운 방에 앉아 있었던 것보다 더 좋습니다.
제 Lenovo ThinkPad X1 Carbon Gen 14 (Aura Edition)에 장착된 카메라는 Intel IPU7 뒤에 Sony IMX471 센서를 사용합니다. Linux 환경에서는 심한 비네팅(vignetting)과 강한 황록색 색조를 띠는 어두운 이미지를 생성했습니다. mipi-fixes-x1-aura가 이러한 수정 사항들을 모았습니다. 이 프로젝트는 해당 노트북에만 관련되므로 큰 패키지 프로젝트 중 하나는 아니지만, 저는 이미 커널 패치를 Kate Hsuan에게 제출했고 libcamera 패치도 Wim Taymans가 Libcamera 제출을 위해 검토하고 있습니다.
커널 (IMX471 드라이버):
- 크롭 선택 버그(crop-selection bug)로 인해 크롭 직사각형을 저장하기 전에 오류가 발생하여, libcamera는 전체 픽셀 배열을 가정했습니다.
- 테스트 패턴 레지스터(test-pattern register)의 너비가 잘못 선언되었습니다.
- 아날로그 게인 캡(analogue gain cap)이 너무 낮아 약 1.8 스톱(stops)의 감도 손실을 초래했습니다.
libcamera 소프트웨어 ISP:
- 렌즈 음영 보정(Lens shading correction)이 완전히 누락되어 모서리가 약 2.7 스톱 더 어둡게 남아 있었습니다.
- 화이트 밸런스 통계가 센서의 네이티브 비트 깊이에서 8비트 블랙 레벨을 기준으로 합산되었습니다. 이로 인해 화이트 밸런스가 왜곡되었고, 수정 사항은 모든 RAW10/RAW12 센서에 적용됩니다.
제어된 저조도 테스트에서 프레임 밝기는 31.1에서 90.9로 상승했습니다. 빨강/녹색 및 청록/녹색 비율은 각각 0.890과 0.672에서 USB 웹캠 레퍼런스에 가까운 1.047과 0.823으로 이동했습니다. 저조도에서도 파란색이 여전히 약 17% 부족한데, 이는 그레이 월드 화이트 밸런스(grey-world white balance) 때문이라고 생각합니다. Fedora 44 RPM은 릴리스 페이지에 있습니다.
제가 배운 것들
참조 캡처(Reference captures)는 큰 진전입니다. AI가 정상 작동하는 트레이스(known-good trace)와 오작동하는 트레이스를 비교하면, 막연한 '작동하지 않는다'라는 문제를 구체적인 차이점 목록으로 바꿀 수 있습니다. 예를 들어, MIPI 카메라에 USB 카메라도 연결하여 Claude가 두 캡처를 비교할 수 있게 한 것이 중요했습니다.
- AI는 지루하고 반복적인 작업을 잘 처리합니다. 이는 캡처 디코딩(decoding captures), 프로브 작성(writing probes), 상수 교차 확인(cross-checking constants)을 포함합니다. 저는 여전히 실제 하드웨어(physical hardware)를 다뤄야 합니다.
- 실제 하드웨어가 유일한 심판입니다. 위에 언급된 모든 주장은 실제 스캐너나 노트북에서 확인했습니다.
만약 Linux 드라이버가 없는 하드웨어를 가지고 있다면, hw-harness를 사용해 보세요. 영감을 준 Glorious Eggroll에게 다시 한번 감사드립니다.
참고: 현재 제가 수행한 스캔이나 MIPI 카메라가 완벽하다고 주장하는 것은 아니지만, 스캐너는 괜찮아 보이는 스캔을 제공하고 MIPI 카메라는 이전보다 훨씬 좋아 보입니다. 따라서 시간이 지나면서 더 다듬고 개선할 수 있을 것이라고 확신하지만, 이러한 유형의 작업에 대한 깊이 있는 지식이 부족함에도 불구하고 진전을 이룰 수 있게 해준 것에 만족합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 HN AI Posts의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기