Сразу оговорюсь, что не буду писать о всех плюсах и минусах использования framebuffer. Только о нескольких. Просто при редактировании программ, конфигов, отладке и т.п. для меня самый главный плюс, который перевешивает все - это большой размер консоли (например, мой любимый: 100x37). Но, к сожалению, за удобство приходится платить. В принципе, минусов при использовании rivafb всего несколько.
Использовать 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".
Наконец, специально для тех, кто будет использовать rivafb как модуль. Вышеуказанная строка append="..." в lilo.conf уже не работает, приходится действовать в лоб, а именно - перед сборкой ядра и после наложения необходимых патчей подредактировать один файл в исходниках ядра (в случае kernel-2.6.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 };
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.6 русские шрифты приходится загружать на каждую консоль отдельно, т.е. говорить setfonts Cyr_a8x16 (или koi8u_8x16), например. Еще не разобрался, почему так. Если кто знает, напишите пару строк, буду очень благодарен. Пока просто вбил в файл .bash_login строчку setfonts "нужный шрифт".
И еще один момент. Касательно ядер 2.6. - Добавьте в файл /etc/X11/XF86Config строчку Option "UseFBDev" "true" (в Section "Device", сразу после строчки Driver "nv"). Иначе при выходе из иксов получите всякий мусор на экране. (К сожалению, такой фокус у меня проходил только на TNT2, а с GeForcaми - все равно мусор..., что ж... будем надеяться, что скоро заработает.:))
(mulder)