[РЕШЕНО]*BSD/Linux + Framebuffer

Модератор: Модераторы разделов

Ответить
Аватара пользователя
sabir
Сообщения: 66
ОС: OpenBSD

[РЕШЕНО]*BSD/Linux + Framebuffer

Сообщение sabir »

Привет всем!

Q1: Как в *BSD зажечь фреймбуффер?

В линуксе, например, это делается не просто, а очень просто:

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <linux/input.h>

struct fb_var_screeninfo vinfo;

int main()
{
    int fd, fbsize, i, j;
    int * fbbuf;

    // открываем фреймбуффер
    if((fd = open("/dev/fb0", O_RDWR)) < 0) exit(1);

    // получаем параметры
    if(ioctl(fd, FBIOGET_VSCREENINFO, &vinfo))
    {
        printf("Bad vscreeninfo ioctl\n");
        exit(2);
    }

    // определяем размер фреймбуффера = (разрешение по X * разрешение по Y * байты на пиксель)
    fbsize = vinfo.xres*vinfo.yres*(vinfo.bits_per_pixel/8);

    // mmap-им
    if((fbbuf = mmap(NULL, fbsize, PROT_WRITE, MAP_SHARED, fd, 0)) == (void *) -1) exit(3);

    // 60 раз забиваем фреймбуффер цветом 0xff004882, чтобы определить FPS
    for(j = 0; j < 60; j++)
    {
        for(i = 0; i < vinfo.xres*vinfo.yres; i++) fbbuf[i] = 0xff004882;
    }

    // освобождаем ресурсы
    munmap(fbbuf, fbsize);
    close(fd);
    return 0;
}

Конкретно сейчас на моем лаптопе стоит фряшка, но я ставил и нетку и опен BSD, там такая же проблема.
А проблема такая:
- девайса /dev/fb0 просто нет (как сделать что бы был?)
- хидера <linux/fb.h> тоже нет, поиск по фразе "fb_var_screeninfo" ничего конструктивного не дал (какой хидер юзать?)
- warning: implicit declaration of function 'ioctl' is invalid in C99 (что то не пойму, в *BSD нет сискола 'ioctl' что ли?)
Или кодинг под *BSD абсолютно отличается от линукса (маловероятно) или что то не так. А что именно, как это вылечить?

Q2: Почему один и тот же бинарник (код см. выше) на разных компах, с одной и той же осью, исполняется по разному?

А именно:
- имеется десктоп i5 + 8GB RAM + встроенная в проц интеловская видяха (другой видяхи нет, FarCry3 запускается и вполне играбелен на средних настройках), в общем компу год и он достаточно наворочен.
Так вот на этом навороченном компе, вышеуказанный бинарник исполняется следующим образом:

Код: Выделить всё

$ time ./main
real 0m6.973s
user 0m6.968s
sys 0m0.000s

Т.е. FPS = 60 / 6.973 = 8.6
Это жуткое тупление.

- имеется лаптоп, старый, ~8 летний Asus с мобильным радеоном HD2400, полагаю, что FarCry3 на нем даже не запуститься, даже FarCry2 идет с такими тормазами, что об игре не может быть и речи.
Так вот на этом древнем лаптопе тот же самый бинарник просто летает:

Код: Выделить всё

$ time ./main
real 0.211s

Считаем FPS = 60 / 0.211 = 284.36
Как такое может быть?
Ось одна и та же, в буквальном смысле, я юзаю форк от Slackware, а именно Porteus, он грузится с флешки, т.е. отличия по составу софта, драйверам или настройкам абсолютно исключены.
Вся разница только в железе, это я понимаю, но не пойму как это вылечить.
Это точно можно вылечить, например при запуске wayland/weston с fbdev-backend.so, никакого тупления нет, все летает на обоих компах.
Спасибо сказали:
Аватара пользователя
Janik
Сообщения: 850
Статус: Оператор вычислительных машин
ОС: Debian

Re: [РЕШЕНО]*BSD/Linux + Framebuffer

Сообщение Janik »

