Ключевые слова:linux, framebuffer, xfree86, video, driver, console, (найти похожие документы)
From: alex k <[email protected]>
Newsgroups: forum.opennet.ru
Date: Mon, 17 Jun 2003 13:01:37 +0000 (UTC)
Subject: Настройка фреймбуфера для видеокарты NVIDIA
Оригинал: http://kmxb.narod.ru/rivafb1.html
Настройка фреймбуфера для видеокарты NVIDIA
немного введения
Сразу оговорюсь, что не буду писать о всех плюсах и минусах
использования framebuffer. Только о нескольких. Просто при
редактировании программ, конфигов, отладке и т.п. для меня самый
главный плюс, который перевешивает все - это большой размер консоли
(например: 100x37). Но, к сожалению, за удобство приходится платить. В
принципе, минусов при использовании rivafb всего несколько.
1. Вывод на экран существенно замедляется, но нам ведь не в игрушки
играть :), кроме того видео смотреть можно безо всяких тормозов.
2. Пока невозможно использовать совместно rivafb и nvidia drivers для
X - либо наглухо виснет, либо пропадает изображение. Не знаю как
сейчас обстоят дела, уже год как не проверял, но, судя по крикам
из форумов - все без изменений. Так что приходится выбирать - либо
rivafb в консоли, либо nvidia в иксах.
3. В ядрах 2.4 все работает на ок. В ветке 2.5 не так давно
заработало тоже, однако есть небольшие проблемы с кириллицей.
Вот, кажется, и все.
теперь, собственно, настройка.
Использовать framebuffer можно либо встроенным в ядро, либо
подгружая как модуль. Если включаете в ядро, то для достижения
необходимого разрешения и частоты экрана достаточно добавить в
lilo.conf строчку типа append="video:rivafb:..." например вот так:
# Linux bootable partition config begins
image = /boot/vmlinuz
append="video=rivafb:xres:800,yres:600,pixclock:17761,
left_margin:152,right_margin:32,upper_margin:27,lower_margin:1,
hsync_len:64,vsync_len:3,bits_per_pixel:32"
root = /dev/hda2
label = Linux>
read-only
# Linux bootable partition config ends
Сразу оговорюсь, что вышеописанные значения расчитаны для режима
800x600, 85Гц и 32bit, проверены на видеокартах GeForce256, TNT2,
GeForce2 MX400 (GeForce4 - пока не поддерживается, во всяком случае -
у меня глючит). Рассчитать режимы каждый сам сможет под свои
разрешение и частоту, внимательно прочитав framebuffer.txt. Чтоб не
томить - вот выдержка из данного документа:
6. 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)
pixclock = 1000000 / DCF
2) horizontal timings:
left_margin = HFL - SH2
right_margin = SH1 - HR
hsync_len = SH2 - SH1
3) vertical timings:
upper_margin = VFL - SV2
lower_margin = SV1 - VR
vsync_len = SV2 - SV1
Good examples for VESA timings can be found in the XFree86 source tree,
under "xc/programs/Xserver/hw/xfree86/doc/modeDB.txt".
Если файла modeDB.txt у вас под рукой не найдется, можно заглянуть
в /etc/fb.modes, но если и там нет нужного вам режима, можно еще
сделать так: временно подредактировать XF86Config, чтобы в X получить
нужный вам режим; потом запускаете xvidinfo, и записываете текущие
значения HFL, HR, SH1 и т.д.; потом вычисляете... потом подставляете.
Еще есть специальные программы-калькуляторы, но я ими не пользовался.
Выбор за вами.
Наконец, специально для тех, кто будет использовать rivafb как
модуль. Вышеуказанная строка append="..." в lilo.conf уже не работает,
приходится действовать в лоб, а именно - перед сборкой ядра и после
наложения необходимых патчей подредактировать один файл в исходниках
ядра (в случае kernel-2.5.xx два файла):
1. kernel-2.4.xx
/usr/src/linux-2.4.xx/drivers/video/riva/fbdev.c
ищем такие строки:
static struct fb_var_screeninfo rivafb_default_var = {
xres: 640,
yres: 480,
xres_virtual: 640,
yres_virtual: 480,
xoffset: 0,
yoffset: 0,
bits_per_pixel: 8,
grayscale: 0,
red: {0, 6, 0},
green: {0, 6, 0},
blue: {0, 6, 0},
transp: {0, 0, 0},
nonstd: 0,
activate: 0,
height: -1,
width: -1,
accel_flags: 0,
pixclock: 39721,
left_margin: 40,
right_margin: 24,
upper_margin: 32,
lower_margin: 11,
hsync_len: 96,
vsync_len: 2,
sync: 0,
vmode: FB_VMODE_NONINTERLACED
};
и меняем значения переменных на нужные:
static struct fb_var_screeninfo rivafb_default_var = {
xres: 800,
yres: 600,
xres_virtual: 800,
yres_virtual: 600,
xoffset: 0,
yoffset: 0,
bits_per_pixel: 32,
grayscale: 0,
red: {0, 6, 0},
green: {0, 6, 0},
blue: {0, 6, 0},
transp: {0, 0, 0},
nonstd: 0,
activate: 0,
height: -1,
width: -1,
accel_flags: 0,
pixclock: 17761,
left_margin: 152,
right_margin: 32,
upper_margin: 27,
lower_margin: 1,
hsync_len: 64,
vsync_len: 3,
sync: 0,
vmode: FB_VMODE_NONINTERLACED
};
2. в kernel 2.5.xx аналогично правим этот же и еще один файл:
/usr/src/linux-2.5.xx/drivers/video/vfb.c
static struct fb_var_screeninfo vfb_default __initdata = {
.xres = 800,
.yres = 600,
.xres_virtual = 800,
.yres_virtual = 600,
.bits_per_pixel = 32,
.red = { 0, 8, 0 },
.green = { 0, 8, 0 },
.blue = { 0, 8, 0 },
.activate = FB_ACTIVATE_TEST,
.height = -1,
.width = -1,
.pixclock = 17761,
.left_margin = 152,
.right_margin = 32,
.upper_margin = 27,
.lower_margin = 1,
.hsync_len = 64,
.vsync_len = 3,
.vmode = FB_VMODE_NONINTERLACED,
};
Осталось только откомпилировать ядро, не забыть записать в
/etc/rc.modules:
modprobe rivafb
modprobe fbcon
и перезагрузиться.
Успехов!
Еще забыл сказать, что в случае ядра 2.5 русские шрифты приходится
загружать на каждую консоль отдельно, т.е. говорить setfonts
Cyr_a8x16, например. Еще не разобрался, почему так. Если кто знает,
напишите пару строк, буду очень благодарен.
last update 2003.06.17