Как использовать/dev/fb0 в качестве консоли от пространства пользователя или синтезируемый текст к нему

Там являются различными:

  • easytag имеет много опций
  • kid3, если Вы находитесь на среде Qt/KDE
  • id3v2 или eyeD3 для командной строки
  • Обычно аудиоплееры могут также отредактировать общие теги, f.e. banshee, rhythmbox или amarok

и много других, попытайтесь искать свой репозиторий дистрибутивов и протестируйте некоторых из них.

24
10.09.2011, 23:35
5 ответов

Для использования кадрового буфера в качестве консоли, Вам нужно fbdev модуль. Вам, вероятно, придется перекомпилировать Ваше ядро.

Можно также интересоваться проектом DirectFB, который является библиотекой, которая делает использование кадрового буфера легче. Уже существуют также приложения и среды GUI, записанные для него.

10
27.01.2020, 19:40
  • 1
    Похож, когда я установил Directfb (webos-internals.org/wiki/Directfb), он шел с названной утилитой dfbg который позволяет мне поставить изображение там (и не удаляет его после завершения как fbi). Я знаю, что могу, вероятно, найти, что утилита создает .png или подобный из текста блока, таким образом, это могло бы просто работать... –  LawrenceC 11.09.2011, 04:57

Для консольной стороны можно повторить материал к /dev/console или можно использовать системный журнал, и в зависимости от различных других настроек, он может обнаружиться на консоли.

Для изображений я просто попробовал catting bmp файл к fb0, и он на самом деле работал! (sortof - несколько копий, меньшего размера)

Я нашел bmp к кадровому буферу программу здесь. Это должно быть идеальным примером формата, который ожидает fb0. Существует также fbi, программа для записи непосредственно в кадровый буфер.

2
27.01.2020, 19:40
  • 1
    fbi позволяет мне помещать изображение на экран, который полезен, но он очищает кадровый буфер, после того как он выходит. –  LawrenceC 11.09.2011, 05:00

Несколько человек ответили на части вашего вопроса, касающиеся ядра и размещения изображений (а не текста) в фреймбуфере, но пока что остальное остается без ответа. Да, вы можете использовать подсистему виртуальных терминалов ядра для создания так называемой консоли framebuffer. Но есть несколько инструментов, которые позволяют использовать устройство framebuffer для создания виртуальных терминалов пользовательского пространства. К ним относятся:

  • zhcon (Debian) - виртуальный терминал пользовательского пространства, ориентированный на обработку ввода-вывода CJK гораздо лучше, чем подсистема ядра. Его особая сила - в работе с кодировками ISO 2022, не относящимися к UTF; его особая слабость - кодировки UTF.
  • fbterm (Debian) - виртуальный терминал пользовательского пространства, породивший несколько форков, включая jfbterm. Он имеет множество подключаемых модулей для ввода CJK.
  • bogl-bterm (Debian) - виртуальный терминал пользовательского пространства, породивший такие форки, как niterm.
  • Ali Gholami Rudi's fbpad - минималистский виртуальный терминал, не зависящий от библиотек X.
  • Инструменты console-terminal-emulator и console-fb-realizer в nosh - виртуальный терминал пользовательского пространства, нацеленный на копирование виртуальных терминалов ядра Linux и FreeBSD/PC-BSD. Он также не имеет зависимостей от библиотек X.
  • kmscon - виртуальный терминал пользовательского пространства, тесно связанный с logind сервером в systemd и его понятиями "места".

Али Голами Руди, в частности, создал не просто эмулятор терминала для работы с фреймбуфером. Он также написал PDF-просмотрщик, VNC-просмотрщик, медиаплеер и программу для чтения Корана.