В BSD разве есть фрейм буффер?
Кто ищет, тот всегда найдет!
Опыт - это когда все получается с первого раза.
Спасибо сказали:
yoshakar
Сообщения: 259
ОС: Debian Stretch

Re: [РЕШЕНО]*BSD/Linux + Framebuffer

Сообщение yoshakar »

Janik писал(а):
11.10.2014 22:44
В BSD разве есть фрейм буффер?
Есть. Через него например jfbterm работает.

Кстати, ТС, посмотрите исходный код этого самого jfbterm, если не найдёте путь обретения знаний попроще.
Спасибо сказали:
Аватара пользователя
sabir
Сообщения: 66
ОС: OpenBSD

Re: [РЕШЕНО]*BSD/Linux + Framebuffer

Сообщение sabir »

yoshakar писал(а):
13.10.2014 20:57
Janik писал(а):
11.10.2014 22:44
В BSD разве есть фрейм буффер?
Есть. Через него например jfbterm работает.

Кстати, ТС, посмотрите исходный код этого самого jfbterm, если не найдёте путь обретения знаний попроще.

Спасибо yoshakar, посмотрим на jfbterm, может на что и сгодится, но как я понял нативной поддержки фреймбуффера (имеется ввиду как в Linux) в *BSD нет, единственный способ зажечь экран - это запустить иксы.
Вообще то меня интересует DRM, fb я хотел попользовать как временное решение, пока не воткну как заюзать на *BSD тот самый DRM. Что характерно, он, DRM, как бы работает, иксы же запускаются, есть даже устройство /dev/dri/card0, но получить из него ресурсы у меня не получается. Впрочем не только у меня, девелоперы libdrm тоже не могут этого сделать, по крайней мере /libdrm/tests/modeprint и /libdrm/tests/modetest завершаются с ошибкой, в линь все работает прекрасно.
Спасибо сказали:
yoshakar
Сообщения: 259
ОС: Debian Stretch

Re: [РЕШЕНО]*BSD/Linux + Framebuffer

Сообщение yoshakar »

sabir писал(а):
17.10.2014 22:17
как я понял нативной поддержки фреймбуффера (имеется ввиду как в Linux) в *BSD нет, единственный способ зажечь экран - это запустить иксы.
Не, это ерунда какая-то. jfbterm ставится и работает без иксов, сам видел. И он явно не консольный, а графический (например, там шрифт явно другой, не тот, что в текстовой консоли).
Спасибо сказали:
Аватара пользователя
alv
Бывший модератор
Сообщения: 7275
Статус: Пенсионер в законе
ОС: Cintu
Контактная информация:

Re: [РЕШЕНО]*BSD/Linux + Framebuffer

Сообщение alv »

yoshakar писал(а):
18.10.2014 04:20
sabir писал(а):
17.10.2014 22:17
как я понял нативной поддержки фреймбуффера (имеется ввиду как в Linux) в *BSD нет, единственный способ зажечь экран - это запустить иксы.
Не, это ерунда какая-то. jfbterm ставится и работает без иксов, сам видел. И он явно не консольный, а графический (например, там шрифт явно другой, не тот, что в текстовой консоли).

Есть лет 10 как - сначала в DragonFly появился, потом во FreeBSD портировали, вроде и про NetBSD поговаривали.
Другое дело, что по умолчанию он не задействован.
Спасибо сказали:
yoshakar
Сообщения: 259
ОС: Debian Stretch

Re: [РЕШЕНО]*BSD/Linux + Framebuffer

Сообщение yoshakar »

alv писал(а):
18.10.2014 11:42
Другое дело, что по умолчанию он не задействован.
"Не задейстован" в смысле, что tty* не через фреймбуффер работают? Ну это да. А так - я ничего не делал, не включал, поставил FreeBSD, захотел UTF-8 в консоли, поставил jfbterm, запустил - он нормально заработал, я ужаснулся увиденному, и сделал системной кодировкой KOI8-R.
Спасибо сказали:
Аватара пользователя
alv
Бывший модератор
Сообщения: 7275
Статус: Пенсионер в законе
ОС: Cintu
Контактная информация:

