Как использовать / dev / fb0 в качестве консоли из пользовательского пространства или выводить на нее текст

24

Итак, у меня есть модель Palm Pre (оригинальная P100EWW), в которой я включил режим разработчика и установил chroot Debian Squeeze. Работает отлично. У меня есть планы использовать это для НИЧЕГО (bittorrent peer, веб-сервер), но телефон.

Я заметил, что если я это сделаю, cat /dev/urandom > /dev/fb0он на самом деле записывает случайные пиксели на экран, пока не No space left on deviceбудет сгенерирована ошибка. Круто, теперь я могу использовать дисплей.

Итак, какие существуют утилиты, которые позволят мне либо A) разрешить использовать / dev / fb0 в качестве консоли, на которую я могу выводить текст, либо B) отобразить текст на / dev / fb0 из командной строки.

Я пока не знаю о перекомпиляции ядра для этого (я хотел бы в конечном итоге полностью отключить WebOS и превратить это в минимальный сервер ARM), поэтому я спрашиваю инструменты пользовательского пространства, если они существуют. Также предпочел бы визуализировать напрямую в / dev / fb0 и не использовать X.

LawrenceC
источник
Виртуальные консоли Linux должны работать поверх драйвера кадрового буфера. Виртуальные консоли являются мощным инструментом; начиная с Linux 2.6 они позволяют устанавливать разные шрифты для каждой консоли. Но они управляются (из пользовательского пространства) через / dev / vcs  n и / dev / vcsa  n , а не / dev / fb0.
Incnis Mrsi

Ответы:

11

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

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

Кит
источник
1
Похоже, когда я установил Directfb ( webos-internals.org/wiki/Directfb ), он шел с утилитой, dfbgкоторая позволяет мне помещать туда картинки (и не удаляет их по завершении, как fbi). Я знаю, что могу найти утилиту для создания .png или подобного из блочного текста, так что это может сработать ...
LawrenceC
24

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

  • zhcon ( Debian ) - виртуальный терминал в пользовательском пространстве, предназначенный для обработки операций ввода-вывода CJK намного лучше, чем подсистема ядра. Его особая сила заключается в работе с кодировками, не относящимися к UTF, согласно ISO 2022; его особая слабость - кодировка UTF.
  • fbterm ( Debian ) - виртуальный терминал в пользовательском пространстве, который породил несколько форков, включая jfbterm . Он имеет множество плагинов для метода ввода CJK.
  • bogl-bterm ( Debian ) - виртуальный терминал в пользовательском пространстве, который породил вилки, такие как niterm .
  • Али Gholami Руди 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, с «общей» группой ISO 2. Один из них преобразует файлы BSD kbdmap в этот формат с помощью console-convert-kbdmapинструмента. Опять же, эти файлы kbdmap используются в подсистеме FreeBSD / PC-BSD vt .
    • fbpad вообще не выполняет собственное сопоставление клавиатуры и для этого использует подсистему виртуального терминала ядра и механизм сопоставления клавиатуры.
  • Существует некоторая разница в вызове и необходимых привилегиях:
    • zhcon, fbterm, bogl-bterm, fbpad и kmscon работают на основе того, что эмулятор терминала порождает программу shell / login на терминале напрямую, как дочерний процесс. Им нужны привилегии суперпользователя, чтобы появиться login.
    • Инструменты nosh были разработаны для интеграции с существующей /etc/ttys(BSD), /etc/inittab(система Linux 5 init) или другой системой, которой они оставляют работу по созданию getty / login / shell. console-fb-realizerнужны только достаточные привилегии для открытия фрейм-буфера и устройств ввода событий, которые не обязательно должны быть привилегиями суперпользователя, и для доступа к FIFO и обычным файлам console-terminal-emulator, которые поддерживаются , что, в свою очередь, вообще не требует никаких специальных привилегий.

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

  • bogl-bterm, конечно, основан на собственной графической библиотеке Бена Пфаффа Бена - библиотеке ввода-вывода кадрового буфера, предназначенной для использования в средах настройки / спасения системы (и «для графических интерфейсов в КПК» ). Конечно, вы можете писать программы, которые используют это напрямую.
  • На полпути между написанием программы, которая использует библиотеку кадрового буфера для выполнения собственного рендеринга, и программой, которая выплевывает escape-последовательности к тому, что он считает терминалом: виртуальный терминал nosh в пользовательском пространстве является модульным и разделяется на составные части. Можно просто не использовать console-terminal-emulator.

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

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

JdeBP
источник
1
Это удивительный ответ. Библиотеки Enlightenment требуют поддержки кадрового буфера в Linux fbcon- в зависимости от параметров времени компиляции . Это также верно для их зависимого терминального эмулятора Терминология : Работает непосредственно в кадровом буфере linux (fbcon) . Кроме terminology, Я второй kmscon (и другие работы Дэвида Herrmann) по рекомендации себе .
mikeserv
1
Руди - мастер фреймбуфера! Однажды я тоже откажусь от X11.
Сиро Сантилли 新疆 新疆 中心 法轮功 六四 事件
10

Если вы можете ловить кошку /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 в Википедии , есть несколько «подформатов» ... 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 символов в ширину. Документация говорит, что это должно быть 1 вместо f ... на busybox, и raspi f был ярче.

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

of(esc)479a 0(esc)yy271p

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

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

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

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

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

Пример вывода текста

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

Zeh
источник
2

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

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

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

Шон Дж. Гофф
источник
fbiпозволяет мне поместить изображение на экран, что полезно, но оно очищает кадровый буфер после его выхода.
LawrenceC
0

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

Чан Ким
источник