Последнее изменение файла: 2003.03.17
Скопировано с www.bog.pp.ru: 2003.03.17

Linux и NVIDIA: драйверы, TV-Out, датчики, TV-In, разгон.

В статье для счастливых пользователей Linux и GPU NVIDIA приводится разница между массовыми моделями GPU от NVIDIA, описываются преимущества закрытых драйверов nvidia от входящих в поставку X Window System драйверов nv, приводятся процедуры установки версий Release 40 и Release 25, описываются параметры модуля ядра, опции драйвера nvidia для X, опции библиотеки OpenGL NVIDIA, различные способы использования TV-Out (телевизор вместо монитора; запуск второго X сервера; программа nvtv; TwinView), разгон видеокарты с помощью nvclock и как использовать датчики на видеоплате с помощью rivatv.

NVIDIA versus ATI

Почему GPU от NVIDIA? Потому что осталось всего 2 компании, производящих GPU потребительского уровня (т.е. дешевые) с нормальной скоростью 3D операций. От графконтроллеров ATI я отказался после 2 лет бесплодных ожиданий работоспособного драйвера OpenGL (после чего фирма мило заявила, что поддерживать такие старые чипы она не будет и скоро выпустит драйверы для новых графконтроллеров, подождите немного ;).

Модели

Разницу между сериями GPU от NVIDIA легче всего узнать на ее российском официальном сайте

На описании и тестировании конкретных моделей видеоплат специализируется сайт IXBT.

У меня под рукой оказалась ASUS V7700PRO/T/32M/PAL/R, о которой можно рассказать следующее (MB на чипсете Intel 845E, P4):

Драйверы для NVIDIA GPU в Linux

Входящий в состав XFree86 4.2.0 (Red Hat Linux 8.0, штатное ядро 2.4.18-14) драйвер nv работает с GeForce как с обычным SVGA, т.е. нет поддержки 3D и вывода видео. К тому же у него проблемы с разрешением 1600x1200 и выше.

Компания NVIDIA выпускает собственный драйвер nvidia (XFree86 4.0.1 и выше), поддерживающий аппаратно OpenGL, XVideo и прочие полезные возможности. К сожалению, он поставляется только в двоичном виде, что сильно осложняет его использование. Драйвер поддерживает любую видеокарту (GPU) или интегрированное графическое ядро (IGP), выпускаемые фирмой NVIDIA, и обеспечивает ускорение 2D операций и OpenGL.

Драйвер состоит из 2 частей: модуль ядра NVIDIA_kernel (NVdriver или nvidia.o в новой версии; больше 1 МБ закрытого кода работает в режиме ядра!) и пакет NVIDIA_GLX (драйвер XFree86 и библиотеки OpenGL). Версии пакетов должны совпадать. Модуль ядра жестко привязан к версии ядра Linux и д.б. переустановлен (пересобран) при смене или сборке ядра. NVIDIA поставляет пакеты в форме .rpm, .srpm и .tar.gz. Я рекомендую брать NVIDIA_kernel в виде .srpm и пересобирать его самостоятельно непосредственно перед установкой, а NVIDIA_GLX брать в виде готового RPM (все равно SRPM и .tar.gz не содержат ни одного исходного текста). Предполагается, что загрузка системы происходит в текстовом режиме (id:3:initdefault: в /etc/inittab), иначе у вас будут большие проблемы при неудачной установке. Перед установкой новой версии (или при смене ядра) надо самостоятельно удалить оба пакета (-U может сработать неправильно).

Предварительная подготовка для построения своего ядра: имеется пакет kernel-source-2.4.18-14, для которого было сделано

  1. cd /usr/src/linux-2.4
  2. make distclean (может достаточно make mrproper?)
  3. make menuconfig (сразу выйти с сохранением)
  4. make dep
  5. make bzImage (warning: kernel is too big for standalone boot from floppy, но я и не собираюсь его устанавливать, но если ядро не собрать, то модуль потом не загружается)
  6. make modules (не компилируется drivers/addon/cipe, убрал ее и поменял drivers/addon/Makefile)

Установка версии 1.0-4191 (release 40)