Полное сравнение бок о бок выходит за рамки данного ответа; но вот некоторые моменты, которые имеют отношение к вопросу:

  • Как отмечалось, несколько программ виртуального терминала в пространстве пользователя используют библиотеки X для обработки шрифтов, отображения клавиатуры, методов ввода CJK и так далее. Они не являются клиентами X, но у них есть зависимости от библиотек X. fbpad и инструменты nosh по своей конструкции не используют никаких библиотек X.
  • Программы, использующие библиотеки X для работы со шрифтами, конечно же, используют шрифты X. Остальные используют другие средства.
    • bogl-bterm и fbpad имеют свои собственные идиосинкразические форматы шрифтов. Один конвертирует шрифты BDF в шрифты BOGL с помощью инструмента bdftobogl; а другой конвертирует TTF в шрифты "tinyfont", которые используются fbpad, с помощью инструмента ft2tf (Arch).
    • Инструмент nosh console-fb-realizer использует те же шрифты "vt", что и новая подсистема виртуальных терминалов ядра FreeBSD 10.1, и поэтому использует инструмент манипулирования шрифтами FreeBSD vtfontcvt для преобразования шрифтов BDF.
  • Программы, использующие библиотеки X, используют отображение клавиатуры X. Что касается остальных:
    • Инструменты nosh имеют свой собственный идиосинкратический формат карты клавиатуры, предназначенный для обеспечения полной клавиатуры, поддерживающей ISO 9995-3, с "общей" группой 2 ISO. Можно преобразовать файлы BSD kbdmap в этот формат с помощью инструмента console-convert-kbdmap. Опять же, эти файлы kbdmap - те, что используются в подсистеме vt FreeBSD/PC-BSD.
    • fbpad вообще не делает собственного отображения клавиатуры, а полагается на наличие подсистемы виртуального терминала ядра и ее механизма отображения клавиатуры.
  • Есть некоторые различия в вызове и требуемых привилегиях:
    • zhcon, fbterm, bogl-bterm, fbpad и kmscon работают на основе того, что эмулятор терминала порождает программу оболочки/логина на терминале, непосредственно, как дочерний процесс. Для порождения login им нужны привилегии суперпользователя.
    • Инструменты nosh были разработаны для интеграции с существующей /etc/ttys (BSD), /etc/inittab (Linux system 5 init) или другой системой, которой они оставляют работу по порождению getty/login/shell. console-fb-realizer нуждается только в привилегиях, достаточных для открытия фреймбуфера и устройств событий ввода, что не требует привилегий суперпользователя, и для доступа к FIFO и обычным файлам, обслуживаемым console-terminal-emulator, который, в свою очередь, вообще не нуждается в специальных привилегиях.

Все это, конечно, эмуляторы терминалов. Если вы хотите убрать эмуляцию терминала и вывести текст на фреймбуфер более непосредственно, у вас есть несколько вариантов:

  • bogl-bterm, конечно, основан на библиотеке Бена Пфаффа Ben's Own Graphics Library - библиотеке ввода/вывода фреймбуфера, разработанной для использования в средах настройки/спасания системы (и "для графических интерфейсов в КПК"). Вы, конечно, можете писать программы, использующие ее напрямую.
  • В качестве промежуточного варианта между написанием программы, использующей библиотеку фреймбуфера для собственного рендеринга, и программы, которая выдает управляющие последовательности тому, что она считает терминалом: Виртуальный терминал пользовательского пространства nosh является модульным и разделяется на составные части. Можно просто не использовать console-terminal-emulator.

    console-fb-realizer использует дисплейный файл с массивом символьных ячеек, как /dev/vcsa*, но обычный файл (не файл специального устройства символов) и с кодовыми точками Unicode, атрибутами ECMA-48 и 24-битным цветом RGB. Так что можно запустить его и просто записать символ+атрибут+цвет прямо в файл массива ячеек символов, позволив console-fb-realizer выполнить рендеринг шрифта в фреймбуфер.

    В качестве дополнения: Обратите внимание, что это противоположно интеграции с BRLTTY, которая использует console-terminal-emulator, но не запускает console-fb-realizer.

26
27.01.2020, 19:40

