Настройка фреймбуфера для видеокарты NVIDIA

немного введения

     Сразу оговорюсь, что не буду писать о всех плюсах и минусах использования framebuffer. Только о нескольких. Просто при редактировании программ, конфигов, отладке и т.п. для меня самый главный плюс, который перевешивает все - это большой размер консоли (например, мой любимый: 100x37). Но, к сожалению, за удобство приходится платить. В принципе, минусов при использовании rivafb всего несколько.

  1. Вывод на экран существенно замедляется, но нам ведь не в игрушки играть :), кроме того видео смотреть можно безо всяких тормозов.
  2. Пока невозможно использовать совместно rivafb и nvidia drivers для X - либо наглухо виснет, либо пропадает изображение. Не знаю как сейчас обстоят дела, уже года два как не проверял, но, судя по крикам из форумов - все без изменений. Так что приходится выбирать - либо rivafb в консоли, либо nvidia в иксах.
  3. В ядрах 2.4 все работает на ок. В ветке 2.6 - не совсем все гладко, к тому же есть небольшие проблемы с кириллицей.
Вот, кажется, и все.

теперь, собственно, настройка.

     Использовать 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 и т.д.; потом вычисляете... потом подставляете. Еще есть специальные программы-калькуляторы, например - gtf (для нашего случая можно выполнить такую команду: gtf 800 600 85 -f), но я ими не пользовался. Да и цифры выдают почему-то немного другие. Выбор за вами.

     Наконец, специально для тех, кто будет использовать 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
};

2. в kernel 2.6.xx аналогично правим этот же и еще один файл:
/usr/src/linux-2.6.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.6 русские шрифты приходится загружать на каждую консоль отдельно, т.е. говорить setfonts Cyr_a8x16 (или koi8u_8x16), например. Еще не разобрался, почему так. Если кто знает, напишите пару строк, буду очень благодарен. Пока просто вбил в файл .bash_login строчку setfonts "нужный шрифт".

    И еще один момент. Касательно ядер 2.6. - Добавьте в файл /etc/X11/XF86Config строчку Option "UseFBDev" "true" (в Section "Device", сразу после строчки Driver "nv"). Иначе при выходе из иксов получите всякий мусор на экране. (К сожалению, такой фокус у меня проходил только на TNT2, а с GeForcaми - все равно мусор..., что ж... будем надеяться, что скоро заработает.:))

(mulder)
last update 2004.03.11

в начало


Hosted by uCoz