Версия 1.0-4191 (release 40) имеет множество улучшений по сравнению с предыдущей версией: OpenGL 1.4 вместо 1.3, GLX 1.3 вместо 1.2, поддержка AGP 3.0 (8x), вместо XFree86 XAA используется собственная архитектура акселератора 2D, поддержка нескольких отдельных экранов на GPU с TwinView (GeForce2 MX и любой GeForce4), перестал ронять приложения с плавающей арифметикой. Однако отзывы на нее резко отрицательные. Одновременно с небольшим ускорением 3D операций (glxgears на 15%) резко замедлились 2D операции. Их можно несколько ускорить, если установить одноцветный фон в Gnome и отключить в Nautilus опцию "nautilus draw icons on the desktop option", однако замедление относительно предыдущей версии остается двухкратным. Рекомендуется также запустить какое-нибудь приложение libGL (например, glxinfo ;). При попытке включить акселератор 2D (Option "RenderAccel" в /etc/X11/XF86Config) X сервер зацикливается через несколько минут работы.

Процедура установки аналогична предыдущей версии, только модуль ядра переименован из NVdriver в nvidia.o

Установка 1.0-2960 и 1.0-3123 (release 25)

В версии 1.0-3123 (release 25) добавлена поддержка GeForce4 MX, GeForce4 Ti 4800 SE и GeForce4 4200.

Процедура установки

Параметры модуля ядра

modinfo NVdriver показывает, что при загрузке модуля можно задавать следующие параметры (я привожу не весь список, описание в os-registry.c):

Опции раздела Device XF86Config

Опции задаются в секции Device файла /etc/X11/XF86Config (или /etc/X11/XF86Config-4 для старых дистрибутивов), я привожу только опции, специфические для драйвера nvidia (и то не все - например, я не использую лаптопов и нотебуков; см. также XF86Config(5x)):

Опции OpenGL

Опции OpenGL задаются установкой переменных окружения перед запуском прикладной приграммы

TV-out. Способ первый - без монитора

Простейший способ вывести изображение на телевизор - отключить монитор! При загрузке компьютера видеоплата обнаружив, что телевизор является единственным устройством, подключенным к ней, начинает выводить изображение (прямо с первого собщения BIOS) на TV-Out.

При подключении телевизора к компьютеру необходимо их предварительно обесточить (выдернуть вилки из розеток!) и вынуть антенный кабель (и не втыкать его обратно, пока не рассоедините телевизор и компьютер!).

Если вам достаточно для работы а/ц режима, то дальше можете не читать, все уже сделано. Для запуска X Window System на телевизоре необходимо дополнить файл /etc/X11/XF86Config (обязательно после стандартного Layout!)

Section "ServerLayout"
        Identifier      "LayoutTV"
        Screen          "ScreenTV"
        InputDevice     "Mouse0" "CorePointer"
        InputDevice     "Mouse1" "SendCoreEvents"
        InputDevice     "Keyboard0" "CoreKeyboard"
EndSection

# VendorName и ModelName подставляйте свои (ни на что не влияют)
Section "Monitor"
        Identifier      "MonitorTV"
        VendorName      "Philips"
        ModelName       "21PT166B/60"
        HorizSync       30.0 - 50.0
        VertRefresh     50.0 - 60.0
EndSection

# Device должен соответствовать Identifier в секции Device (описание см. выше)
Section "Screen"
        Identifier "ScreenTV"
        Device     "NVIDIA GeForce 2 GTS (generic)"
        Monitor    "MonitorTV"
        DefaultDepth    24
        SubSection "Display"
                Depth   24
# для телевизионного кодировщика Bt871, Connexant 25871, GeForce4 (?)
# (тип кодировщика можно узнать из файла /var/log/XFree86.0.log в строке "Detected TV Encoder")
# можно задать режим "1024x768"
                Modes   "800x600" "640x480"
        EndSubSection
# для адаптированных под Россию телевизоров именно PAL-B,
# хотя на моей плате задается джампером NTSC/PAL (на всякий случай ;)
        Option  "TVStandard" "PAL-B"
# "SVIDEO" или "COMPOSITE"
        Option  "TVOutFormat" "SVIDEO"
        Option  "ConnectedMonitor" "TV"
EndSection

Теперь можно запускать X и работать как на обычном мониторе, хотя и без удовольствия (фильмы смотрятся гораздо лучше, чем на мониторе):

startx -- -layout LayoutTv

TV-out. Способ второй - два X

Редактировать тексты, глядя на экран телевизора - невозможно, перезагружаться каждый раз, когда хочется посмотреть фильм - утомительно. Поэтому предлагается запустить два X сервера - каждый для своего устройства (напоминаю, что речь идет о GeForce 2, который не умеет выводить 2 независимых изображения). Конфигурация XF86Config совпадает с описанной в предыдущем разделе. Первый X сервер запускается как обычно (я запускаю его командой startx). Второй X сервер запускается командой (используется ключ -ac, потому что я не знаю другого способа снять защиту при такой форме запуска)

X -ac -layout LayoutTV :1

