Ecrire un driver linux pour les ecrans sharp basse consomation

Ecran sharp dans son boitier imprimé en 3d
Ecran sharp dans son boitier imprimé en 3d

Pour l’écran, nous avons choisi d’utiliser un module Sharp de la gamme memory lcd, le LS027B7DH01.
Il possède un fort taux de contraste et reste lisible même sans rétro-éclairage, ce qui le rend extrêmement peu gourmand en énergie, 50 microW d’après le site de Sharp.
Il est monochrome, sa résolution est de 400×240 et sa taille de 2,7″.

Il s’interface sur bus SPI et l’affichage est commandé par un protocole simple.
La mise à jour de l’affichage se fait par ligne, c’est à dire que le message le plus court à envoyer à l’écran code au minimum la valeur d’une ligne de pixel.
L’affichage étant monochrome, la valeur d’un pixel (noir ou blanc) est codé sur un bit.
Le module que nous utilisons a une résolution en largeur de 400 pixels, on codera donc la valeur d’une ligne de pixel sur 400 / 8 = 50 octets.
On préfixe la trame par un octet de commande pour signifier à l’écran qu’on met à jour une ligne, un octet pour représenter le numéro de ligne, et on suffixe par 2 octets à 0 pour représenter la fin du message.

On arrive donc à une taille de trame de 1 + 1 + 50 + 2 = 54 octets pour mettre à jour une ligne de pixels.
En résumé, voici la structure d’une trame de mise à jour d’une ligne de pixels :
(insérer schéma)

La vitesse maximum du bus SPI supportée par l’écran d’après Sharp est de 2Mbit/s.
On déduit donc la vitesse maximum de rafraîchissement complet de l’écran :
Une ligne de pixel : 54 * 8 = 432 bits
Résolution verticale : 240
Une frame : 432 * 240 = 103 680 bits

=> Frames par seconde : 2 000 000 / 103 680 =~ 19

La vitesse maximum théorique de rafraîchissement semble donc juste suffisante pour obtenir un affichage fluide.
On espère par contre pouvoir tirer partie de la possibilité de ne mettre à jour que les lignes de pixels qui ont réellement été modifiée entre 2 rafraîchissements.

Premiers tests

L’objectif est donc d’utiliser l’écran Sharp comme moniteur pour notre board.
On souhaite avoir une console et pouvoir lancer des applications dans le framebuffer sur cet écran.

Il faut donc que le noyau Linux voit notre écran comme un framebuffer standard.
Nous n’avons pas trouvé de module noyau qui supporterait le protocole utilisé par l’écran Sharp, nous allons donc le coder nous même.
Nous avons par contre trouvé une librairie userland utilisant le bus SPI d’une Raspberry-Pi pour dessiner sur notre type d’écran :

https://github.com/MakerDyne/Memory-LCD-for-Raspberry-Pi

Cette librairie est un bon point de départ pour expérimenter avec l’écran, nous câblons l’écran sur la Raspberry comme expliqué sur le lien précédent, lançons le programme de test fourni avec la librairie et ça fonctionne !

Par contre, la librairie n’est pas portable, elle s’appuie sur une autre librairie pour contrôler les GPIO et le bus SPI, mais elle est spécifique au SoC de la Raspberry, le bcm2835.
Des fonctions portables existent pourtant en userland pour contrôler les GPIO et un bus SPI sous linux.
Spidev pour le bus SPI par exemple.
Pour les GPIO, des fichiers spéciaux sont créés dans « /sys/class/gpio/ » et représentent chaque pin, on peut donc contrôler leur état en userland avec les fonctions standards d’ouverture, de lecture et d’écriture sur les fichiers.

Pour tester l’affichage sur l’écran sur notre board de test, une olinuxino mini, nous avons donc modifié la librairie en remplaçant les fonctions spécifiques au bcm2835 par des fonctions portables.

Après modification de la librairie et câblage de l’écran sur la olinuxino mini, le programme de test de MakerDyne fonctionne !

Il nous reste donc à développer le module noyau en nous inspirant du fonctionnement du programme de test.

Pour développer le module noyau, nous sommes partis du squelette de module framebuffer, dans le source du noyau Linux :
drivers/video/skeletonfb.c

[Plus de détails à venir !]

La source du module est téléchargeable ici ( Module noyau écran Sharp).

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *


*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>