Framebuffer в Linux'e и как его использовать.
Что и зачем оно надо...
Коротко - это устройство позволяющее работать с видео адаптером, что-то
типа /dev/cuaXX, только для видеоадаптера. Это нововидение появилось
недавно в ядрах серии 2.1.x - 2.2.x, на мой взгляд, полезное новшество.
Оно позволяет вам менять разрешение любимой текстовой консоли, так как вам
нравиться, а также, к примеру, при загрузке вывести любимое животное на экран,
ПИНГВИНА! :-)
Со стороны пользователя...
Выглядит это все как обыкновенные char-device'ы с major'ом 28 и минором
в зависимости от видюшки, в /dev.
Всего ох создается 8 штук...
0 = /dev/fb0 1-ый framebuffer
32 = /dev/fb1 2-ой framebuffer
...
224 = /dev/fb7 8-ой framebuffer
Вобщем-то framebuffer "нормальный" memory-device, это означает, что вы можете
сделать, например, так:
cp /dev/fb0 filename
и получите screenshot с экрана. :-) (соответственно следите за правами доступа
на этих device'ах). Но в тоже время, если ваш видеоадаптер имеет несколько функций
то fb0...fb8 могут выполнять разные функции и работать независимо друг от друга.
(правда, так и не удалось попробовать).
Кроме прелестей в консоли framebuffer дает возможность запускать через себя разные
приложения... например X-Server.. вы спросите:
- а зачем оно и так работает?
а ответ прост. Представьте себе ситуацию.. вы обладатель безымянной видиокарты...
framebuffer на ура с ней, а X-ы ну никак толи сервер не тот толи еще что-то...
вы легким нажатием клавиш ставите универсальный XF86_FBServer, и прекрасно себя
чувствуете без лишних проблем. (ну где-то вот так) :-)
По default X-server использует /dev/fb0 (старый /dev/fb0current - можете сделать
симлик /dev/fb0 -> /dev/fb0current), имеется возможность указывать framebuffer
через shell-environment'ы:
export FRAMEBUFFER=/dev/fb1
или (csh клоны)
setenv FRAMEBUFFER /dev/fb1
после определения этой переменной X-server будет использовать /dev/fb0.
Про программирование с использованием framebuffer'а ничего не скажу - бог
миловал заниматься этим. :-)
Как рулить всем этим хозяйством...
Как можно догадаться, без соответствующего управляющего ПО, framebuffer
вам вряд ли пригодится. Для управления существует замечательная программка -
'fbset'. В использование она проста и не требует сверхестественных умений
или знаний. Пара примеров:
1. fbset 1024x768-100 - ставит разрешение в данной консоли 1024x768 100Hz
но данное разрешение должно быть описано в db файле /etc/fb.modes.
поставляется в комплекте с fbset, но желательно поработать над этим файликом
"напильником". ;-) (он страшно default).
2. fbset -xres 800 -yres 600 -depth 8 - соответственно 800x600 и глубина цвета
8 bit. Частота развертки устанавливается параметрами -hsync, -vsync...и прочие. :-)
Поддержка определенных видов видеоадаптеров...
По default'у система использует VESA драйвер, но есть и special-designed драйверочки.
1. Matrox - драйвер для Matrox'ов для Intel, PPC и Alpha платформ.
Конкретного списка карт производимых Matrox`ом нет, но насколько
известно мне поддерживаются все видеоадаптеры.
Чтобы системе сказать, что у вас Matrox, надо в /etc/lilo.conf
в строке append="...." добавить значение "video=matrox:options".
Об опциях смотрите документацию к драйверу. (..../linux/Documentation/fb/matroxfb.txt)
2. Видео карты на чипе Perbedia2 (Diamond Multimedia). Списка также нет,
я побывал на Diamond FireGL 1000 Pro и остался доволен.
Включается аналогично "video=Permedia2:options", доки по опциям
я так и не нашел и оставил default`ые.
3. VESA driver. - Соответственно все адаптеры знающие что такое VESA 2.0 :-)
Для установки разрешения перед загрузкой в lilo.conf поставьте опцию
"vga=ask". При загрузке ядра вы увидите приглашение либо установить video-mode
(нажать Enter) либо продолжить (нажать пробел). Жмине пробел. Вам вывалиться
табличка.(это будет не то что вам надо) Заранее посмотрите видеорежимы:
VESA коды:
| 640x480 800x600 1024x768 1280x1024
----+-------------------------------------
256 | 0x101 0x103 0x105 0x107
32k | 0x110 0x113 0x116 0x119
64k | 0x111 0x114 0x117 0x11A
16M | 0x112 0x115 0x118 0x11B
Kernel_code = Vesa_code + 0x200.
Kernel коды:
| 640x480 800x600 1024x768 1280x1024
----+-------------------------------------
256 | 0x301 0x303 0x305 0x307
32k | 0x310 0x313 0x316 0x319
64k | 0x311 0x314 0x317 0x31A
16M | 0x312 0x315 0x318 0x31B
в промте вводите номер моды, скажем если это 1024x768x64k, то вводите 317.
для Matrox'ов свои таблицы. см. .../linux/Documentation/fb/matroxfb.txt
для Permedia я пользовался стандартными VESA режимами.
... за более детальной информацией обращайтесь в документацию или к разработчикам.
P.S. Не забудьте включить FrameBuffer в kernel`е :-)
Где взять...
Все необходимое лежит по этому адресу:
ftp://ftp.uni-erlangen.de/pub/Linux/LOCAL/680x0/
Идея создания принадлежит Martin Schaller.
Данное info на 60% срисованно с родной доки :), Sergey Minakov (25.05.99)
|