Теперь у нас "крутятся" сразу два X сервера с общей клавиатурой и мышкой. Переключения между ними производятся по нажатию Ctrl-Alt-F7 и Ctrl-Alt-F8 (предполагается наличие 6 виртуальных а/ц консолей, иначе клавиши будут другими). Закрывается сервер обычным сочетанием Ctrl-Alt-Backspace, главное не перепутать, какому серверу в момент нажатия принадлежит клавиатура.

Сразу после запуска "текущим" является второй сервер - ему принадлежит клавиатура, на его экран (телевизор) выводится изображение. Переключаемся обратно на первый сервер (Ctrl-Alt-F7) и запускаем, например, mplayer

DISPLAY=:1 mplayer -vo xv dvd://1

Пока он раскручивает диск, переключаемся на второй сервер (Ctrl-Alt-F8). По окончанию просмотра втрой сервер останавливать необязательно - он никому не мешает.

TV-out. Способ третий - nvtv

Преодолеть оставшееся чувство неудовлетворения поможет программа nvtv. Она позволяет гибко настраивать параметры вывода (вплоть до прямого доступа ко всем регистрам телевизионных кодировщиков и CRTC NVIDIA!) и выводить одновременно на монитор и телевизор для видеоплат без TwinView (к сожалению, одинаковое изображение). Не работает с GeForce3 и выше. Включена в состав xine.

Установка nvtv 0.4.3:

Для доступа к регистрам программе nvtv требуются либо права root (их можно обеспечить с помощью механизма suid или вспомогательного демона nvtvd), либо работающий драйвер NVIDIA (обеспечивается совместимость с версиями не старше 3123). Есть слухи, что nvtv работает с GeForce4, если тот проинициализирован фирменным драйвером. Исходный текст программы доступа к внутренним структурам драйвера NVIDIA (через /dev/nvidia*) представляет самостоятельный интерес. При использовании драйвер NVIDIA программу nvtv необходимо запускать после запуска X с ключом -N.

При запуске в графическом режиме nvtv предоставляет обширные (я бы даже сказал, что чрезмерно обширные) возможности по настройке формата вывода. Я рекомендую подсмотреть список режимов (закладка Mode, ключи -r и -s), доступных вашему ТВ кодировщику, а в дальнейшем использовать текстовый режим. Список режимов зависит от режима цветности, например, мой chrontel 7007 для SECAM выдает пустой список режимов. Включение вывода на телевизор одновремено с выводом на монитор и переход к разрешению 768x576:

nvtv -N -X -t -r 768,576 -s Large -S PAL -C SVHS

После этого изображение будет выводиться одновременно на телевизор и монитор. Монитор может не поддерживать выбранное разрешение и режим работы. В этом случае попробуйте другой режим. Например, мой монитор не любит режимы 800x600xLarge (обрезает картинку), 768x576xSmall (срывается кадр), 640x480xLarge (рекомендуемый для NTSC DVD 4:3 - мельтешение на экране, Small - нормально). Некоторые режимы невозможно смотреть ни на мониторе, ни на телевизоре (для меня такой режим - 800x450). Для нестандартных разрешений рекомендуется завести соответствующий Modeline в секции Monitor (основной монитор, не MonitorTV) и включить его в список Modes соответствующей подсекции Display, например (nvtv поменяет частоты синхронизации при использовании ключа -t)

  Modeline  "pal"  50.00  768 832 856 1000  576 590 595 630  -hsync -vsync
...
  Modes "1600x1200" "pal"

Виртуальное разрешение останется прежним (у меня 1600x1200), так что окно с фильмом приходится искать на этом бескрайнем поле и центрировать, а также бороться с излишним рвением некоторых программ к масштабированию и обеспечению "правильного" соотношения сторон (mplayer -noaspect). Надеюсь, что это умение придет к вам с опытом, описать это невозможно. Если ваш телевизор имеет возможность для просмотра широкоэкранных фильмов, то лучше использовать ее и выводить в режиме 4:3, чем использовать дискретное масштабирование плейера и режим вывода типа 800x450.

Выключение вывода на телевизор и возвращение исходного разрешения экрана:

nvtv -N -m -X -r 1600,1200

nvtv позволяет задавать в текстовом режиме множество параметров с помощью ключа --set (полный список и интервал значений выдается по nvtv -h, используемый ТВ кодировщик может поддерживать не все параметры):

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

TV-out. Способ четвертый - TwinView

GPU GeForce2 MX и GeForce4 имеют два CRTC и могут выводить 2 независимых изображения (с различным разрешением и частотой) на монитор и телевизор. Настройки задаются с помощью TwinView и не должны вызвать затруднений в простом случае (один монитор и один телевизор).

