фреймбуфер /dev/fb

Вопросы программного кода и архитектуры Linux

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

фреймбуфер /dev/fb

Непрочитанное сообщение Olej » 05 мар 2019, 11:54

В этом принципиальное отличие всех этих маленьких ARM SBC от привычных x86 - у них (ARM) нет видеоподсистемы текстового вывода на монитор, поэтому они подхватили довольно давнюю (ядро 2.1.107) идею видео фреймбуфера, куда записывается графические образ экрана, который мы потом и видим на HDMI.
Отображается фреймбуфер в системе (как один или несколько) /dev/fb0 ... и далее /dev/fb1 и т.д.

Но ... во-первых, в настройках-конфигурациях системы (а скорее даже системного загрузчика, U-boot etc.) фреймбуфер должен быть сконфигурирован.
А во-вторых, в смысле программного использования фреймбуфера - там всё не так просто.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: фреймбуфер /dev/fb

Непрочитанное сообщение Olej » 05 мар 2019, 12:00

Olej писал(а):А во-вторых, в смысле программного использования фреймбуфера - там всё не так просто.
Вот, подсказали - Curtis McEnroe:
Programming the Linux Framebuffer
Tuesday, 30 January, 2018
...
Очень небольшая статья, с примерами кода, которая показывает как а). отобразить фреймбуфер на буферную область памяти, б). как через эту буферную область отрисовать цветной пиксель на экране через фреймбуфер и в). как использовать текстовый фонт для вывода текста через фреймбуфер.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: фреймбуфер /dev/fb

Непрочитанное сообщение Olej » 05 мар 2019, 12:44

Olej писал(а): Но ... во-первых, в настройках-конфигурациях системы (а скорее даже системного загрузчика, U-boot etc.) фреймбуфер должен быть сконфигурирован.
Фреймбуфер, как я понял, может создаваться в ядре - для известных видов видеоадаптеров!, или пробрасываться в ядро загрузчиком системы (U-boot и др.) для тех новых типов чипов, поддержка которых ещё не реализована в ядре.
Про мытарства с /dev/fb и его отображением на HDMI читаем здесь:
Mainline Kernel и HDMI (здесь, кстати, подробно показаны параметры кросс компиляции U-boot под ARM SBC Orange Pi !):
Май 11, 2017
...
1. Скачиваем u-boot из git://git.denx.de/u-boot.git (когда недавние изменения попадут в релиз, можно будет качать архив).
2. Накладываем на u-boot патч, с которым драйвер добавляет описание фреймбуфера в device tree во время загрузки https://github.com/Icenowy/u-boot/commi ... dc96.patch
3. Делаем defconfig, собираем u-boot.
4. Скачиваем свежее мейнлайновое ядро отсюда: https://www.kernel.org/ :)
5. Накладываем на ядро патч, который добавляет фреймбуфер в device tree для H3: https://pastebin.com/raw/PgYmgzbT
6. Делаем defconfig, собираем ядро.
7. Устанавливаем u-boot, ядро, dtb и радуемся рабочему HDMI с EDID.
сборка системы BuildRoot
Июнь 29, 2018
...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: фреймбуфер /dev/fb

Непрочитанное сообщение Olej » 05 мар 2019, 13:02

Olej писал(а):В этом принципиальное отличие всех этих маленьких ARM SBC от привычных x86
Вообще то, многие традиционные x86 дистрибутивы конфигурируют ядро с поддержкой фреймбуфера:

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

olej@ACER:~/2019_WORK/own.WORK/AplitSoft/OrgDoc$ uname -a
Linux ACER 4.19.0-2-amd64 #1 SMP Debian 4.19.16-1 (2019-01-17) x86_64 GNU/Linux

olej@ACER:~/2019_WORK/own.WORK/AplitSoft/OrgDoc$ lsb_release -a
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux buster/sid
Release:	testing
Codename:	buster

olej@ACER:~/2019_WORK/own.WORK/AplitSoft/OrgDoc$ ls -l /dev/fb*
crw-rw---- 1 root video 29, 0 фев 27 16:12 /dev/fb0
Конфигпараметры ядра:

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

olej@ACER:~/2019_WORK/own.WORK/AplitSoft/OrgDoc$ cat /boot/config-4.19.0-2-amd64 | grep FRAMEBUFFER
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set
Фреймбуфер здесь сконфигурирован по умолчанию с поддержкой конкретных видеокарт:

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

