FrameBuffer eInker
Licenciado bajo GPLv3+. Alojado aquí en GitHub.
¡Esto tiene como objetivo llenar el vacío que sienten los desarrolladores y expertos de Kobo cuando se dan cuenta de que no tienen una forma integrada de imprimir cosas en la pantalla del dispositivo!
Es especialmente cruel cuando se cambia a un Kobo, después de estar acostumbrado a la ubicuidad de eips
en Kindle...
En resumen, imprime mensajes o imágenes en su pantalla, manejando los ajustes de bajo nivel tanto con la interfaz framebuffer de Linux como con el i.MX EPDC (así como con el MTK en Kindle y el sunxi en Kobo).
Se ha probado en Kobo, Kindle, BQ Cervantes, reMarkable y PocketBook, pero trasladarlo a otros dispositivos Linux, i.MX eInk debería ser trivial (diablos, incluso la compatibilidad con Sipix no debería ser demasiado difícil). #64 demostró que incluso podemos doblegar las API de Sunxi a nuestra voluntad, si no te importa demasiado perder la cordura en el proceso;).
De forma predeterminada, la representación de texto se basa en fuentes de mapa de bits de celda fija incluidas (consulte esta publicación para ver una pequeña muestra), pero gracias a las contribuciones de @shermp (#20), también puede confiar en la representación de fuentes TrueType/OpenType completa.
La compatibilidad con imágenes incluye los formatos más comunes (JPEG/PNG/TGA/BMP/GIF/PNM), así como píxeles empaquetados sin formato en los formatos de píxeles más relevantes (Gray8 y RGB32; ambos +/- Alfa).
También funciona perfectamente bien en cualquier tipo de dispositivo framebuffer de Linux y admite una amplia gama de profundidades de bits (4bpp, 8bpp, 16bpp, 24bpp y 32bpp), por lo que puedes usarlo para dibujar en tu EFI fb, por ejemplo ;) .
Para los dispositivos Kobo, hay un hilo de discusión abierto aquí en MobileRead, donde encontrará archivos binarios independientes. A propósito, carece de instrucciones detalladas, porque el público objetivo son principalmente desarrolladores y expertos. Piense en esto como una medida de seguridad;).
También hay un hilo hermano para dispositivos Kindle aquí donde, además de archivos binarios, también encontrarás ejemplos de personas que hacen locuras con él;).
En la práctica, la mayoría de los usuarios de Kindle y Kobo lo obtendrán gratis, ya que viene incluido con la mayoría de mis paquetes.
Como ejemplo de uso en la naturaleza, vea KFMon, donde lo uso para proporcionar retroalimentación visual, o kobo-rclone, donde también se usa para raspar pantalla. También lo estamos usando en KOReader para que el proceso de actualización OTA sea más fácil de usar.
Una búsqueda rápida en GitHub de código que mencione fbink también debería arrojar resultados interesantes, por ejemplo, una corrección de manejo de DAÑOS para X11, un Qt5 QPA o InkVT, un emulador de terminal.
Consulte también los distintos enlaces en otros idiomas, que a menudo incluyen algunos ejemplos.
Hay disponible una utilidad CLI, construida alrededor de la misma API pública que se puede usar a través de una biblioteca compartida o estática para proyectos C, o a través de FFI en otros idiomas (tenga cuidado, sin embargo, tiene licencia GPLv3+, no LGPL). Para la utilidad CLI, consulte su documentación o ejecute fbink --help
para obtener más detalles. Para la biblioteca, consulte el encabezado público. ¡No dudes en ponerte en contacto conmigo si algo no te queda claro!
NOTA: Por lo general, NO intenta manejar la rotación del software, porque actualmente parece ser lo correcto tanto con las versiones actuales de Kobo FW como con Kindle.
YMMV en FW anteriores, o si algo más está alterando la rotación de Facebook, o si su aplicación está implementando la rotación en el software (es decir, una ventana gráfica rotada).
En lo que respecta a la rotación de hardware, existen algunas excepciones específicas para los dispositivos Kobo:
Aquellos que se ejecutan en modo de 16 bpp y parecen estar en modo horizontal: dado que ese parece ser su estado nativo, intentamos compensar esto, ya que podemos ser utilizados legítimamente antes de que Nickel lo corrija.
En dispositivos con acelerómetro, como Forma y Libra, donde el propio níquel se encargará de la rotación del hardware.
Algunos ejemplos básicos de la representación de texto de celda fija...
O si colocamos una imagen allí...
Y con todas las ventajas de trabajar con transparencia, incluso en hardware antiguo :).
Aquí hay algunas otras fuentes, así como una barra de progreso...
Y cuando se utilizan fuentes TrueType brillantes :).
A menos que simplemente estés intentando probarlo en un sistema Linux nativo puro ( make linux
), necesitarás un compilador cruzado dirigido a tu, bueno, dispositivo de destino.
Makefile está diseñado para detectar automáticamente mis propias configuraciones de ToolChain de compilación cruzada, que evidentemente recomiendo encarecidamente usar en lugar de confiar en cadenas de herramientas de compilación cruzada genéricas que pueden no apuntar exactamente al dúo kernel/libc correcto;).
El uso de la interfaz koxtoolchain debería hacer que la construcción de uno de estos sea un proceso bastante sencillo.
En caso de que esté utilizando su propia cadena de herramientas, tenga en cuenta que requerimos compatibilidad con C11 (GCC >= 4.9, Clang >= 3.0).
Siempre que no esté utilizando un compilador anterior, le recomiendo que lo cree con LTO habilitado.
Una vez aclarado esto, el objetivo predeterminado (es decir, make
) generará una compilación estática de Kobo, mientras que make kobo
generará una compilación compartida simplificada y, además, empaquetará todo a la manera de Kobo. El paquete que se encuentra en el hilo de Kobo está construido de esta manera.
También hay algunos objetivos convenientes para los tipos de compilación habituales ( make static
para una compilación estática, make shared
para una compilación compartida, make strip
para una compilación estática eliminada, make release
para una compilación compartida eliminada, make debug
para una compilación de depuración). como algunos inusuales para casos de uso muy específicos, generalmente relacionados con enlaces FFI ( make pic
para una compilación estática de PIC o pasar STATIC_LIBM=1
para intentar vincular estáticamente contra libm).
La elección de la plataforma de destino se maneja mediante una variable simple:
KINDLE=1
para crear una compilación de Kindle ( make kindle
lo haga en una compilación estática eliminada).KINDLE=1 LEGACY=1
para crear una compilación Kindle FW 2.x ( make legacy
hace eso en una compilación estática eliminada). Básicamente, esto simplemente desactiva CLOEXEC, que podría no ser compatible con FW 2.x.CERVANTES=1
para crear una compilación BQ/Cervantes ( make cervantes
haga eso en una compilación estática eliminada).REMARKABLE=1
para crear una compilación reMarkable ( make remarkable
hace eso en una compilación estática eliminada).POCKETBOOK=1
para crear una compilación de PocketBook ( make pocketbook
lo haga en una compilación estática eliminada).Se utiliza la misma lógica para permitir un poco de adaptación:
MINIMAL=1
para crear una compilación con una funcionalidad muy limitada (sin primitivas de dibujo, sin representación de fuentes de celda fija, sin representación de imágenes, sin fuentes adicionales, sin OpenType), lo que produce una aplicación y biblioteca mucho más pequeñas.DEBUG=1
para crear una compilación de depuración y pase DEBUG=1 DEBUGFLAGS=1
para crear una compilación de depuración con CFLAGS de depuración obligatorios. También puede agregar funciones una por una a una compilación MINIMAL
:
DRAW=1
para agregar soporte para dibujar primitivas.BITMAP=1
para agregar soporte para la representación de fuentes de celda fija. (Implica DRAW
)FONTS=1
para agregar soporte para las fuentes de celda fija incluidas adicionales. (Implica BITMAP
)IMAGE=1
para agregar soporte de imágenes. (Implica DRAW
)OPENTYPE=1
para agregar soporte de representación de fuentes OTF/TTF. (Implica DRAW
)INPUT=1
para agregar soporte para utilidades de entrada.BUTTON_SCAN=1
para agregar soporte para el escaneo de botones específico de Kobo. (Implica DRAW
) Si realmente necesita una cobertura Unicode extrema en la ruta de código de celda fija, también puede optar por incrustar GNU Unifont, pasando UNIFONT=1
.
Tenga en cuenta que esto agregará casi 2 MB al tamaño binario, y que la fuente en realidad está dividida en dos (los glifos de doble ancho se dirigen a una fuente específica), lo que puede reducir su utilidad en la práctica...
Por razones obvias, esto nunca está habilitado de forma predeterminada.
A menos que esté haciendo cosas muy específicas, generalmente querrá habilitar al menos DRAW
& BITMAP
en una compilación MINIMAL
...
No olvide ejecutar al menos make cleanlib
cuando cambie las plataformas de destino o los indicadores de funciones; de lo contrario, se mantendrá la última compilación de la biblioteca coincidente, porque cumplirá con las dependencias de make;).
En el camino, pueden aparecer algunas herramientas auxiliares en la carpeta de utils
. make utils
realizará una compilación estática de estos (que es la forma recomendada de hacerlo, ya que se aprovechan de forma bastante tosca de la API interna de FBInk). Actualmente, estos consisten en una herramienta de diagnóstico sobre el comportamiento de rotación y la prueba de estrés fatal que se menciona a continuación.
La mayoría de estos solo se han probado en Kobo y probablemente deberías dejarlos en paz a menos que sepas lo que estás haciendo;).
También está disponible una herramienta para manipular adecuadamente la profundidad de bits en dispositivos eInk, y se puede crear para objetivos de e-Ink con make fbdepth
.
Su nombre poco inspirado es fbdepth
y KOReader en Kobo y reMarkable lo utiliza para imponer una rotación sensata y cambiar a una profundidad de bits más eficiente. También se ha probado en Kindle, donde el manejo de la rotación, como mínimo, debería comportarse correctamente. Tenga en cuenta que en FW 5.x, la GUI estándar se ejecuta en X, y a X no le gustará que gire el fb debajo de sus pies;).
Si desea el binario más pequeño posible, asegúrese de compilarlo solo, a partir de un árbol fuente impecable.
También hay un ejemplo bastante estúpido que muestra la API de volcado/restauración que se puede crear mediante make dump
.
Se implementó otra demostración estúpida basada en el efecto de fuego de PSX Doom, para probar el EPDC de una manera ligeramente interesante.
Si alguna vez sintió curiosidad por toda la juerga de mxcfb alt_buffer, puede echar un vistazo a esta PoC.
En la misma línea, si estás investigando las travesuras de rotación y entrada en Kobo, make devcap
creará un tarball que contiene algunos archivos binarios y un script devcap_test.sh que, cuando se ejecute en el dispositivo de destino, compilará bastante información. En particular, si alguna vez necesita informar un error en fbdepth
, probablemente le pediré que lo ejecute y adjunte los resultados al problema;).
Y en cuanto al tema de la entrada y la rotación en Kobo, make ftrace
creará una utilidad de seguimiento de puntero simple, que aprovecha libevdev y algunas de nuestras llamadas API más divertidas para intentar dar sentido a las travesuras de traducción de entrada que suceden en Kobo.
Si tiene la intención de manejar la entrada táctil de alguna manera en su código, este debería ser un buen lugar para buscar;).
También demuestra cómo manejar eficazmente la entrada y el dibujo con lápiz en la Elipsa.
En cuanto a make input_scan
, creará una pequeña herramienta CLI alrededor de la API fbink_input_scan
, que ayuda a entender qué dispositivo de entrada hace qué (también conocido como "¿dónde está esa maldita pantalla táctil?";)).
El soporte de Kindle cubre toda la línea Kindle, comenzando desde el K2.
El soporte de Kobo cubre toda la línea Kobo, comenzando desde Kobo Touch A/B/C (NOTA: algunas funciones no están disponibles en Sunxi SoC, cf, API docs).
El soporte de BQ Cervantes ha sido aportado por @pazos (#17) y debería encargarse de la alineación actual.
@tcrs (#41) ha aportado soporte reMarkable y admite el rM2 cuando se combina con una de las diversas implementaciones de shim de rm2fb.
@ezdiy (#47) probó la compatibilidad con PocketBook y debería admitir el mismo conjunto de dispositivos que KOReader. Tenga en cuenta que PocketBook es una plataforma complicada de manejar y que yo mismo no tengo acceso a ella. Lo que significa que hay bastantes peculiaridades involucradas:
fbink_get_fb_info
en lugar de recurrir a los ioctls nativos usted mismo.FBINK_NO_INKVIEW
en tu entorno. Actualmente, el único inconveniente será la identificación deficiente del dispositivo: específicamente, sin nombre de dispositivo y DPI inexactos (el valor predeterminado será 212, a menos que establezca una anulación a través de la variable de entorno FBINK_FORCE_DPI
)).FBINK_NO_SW_ROTA
en su entorno, en cuyo caso siempre dibujaremos el diseño nativo de Facebook. Si, en lugar de escribir en el framebuffer, quieres tomar una instantánea PNG del mismo (lo que puede resultar útil), tengo una versión muy modificada de FBGrab que debería abordar con sensatez las diversas peculiaridades de los framebuffers eInk;). Si realmente no necesita un archivo PNG y solo quiere jugar con volcados de Facebook en memoria, consulte todas las llamadas API fbink_dump
y fbink_restore
.
¡Para que todos se diviertan, incluso si no soportas C!
Óxido:
Ir: go-fbink y su sucesor go-fbink-v2 por @shermp
LuaJIT: lua-fbink por @NiLuJe
Python: py-fbink por @NiLuJe
Tenga en cuenta que, como es posible que la API no sea completamente estable en la versión maestra, todas están vinculadas a una etiqueta específica (generalmente, la última versión). Debes cumplir con ese requisito, o se desatará el infierno;).
Generalmente intento mantener las roturas al mínimo, o salvo eso, hacer que las rutas de actualización sean lo más sencillas posible, pero ahí lo tienes, admitir cosas nuevas a menudo significa que las cosas existentes tienen que funcionar de manera ligeramente diferente.
Intento detallar las roturas de API/ABI en los comentarios de cada etiqueta, pero una buena forma de visualizarlo es, por supuesto, diferenciar el encabezado público único (o, para una descripción general rápida y sin contexto, los encabezados mínimos generados para los enlaces FFI);).