Re: [РЕШЕНО]*BSD/Linux + Framebuffer

Сообщение alv »

yoshakar писал(а):
18.10.2014 16:00
alv писал(а):
18.10.2014 11:42
Другое дело, что по умолчанию он не задействован.
"Не задейстован" в смысле, что tty* не через фреймбуффер работают? Ну это да. А так - я ничего не делал, не включал, поставил FreeBSD, захотел UTF-8 в консоли, поставил jfbterm, запустил - он нормально заработал, я ужаснулся увиденному, и сделал системной кодировкой KOI8-R.

Значит, теперь модуль PIXEL MODE сам научился загружать - в DragonFly так с самого начала было
а во Free ядро надо было пересобирать
А UTF - да, насколько понимаю, во всех BSD'ях всё там же (где спина теряет своё благородное имя)
Спасибо сказали:
Аватара пользователя
sabir
Сообщения: 66
ОС: OpenBSD

Re: [РЕШЕНО]*BSD/Linux + Framebuffer

Сообщение sabir »

alv писал(а):
18.10.2014 11:42
Другое дело, что по умолчанию он не задействован.

А как его задействовать то?
Скачал я исходники jfbterm, в файлике fbcommon.c есть функция tfbm_init(), внутри которой вызывается функция util_privilege_open("/dev/fb0", O_RDWR)
Заходим в /dev/ и ... нету там fb0 :(
Неохота мне ковыряться в исходниках jfbterm, тем более мне нужен DRM, а не FB, ежели только если бы без гимороя как то, а так...
На текущий момент занимаюсь препарированием Linux, в целом пока "работы" достаточно, была у меня мулька соскочить с линя на *BSD, ну типа *BSD более TRUE, но видать еще не пришло время, подождем :)
Спасибо сказали:
Аватара пользователя
alv
Бывший модератор
Сообщения: 7275
Статус: Пенсионер в законе
ОС: Cintu
Контактная информация:

Re: [РЕШЕНО]*BSD/Linux + Framebuffer

Сообщение alv »

sabir писал(а):
20.10.2014 05:13
А как его задействовать то?

Во FreeBSD/DFBSD это называется PIXEL MODE - так что да, fb0 там нету.
Как - в DFBSD раньше было так: http://alv.me/?p=352
Во FreeBSD чуть позже - примерно так же
Сейчас, вот yoshakar говорит, ещё проще - ядро пересобирать не нужно.
Спасибо сказали:
yoshakar
Сообщения: 259
ОС: Debian Stretch

Re: [РЕШЕНО]*BSD/Linux + Framebuffer

Сообщение yoshakar »