DPMS не работает на втором мониторе (ТВ) - может это и правильно?.

nvclock

Утилита nvclock позволяет изменить частоту работы GPU и памяти.

Установка:

Утилита не сохраняет измененные значения частот в NVRAM, так что ее необходимо вызывать каждый раз после запуска X Windows (например, поместить в .xinitrc). Если запускать ее до X Windows, то требуются права root, а модуль nvidia может сбросить изменения. Ключи запуска:

Не все значения частоты памяти возможны, например у меня они устанавливаются с шагом 7 МГц (утилита сообщает реально установленную частоту). Утилита имеет свои представления о максимально возможных частотах. Их можно преодолеть с помощью ключа -f, но я не советую. Рекомендуется постепенно повышать частоту GPU (пока компьютер не зависнет ;), затем перезагрузиться и постепенно повышать частоту памяти (пока опять не зависнет ;). Не рекомендуется работать постоянно на максимально возможной частоте - это сильно сокращает время жизни видеоплаты и может привести к зависаниям при повышении температуры за бортом в самый неподходящий момент.

У меня получилось поднять частоты с 200/401 до 228/451 МГц (при этом используются ключи -n 228 -m 449). glxgears ускорилась с 1225 fps (87 fps при 1600x1200) до 1425 fps (101 fps при 1600x1200). x11perf (-all требует 3 часов работы, запускать на только что загруженном компьютере, необходимо выключить screensaver, отключить запуск updatedb и прочих программ, освободить левый верхний угол 800x800) отчетливо показывает какие операции выполняются CPU (не ускоряются совсем), GPU (ускоряются в 228/200 раза). Некоторые операции ведут себя странно. Например, putimagexy и getimagexy временно блокируют компьютер.

Сенсоры и TV-In

Для видеокарт с аппаратным контролем возможно извлечь значения температуры и частоты вращения вентилятора с помощью пакета rivatv. Основное назначение пакета - видеозахват, но в этом качестве я его не пробовал. (о видео захвате с помощью AverMedia TVPhone98 или аналогичных карт на Bt848/878 смотрите мою статью).

Установка:

Параметры модуля rivatv

При запуске sensors-detect ошибочно ссылается на пакет rivatv как i2c-riva (в исходных текстах действительно есть i2c-riva.c, но при сборке он включается в rivatv.o)

  Use driver `i2c-riva' for device 01:00.0: GeForce2 GTS
  Load `i2c-riva' (say NO if built into your kernel)? (YES/no)

Далее следуете всем указаниям, которые выдает sensors-detect. Пример моей борьбы (борьбы, потому что поддержка I2C реализована в Linux отвратительно) с датчиками смотрите в описании установки Red Hat 8.0.

Если все сделано правильно, то программа sensors среди прочей информации выдает (устройства с 1-50 по 1-57 - это нераспознанная информация: то ли настройка самой видеокарты, то ли настройка внешнего чипа TV-Out Chrontel 7007)

eeprom-i2c-1-50
Adapter: NVIDIA display adapter bus 0
Algorithm: Bit-shift algorithm
...
eeprom-i2c-1-57
Adapter: NVIDIA display adapter bus 0
Algorithm: Bit-shift algorithm

w83781d-i2c-0-2d
Adapter: NVIDIA display adapter bus 1
Algorithm: Bit-shift algorithm
VCore 1:   +2.04 V  (min =  +0.00 V, max =  +0.00 V)       ALARM
VCore 2:   +1.52 V  (min =  +0.00 V, max =  +0.00 V)       ALARM
+3.3V:     +3.34 V  (min =  +2.97 V, max =  +3.63 V)
+5V:       +4.89 V  (min =  +4.50 V, max =  +5.48 V)
+12V:     +11.97 V  (min = +10.79 V, max = +13.11 V)
-12V:      -0.14 V  (min = -13.18 V, max = -10.78 V)       ALARM
-5V:       -0.06 V  (min =  -5.48 V, max =  -4.50 V)       ALARM
fan1:     7670 RPM  (min = 3000 RPM, div = 2)
fan2:        0 RPM  (min = 3000 RPM, div = 2)              ALARM
fan3:        0 RPM  (min = 3000 RPM, div = 2)              ALARM
temp1:       +53°C  (limit =  +60°C, hysteresis =  +50°C)
temp2:     +53.0°C  (limit =  +60°C, hysteresis =  +50°C)
temp3:     +42.5°C  (limit =  +60°C, hysteresis =  +50°C)
vid:      +0.000 V

Ссылки


Copyright © 1996-2003 Sergey E. Bogomolov; www.bog.pp.ru