Introduction
Récemment, j'ai jailbreaké mon Kindle Paperwhite de 7e génération. Mon objectif initial était de l'utiliser comme une horloge sur ma table de nuit, mais j'ai ensuite décidé d'explorer la possibilité d'exécuter Rust sur cet appareil. Cela m'a permis de découvrir le potentiel de création d'un tableau de bord pour certaines fonctionnalités.
Contexte Technique
Pour compiler Rust pour le Kindle, j'ai dû cibler ARMv7 et musl libc. J'ai utilisé cargo-zigbuild, un outil de compilation croisée qui facilite la création d'applications pour des appareils à faible puissance. La compilation pour le Kindle est devenue relativement simple grâce à cette approche.
Pour obtenir un accès shell sur le Kindle, j'ai utilisé l'outil USBNetwork, qui permet de configurer l'accès SSH via USB ou Wi-Fi. J'ai également ajouté une entrée dans mon fichier de configuration SSH pour plus de commodité.
Analyse et Implications
Avec l'accès shell en place, j'ai pu confirmer que ma chaîne d'outils de compilation croisée fonctionnait correctement. Cependant, un programme qui imprime sur stdout n'est pas très utile sur un Kindle. J'ai donc décidé d'explorer les bibliothèques d'interface graphique (GUI) disponibles pour Rust, en particulier Slint, avec laquelle j'ai de l'expérience.
Slint prend en charge diverses interfaces de rendu et de backend, y compris un rendu logiciel léger qui fonctionne sur presque tout. En fournissant un LineBufferProvider qui implémente process_line(), nous pouvons prendre les lignes de sortie visuelle rasterisées une par une, les convertir en niveaux de gris et les écrire dans le tampon de trame, qui est simplement un fichier sur mon Kindle.
Perspective
Avec les pixels sur l'écran, l'autre moitié du puzzle consiste à faire en sorte que le panneau tactile communique avec Slint. La philosophie Linux « tout est un fichier » nous aide à nouveau : le contrôleur tactile apparaît comme /dev/input/event1, et nous pouvons simplement lire à partir de celui-ci.
Après avoir débogué de nombreux problèmes, j'ai finalement obtenu un compteur et un bouton d'incrémentation fonctionnels. J'ai extrait le code pertinent dans une crate séparée et l'ai publié sur crates.io. Il ne me reste plus qu'à dessiner le reste du tableau de bord.