Это старый пост, но я понимаю, что обычно вам нужна консоль фреймбуфера (fbcon) для запуска консоли в фреймбуфере. Дело в комплектации. (драйверы устройств / графика / дисплей консоли ..)

0
27.01.2020, 19:40

Если вы можете cat /dev/urandom > /dev/fb0 и получить случайные пиксели на экране, у вас есть все, что вам нужно.

В моем случае мне нужно было сбросить некоторую текстовую информацию. Я тестировал это в busybox и raspi, так что это может сработать и для вас. Ответ может быть немного длинным, так как если вы не используете консоль, вам придется выводить пиксели символов самостоятельно. К счастью, кто-то уже проделал эту сложную работу, поэтому нам нужно просто объединить их.

В busybox или в вашем raspi у вас должен быть fbset бинарник. Это может помочь вам узнать ваши настройки размеров экрана.

В моей встроенной программе это выглядит так:

# fbset

mode "480x272-1"
    # D: 0.104 MHz, H: 0.207 kHz, V: 0.657 Hz
    geometry 480 272 480 272 16
    timings 9600000 3 3 0 32 17 11
    accel false
    rgba 5/0,6/5,5/11,0/0
endmode

Важной частью здесь является ширина 480 и высота 272 пикселей.

Как вы упомянули, вы можете выполнить экран с помощью команды cat /dev/urandom > /dev/fb0

и вы можете очистить его с помощью cat /dev/zeros > /dev/fb0

Чем очищать экран, мы должны убедиться, что вы получили правильные размеры.

Случайно в моем busybox был бинарник fbsplash, который получал в качестве входных данных файл .ppm.

Поправьте, если я ошибаюсь, но кажется, что fb0 принимает этот формат. Если посмотреть на Portable Anymap в Wikipedia, там есть несколько "подформатов"... fbsplash использует причудливый с цветом, и так далее... но мы хотим иметь возможность просто распечатать что-то читабельное. Давайте для простоты воспользуемся P1, закодированным в ASCII. Если бы мы могли напечатать вертикальную линию, мы бы знали, что наши размеры верны. Давайте попробуем:

Вертикальная линия в ppm типа P1 должна выглядеть так:

P1
480 272
f 0 0 0 0 ... 0 
f 0 0 0 0 ... 0
... 
f 0 0 0 0 ... 0

Итак, будет 272 строки, шириной 959 символов. В документации сказано, что вместо f должно быть 1... на busybox и raspi f было ярче.

Важно, чтобы после 0 не было пробела... Эта задача может быть немного утомительной... лучше использовать текстовый редактор, который поможет вам. В vim вы можете скопировать первые две строки, перейти в командный режим (esc), затем ввести следующие символы:

of(esc)479a 0(esc)yy271p

Конечно, я использую свои размеры, вы должны использовать свои. Скопируйте этот файл на /dev/fb0, он должен выглядеть следующим образом: Vertical line screen

Хорошо, я обманываю... там не одна строка... там около 8... но когда это не работает (у нас неправильные размеры или у нас есть пробел в конце, иметь только одну строку намного проще).

Если вы дошли до этого, нам нужно просто напечатать правильные пиксели, чтобы увидеть их как символы. Благодаря Marcel Sondaar и его репозиторию на GitHub нам не нужно будет рисовать каждый символ.

С помощью небольшой доработки можно расширить его простую программу, чтобы печатать f вместо X и 0 вместо пробелов, вставить пробелы между каждым символом, добавить заголовок, и у нас есть файл .ppm с буквой, соответствующей ее коду.

Еще один маленький шаг - и вы получаете на вход не символ, а строку. Катируйте файл, передайте в вашу программу и выведите на /dev/fb0 и вы получите текстовый вывод:

Example of text output

Я протестировал это решение также на raspberry pi и оно сработало. Система говорит мне, что у меня нет репутации для размещения более 2 ссылок. Пока я не разберусь с этим, вы должны полагаться на мои слова :D

10
27.01.2020, 19:40

Теги

Похожие вопросы