L'idée de détourner un Kindle de son usage premier a séduit de nombreux propriétaires. Sverre Johann Bjørke a poussé l'exercice plus loin en parvenant à faire fonctionner le langage de programmation Rust et la bibliothèque d'interface utilisateur Slint sur un Kindle Paperwhite de 7e génération jailbreaké. Son objectif initial était de transformer l'appareil en horloge de chevet, mais il a rapidement envisagé des applications plus ambitieuses, comme un tableau de bord pour son système domotique Home Assistant.

Pour y parvenir, le développeur a d'abord dû résoudre le problème de la compilation croisée de Rust. Le Kindle utilisant un processeur ARMv7 avec la bibliothèque musl libc, il s'est tourné vers l'outil cargo-zigbuild. Ce dernier, s'appuyant sur le compilateur Zig, permet de produire des binaires pour des architectures différentes directement depuis une machine de développement standard. La commande cargo zigbuild --release --target armv7-unknown-linux-musleabihf a suffi à générer le code exécutable.

Accès à la machine et affichage sur l'encre électronique

L'étape suivante consistait à obtenir un accès shell au Kindle. Le développeur a utilisé l'outil USBNetwork, qui permet de configurer un accès SSH via USB ou Wi-Fi. Après avoir copié sa clé publique dans le fichier d'autorisation approprié, il a pu confirmer le bon fonctionnement de sa chaîne de compilation avec un classique « Hello, World! ». Restait à afficher quelque chose sur l'écran à encre électronique.

Slint, une bibliothèque d'interface utilisateur, supporte un rendu logiciel léger. Bjørke a implémenté un LineBufferProvider capable de prendre chaque ligne de sortie rasterisée, de la convertir en niveaux de gris et de l'écrire dans le framebuffer Linux, accessible via le fichier /dev/fb0. Pour rafraîchir l'affichage e-ink, il a utilisé l'appel système ioctl() de la crate libc de Rust, en lui passant la zone modifiée.

Gestion du tactile multi-points

Pour interagir avec l'interface, le développeur a dû s'interfacer avec le panneau tactile. Celui-ci se présente comme un fichier d'entrée (/dev/input/event1) dont la lecture renvoie des structures de données brutes. Le Kindle utilise le protocole multi-touch de type B du noyau Linux. Le développeur a donc programmé la gestion des événements : accumulation des coordonnées X, Y et de l'identifiant de suivi, puis à chaque événement SYNC_REPORT, traduction en actions pour Slint (pression, glissement, relâchement).

Un résultat opérationnel

Après de nombreuses phases de débogage portant sur l'affichage et la détection tactile, Sverre Johann Bjørke est parvenu à faire fonctionner un compteur avec un bouton d'incrémentation. Fort de cette preuve de concept, il a extrait le code spécifique au Kindle dans une crate indépendante, qu'il a publiée sur crates.io sous le nom slint-backend-kindle. Ce code, bien que fonctionnel sur son modèle précis, nécessitera probablement des ajustements pour d'autres versions de Kindle.

Le développeur prévoit maintenant de créer un tableau de bord complet, mais note que cela fera l'objet d'un autre projet.