7 votes

Pourquoi le FrameBuffer est-il absent sur certains appareils Android ?

Je suis curieux du dispositif d'affichage sur Android. Je sais que sous Linux, les périphériques d'affichage sont représentés par /dev/fbX où "fb" signifie FrameBuffer. J'ai aussi entendu dire qu'Android utilise aussi FrameBuffer.

dans Android, c'est /dev/graphics/fbX habituellement /dev/graphics/fb0

<a href="https://kaustav.space/2018-09-22/introduction-to-android-framebuffer" rel="nofollow noreferrer">Kaustav - Introduction au framebuffer d'Android</a>

et

Android s'appuie sur le dispositif standard de tampon de trame ( /dev/fb0 o /dev/graphics/fb0 ) et le conducteur comme décrit dans le linux/fb.h fichier d'en-tête du noyau.

<a href="https://wladimir-tm4pda.github.io/porting/display_drivers.html" rel="nofollow noreferrer">Pilotes d'affichage | Android Open Source</a>

Cependant, sur mon appareil, qui est le OnePlus 7 Pro fonctionnant sous Lineage OS, je n'ai rien trouvé qui y soit lié. Je ne peux même pas trouver de nœuds d'appareil appelés *fb* sous /dev . Cependant, j'ai entendu dire que quelqu'un a certains appareils avec fb, et leurs autres appareils ne le font pas.

Je suis juste curieux, pourquoi ? Où est le dispositif d'affichage sur Android ?

0 votes

L'implémentation matérielle d'Android est totalement spécifique à chaque fournisseur. Il n'y a pas de standardisation. De nombreux équipementiers n'exposent pas les interfaces Linux standard en /dev , /sys , /proc , /config etc. De nombreux appels de service ne fonctionnent pas non plus. Au lieu de cela, les HAL fermés des OEM interagissent avec le matériel par le biais de différentes IPC, en particulier les Binders.

0 votes

@IrfanLatif Merci ! Cela m'a beaucoup aidé.

3voto

peterh Points 866

J'avais beaucoup de questions similaires jusqu'à ce que je leur demande aquí . L'essentiel des informations que vous obtiendrez sur ce post est le suivant :

  • Aucune application Android ne gère directement /dev/fb0 il existe ou non. Au lieu de cela, ils communiquent avec le processus système nommé "Surface Flinger", qui est l'analogue du serveur X sur les Linux.
  • Cette communication s'effectue par le biais de Binder, qui est un protocole RPC spécifique à Android, réservé aux hôtes locaux et similaire aux pipes d'Unix.
  • Même le dragueur de surface ne peut pas voir le /dev/fb0 directement. Au lieu de cela, il communique avec le HAL (couche d'abstraction matérielle). Jusqu'à Android 8, la HAL était un ensemble de librairies partagées dans /lib/hw . Depuis Android8, le HAL est également un ensemble de services système qui communiquent par l'intermédiaire d'un binder avec le Surface Flinger (bien que les HAL à librairie partagée soient toujours possibles).
  • L'accès direct à l'affichage se fait dans la bibliothèque HAL (service) responsable de cette tâche.

Les librairies HAL (services) sont développées par le fournisseur du téléphone. Ha peut développer une /dev/fb0 et utiliser un hal capable de le gérer, mais il peut aussi développer toute méthode personnalisée. Dans le second cas, vous n'aurez pas de /dev/fb0 dans le noyau.


De plus, et c'est déjà une chose spécifique à linux : /dev n'a pas besoin d'avoir tous les fichiers du périphérique existant sur votre système. C'est généralement le cas, mais ce n'est pas une obligation. (Sur la plupart des distributions Linux, le logiciel nommé udev automatise cette tâche, mais Android ne l'utilise pas). /dev a fichiers de périphérique sur un Linux vous pouvez voir qu'ils commencent par un c (fichier de périphériques de caractères) ou b (fichier de périphérique de bloc) dans le ls -l et également sur Android :

crw-rw---- 1 root video 29, 0   Dec 10 09:08 /dev/fb0
brw-rw---- 1 root disk   8, 0   Dec 11 07:21 /dev/sda
-rwxr-xr-x 1 root root  1302248 Apr 18  2019 /bin/bash

/dev/fb0 est un fichier de périphérique de caractères, /dev/sda est un fichier de périphérique de bloc, tandis que /bin/bash est un fichier ordinaire et non un périphérique.

Vous pouvez créer des fichiers de périphérique avec l'option mknod mais attention : il nécessite Root.

Il est tout à fait possible que /dev/fb0 est créé ailleurs sur votre système, peut-être à un endroit caché derrière les mêmes montages réservés aux utilisateurs. Il est également possible que fb0 ne soit pas créé du tout, bien que son pilote soit compilé dans le noyau.

Nous pouvons vérifier, quels fichiers de périphériques sont compilés dans le noyau, dans le fichier procfs. /proc/devices . Il doit contenir la ligne

Character devices:
...
29 fb          
...              

Ce fichier procfs est pratiquement toujours lisible même en tant qu'utilisateur. S'il n'existe pas, alors votre HAL responsable de l'affichage communique d'une autre manière avec le noyau.

S'il existe, alors vous pouvez créer le périphérique framebuffer par une commande

mknod /dev/fb0 c 29 0

en tant que racine. (En fait, vous pouvez toujours le créer en tant que Root, mais si la ligne ci-dessus n'existe pas dans le fichier /proc/devices alors il ne sera pas utilisable).

P.s. dans LineageOS, mes expériences sont de loin les meilleures en compilant une image userdebug. Cela n'a pas ralenti mon système du tout, mais toutes les choses de rooting, adb ont fonctionné dedans très correctement.

0 votes

Hmm, j'ai essayé de faire mknod et cela a créé avec succès le nœud de périphérique, mais quand j'ai essayé d'y accéder en utilisant cat ou d'autres outils, cela donne ceci No such device .

0 votes

Le char dev 29 est-il dans /proc/devices ?

0 votes

Oui. cat /proc/devices | grep fb sorties 29 fb

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X