Het artikel bespreekt de inzet van AI (met name Claude Code) om hardware-drivers voor Linux te schrijven door middel van reverse engineering. De kernmethode is het gebruik van een door de auteur ontwikkeld raamwerk genaamd hw-harness. Hiermee wordt het gedrag van een werkende Windows-driver vastgelegd via USB-captures (usbmon) in een virtuele machine, waarna de AI de data analyseert en verschillen identificeert ten opzichte van de Linux-implementatie.
De auteur illustreert deze aanpak met drie projecten:
- Plustek OpticFilm 8200i: Het ontwikkelen van een SANE-backend voor een negatief-scanner die geen Linux-ondersteuning had.
- Negative Vibes: Een in Rust geschreven GNOME-applicatie voor het scannen en bewerken van negatieven en dia's.
- ThinkPad MIPI-camera: Het repareren van de kernel-driver en libcamera voor een Sony IMX471-sensor op een Lenovo ThinkPad X1 Carbon Gen 14, wat resulteerde in aanzienlijk betere beeldkwaliteit.
De belangrijkste conclusie is dat AI uitermate geschikt is voor het repetitieve en tijdrovende werk, zoals het analyseren van hex-dumps en het opstellen van hypothesen over registers, terwijl de mens de fysieke hardware bedient en de resultaten valideert.
Kunstmatige Intelligentie gebruiken voor het reverse engineeren van hardware
Omdat ik eerder succes had gehad met het maken van Linux-configuratietools voor mijn hardware met behulp van Claude Code (zoals mijn Dell Camera controller app), dacht ik dat Claude me misschien kon helpen om een werkende SANE-driver te maken. In eerste instantie liep ik echter vast en kwam ik lange tijd nergens, waardoor ik het project enkele maanden liet rusten.
Toen zag ik een bericht op X van Tom Crider, alias Glorious Eggroll, over hoe hij een muisdriver had kunnen repareren met AI-tooling. Hij beschreef hoe hij het zo had ingericht dat de AI-agent volledige controle had over een Windows-instantie om de data te verzamelen die nodig was om de driver te herstellen. Ik plakte zijn tweet in Claude en vroeg om hulp bij het opzetten van een Windows-virtuele machine om hetzelfde te doen voor mijn scanner.
De combinatie van het kunnen uitvoeren van scans onder Windows en het gelijktijdig vastleggen van de USB-data werkte wonderen, waarschijnlijk versterkt door verbeteringen in Claude Code. Binnen enkele uren had ik mijn eerste werkende scan onder Linux; er waren nog kwaliteitsissues, maar het beeld was 100% herkenbaar als het beeld op het negatief. Een paar dagen later had ik een bijna perfecte driver, inclusief ondersteuning voor infraroodscanning. Ironisch genoeg ontdekte ik vlak daarna dat iemand in de tussentijd al code naar SANE had gecommit om deze scanner te ondersteunen. Daarnaast gebruikte ik Claude om een applicatie te schrijven voor het scannen van negatieven, die ik "Negative Vibes" noemde.
Met het succes van de scanner vroeg ik me af of ik dit kon gebruiken om eindelijk de laatste problemen met de MIPI-camerasteun op mijn laptop op te lossen. Ik vroeg Claude om het door mij gecreëerde raamwerk (harness) te hergebruiken en de MIPI-camera op mijn laptop te repareren door de kernel-driver en libcamera waar nodig bij te werken. Ik begon 's ochtends en aan het einde van de dag had ik een aanzienlijk verbeterde situatie met patches voor zowel de kernel als libcamera.
Het schrijven van een driver voor ongedocumenteerde hardware is altijd tedious. Je legt busverkeer vast, staart naar hex-dumps en vormt hypothesen over wat elk register of elke control-transfer doet. Je test deze vervolgens één voor één, wat vaak weken duurt. Conceptueel is dit niet moeilijk, maar het vereist veel geduld en vaardigheid.
Dit type werk is uitermate geschikt voor een AI-model. Het kan duizenden regels USB-captures lezen, opmerken dat een sequentie zich herhaalt met slechts één veranderende byte, en voorstellen wat die byte betekent. De AI kan de test schrijven om dit te bevestigen en raakt niet verveeld. De mens bepaalt nog steeds wat er gebouwd wordt en controleert of het werkt op echte hardware, maar het zware sleurwerk wordt drastisch verminderd.
hw-harness
Ik heb hw-harness ontwikkeld als een poging om de scripts die ik gebruikte generieker en deelbaar te maken. Het project is bedoeld om een Claude- of Codex-sessie te ondersteunen bij het volgende:
- Het opnemen van een referentiesessie: Draai de Windows-driver van de fabrikant in een KVM-virtuele machine, waarbij het fysieke apparaat wordt doorgegeven (passthrough) aan de guest.
- Vastleggen vanaf buiten de VM: Registreer het verkeer op de Linux-host met
usbmon. Omdat dit onder de passthrough-laag zit, kan de guest dit niet zien.
- Herhalen op Linux: Voer dezelfde operatie uit op Linux met je eigen driver en leg dit op dezelfde manier vast.
- Diffen van de traces: Omdat beide traces van hetzelfde instrument komen, kunnen ze direct vergeleken worden. De verschillen vormen je lijst met driver-bugs.
Voor apparaten zonder aftappunt op de bus, zoals een interne MIPI-camera, maakt het raamwerk gebruik van inspectie aan de Windows-zijde. Dit omvat INF-bestanden, registergegevens, ACPI-tabellen en apparaateigenschappen. Deze aanpak is veilig omdat het niet vertrouwt op het kopiëren van code, maar observeert wat de hardware doet en enkel configuratiegegevens uit de Windows-drivers extraheert. Elke constante in de nieuwe driver is dus terug te voeren op een geregistreerde waarneming.
Hieronder volgen drie korte beschrijvingen van de projecten die ik heb uitgevoerd.
Project 1: Een SANE-backend voor de Plustek OpticFilm 8200i
Het eerste project is een SANE-backend voor de nieuwere Plustek OpticFilm 8200i. Deze maakt gebruik van de Genesys GL128-controller (USB 07b3:1825) en had geen Linux-ondersteuning. Het oudere model met dezelfde naam gebruikt een GL845 en wordt al door SANE afgehandeld.
De backend ondersteunt:
- Kleur, grijs, infrarood en kleur+infrarood modi.
- Resoluties van 300 tot 7200 dpi, met 8 of 16 bits per kanaal.
- Verwijdering van stof en krassen via het infraroodkanaal.
- Een belichtingsvermenigvuldiger voor dichte negatieven.
Het is verpakt als een Fedora RPM. Ik heb het voornamelijk getest met mijn eigen "Negative Vibes"-applicatie. In september 2026 kreeg de upstream SANE genesys-backend ook ondersteuning voor deze scanner. Bij een vergelijking bleek dat beide dezelfde fijne details oplossen bij 3600 dpi. Mijn versie is sneller bij volledige resolutie (34,6 s tegenover 54,4 s) en ondersteunt infrarood stofverwijdering, terwijl de upstream versie meer resolutiestappen biedt.
Project 2: Negative Vibes
Een driver alleen is niet erg nuttig als het scannen van negatieven pijnlijk blijft, dus bouwde ik Negative Vibes. Het is een GNOME-app, geschreven in Rust, voor het scannen van kleur- en zwart-witnegatieven en dia's op elke film-compatibele SANE-scanner.
De scan wordt precies zo bewaard als de scanner deze levert: 16-bit, lineair, inclusief het infraroodvlak. Alle verdere bewerkingen zijn non-destructieve instellingen, zodat je de look kunt aanpassen en opnieuw kunt exporteren. De app bevat:
- Negatief-inversie in de dichtheidsruimte met correctie voor filmbasis en kleurcast (dye-crosstalk).
- Instellingen voor de hele rol met overrides per frame.
- Infrarode en softwarematige stofverwijdering.
- IT8-kalibratie via ArgyllCMS.
- Export naar TIFF, JPEG, PNG en DNG, inclusief ICC-profielen en metadata.
Het wordt geleverd als een Flatpak inclusief de scanner-backend. Het doel is om elke filmscanner te ondersteunen die SANE ondersteunt, al moet SANE hiervoor nog een standaardmanier implementeren om infraroodkanalen bloot te stellen.
Project 3: Het repareren van de MIPI-camera op mijn ThinkPad
De camera in mijn Lenovo ThinkPad X1 Carbon Gen 14 (Aura Edition) gebruikt een Sony IMX471-sensor achter een Intel IPU7. Onder Linux produceerde deze donkere beelden met zware vignettering en een sterke geel-groene zweem. De fixes zijn verzameld in mipi-fixes-x1-aura.
Kernel (IMX471 driver):
- Een bug in de crop-selectie retourneerde een fout voordat het crop-rechthoek werd opgeslagen, waardoor libcamera uitging van het volledige pixel-array.
- Het test-pattern register was gedeclareerd met de verkeerde breedte.
- De analoge gain cap was te laag, wat ongeveer 1,8 stops aan gevoeligheid kostte.
libcamera software ISP:
- Lens shading correctie ontbrak volledig, waardoor de hoeken ongeveer 2,7 stops donkerder waren.
- White-balance statistieken werden opgeteld op de native bitdiepte van de sensor tegenover een 8-bit zwartniveau. Dit vervormde de witbalans; de fix hiervoor is toepasbaar op elke RAW10/RAW12-sensor.
In een gecontroleerde test bij weinig licht steeg de helderheid van het frame van 31,1 naar 90,9. De rood/groen en blauw/groen ratio's bewogen van 0,890 en 0,672 naar 1,047 en 0,823, wat dicht bij een USB-webcam referentie ligt.
Wat ik heb geleerd
- Referentie-opnames zijn een grote stap. Het laten vergelijken door de AI van een trace die bekendelijk goed werkt tegenover een trace die faalt, verandert een vaag "het werkt niet" in een concrete lijst met verschillen. Voor de MIPI-camera was het cruciaal dat er ook een USB-camera was aangesloten, zodat Claude de twee captures kon vergelijken.
- De AI is goed in het saaie werk. Dit omvat het decoderen van captures, het schrijven van probes en het kruiscontroleren van constanten. Ik moet nog steeds degene zijn die de fysieke hardware bedient.
- Echte hardware is de enige rechter. Elke bewering hierboven is gecontroleerd op de werkelijke scanner of laptop.
Voor wie hardware heeft zonder Linux-driver, raad ik aan om hw-harness te proberen.
Noot: Ik claim niet dat mijn scans of MIPI-camera nu perfect zijn, maar de scanner geeft goede resultaten en de MIPI-camera ziet er veel beter uit dan voorheen. Ik ben blij dat dit me in staat stelde vooruitgang te boeken, ondanks dat ik niet over de diepgaande kennis voor dit type werk beschik.
Kunstmatige Intelligentie gebruiken voor het reverse engineeren van hardware
Omdat ik eerder succes had gehad met het maken van Linux-configuratietools voor mijn hardware met behulp van Claude Code (zoals mijn Dell Camera controller app), dacht ik dat Claude me misschien kon helpen om een werkende SANE-driver te maken. In eerste instantie liep ik echter vast en kwam ik lange tijd nergens, waardoor ik het project enkele maanden liet rusten.
Toen zag ik een bericht op X van Tom Crider, alias Glorious Eggroll, over hoe hij een muisdriver had kunnen repareren met AI-tooling. Hij beschreef hoe hij het zo had ingericht dat de AI-agent volledige controle had over een Windows-instantie om de data te verzamelen die nodig was om de driver te herstellen. Ik plakte zijn tweet in Claude en vroeg om hulp bij het opzetten van een Windows-virtuele machine om hetzelfde te doen voor mijn scanner.
De combinatie van het kunnen uitvoeren van scans onder Windows en het gelijktijdig vastleggen van de USB-data werkte wonderen, waarschijnlijk versterkt door verbeteringen in Claude Code. Binnen enkele uren had ik mijn eerste werkende scan onder Linux; er waren nog kwaliteitsissues, maar het beeld was 100% herkenbaar als het beeld op het negatief. Een paar dagen later had ik een bijna perfecte driver, inclusief ondersteuning voor infraroodscanning. Ironisch genoeg ontdekte ik vlak daarna dat iemand in de tussentijd al code naar SANE had gecommit om deze scanner te ondersteunen. Daarnaast gebruikte ik Claude om een applicatie te schrijven voor het scannen van negatieven, die ik "Negative Vibes" noemde.
Met het succes van de scanner vroeg ik me af of ik dit kon gebruiken om eindelijk de laatste problemen met de MIPI-camerasteun op mijn laptop op te lossen. Ik vroeg Claude om het door mij gecreëerde raamwerk (harness) te hergebruiken en de MIPI-camera op mijn laptop te repareren door de kernel-driver en libcamera waar nodig bij te werken. Ik begon 's ochtends en aan het einde van de dag had ik een aanzienlijk verbeterde situatie met patches voor zowel de kernel als libcamera.
Het schrijven van een driver voor ongedocumenteerde hardware is altijd tedious. Je legt busverkeer vast, staart naar hex-dumps en vormt hypothesen over wat elk register of elke control-transfer doet. Je test deze vervolgens één voor één, wat vaak weken duurt. Conceptueel is dit niet moeilijk, maar het vereist veel geduld en vaardigheid.
Dit type werk is uitermate geschikt voor een AI-model. Het kan duizenden regels USB-captures lezen, opmerken dat een sequentie zich herhaalt met slechts één veranderende byte, en voorstellen wat die byte betekent. De AI kan de test schrijven om dit te bevestigen en raakt niet verveeld. De mens bepaalt nog steeds wat er gebouwd wordt en controleert of het werkt op echte hardware, maar het zware sleurwerk wordt drastisch verminderd.
hw-harness
Ik heb hw-harness ontwikkeld als een poging om de scripts die ik gebruikte generieker en deelbaar te maken. Het project is bedoeld om een Claude- of Codex-sessie te ondersteunen bij het volgende:
- Het opnemen van een referentiesessie: Draai de Windows-driver van de fabrikant in een KVM-virtuele machine, waarbij het fysieke apparaat wordt doorgegeven (passthrough) aan de guest.
- Vastleggen vanaf buiten de VM: Registreer het verkeer op de Linux-host met
usbmon. Omdat dit onder de passthrough-laag zit, kan de guest dit niet zien.
- Herhalen op Linux: Voer dezelfde operatie uit op Linux met je eigen driver en leg dit op dezelfde manier vast.
- Diffen van de traces: Omdat beide traces van hetzelfde instrument komen, kunnen ze direct vergeleken worden. De verschillen vormen je lijst met driver-bugs.
Voor apparaten zonder aftappunt op de bus, zoals een interne MIPI-camera, maakt het raamwerk gebruik van inspectie aan de Windows-zijde. Dit omvat INF-bestanden, registergegevens, ACPI-tabellen en apparaateigenschappen. Deze aanpak is veilig omdat het niet vertrouwt op het kopiëren van code, maar observeert wat de hardware doet en enkel configuratiegegevens uit de Windows-drivers extraheert. Elke constante in de nieuwe driver is dus terug te voeren op een geregistreerde waarneming.
Hieronder volgen drie korte beschrijvingen van de projecten die ik heb uitgevoerd.
Project 1: Een SANE-backend voor de Plustek OpticFilm 8200i
Het eerste project is een SANE-backend voor de nieuwere Plustek OpticFilm 8200i. Deze maakt gebruik van de Genesys GL128-controller (USB 07b3:1825) en had geen Linux-ondersteuning. Het oudere model met dezelfde naam gebruikt een GL845 en wordt al door SANE afgehandeld.
De backend ondersteunt:
- Kleur, grijs, infrarood en kleur+infrarood modi.
- Resoluties van 300 tot 7200 dpi, met 8 of 16 bits per kanaal.
- Verwijdering van stof en krassen via het infraroodkanaal.
- Een belichtingsvermenigvuldiger voor dichte negatieven.
Het is verpakt als een Fedora RPM. Ik heb het voornamelijk getest met mijn eigen "Negative Vibes"-applicatie. In september 2026 kreeg de upstream SANE genesys-backend ook ondersteuning voor deze scanner. Bij een vergelijking bleek dat beide dezelfde fijne details oplossen bij 3600 dpi. Mijn versie is sneller bij volledige resolutie (34,6 s tegenover 54,4 s) en ondersteunt infrarood stofverwijdering, terwijl de upstream versie meer resolutiestappen biedt.
Project 2: Negative Vibes
Een driver alleen is niet erg nuttig als het scannen van negatieven pijnlijk blijft, dus bouwde ik Negative Vibes. Het is een GNOME-app, geschreven in Rust, voor het scannen van kleur- en zwart-witnegatieven en dia's op elke film-compatibele SANE-scanner.
De scan wordt precies zo bewaard als de scanner deze levert: 16-bit, lineair, inclusief het infraroodvlak. Alle verdere bewerkingen zijn non-destructieve instellingen, zodat je de look kunt aanpassen en opnieuw kunt exporteren. De app bevat:
- Negatief-inversie in de dichtheidsruimte met correctie voor filmbasis en kleurcast (dye-crosstalk).
- Instellingen voor de hele rol met overrides per frame.
- Infrarode en softwarematige stofverwijdering.
- IT8-kalibratie via ArgyllCMS.
- Export naar TIFF, JPEG, PNG en DNG, inclusief ICC-profielen en metadata.
Het wordt geleverd als een Flatpak inclusief de scanner-backend. Het doel is om elke filmscanner te ondersteunen die SANE ondersteunt, al moet SANE hiervoor nog een standaardmanier implementeren om infraroodkanalen bloot te stellen.
Project 3: Het repareren van de MIPI-camera op mijn ThinkPad
De camera in mijn Lenovo ThinkPad X1 Carbon Gen 14 (Aura Edition) gebruikt een Sony IMX471-sensor achter een Intel IPU7. Onder Linux produceerde deze donkere beelden met zware vignettering en een sterke geel-groene zweem. De fixes zijn verzameld in mipi-fixes-x1-aura.
Kernel (IMX471 driver):
- Een bug in de crop-selectie retourneerde een fout voordat het crop-rechthoek werd opgeslagen, waardoor libcamera uitging van het volledige pixel-array.
- Het test-pattern register was gedeclareerd met de verkeerde breedte.
- De analoge gain cap was te laag, wat ongeveer 1,8 stops aan gevoeligheid kostte.
libcamera software ISP:
- Lens shading correctie ontbrak volledig, waardoor de hoeken ongeveer 2,7 stops donkerder waren.
- White-balance statistieken werden opgeteld op de native bitdiepte van de sensor tegenover een 8-bit zwartniveau. Dit vervormde de witbalans; de fix hiervoor is toepasbaar op elke RAW10/RAW12-sensor.
In een gecontroleerde test bij weinig licht steeg de helderheid van het frame van 31,1 naar 90,9. De rood/groen en blauw/groen ratio's bewogen van 0,890 en 0,672 naar 1,047 en 0,823, wat dicht bij een USB-webcam referentie ligt.
Wat ik heb geleerd
- Referentie-opnames zijn een grote stap. Het laten vergelijken door de AI van een trace die bekendelijk goed werkt tegenover een trace die faalt, verandert een vaag "het werkt niet" in een concrete lijst met verschillen. Voor de MIPI-camera was het cruciaal dat er ook een USB-camera was aangesloten, zodat Claude de twee captures kon vergelijken.
- De AI is goed in het saaie werk. Dit omvat het decoderen van captures, het schrijven van probes en het kruiscontroleren van constanten. Ik moet nog steeds degene zijn die de fysieke hardware bedient.
- Echte hardware is de enige rechter. Elke bewering hierboven is gecontroleerd op de werkelijke scanner of laptop.
Voor wie hardware heeft zonder Linux-driver, raad ik aan om hw-harness te proberen.
Noot: Ik claim niet dat mijn scans of MIPI-camera nu perfect zijn, maar de scanner geeft goede resultaten en de MIPI-camera ziet er veel beter uit dan voorheen. Ik ben blij dat dit me in staat stelde vooruitgang te boeken, ondanks dat ik niet over de diepgaande kennis voor dit type werk beschik.