7 votos

¿Por qué falta el FrameBuffer en algunos dispositivos Android?

Tengo curiosidad por el dispositivo de visualización en Android. Sé que en Linux, los dispositivos de los dispositivos se representan como /dev/fbX que "fb" significa FrameBuffer. También he oído que Android utiliza FrameBuffer también

en Android es /dev/graphics/fbX , por lo general /dev/graphics/fb0

<a href="https://kaustav.space/2018-09-22/introduction-to-android-framebuffer" rel="nofollow noreferrer">Kaustav - Introducción al framebuffer de Android</a>

y

Android se basa en el dispositivo de memoria intermedia estándar ( /dev/fb0 o /dev/graphics/fb0 ) y el controlador como se describe en el linux/fb.h archivo de cabecera del kernel.

<a href="https://wladimir-tm4pda.github.io/porting/display_drivers.html" rel="nofollow noreferrer">Controladores de pantalla | Android Open Source</a>

Sin embargo, en mi dispositivo, que es OnePlus 7 Pro corriendo Lineage OS, no pude encontrar nada relacionado con eso. Ni siquiera puedo encontrar ningún nodo de dispositivo llamado *fb* en /dev . Sin embargo, he oído que alguien tiene algunos dispositivos con fb, y sus otros dispositivos no.

Tengo curiosidad, ¿por qué? ¿Dónde está el dispositivo de visualización en Android?

0 votos

La implementación de hardware de Android es totalmente específica del proveedor. No hay estandarización. Muchos OEMs no exponen las interfaces estándar de Linux en /dev , /sys , /proc , /config etc. Muchas llamadas al sistema tampoco funcionan. En su lugar, los HAL de código cerrado de los OEMs interactúan con el hardware a través de diferentes IPC's, particularmente Binders.

0 votos

@IrfanLatif ¡Gracias! Esto ha ayudado mucho.

3voto

peterh Puntos 151

Tenía un montón de preguntas similares hasta que les pregunté aquí . La esencia de las infos que se obtienen en este post son estas:

  • Ninguna aplicación de Android maneja directamente /dev/fb0 Existe o no existe. En cambio, se comunican con el proceso del sistema llamado "Surface Flinger", que es la analogía del servidor X en los Linux.
  • Esta comunicación se lleva a cabo con Binder, que es un protocolo RPC específico de Android, sólo para hosts locales, similar a las tuberías de Unix.
  • Ni siquiera el Flinger de la superficie puede ver el /dev/fb0 directamente. En su lugar, habla con la HAL (capa de abstracción de hardware). Hasta Android 8, la HAL era un conjunto de bibliotecas compartidas en /lib/hw . Desde Android8, también la HAL es un conjunto de servicios del sistema que habla a través de un binder con el Surface Flinger (aunque todavía es posible la HAL de librerías compartidas heredadas).
  • El acceso directo a la pantalla se produce en la biblioteca HAL (servicio) responsable de ello.

Las librerías (servicios) HAL son desarrolladas por el proveedor del teléfono. Ha puede desarrollar una /dev/fb0 conductor y utilizar un hal capaz de manejarlo, pero también puede desarrollar cualquier método personalizado. En el segundo caso, no tendrá un /dev/fb0 en el núcleo.


Además, y ya es algo específico de linux: /dev no necesita tener todos los archivos de dispositivos existentes en su sistema. Comúnmente es así, pero no es un requisito. (En la mayoría de las distribuciones de Linux, el software llamado udev automatiza esta tarea, pero Android no la utiliza). /dev tiene archivos de dispositivos , en un Linux se puede ver que comienzan por un c (archivo de dispositivo de caracteres) o b (archivo de dispositivo de bloque) en el ls -l y también en 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 es un archivo de dispositivo de caracteres, /dev/sda es un archivo de dispositivo de bloque, mientras que /bin/bash es un archivo ordinario y no un dispositivo.

Puede crear archivos de dispositivos con la función mknod pero ten en cuenta que requiere Root.

Es muy posible que /dev/fb0 se crea en otra parte de su sistema, tal vez en una ubicación que está oculta detrás de los mismos montajes de sólo usuarios o así. También es posible que fb0 no se cree en absoluto, a pesar de que su controlador está compilado en el kernel.

Podemos comprobar qué archivos de dispositivo están compilados en el kernel, en el archivo procfs /proc/devices . Debe contener la línea

Character devices:
...
29 fb          
...              

Este archivo procfs es prácticamente siempre legible también como usuario. Si no existe, entonces su HAL responsable de la visualización se comunica por alguna otra vía con el kernel.

Si existe, entonces puedes crear el dispositivo framebuffer mediante un comando

mknod /dev/fb0 c 29 0

como root. (En realidad siempre se puede crear como Root, pero si la línea anterior no existe en /proc/devices Entonces no será utilizable).

P.d. en LineageOS, mis experiencias son mucho mejores compilando una imagen userdebug. No ralentizó mi sistema en absoluto, pero todas las cosas de rooting, adb funcionaron en él muy correctamente.

0 votos

El comando mknod no debería ser como mknod /dev/fb0 c 29 0 ? He comprobado el manual y dice que la sintaxis es mknod [OPTION]... NAME TYPE [MAJOR MINOR] . El tuyo tampoco funciona en mi LineageOS, pero el mío sí. No estoy seguro de si es un error tipográfico o una cosa de la versión o variante.

1 votos

@YuutaW me acordaba mal, lo siento, lo he arreglado. :-)

0 votos

Hmm, traté de mknod y creó con éxito el nodo de dispositivo, pero cuando traté de acceder a él utilizando cat o cualquier herramienta, se muestra como No such device .

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X