olej@ACER:~/2019_WORK/own.WORK/AplitSoft/OrgDoc$ cat /boot/config-4.19.0-2-amd64 | grep _FB_ | grep =y 
CONFIG_DRM_KMS_FB_HELPER=y
CONFIG_FB_CMDLINE=y
CONFIG_FB_NOTIFY=y
CONFIG_FB_BOOT_VESA_SUPPORT=y
CONFIG_FB_CFB_FILLRECT=y
CONFIG_FB_CFB_COPYAREA=y
CONFIG_FB_CFB_IMAGEBLIT=y
CONFIG_FB_SYS_FILLRECT=y
CONFIG_FB_SYS_COPYAREA=y
CONFIG_FB_SYS_IMAGEBLIT=y
CONFIG_FB_SYS_FOPS=y
CONFIG_FB_DEFERRED_IO=y
CONFIG_FB_BACKLIGHT=y
CONFIG_FB_MODE_HELPERS=y
CONFIG_FB_TILEBLITTING=y
CONFIG_FB_PM2_FIFO_DISCONNECT=y
CONFIG_FB_CYBER2000_DDC=y
CONFIG_FB_VESA=y
CONFIG_FB_EFI=y
CONFIG_FB_MATROX_MILLENIUM=y
CONFIG_FB_MATROX_MYSTIQUE=y
CONFIG_FB_MATROX_G=y
CONFIG_FB_RADEON_I2C=y
CONFIG_FB_RADEON_BACKLIGHT=y
CONFIG_FB_ATY128_BACKLIGHT=y
CONFIG_FB_ATY_CT=y
CONFIG_FB_ATY_GX=y
CONFIG_FB_ATY_BACKLIGHT=y
CONFIG_FB_S3_DDC=y
CONFIG_FB_SIS_300=y
CONFIG_FB_SIS_315=y
CONFIG_FB_VIA_X_COMPATIBILITY=y
CONFIG_FB_3DFX_I2C=y
CONFIG_FB_MB862XX_PCI_GDC=y
CONFIG_FB_MB862XX_I2C=y

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: фреймбуфер /dev/fb

Непрочитанное сообщение Olej » 05 мар 2019, 14:43

Olej писал(а): Вообще то, многие традиционные x86 дистрибутивы конфигурируют ядро с поддержкой фреймбуфера:
Как это выглядит в разных дистрибутивах и при разном видеооборудовании:

- Mint 19.1

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

olej@nvidia:~$ lsb_release -a
No LSB modules are available.
Distributor ID: LinuxMint
Description:    Linux Mint 19.1 Tessa
Release:        19.1
Codename:       tessa

olej@nvidia:~$ uname -a
Linux nvidia 4.15.0-45-generic #48-Ubuntu SMP Tue Jan 29 16:28:13 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

olej@nvidia:~$ inxi -G
Graphics:  Device-1: NVIDIA GF119 [GeForce GT 520] driver: nvidia v: 390.77
           Display: server: X.Org 1.19.6 driver: nvidia unloaded: fbdev,modesetting,nouveau,vesa resolution: 1920x1080~60Hz
           OpenGL: renderer: GeForce GT 520/PCIe/SSE2 v: 4.6.0 NVIDIA 390.77

olej@nvidia:~$ ls -l /dev/fb*
crw-rw---- 1 root video 29, 0 мар  5 12:32 /dev/fb0
- Fedora 28:

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

[olej@xenix ~]$ lsb_release -a
LSB Version:    :core-4.1-amd64:core-4.1-noarch
Distributor ID: Fedora
Description:    Fedora release 28 (Twenty Eight)
Release:        28
Codename:       TwentyEight

[olej@xenix ~]$ uname -a
Linux xenix.localdomain 4.19.13-200.fc28.x86_64 #1 SMP Sat Dec 29 23:10:35 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

[olej@xenix ~]$ inxi -G
Graphics:  Device-1: Intel 4 Series Integrated Graphics driver: i915 v: kernel
           Display: x11 server: Fedora Project X.org 1.19.6 driver: modesetting unloaded: fbdev,vesa
           resolution: 1920x1080~60Hz
           OpenGL: renderer: Mesa DRI Intel G41 v: 2.1 Mesa 18.0.5

[olej@xenix ~]$ ls -l /dev/fb*
crw-rw---- 1 root video 29, 0 мар  5 12:30 /dev/fb0

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: фреймбуфер /dev/fb

