Скажите, кто из вас не делал этого? Наверняка почти все. Мне просто
захотелось все это обобщить и рассмотреть различные варианты
настройки. Буду рад всем вашим дополнениям. И наконец - появится
первая статья :).
Все желающие могут использовать материал данной статьи, но только при
наличии ссылки на первоисточник. В статье использован материал с сайта
http://kmxb.narod.ru/index.html
Для осуществления сабжа вам будет необходимо несколько вещей:
* не кривые руки (надо хотя бы иметь опыт компиляции ядра),
* ОС Linux,
* ведро линукс больше >=2.4.5 (уточните - не помню когда появился
fb). Насчет всего сказанного относительно 2.6 прошу не пинать -
сам не проверял.
О чем базар?
Framebuffer - это такая классная штука, которая позволяет нам в
текстовом режиме увидеть больше символов чем 80x25, да еще посмотреть
картинки и фильмы поверх текста - виндузятники просто помирают от
зависти. В дословном переводе означает "кадровый буфер". Когда мы
включаем свой компьютер, мы в большинстве своем видим при загрузке как
lilo обращается через BIOS к нашей видюхе, а затем и ядро (уже
напрямую) выдает на консоль все в том же режиме 80х25. Возникает
вопрос - почему же мы владельцы наикрутейших видеокарт с поддержкой
vesa 2.0 (с s3tri64v2) и vesa 3.0 (начиная вроде с ривы) должны
пользоваться этим наследием доисторических времен, когда компьютеры
были большими а программы - маленькими?
Первым делом, первым делом - самолеты...
Наипростейшим решением узнать поддерживает ли ваша карта vesa >=2.0
было бы написать простенькую программку, которая загружается с дискеты
и инициализирует vesa, считывая при этом инфу... Но некоторым кажется
проще найти какой-нибудь виндозный софт типа sandra-soft- че-то-там
или AIDA32... На самом деле это уже ваши проблемы. Могу только
заверить, что если у вас agp-карта то она vesa 2.0 точно поддерживает.
Так вот о чем это я...
Заходим в консоли под root'ом в /usr/src/linux
пишем make menuconfig
ставим галку
"Code maturity level options>Prompt for development and/or incomplete
code/drivers"
далее идем в
"Console drivers>Frame-buffer support"
и включаем vesafb (у кого карта nvidia - включите rivafb - о нем тоже пойдет речь)
все это компилим.
Дальше смотрим в /usr/src/linux/Documentation/fb/vesafb.txt
И что же мы видим?
Это список нужных нам режимов. Т.к. vesa 2.0 не поддерживает смену
частоты развертки все режимы на частоте 60Hz... В следующей версии
этой статьи будет как этот досадный факт исправить Открываем
/etc/lilo.conf (если у вас в качестве загрузщика lilo) и
добавляем(!!!) вместе с новым ядром строчку типа vga=... вы думаете
это число из таблицы? А нифига - берите калькулятор и пересчитывайте
все в десятичную систему счисления. Именно добавляем а не исправляем.
Не спрашивайте почему.
image = /boot/vmlinuz
root = /dev/hda2
label = Linux-fb
read-only
vga=[режим]
После этого пишем lilo и reboot.
После перезагрузки вы должны увидеть мир линукс другими глазами.
Если вывалилось сообщение типа incorrect vga mode press space or enter
и т.д то значит на вашей карточке vesafb работать не будет как не
старайся. Все вопросы к Gerd Knorr <kraxel@goldbach.in-berlin.de>
Это не баг - это фича
Дополнительно можно проставить параметры модулю vesafb написав в
lilo.conf
append=vesapt[,opt1[,opt2...]]
* ypan - скроллинг работает быстрее за счет того что экран не
перерисовывается, а просто изменяется адрес окна в памяти.
* ywrap - тоже самое, только уже при достижении конца памяти
указатель перемещается в начало. Быстрее, чем ypan
* redraw - самый медленный вариант - перерисовка
* vgapal и pmipal - при изменении палитры использовать либо
стандартные регистры либо через защищенный режим.
* mtrr - включить использование MemoryTypeRangeRegisters - в кратце
это должно ускорить работу. (только на PII и выше)
Для самых смелых
А теперь поговорим о счастливых (или несчастных) владельцах видеокарт
от nVIDIA.
Спешл для вас есть модуль rivafb, который мы и попытаемся использовать
по-назначению.
Сразу оговорюсь - в X Window вам придется пожертвовать деревами от
nvidia(т.е. и ускорением GLX) и поставить nv, иначе все что вы
добъетесь - повесившаяся консоль и даже SysRq иногда не спасает.
Для нормальной настройки вам еще понадобится пакет fbset.
По умолчанию при загрузке модуля rivafb инициализируется режим
640x480/8-60Hz Это естественно нас не устраивает и тогда мы при помощи
пакета fbset это исправим. Если Вы скомпилили rivafb как модуль, то
потрудитесь прописать его загрузку где-нить в одном из скриптов в
/etc/rc.d, который исполняется как можно раньше.
Например у меня это /etc/rc.d/rc.sysinit
modprobe rivafb
где-то там можно еще и прописать строку
fbset -a -x ....
Не буду перечислять параметры fbset - это не входит в цели данного
документа так что RTFM.
Вместо этого опишу файл /etc/fb.modes. В нем находится самое
интересное - различные разрешения экрана для fbset.
Чтобы добавить свое любимое разрешение из X достаточно запустить под
ним xvidtune и нажать кнопку show. Мы получим т.н. Modeline, который
нам теперь предстоит преоброзовать в формат понятный fbset.
Например у меня.
Получаем описание режима и сохраняем его где-нибудь в /etc/fb.modes
под другим именем. Глубину цвета указываем в строчке geometry в
качестве последнего параметра. Идеальный вариант - 15 бит/пиксель
Все теперь прописываем fbset в скриптах с названием этого режима в
качестве параметра.
fbset -x -a 1024x768-70.
Если вы не сделали такой же ошибки как и я и не стали компилировать
rivafb как модуль, а встроили его в ядро то можно забить на fbset и
обратиться к /etc/lilo.conf
теперь мы поимели консоль с нужной нам частотой развертки, но это еще
не все. Теперь мы можем запускать mplayer -vo fbdev. Это так к
слову... Работает все значительно быстрее чем с vesafb.
Сыроедам
Чтобы не пользовать fbset или есть резон использовать rivafb как
модуль или просто ради извращенного интереса то можно прописать нужный
режим в исходниках модуля. kernel-2.4.xx
/usr/src/linux-2.4.xx/drivers/video/riva/fbdev.c: ищем такие строки:
Некоторые уточнения.
* Параметр video ядра (который мы указывали в lilo.conf)
используется для задания драйвера консоли и его параметров (в
нашем случае это rivafb или vesa). Т.е. Если у вас одновременно
встроен в ядро несколько драйверов, то выбирается конкретный
именно здесь. Это не относится к варианту, когда у вас драйвер
скомпилен как модуль (в этом случае передача параметров не
происходит).
* В данном документе не учитываются особенности некоторых
дистрибутивов (во многих уже включен по умолчанию vesafb)
Приложение 2: Конвертирование таймингов modeline в тайминги фрэйм-буфера
Converting XFree86 timing values info frame buffer device timings
---------------------------------------------------------------------
An XFree86 mode line consists of the following fields:
"800x600" 50 800 856 976 1040 600 637 643 666
< name > DCF HR SH1 SH2 HFL VR SV1 SV2 VFL
The frame buffer device uses the following fields:
- pixclock: pixel clock in ps (pico seconds)
- left_margin: time from sync to picture
- right_margin: time from picture to sync
- upper_margin: time from sync to picture
- lower_margin: time from picture to sync
- hsync_len: length of horizontal sync
- vsync_len: length of vertical sync
1) Pixelclock:
xfree: in MHz
fb: in picoseconds (ps)