sabir писал(а):
20.10.2014 05:13
Скачал я исходники jfbterm, в файлике fbcommon.c есть функция tfbm_init(), внутри которой вызывается функция util_privilege_open("/dev/fb0", O_RDWR)
Есть сильное подозрение, что вы скачали исходники для Linux, а для FreeBSD исходники другие. Подозрение основывается на том, что мой тарбол с исходниками, скачанный автоматически при установке jfbterm, называется jfbterm-FreeBSD-0.6.1.tar.gz (зачем бы там было FreeBSD, если бы оно там было не нужно?), а также на отсутствии в нём файла fbcommon.c (но зато есть framebuffer.c в котором опять-таки есть упоминание /dev/fb0, но только внутри #if defined (__linux__), а внутри #elif defined (__FreeBSD__) совсем другое).

Кстати, а нельзя воспользоваться SDL? Там вполне может быть всё уже написано за вас (но вполне может быть что и нет).
Спасибо сказали:
Аватара пользователя
sabir
Сообщения: 66
ОС: OpenBSD

Re: [РЕШЕНО]*BSD/Linux + Framebuffer

Сообщение sabir »

yoshakar писал(а):
20.10.2014 23:48
sabir писал(а):
20.10.2014 05:13
Скачал я исходники jfbterm, в файлике fbcommon.c есть функция tfbm_init(), внутри которой вызывается функция util_privilege_open("/dev/fb0", O_RDWR)
Есть сильное подозрение, что вы скачали исходники для Linux, а для FreeBSD исходники другие. Подозрение основывается на том, что мой тарбол с исходниками, скачанный автоматически при установке jfbterm, называется jfbterm-FreeBSD-0.6.1.tar.gz (зачем бы там было FreeBSD, если бы оно там было не нужно?), а также на отсутствии в нём файла fbcommon.c (но зато есть framebuffer.c в котором опять-таки есть упоминание /dev/fb0, но только внутри #if defined (__linux__), а внутри #elif defined (__FreeBSD__) совсем другое).

Кстати, а нельзя воспользоваться SDL? Там вполне может быть всё уже написано за вас (но вполне может быть что и нет).

Да, Вы совершенно правы, я скачал первый попавшийся тарбол и он без всяких сомнений заточен под линь.
Столо быть во фряшке юзается некий "/dev/tty*", буду иметь ввиду.
А насчет SDL, так это да, все уже давно сделано за меня и всех остальных, равно как и OpenGL, Xlib, gtk и qt, а сейчас еще ковыряют wayland/weston, убунтуйцы некий mir+unity толкают или как его там, можно сказать, что таки да, я занят изобретением велосипеда, но не колеса. Это с одной стороны, а если посмотреть с другой стороны, то мне интересно как это работает, вот есть буффер экрана и я сам отдельно взятыми пикселями рисую некий GUI. Мне интересен сам процесс творчества, а не конечный результат, сделать что то самому, разве это не круто. Ну да, криво, косо, никому не нужно, все так, но это лучше, чем пить пиво на диване и пялиться в телек, разве я не прав?
Ко всему прочему это весьма полезно для головного мозга, я имею ввиду интеллектуальную деятельность, как говориться не дай себе отупеть :D
alv писал(а):
20.10.2014 13:06
Сейчас, вот http://alv.me/?p=352

Благодарю alv, интересная статья
Спасибо сказали:
yoshakar
Сообщения: 259
ОС: Debian Stretch

Re: [РЕШЕНО]*BSD/Linux + Framebuffer

Сообщение yoshakar »

sabir писал(а):
21.10.2014 06:32
Ну да, криво, косо, никому не нужно, все так, но это лучше, чем пить пиво на диване и пялиться в телек, разве я не прав?
Вы совершенно правы.
Спасибо сказали:
yoshakar
Сообщения: 259
ОС: Debian Stretch

Re: [РЕШЕНО]*BSD/Linux + Framebuffer

Сообщение yoshakar »

sabir писал(а):
21.10.2014 06:32
Столо быть во фряшке юзается некий "/dev/tty*", буду иметь ввиду.
Это просто файл консоли. По идее, отправка в него какого-нибудь текста (echo "abc > /dev/ttyv1) должна вызвать появление текста на экране. И да, похоже, что и "рисование" в FreeBSD происходит, в отличие от Линукса, черех него же. Но как именно - я с ходу не понял.
Спасибо сказали:
Аватара пользователя
sabir
Сообщения: 66
ОС: OpenBSD

Re: [РЕШЕНО]*BSD/Linux + Framebuffer

Сообщение sabir »

yoshakar писал(а):
21.10.2014 10:50
Это просто файл консоли. По идее, отправка в него какого-нибудь текста (echo "abc > /dev/ttyv1) должна вызвать появление текста на экране.

Это уже интересно, может подскажете, что есть эмулятор консоли. Если просто по рабоче-крестьянски, эмулятор консоли это программа, которая:
1. Отправляет/получает сообщения в/из /dev/tty*, а затем отображает это в некой области экрана, назовем ее окном.
2. Отправляет/получает сообщения в/из stdout/stderr/stdin, а затем отображает это в некой области экрана, назовем ее окном.
3. Что то еще. Интерес представляют только конечные точки приложения сил, т.е. что надо открыть open(), откуда считать read() и куда записать write().
А уж проблем нарисовать красивый GUI нету совершенно никаких, любое изображение на экране есть всего лишь набор отдельно взятых пикселей определенного цвета и ничего больше.
Попытка чтения исходников, например xterm нагоняет жуткую депрессию, неужели, что бы вывести на экран пару строк текста нужно несколько десятков тысяч строк кода, мне думается тут какой то косяк
Спасибо сказали:
yoshakar
Сообщения: 259
ОС: Debian Stretch

Re: [РЕШЕНО]*BSD/Linux + Framebuffer

Сообщение yoshakar »

Увы, для меня это тоже неизвестная область.
Спасибо сказали:
Аватара пользователя
alv
Бывший модератор
Сообщения: 7275
Статус: Пенсионер в законе
ОС: Cintu
Контактная информация:

Re: [РЕШЕНО]*BSD/Linux + Framebuffer

Сообщение alv »

sabir писал(а):
23.10.2014 23:49
Это уже интересно, может подскажете, что есть эмулятор консоли.

Это очень интересный философский вопрос. Вообще-то консоль - это тот виртуальный терминал, на котором можно авторизоваться рутом. Во Фре, в отличие от Линукса, авторизацию рутом можно запретить/разрешить для конкретного терминала.
Но всё это имеет исторический интерес. В какой-то из своих книжек я про это писал.

yoshakar писал(а):
21.10.2014 10:50
Это просто файл консоли.

Это файл устройства - виртуального терминала #
Настоящей консоли (то есть терминала рут-оператора) сейчас нет нигде. Хотя как раз во Free сохранились реликты.
Спасибо сказали:
Аватара пользователя
sabir
Сообщения: 66
ОС: OpenBSD

Re: [РЕШЕНО]*BSD/Linux + Framebuffer

Сообщение sabir »

alv писал(а):
24.10.2014 02:05
sabir писал(а):
23.10.2014 23:49
Это уже интересно, может подскажете, что есть эмулятор консоли.

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

Не, я имел ввиду как это работает физически, вернее на программном уровне. Нарисовать окно консоли не проблема, равно как и нарисовать с помощью libfreetype.so любые символы, любым шрифтом, любого цвета и в любом месте экрана.
Предположим юзер набрал на клаве: lsmod и нажал Enter.
Предположим я хочу написать эмулятор терминала и соответственно делаю примерно следующие шаги:
1. Переводим систему, не важно как, из ублюдочного текстового режима в полноценный графический режим. Получаем черный экран, далее можно в кровь разбить пальцы о клаву, все равно ничего не произойдет, поскольку нажатия клавиш и отображение символов нажатых клавиш нужно еще как то реализовать. Делается это легко и не принужденно (в Linux), считыванием из /dev/input/event*, там и мышка есть, и клава, и тачпад с тачскринами и любые другие устройства ввода.
2. Тупо рисуем окно с заголовком и кнопками: свернуть, развернуть, закрыть.
3. Ловим нажатие клавиш и рисуем в окне набранные символы красивым TrueType шрифтом. Получаем, что типа юзер набрал "lsmod" + "Enter".
А что дальше то происходит, надо в ручную запускать "exec*() + /bin/sh + /sbin/lsmod" или записать это в /dev/tty* или в /dev/stdin или еще куда?
А вывод lsmod'а как прочитать, из /dev/tty*, /dev/stdout или еще откуда?
Сторонние либы не интересны, только голые syscall'ы, в самом крайнем случае libc.so. Я собственно об этом.
Спасибо сказали:
Аватара пользователя
sabir
Сообщения: 66
ОС: OpenBSD

Re: [РЕШЕНО]*BSD/Linux + Framebuffer

Сообщение sabir »

sabir писал(а):
24.10.2014 07:14
А что дальше то происходит, надо в ручную запускать "exec*() + /bin/sh + /sbin/lsmod" или записать это в /dev/tty* или в /dev/stdin или еще куда?
А вывод lsmod'а как прочитать, из /dev/tty*, /dev/stdout или еще откуда?
Сторонние либы не интересны, только голые syscall'ы, в самом крайнем случае libc.so. Я собственно об этом.


НАЗВАНИЕ
ptmx и pts - основной и подчиненный псевдотерминал

ОПИСАНИЕ
Файл /dev/ptmx является символьным файлом с основным номером, равным 5 и вторичным номером 2, обычно имеет права доступа 0666, владелец и группа равны root. Используется для создания пары основного и подчиненного псевдотерминала.
Когда процесс открывает /dev/ptmx, то он получает описатель файла для основного псевдотерминала (PTM, pseudo-terminal master), а в каталоге /dev/pts создается устройство подчиненного псевдотерминала (PTS, pseudo-terminal slave).
Каждый описатель файла, полученный открытием /dev/ptmx, является независимым PTM со своим отдельным ассоциированным PTS, путь к нему можно определить, передав описатель на ptsname(3).
Перед открытием подчиненного псевдотерминала вы должен передать описатель файла основного терминала на grantpt(3) и unlockpt(3).
Когда и основной и подчиненный псевдотерминалы будут открыты, подчиненный начинает обеспечивать процессы интерфейсом, идентичным обычному терминалу.
Данные, записываемые на подчиненный терминал, появляются на основном терминале, как поток ввода. Данные, записываемые на основной терминал, появляются на подчиненном терминале, как поток ввода.
На практике псевдотерминалы используются для реализации эмуляторов терминала, таких как xterm(1), где данные, считываемые с основного псевдотерминала, интерпретируются приложениями в том же виде, как и данные с обычного терминала; а также в программах, реализующих удаленный доступ, таких как sshd(8), где данные, считываемые с основного псевдотерминала, отправляются по сети в программу-клиент, подключенной к терминула или эмулятору терминала.
Псевдотерминалы также могут использоваться для отправления данных ввода в программы, не желающие принимать обычный ввод через перенаправление, например su(8), или passwd(8)).

ФАЙЛЫ
/dev/ptmx, /dev/pts/*
Спасибо сказали:
Аватара пользователя
sabir
Сообщения: 66
ОС: OpenBSD

Re: [РЕШЕНО]*BSD/Linux + Framebuffer

Сообщение sabir »

sabir писал(а):
17.09.2014 13:18
Q1: Как в *BSD зажечь фреймбуффер?

В *BSD, впрочем как и в Linux, фреймбуффер (/dev/fb0) не нужен, т.к. он дает только software rendering, глупо в 21 веке юзать голый камень для отрисовки графики, надо юзать hardware acceleration, например связка libdrm + OpenGL(ES), впрочем софтварный рендеринг все еще безнаказанно доступен с помощью libdrm через /dev/drm0 и будет то же самое, что и через /dev/fb0, тока чуть больше (совсем немного) строчек кода выйдет.
sabir писал(а):
23.10.2014 23:49
может подскажете, что есть эмулятор консоли. Если просто по рабоче-крестьянски, эмулятор консоли это программа, которая:
1. Отправляет/получает сообщения в/из /dev/tty*, а затем отображает это в некой области экрана, назовем ее окном.
2. Отправляет/получает сообщения в/из stdout/stderr/stdin, а затем отображает это в некой области экрана, назовем ее окном.
3. Что то еще. Интерес представляют только конечные точки приложения сил, т.е. что надо открыть open(), откуда считать read() и куда записать write().
А уж проблем нарисовать красивый GUI нету совершенно никаких, любое изображение на экране есть всего лишь набор отдельно взятых пикселей определенного цвета и ничего больше.
Попытка чтения исходников, например xterm нагоняет жуткую депрессию, неужели, что бы вывести на экран пару строк текста нужно несколько десятков тысяч строк кода, мне думается тут какой то косяк .

Есть хорошая реализация эмулятора терминала, называется "st", исходники структурированы и легко читаются, есть даже кое-какие комменты, на пиндосском разумеется, имеется в коллекции пакетов OpenBSD, сорцы разумеется в свободном доступе, всего ~4000 строк кода, никакого gtk и qt, голый libc + Xlib. Вызовы libc легко можно выкинуть и заменить на syscall'ы, ну а выкинуть Xlib не так то просто, но вполне возможно, например заюзать libdrm, а можно и вовсе вместо libdrm заюзать ioctl()'ы и на голом асме без каких-либо зависимостей :)
Спасибо сказали:
Ответить