Непрочитанное сообщение Olej » 05 мар 2019, 14:51

Olej писал(а): Как это выглядит в разных дистрибутивах и при разном видеооборудовании:
А это уже ARM SBC одноплатный Orange Pi One:

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

[olej@xenix 05]$ ssh olej@192.168.1.108
olej@192.168.1.108's password:
  ___                               ____  _    ___
 / _ \ _ __ __ _ _ __   __ _  ___  |  _ \(_)  / _ \ _ __   ___
| | | | '__/ _` | '_ \ / _` |/ _ \ | |_) | | | | | | '_ \ / _ \
| |_| | | | (_| | | | | (_| |  __/ |  __/| | | |_| | | | |  __/
 \___/|_|  \__,_|_| |_|\__, |\___| |_|   |_|  \___/|_| |_|\___|
                       |___/

Welcome to ARMBIAN 5.60 stable Debian GNU/Linux 9 (stretch) 4.14.70-sunxi
System load:   0.00 0.07 0.05   Up time:       6 min
Memory usage:  10 % of 493MB    IP:            192.168.1.108
CPU temp:      35°C
Usage of /:    74% of 3.7G

[ General system configuration (beta): armbian-config ]

Last login: Tue Mar  5 10:48:20 2019

olej@orangepione:~$ uname -a
Linux orangepione 4.14.70-sunxi #265 SMP Wed Sep 19 10:01:19 CEST 2018 armv7l GNU/Linux

olej@orangepione:~$ inxi -G
Graphics:  Card: Failed to Detect Video Card!
           Display Server: X.org 1.19.2 driver: N/A tty size: 120x45 Advanced Data: N/A out of X

olej@orangepione:~$ ls -l /dev/fb*
crw-rw---- 1 root video 29, 0 Nov 30 09:17 /dev/fb0
И, уж для полноты картины, Raspberry Pi 2 :

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

[olej@xenix 05]$ ssh olej@192.168.1.109
olej@192.168.1.109's password: 
...
model: Raspberry Pi 2 Model B Rev 1.1
compatible: brcm,bcm2709
My IP address is 192.168.1.109 
Xenomai/cobalt v3.0.5

olej@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 8.0 (jessie)
Release:	8.0
Codename:	jessie

olej@raspberrypi:~ $ uname -a
Linux raspberrypi 4.1.21-v7+ #4 SMP Sat Jul 15 06:39:14 CEST 2017 armv7l GNU/Linux

olej@raspberrypi:~ $ ls -l /dev/fb*
crw-rw---- 1 root video 29, 0 Nov 30 09:17 /dev/fb0

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: фреймбуфер /dev/fb

Непрочитанное сообщение Olej » 05 мар 2019, 15:14

Olej писал(а): Как это выглядит в разных дистрибутивах и при разном видеооборудовании:
Я стал копать это так обширно только потому, что на некоторых образцах нет фреймбуфера:

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

[olej@dell ~]$ lsb_release -a
LSB Version:	:core-4.1-amd64:core-4.1-noarch
Distributor ID:	Fedora
Description:	Fedora release 27 (Twenty Seven)
Release:	27
Codename:	TwentySeven

[olej@dell ~]$ ls -l /dev/fb*
ls: невозможно получить доступ к '/dev/fb*': Нет такого файла или каталога

[olej@dell ~]$ inxi -G
Graphics:  Device-1: NVIDIA GT218M [NVS 3100M] driver: nvidia v: 340.107 
           Display: server: X.org 1.19.6 driver: nvidia unloaded: fbdev,modesetting,nouveau,vesa tty: 172x49 
           Message: Advanced graphics data unavailable in console. Try -G --display 

[olej@dell ~]$ inxi -G --display
Graphics:  Device-1: NVIDIA GT218M [NVS 3100M] driver: nvidia v: 340.107 
           Display: x11 server: Fedora Project X.org 1.19.6 driver: nvidia 
           unloaded: fbdev,modesetting,nouveau,vesa resolution: 1600x900~60Hz 
           OpenGL: renderer: NVS 3100M/PCIe/SSE2 v: 3.3.0 NVIDIA 340.107 
Почему?
И что значит unloaded fbdev у inxi? :-o

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: фреймбуфер /dev/fb

Непрочитанное сообщение Olej » 06 мар 2019, 15:14

Olej писал(а):В этом принципиальное отличие всех этих маленьких ARM SBC от привычных x86 - у них (ARM) нет видеоподсистемы текстового вывода на монитор, поэтому они подхватили довольно давнюю (ядро 2.1.107) идею видео фреймбуфера, куда записывается графические образ экрана, который мы потом и видим на HDMI.
Это очень старый механизм Linux (даже дремучий), получивший новую жизнь в связи с SBC, поэтому с ним крайне сложно разбираться:
- публикации на счёт использования FB (API) - старые...
- относящиеся, главным образом, к консольным конфигурациям (без Xorg)...
- а все каталоги и пути с того времени, в разных дистрибутивах, поплыли - всё приходится разыскивать!

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: фреймбуфер /dev/fb

Непрочитанное сообщение Olej » 06 мар 2019, 15:22

Olej писал(а): Вот, подсказали - Curtis McEnroe:
Programming the Linux Framebuffer
Tuesday, 30 January, 2018
...
Основываясь на этой публикации (в моих дистрибутивах всё находится совсем в других местах)...
- fb1.c :

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

#include <fcntl.h>
#include <assert.h>
#include <stddef.h>
#include <linux/fb.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <sys/mman.h>
#include <stdint.h>
#include <unistd.h>
#include <stdlib.h>

int main() {
   int fb = open( "/dev/fb0", O_RDWR );
   assert( fb > 0 );
   struct fb_var_screeninfo info;
   assert( 0 == ioctl( fb, FBIOGET_VSCREENINFO, &info ) );
   size_t len = 4 * info.xres * info.yres;
   printf( "X=%d | Y=%d | LEN=%u\n", info.xres, info.yres, len );
   uint32_t *buf = mmap( NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0 );
   printf( "%p\n", buf );
   if( MAP_FAILED == buf )
      printf( "error: %m\n" );
   assert( buf != MAP_FAILED );
   int ret = munmap( buf, len );
   if( ret != 0 )
      printf( "error: %m\n" );
   close( fb );
   exit( EXIT_SUCCESS );
}

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

olej@ACER:~/2019_WORK/own.WORK/fb$ gcc fb1.c -o fb1
Debian десктоп:

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

olej@ACER:~/2019_WORK/own.WORK/fb$ ./fb1
X=1920 | Y=1080 | LEN=8294400
0x7fb51c35f000
Armbian Orange Pi (ARM):

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

olej@orangepione:~/fb$ uname -a
Linux orangepione 4.14.70-sunxi #265 SMP Wed Sep 19 10:01:19 CEST 2018 armv7l GNU/Linux

olej@orangepione:~/fb$ gcc fb1.c -o fb1

olej@orangepione:~/fb$ ls -l /dev/fb*
crw-rw---- 1 root video 29, 0 Mar  5 22:17 /dev/fb0

olej@orangepione:~/fb$ cat /etc/group | grep video
video:x:44:olej,motion

olej@orangepione:~/fb$ ./fb1
X=1024 | Y=768 | LEN=3145728
0xb6b7a000
Вложения
fb1.c
(886 байт) 144 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: фреймбуфер /dev/fb

Непрочитанное сообщение Olej » 06 мар 2019, 15:29

Olej писал(а): Armbian Orange Pi (ARM):

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

olej@orangepione:~/fb$ ./fb1
X=1024 | Y=768 | LEN=3145728
0xb6b7a000
Но!!! :-o
Rapsberry Pi 2:

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

olej@raspberrypi:~/fb $ uname -a
Linux raspberrypi 4.1.21-v7+ #4 SMP Sat Jul 15 06:39:14 CEST 2017 armv7l GNU/Linux

olej@raspberrypi:~/fb $ ls -l /dev/fb0
crw-rw---- 1 root video 29, 0 Mar  5 22:17 /dev/fb0

olej@raspberrypi:~/fb $ cat /etc/group | grep video
video:x:44:pi,olej

olej@raspberrypi:~/fb $ ./fb1
fb1: fb1.c:14: main: Assertion `fb > 0' failed.
Aborted

olej@raspberrypi:~/fb $ sudo ./fb1
[sudo] password for olej: 
X=656 | Y=416 | LEN=1091584
0xffffffff
error: Invalid argument
fb1: fb1.c:24: main: Assertion `buf != ((void *) -1)' failed.
Смешно? :-o ;-)

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей