Показаны сообщения с ярлыком X-Window. Показать все сообщения
Показаны сообщения с ярлыком X-Window. Показать все сообщения

воскресенье, 29 сентября 2019 г.

Установка и настройка драйверов nvidia для X-сервера

Заменил в компьютере одну подержанную устаревшую материнскую плату на другую подержанную, устаревшую чуть менее. На прежней был встроенный видеоконтроллер от Intel, на новой - от Nvidia. Не задумываясь поставил свободный драйвер nouveau, однако столкнулся с проблемами: 1. изображение на экране изредка моргало, как будто кто-то периодически вставляет 25 кадр, 2. компьютер спонтанно зависал, предварительно заливая экран белым цветом в чёрные горизонтальные прерывистые полоски. Стал грешить на видеоконтроллер и его драйвер. Пытался заставить работать драйвер nvidia где-то с полчаса. Попытки увенчались успехом. Пока помнил последовательность настройки, записал всё в блокнот. Теперь из блокнота выбрасываю записи в блог, чтобы в следующий раз не ходить по всем граблям снова.

Для начала узнаем, видеконтроллер какого из производителей установлен в системе:
$ lspci | fgrep VGA
00:0d.0 VGA compatible controller: NVIDIA Corporation C61 [GeForce 7025 / nForce 630a] (rev a2)
В нашем случае это встроенный видеоконтроллер NVidia. Чтобы определить, какой драйвер следует использовать с этим видеоконтроллером, установим утилиту nvidia-detect и запустим её:
# apt-get install nvidia-detect
# nvidia-detect
Утилита должна сообщить имя пакета с драйвером видеоконтроллера. В моём случае это был пакет nvidia-legacy-304xx-driver. Установим этот пакет:
# apt-get install --install-recommends nvidia-legacy-304xx-driver
После установки пакета с драйвером будет собран модуль ядра, который нужно подгрузить. Сделать это можно при помощи следующей команды:
# modprobe nvidia-legacy-304xx
Вписываем модуль ядра nvidia-legacy-304xx в файл /etc/modules, чтобы при перезагрузке системы или включении компьютера этот модуль загружался автоматически.

Также нужно установить поддержку этого драйвера со стороны X-сервера. Для этого ставим пакет с именем xserver-xorg-video-nvidia-legacy-304xx:
# apt-get install xserver-xorg-video-nvidia-legacy-304xx
Свободный драйвер nouveau в X-сервере имеет более высокий приоритет, чем фирменный драйвер от NVidia. Поэтому, чтобы X-сервер использовал именно фирменный драйвер, нужно удалить из системы пакет, отвечающий за поддержку nouveau со стороны X-сервера:
# apt-get remove xserver-xorg-video-nouveau
Осталось перезапустить дисплейный менеджер, чтобы он запустил X-сервер, а X-сервер начал использовать новые драйверы. Я пользуюсь дисплейным менеджером lightdm, поэтому в моём случае это можно сделать следующими командами:
# systemctl stop lightdm
# systemctl start lightdm
По окончании настройки пакет nvidia-detect можно удалить, т.к. вероятность, что он вновь понадобится, довольно мала.
# apt-get purge nvidia-detect
P.S. Кстати, замена драйвера помогла решить проблему.

воскресенье, 13 января 2013 г.

Nouveau + Xrandr: Монитор и телевизор

В прошлом я уже описывал два способа одновременного использования монитора и телевизора на одной видеокарте: Xinerama: монитор и телевизор и TwinView: монитор и телевизор.

На этот раз мне, по некоторым причинам, понадобилось поставить свободный драйвер Nouveau. Сам по себе он ставится довольно просто, а вот с настройкой одновременного использования монитора и телевизора пришлось попотеть.

Установка nouveau

Итак, сначала опишу процедуру замены проприетарного драйвера nvidia на свободный nouveau. Для этого я воспользовался статьёй Переход на драйвер nouveau с проприетарных драйверов nvidia.

У меня установлен Wheezy, поэтому я сразу установил драйвер (в ответ на что система сообщила, что у меня уже установлено всё необходимое):
# apt-get install libdrm-nouveau1a xserver-xorg-video-nouveau
Остановил LightDM из первой консоли:
# /etc/init.d/lightdm stop
Выгрузил модули nvidia и drm и загрузил модуль nouveau:
# rmmod nvidia
# rmmod drm
# modprobe nouveau
Удостоверился, что система не ругнулась в ответ на загрузку модуля nouveau:
# dmesg | tail
Сделал резервную копию файла конфигурации X-сервера:
# cp /etc/X11/xorg.conf /etc/X11/xorg.conf-nvidia-twinview
В исходном файле закомментировал секции Monitor и Screen, соответствующие телевизору, в секции ServerLayout оставил только один Screen, в секции Driver закомментировал использование TwinView.
Затем удалил пакет nvidia-glx:
# apt-get remove nvidia-glx
И поставил замену для него:
# apt-get install libgl1-mesa-dri libgl1-mesa-glx
Затем попробовал запустить LightDM и убедился, что монитор работает:
# /etc/init.d/lightdm start
Затем, удалил остатки проприетарного драйвера nvidia:
# apt-get remove nvidia-\*
Добавил модуль проприетарного драйвера в чёрный список, закомментировав строчку с nouveau и прописав строчку с nvidia в файле /etc/modprobe.d/nvidia-kernel-common.conf:
#blacklist nouveau
blacklist nvidia
И добавил модуль nouveau в автозагрузку:
# echo nouveau >> /etc/modules
Теперь настала пора самого сложного - настроить телевизор.

Настройка монитора и телевизора

В результате всех мытарств получился такой /etc/X11/xorg.conf:
Section "ServerFlags"
    Option "AutoAddDevices" "False"
    Option "AllowEmptyInput" "False"
    Option "DontZap" "False"
EndSection

Section "ServerLayout"
    Identifier     "X.org Configured"
    Screen      0  "Screen0" 0 0
    InputDevice    "Mouse0" "CorePointer"
    InputDevice    "Keyboard0" "CoreKeyboard"
EndSection

Section "Files"
    ModulePath   "/usr/lib/xorg/modules"
    FontPath     "/usr/share/fonts/X11/misc"
    FontPath     "/usr/share/fonts/X11/Type1"
    FontPath     "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType"
EndSection

Section "Module"
    Load  "dri"
    Load  "GLcore"
    Load  "glx"
    Load  "dbe"
    Load  "record"
    Load  "extmod"
    Load  "xtrap"
    Load  "Xrandr"
EndSection

Section "InputDevice"
    Identifier  "Keyboard0"
    Driver      "kbd"
    Option      "XkbRules" "xorg"
    Option      "XkbModel" "pc104"
    Option      "XkbLayout" "us,ru"
    Option      "XkbOptions" "grp:alt_shift_toggle"
    Option      "XkbVariant" ",winkeys"
    Option      "AutoRepeat" "250 30"
EndSection

Section "InputDevice"
    Identifier  "Mouse0"
    Driver      "mouse"
    Option      "Protocol" "auto"
    Option      "Device" "/dev/input/mice"
    Option      "ZAxisMapping" "4 5 6 7"
EndSection

Section "Monitor"
    DisplaySize  338 270 # mm
    Identifier   "VGA-1"
    VendorName   "LG"
    ModelName    "Flatron L1730S"
    HorizSync    30.0 - 80.2
    VertRefresh  56.0 - 75.0
    Option       "DPMS"
    # 1280x1024 @ 75.00 Hz (GTF) hsync: 80.17 kHz; pclk: 138.54 MHz
    Modeline "1280x1024_75.00"  138.54  1280 1368 1504 1728  1024 1025 1028 1069  -HSync +Vsync
    # 1024x768 @ 75.00 Hz (GTF) hsync: 60.15 kHz; pclk: 81.80 MHz
    Modeline "1024x768_75.00"  81.80  1024 1080 1192 1360  768 769 772 802  -HSync +Vsync
    # 800x600 @ 75.00 Hz (GTF) hsync: 47.02 kHz; pclk: 48.91 MHz
    Modeline "800x600_75.00"  48.91  800 840 920 1040  600 601 604 627  -HSync +Vsync
    # 640x480 @ 75.00 Hz (GTF) hsync: 37.65 kHz; pclk: 30.72 MHz
    Modeline "640x480_75.00"  30.72  640 664 728 816  480 481 484 502  -HSync +Vsync
    Option       "PreferredMode" "1280x1024_75.00"
EndSection

Section "Monitor"
    DisplaySize    450 350 # mm
    Identifier     "TV-1"
    VendorName     "LG"
    ModelName      "Flatron RT-21FA32X"
    HorizSync      15.625 - 29.7
    VertRefresh    50.0 - 50.0
    Option         "DPMS"
    # 720x576 @ 50.00 Hz (GTF) hsync: 29.65 kHz; pclk: 26.57 MHz
    Modeline "720x576_50.00"  26.57 720 736 808 896  576 577 580 593  -HSync +Vsync
    Option         "PreferredMode" "720x576_50.00"
    Option         "RightOf" "VGA-1"
EndSection

Section "Device"
    Identifier  "Card0"
    Driver      "nouveau"
    VendorName  "nVidia Corporation"
    BoardName   "NV43 [GeForce 6600]"
    BusID       "PCI:5:0:0"

    Option      "Monitor-VGA-1" "VGA-1"
    Option      "Monitor-TV-1" "TV-1"
EndSection

Section "Screen"
    Identifier "Screen0"
    Device     "Card0"
    Monitor    "VGA-1"
    DefaultDepth    24
    SubSection "Display"
        Depth     24
    EndSubSection
EndSection
На что следует обратить внимание?

Во-первых, на опции в секции Device, которые устанавливают соответствие между портами видеокарты и секциями мониторов в файле конфигурации. Порты, по крайней мере на моей видеокарте, имеют названия "VGA-1", "DVI-I-1" и "TV-1" (их названия можно узнать с помощью команды xrandr), поэтому в опциях они будут называться "Monitor-VGA-1", "Monitor-DVI-I-1" и "Monitor-TV-1". Названия же секций мониторов могут быть произвольными - я решил назвать их так же, как и порты.

Во-вторых, в секции, описывающей один из мониторов, нужно добавить опцию, указывающую его расположение относительно первого. В моём случае эта опция выглядит так:
Option         "RightOf" "VGA-1"
В-третьих, в секции Screen, описывающей единственный экран, не должно быть посторонних опций вроде ViewPort, Modes и Virtual. Если они указаны, Xrandr может проявить самостоятельность в выборе настроек видеорежимов, если ему что-то не понравится.

В-четвёртых, предпочитаемый видеорежим монитора можно выбрать с помощью опции PreferredMode. Единственный его недостаток заключается в том, что нельзя ещё дополнительно указать частоту кадровой развёртки. У меня Xrandr упорно выбирал наименьшую из возможных. Для того, чтобы заставить его использовать нужную частоту развёртки, пришлось описать каждый режим вручную в опциях Modeline. Список доступных режимов можно узнать с помощью команды xrandr. Строчки Modeline можно посчитать с помощью команды gtf.

В-пятых, опция Modeline может быть молча проигнорирована, если Xrandr решит, что такой режим не поддерживается монитором. Для того, чтобы убедить Xrandr всё-же установить запрошенный видеорежим, нужно ещё вручную задать допустимые пределы вертикальной и горизонтальной частот синхронизации. Их значения можно получить с помощью команды ddcprobe и перед внесением в файл конфигурации отредактировать так, чтобы они соответствовали Modeline'у.

Например, с помощью gtf я рассчитал Modeline для телевизора:
# 720x576 @ 50.00 Hz (GTF) hsync: 29.65 kHz; pclk: 26.57 MHz
Modeline "720x576_50.00"  26.57 720 736 808 896  576 577 580 593  -HSync +Vsync
Чтобы им можно было воспользоваться, нужно чтобы верхнее значение горизонтальной частоты синхронизации равнялось, а лучше - было чуть больше, чем указанное в Modeline (hsync: 29.65 kHz). Исходя из этого, я задрал верхнюю планку в настройке HorizSync:
HorizSync      15.625 - 29.7
Наконец, после прописывания этих настроек, Xrandr установил нужные мне видеорежимы. Нетребовательные люди могут остановиться на устраивающих их настройках, потому что Xrandr довольно хорошо (но не идеально) выбирает режимы сам.

Ещё один подводный камень возник с XFCE. У него есть собственное меню для настройки видеорежимов - "Дисплей" в "Диспетчере настроек". Чтобы настройки XFCE не сбивали то, что прописано в настройках X-сервера, нужно удалить из домашнего каталога файл ~/.config/xfce4/xfconf/xfce4-perchannel-xml/display.xml и больше не заходить в это меню, потому что при запуске этот файл создаётся снова.

И, наконец, завершающий штрих.

Настройка видеорежима в консоли

Драйвер nouveau располагает двумя мониторами с разными разрешениями. В режиме отображения консоли он показывает на обоих мониторах одно и то же изображение. Чтобы изображение целиком отображалось на обоих мониторах, он формирует картинку, размеры которой позволяют отобразить её целиком на мониторе с меньшим разрешением (на телевизоре). Соответственно, на мониторе с большим разрешением используется только прямоугольная область в верхнем левом углу, совпадающая по пиксельным размерам с разрешением второго монитора (телевизора).

Выглядит это не очень приятно, поэтому я настроил на обоих мониторах одинаковое разрешение, которое они оба могут отобразить: 640x480. При этом разрешении текст умещается в экран телевизора, и занимает 100% площади экрана как на мониторе, так и на телевизоре.

Добавим модуль в загрузочный образ системы. Для этого в файле /etc/initramfs-tools/modules добавим строчку с текстом "nouveau" и обновим загрузочный образ:
# update-initramfs -u -k all
Теперь добавим настройки видеорежимов к параметрам ядер Linux, загружаемых с помощью GRUB 2. Для этого откроем файл /etc/defaults/grub и добавим в опцию GRUB_CMDLINE_LINUX необходимые настройки. У меня в этой опции было пусто, поэтому она приняла следующий вид:
GRUB_CMDLINE_LINUX="video=VGA-1:640x480 video=TV-1:640x480"
Теперь сгенерируем новую конфигурацию GRUB 2:
# update-grub
И перезагрузим компьютер. Оба экрана будут использовать в режиме текстовой консоли разрешения 640x480, а в графическом режиме - настройки X-сервера.

Ссылки:
1. Переход на драйвер nouveau с проприетарных драйверов nvidia
2. Enabling Randr12 support in nouveau
3. Kernel Mode-setting
4. http://cgit.freedesktop.org/nouveau/linux-2.6/tree/Documentation/fb/modedb.txt
5. Проблема со шрифтами в консоли...
6. Оптимизация initramfs в Debian
7. Отключение режима обнаружения TV драйвером NOUVEAU
8. Gentoo: переходим на Grub2
9. Не работает OpenGL в Debian(Nouveau)

воскресенье, 15 июля 2012 г.

TwinView: монитор и телевизор

Почти ровно год назад я писал о настройке двухмониторной конфигурации X-сервера в заметке Xinerama: монитор и телевизор.

До недавних пор я был, в принципе, почти всем доволен. Меня лишь иногда беспокоило то, что при запуске из консоли некоторые программы ругались на отсутствие поддержки расширения XRandr. Это расширение конфликтует с конфигурацией Xinerama, и поэтому оно автоматически отключается. Многие программы, видимо, рассчитаны на работу именно с расширением XRandr, но не умеют работать с Xinerama. В чём заключалось это неумение - не понятно, всё работало нормально, за исключением этих последних китайских предупреждений.

В комментариях к моей предпоследней заметке "Настройка X-сервера" virens, автор блога Записки дебианщика, сказал, что ему будет интересно почитать о моём опыте настройки двухмониторной конфигурации с помощью XRandr. И сегодня я решил попробовать настроить XRandr.

К сожалению, настроить двухмониторную конфигурацию с помощью Xrandr мне не удалось - проприетарный драйвер nvidia, которым я пользуюсь, не поддерживает XRandr. (Тут я оставлю место для тухлых помидоров.) В своё оправдание могу сказать, что моему компьютеру уже почти 6 лет, а 6 лет назад покупка видеокарты ATI для компьютера с Linux неизбежно приводила к захватывающим приключениям на мягкое место. Хотя, говорят, что совсем недавно nvidia всё-таки сподобилась выпустить драйверы с поддержкой XRandr (Тестовая версия проприетарного драйвера NVIDIA 302.07 с поддержкой RandR 1.2/1.3), но эта новость скорее всего не работает для моего случая с видеокартой, которая поддерживается только legacy-драйвером nvidia. Но зато в проприетарном драйвере nvidia есть свой собственный велосипед для двухмониторых (и только) конфигураций под названием TwinView. Его-то я и попробовал настроить.

Это оказалось довольно простым делом, если вооружиться Переводом документации драйвера NVIDIA для Linux. Всё нужное у меня уже было готово после настройки Xinerama. Что я сделал:

1. Закоментировал опции
Screen     1   "Screen1" RightOf "Screen0"
и
Option         "Xinerama" "On"
в секции ServerLayout,

2. Закоментировал секции Device, Monitor и Screen, связанные с настройками второго монитора (то бишь телевизора),

3. Вписал в оставшуюся секцию Device следующие опции:
Option      "TwinView"
Option      "TwinViewOrientation" "RigthOf"
Option      "SecondMonitorHorizSync" "15.625 - 15.625"
Option      "SecondMonitorVertSync"  "50.0 - 50.0"
Option      "MetaModes" "1280x1024,800x600; 1024x768, 800x600; 800x600, 800x600; 640x480, 800x600"
4. Перезапустил дисплейный менеджер.

Как это ни странно, но всё заработало. Появились даже несколько плюсов. Поскольку у двух экранов разное разрешение по вертикали, то под вторым экраном образовывалась некая область, которую я условно назвал "мёртвая зона":
.________________.___________.
|                |           |
|                | Телевизор |
|    Монитор     |___________|
|                |  Мёртвая  |
|________________|___зона____|

Плюс первый - теперь мышь не уезжает из монитора в мёртвую зону, а останавливается прямо перед "мёртвой зоной", на краю экрана монитора. Если же мышь поднять повыше, то она легко проваливается на экран телевизора. Это удобно, потому что так мышь не теряется там, где ей нечего делать.

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

Ну и третий плюс - программы перестали ругаться на отсутствие поддержки XRandr.

Теперь снимки экрана выглядят вот так:

А мой третий файл конфигурации X-сервера для случая настройки двухмониторной конфигурации с использованием TwinView, выглядит вот так (закоментированные фрагменты вырезаны):
Section "ServerFlags"
  Option "AutoAddDevices" "False"
  Option "AllowEmptyInput" "False"
  Option "DontZap" "False"
EndSection

Section "ServerLayout"
  Identifier     "X.org Configured"
  Screen      0  "Screen0" 0 0
  InputDevice    "Mouse0" "CorePointer"
  InputDevice    "Keyboard0" "CoreKeyboard"
EndSection

Section "Files"
  #RgbPath      "/etc/X11/rgb"
  ModulePath   "/usr/lib/xorg/modules"
  FontPath     "/usr/share/fonts/X11/misc"
  FontPath     "/usr/share/fonts/X11/Type1"
  FontPath     "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType"
EndSection

Section "Module"
  Load  "dri"
  Load  "GLcore"
  Load  "glx"
  Load  "dbe"
  Load  "record"
  Load  "extmod"
  Load  "xtrap"
EndSection

Section "InputDevice"
  Identifier  "Keyboard0"
  Driver      "kbd"
  Option      "XkbRules" "xorg"
  Option      "XkbModel" "pc104"
  Option      "XkbLayout" "us,ru"
  Option      "XkbOptions" "grp:alt_shift_toggle"
  Option      "XkbVariant" ",winkeys"
  Option      "AutoRepeat" "250 30"
EndSection

Section "InputDevice"
  Identifier  "Mouse0"
  Driver      "mouse"
  Option      "Protocol" "auto"
  Option      "Device" "/dev/input/mice"
  Option      "ZAxisMapping" "4 5 6 7"
EndSection

Section "Monitor"
  DisplaySize  338 270 # mm
  Identifier   "Monitor0"
  VendorName   "LG"
  ModelName    "Flatron L1730S"
  ### Comment all HorizSync and VertRefresh values to use DDC:
  HorizSync    30.0 - 80.2
  VertRefresh  56.0 - 75.0
  Option       "DPMS"
  # 1280x1024 @ 75.00 Hz (GTF) hsync: 80.17 kHz; pclk: 138.54 MHz
  Modeline "1280x1024_75.00"  138.54  1280 1368 1504 1728  1024 1025 1028 1069  -HSync +Vsync
  # 1024x768 @ 75.00 Hz (GTF) hsync: 60.15 kHz; pclk: 81.80 MHz
  Modeline "1024x768_75.00"  81.80  1024 1080 1192 1360  768 769 772 802  -HSync +Vsync
  # 800x600 @ 75.00 Hz (GTF) hsync: 47.02 kHz; pclk: 48.91 MHz
  Modeline "800x600_75.00"  48.91  800 840 920 1040  600 601 604 627  -HSync +Vsync
  # 640x480 @ 75.00 Hz (GTF) hsync: 37.65 kHz; pclk: 30.72 MHz
  Modeline "640x480_75.00"  30.72  640 664 728 816  480 481 484 502  -HSync +Vsync
EndSection

Section "Device"
  Identifier  "Card0"
  Driver      "nvidia"
  VendorName  "nVidia Corporation"
  BoardName   "NV43 [GeForce 6600]"
  BusID       "PCI:5:0:0"
  Option      "TwinView"
  Option      "TwinViewOrientation" "RigthOf"
  Option      "SecondMonitorHorizSync" "15.625 - 15.625"
  Option      "SecondMonitorVertSync"  "50.0 - 50.0"
  Option      "MetaModes" "1280x1024,800x600; 1024x768, 800x600; 800x600, 800x600; 640x480, 800x600"
EndSection

Section "Screen"
  Identifier "Screen0"
  Device     "Card0"
  Monitor    "Monitor0"
  DefaultDepth    24
  SubSection "Display"
    Viewport   0 0
    Depth     24
    Modes "1280x1024_75.00" "1024x768_75.00" "800x600_75.00" "640x480_75.00"
  EndSubSection
EndSection

воскресенье, 20 мая 2012 г.

Настройка X-сервера

Файл конфигурации моего X-сервера подвергался многократным доработкам. Большинство доработок приведено здесь. Из не уместившегося здесь, остались установка фирменного драйвера от nvidia и настройка xinerama для подключения телевизора. Настройка Xinerama описана в этой заметке: Xinerama: монитор и телевизор, а установка фирменного драйвера от nvidia описана здесь: Установка проприетарных драйверов ATI/nVidia в Debian GNU/Linux (Etch).

1. Получение заготовки файла конфигурации

Для начала запустим X-сервер в режиме автоматического конфигурирования:
# X -configure
X-сервер протестирует всё доступное оборудование и запишет файл конфигурации в /root/xorg.conf.new. Скопируем его в каталог /etc/X11 под именем xorg.conf:
# cp /root/xorg.conf.new /etc/X11/
Теперь можно отключить взаимодействие X-сервера с HAL. Для этого в файле /etc/X11/xorg.conf нужно прописать секцию ServerFlags и две опции:
Section "ServerFlags"
  Option "AutoAddDevices" "False"
  Option "AllowEmptyInput" "False"
EndSection
Чтобы X-сервер перезапускался при нажатии комбинации клавиш Ctrl+Alt+Backspace, можно добавить ту же секцию следующую опцию:
Option "DontZap" "False"
2. Русская раскладка

Теперь нужно русифицировать клавиатуру.

Если вы отключили HAL, то раскладки клавиатуры настраиваются в файле /etc/X11/xorg.conf. Для этого в секцию InputDevice с настройками клавиатуры нужно добавить следующие строки:
Option      "XkbRules" "xorg"
Option      "XkbModel" "pc104"
Option      "XkbLayout" "us,ru"
Option      "XkbOptions" "grp:alt_shift_toggle,grp_led:caps"
Option      "XkbVariant" ",winkeys"
Option      "AutoRepeat" "250 30"
Если HAL включен, то нужно создать файл /etc/hal/fdi/policy/10-keymap.fdi со следующим текстом:
<?xml version="1.0" encoding="UTF-8"?"?>
<deviceinfo version="0.2">
  <device>
    <match key="info.capabilities" contains="input.keymap">
      <append key="info.callouts.add" type="strlist">hal-setup-keymap</append>
    </match>
    <match key="info.capabilities" contains="input.keys">
      <merge key="input.xkb.rules" type="string">base</merge>
      <merge key="input.xkb.model" type="string">keyboard</merge>
      <match key="/org/freedesktop/Hal/devices/computer:system.kernel.name" string="Linux">
      <merge key="input.xkb.model" type="string">evdev</merge>
      <merge key="input.xkb.layout" type="string">us,ru</merge>
      <merge key="input.xkb.variant" type="string">,winkeys</merge>
      <merge key="input.xkb.options" type="string">grp:alt_shift_toggle</merge>
      <merge key="input.xkb.options" type="string">grp_led:caps</merge>
    </match>
  </device>
</deviceinfo>
Настройки клавиатуры в варианте для HAL пригодятся на случай, если в ручной конфигурации допущены какие-то ошибки. В этом случае X-сервер переключится в режим самоконфигурации и подхватит настройки клавиатуры, заданные для HAL.

Оба варианта настроек задают две раскладки: американскую английскую и русскую раскладку, которая принята в Windows (то есть на подавляющем большинстве современных серийных клавиатур). Переключателем раскладки будет комбинация одновременно нажатых клавиш Alt и Shift. Индикатором раскладки - светодиод клавиши CapsLock.

3. Настройка монитора

Все настройки монитора указываются в секции Monitor.

Обычно все современные мониторы умеют отдавать всю информацию о поддерживаемых ими режимах видеокарте по протоколу DDC и поэтому обычно ручная настройка режимов не требуется.

Мой монитор LG Flatron L1730S выдаёт по DDC вполне рабочие режимы, но они не совпадают с режимами, заявленными в документации. Среди режимов DDC нет режима с разрешением 1280x1024 при частоте кадровой развёртки 75 Герц.

Узнать информацию, которую монитор отдаёт видеокарте по протоколу DDC, можно с помощью команды ddcprobe из пакета xresprobe.

Значения частот вертикальной и горизонтальной развёртки можно прописать в качестве начальных:
HorizSync    30.0 - 83.0
VertRefresh  56.0 - 75.0
Теперь, чтобы добавить поддержку недостающих режимов, воспользуемся программой gtf из пакета xserver-xorg-core.

Запускаем команду, указывая желаемое разрешение:
$ gtf 1280 1024 75 -x
Она выдаст строку Modeline для этого режима, которую нужно будет включить в эту же секцию:
# 1280x1024 @ 75.00 Hz (GTF) hsync: 80.17 kHz; pclk: 138.54 MHz
Modeline "1280x1024_75.00" 138.54 1280 1368 1504 1728 1024 1025 1028 1069 -HSync +Vsync
То же самое нужно повторить для всех остальных желаемых режимов.

Максимальное значение hsync из всех Modeline'ов укажем в настройках частоты горизонтальной развёртки:
HorizSync    30.0 - 83.0
VertRefresh  56.0 - 75.0
Однако если всё определилось правильно, или вы иногда меняете монитор на другой, то лучше там ничего не указывать.

Для включения режима энергосбережения монитора нужно указать опцию DPMS:
Option "DPMS"
Правильные размеры видимой части экрана в миллиметрах можно измерить линейкой и указать в этом же разделе:
DisplaySize      340   270
4. Настройка экрана

При переключении разрешения экрана по Ctrl-Alt-+ и Ctrl-Alt-- вас может утомить листать большое количество режимов. Большинство режимов имеют очень низкую глубину цвета. Самой высокой глубиной цвета является 24-битная. Для этого в секции Screen удалим все подсекции Display, в которых опция Depth принимает значения, отличные от 24. Также полезно в секции Screen указать предпочтительную глубину цвета в 24 бита. В результате секция примет следующий вид. Здесь же можно указать доступные Modeline'ы, расчитанные с помощью программы gtf:
Section "Screen"
  Identifier "Screen0"
  Device     "Card0"
  Monitor    "Monitor0"
  DefaultDepth  24
    SubSection "Display"
      Viewport 0 0
      Depth     24
      Modes "1280x1024_75.00" "1024x768_75.00" "800x600_75.00" "640x480_75.00"
    EndSubSection
EndSection
5. Другие примеры настройки X-сервера через HAL

Другие примеры настройки X-сервера через HAL можно найти в каталоге /usr/share/hal/fdi/. Например, упомянутый пример настройки раскладок клавиатуры находится в файле /usr/share/hal/fdi/policy/10osvendor/10-keymap.fdi

6. Пример моего конфигурационного файла X-сервера
Section "ServerFlags"
        Option "AutoAddDevices" "False"
        Option "AllowEmptyInput" "False"
        Option "DontZap" "False"
EndSection

Section "ServerLayout"
        Identifier     "X.org Configured"
        Screen      0  "Screen0" 0 0
        InputDevice    "Mouse0" "CorePointer"
        InputDevice    "Keyboard0" "CoreKeyboard"
EndSection

Section "Files"
        RgbPath      "/etc/X11/rgb"
        ModulePath   "/usr/lib/xorg/modules"
        FontPath     "/usr/share/fonts/X11/misc"
        FontPath     "/usr/share/fonts/X11/Type1"
        FontPath     "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType"
EndSection

Section "Module"
        Load  "dri"
        Load  "GLcore"
        Load  "glx"
        Load  "dbe"
        Load  "record"
        Load  "extmod"
        Load  "xtrap"
EndSection

Section "InputDevice"
        Identifier  "Keyboard0"
        Driver      "kbd"
        Option      "XkbRules" "xorg"
        Option      "XkbModel" "pc104"
        Option      "XkbLayout" "us,ru"
        Option      "XkbOptions" "grp:alt_shift_toggle"
        Option      "XkbVariant" ",winkeys"
        Option      "AutoRepeat" "250 30"
EndSection

Section "InputDevice"
        Identifier  "Mouse0"
        Driver      "mouse"
        Option      "Protocol" "auto"
        Option      "Device" "/dev/input/mice"
        Option      "ZAxisMapping" "4 5 6 7"
EndSection

Section "Monitor"
        DisplaySize  338 270 # mm
        Identifier   "Monitor0"
        VendorName   "LG"
        ModelName    "Flatron L1730S"
 ### Comment all HorizSync and VertRefresh values to use DDC:
        HorizSync    30.0 - 80.2
        VertRefresh  56.0 - 75.0
        Option       "DPMS"
        # 1280x1024 @ 75.00 Hz (GTF) hsync: 80.17 kHz; pclk: 138.54 MHz
        Modeline "1280x1024_75.00"  138.54  1280 1368 1504 1728  1024 1025 1028 1069  -HSync +Vsync
        # 1024x768 @ 75.00 Hz (GTF) hsync: 60.15 kHz; pclk: 81.80 MHz
        Modeline "1024x768_75.00"  81.80  1024 1080 1192 1360  768 769 772 802  -HSync +Vsync
        # 800x600 @ 75.00 Hz (GTF) hsync: 47.02 kHz; pclk: 48.91 MHz
        Modeline "800x600_75.00"  48.91  800 840 920 1040  600 601 604 627  -HSync +Vsync
        # 640x480 @ 75.00 Hz (GTF) hsync: 37.65 kHz; pclk: 30.72 MHz
        Modeline "640x480_75.00"  30.72  640 664 728 816  480 481 484 502  -HSync +Vsync
EndSection

Section "Device"
        ### Available Driver options are:-
        ### Values: <i>: integer, <f>: float, <bool>: "True"/"False",
        ### <string>: "String", <freq>: "<f> Hz/kHz/MHz"
        ### [arg]: arg optional
        #Option     "SWcursor"                  # [<bool>]
        #Option     "HWcursor"                  # [<bool>]
        #Option     "NoAccel"                   # [<bool>]
        #Option     "ShadowFB"                  # [<bool>]
        #Option     "UseFBDev"                  # [<bool>]
        #Option     "Rotate"                    # [<str>]
        #Option     "VideoKey"                  # <i>
        #Option     "FlatPanel"                 # [<bool>]
        #Option     "FPDither"                  # [<bool>]
        #Option     "CrtcNumber"                # <i>
        #Option     "FPScale"                   # [<bool>]
        #Option     "FPTweak"                   # <i>
        #Option     "DualHead"                  # [<bool>]
        Identifier  "Card0"
        Driver      "nvidia"
        VendorName  "nVidia Corporation"
        BoardName   "NV43 [GeForce 6600]"
        BusID       "PCI:5:0:0"
EndSection

Section "Screen"
        Identifier "Screen0"
        Device     "Card0"
        Monitor    "Monitor0"
        DefaultDepth    24
        SubSection "Display"
                Viewport   0 0
                Depth     24
                Modes "1280x1024_75.00" "1024x768_75.00" "800x600_75.00" "640x480_75.00"
        EndSubSection
EndSection

среда, 13 июля 2011 г.

Xinerama: монитор и телевизор

Примерно год назад у меня дома случилась перестановка мебели, в результате которой телевизор стал стоять недалеко от компьютера. Тогда же мне пришла в голову мысль подключить телевизор к компьютеру для более удобного просмотра фильмов. Но, прошёл почти год, прежде чем у меня появилось достаточно свободного времени, чтобы этим заняться. Сейчас я в отпуске и решил этим заняться.

Хочу заранее сказать, что я не любитель отслеживать разного рода новинки в области компьютерной и видеотехники. Телевизор этот купила моя жена, когда ещё начала работать, с ней мы тогда не были знакомы. Компьютер с этой видеокартой (NVidia GeForce 6600) я купил где-то в начале 2006 года, когда мой старый компьютер стал намертво виснуть при повышенной нагрузке на процессор (архивирование, просмотр некоторых фильмов, просмотр флеша). Старый компьютер модернизации не подлежал и поэтому из старого компьютера в новый попал только привод DVD-RW, который позже сломался и был заменён на другой.

Есть люди, которым нравится покупать все новинки компьютерной и видеотехники. Им вряд ли будет интересно читать всё нижеследующее, потому что всё это уже давно устарело. Эти люди будут любят задавать вопросы "зачем тебе этот хлам" и раздавать ценные советы вида "купи себе то-то и то-то и не возись с этим барахлом". Заранее прошу таких людей не беспокоить меня.

Итак, перво-наперво, нужно было купить кабели для соединения телевизора и компьютера.

Я обследовал видеокарту и нашёл там разъём S-Video (собственно, я и так знал, что он там есть). Один друг мне до этого рассказывал, что он тоже подключал телевизор к компьютеру (правда под Windows) и сказал, что с этим кабелем он намучился, потому что их бывает несколько разных видов. Я это вспомнил, внимательно рассмотрел разъём и поискал его в интернете. Нашёл вот такую статью Разъёмы S-Video, применяемые в видеокартах и убедился в том, что у меня на видеокарте именно разъём S-Video, стандартный 4-контактный.

Этот разъём может работать в двух режимах:
  1. Композитный - по одному проводу передаются все три сигнала Y (яркость), Cr или U (разница между яркостью и синим), и Cb или V (разница между яркостью и красным). Сигналы мультиплексирются видеокартой и демультиплексируются телевизором. Обеспечивает менее качественную картинку, поскольку не может устранить взаимовлияние сигналов яркости и цвета.
  2. S-Video - по одному проводу передаётся сигнал яркости Y, а по другому - мультиплексированный сигнал цвета Cr или U (разница между яркостью и синим), и Cb или V (разница между яркостью и красным). Обеспечивает более качественную картинку, поскольку исключается взаимовлияние сигнала яркости и сигнала цветности. Более подробно об этом написано в статье Особенности преобразования сигналов VGA в TV.
Самым лучшим вариантом был бы компонентный сигнал, при котором каждый компонент передаётся по отдельному проводу. Но, к сожалению, мой разъём S-Video такого варианта обеспечить не может, его могут обеспечить 7-контактный или 9-контактный варианты разъёма S-Video. Подробнее об этом можно почитать, например, здесь: Подключение компьютера к телевизору.

Ещё можно было бы попробовать воспользоваться разъёмом DVI, имеющимся на видеокарте, но забегая вперёд скажу, что переходников DVI на 3 RCA я не нашёл ни в каком виде. Если найду - опробую этот вариант.

Затем я обследовал телевизор. На телевизоре оказалось огромное количество разъёмов типа "Тюльпан", которые правильно называются RCA.

Фото задней панели телевизора:

Разъёмы на задней панели выделены в 3 группы:
1 группа. 5 разъёмов для подключения DVD-плеера с развёрткой на 480 строк:
  1. Y,
  2. U или Cr,
  3. V или Cb,
  4. левый аудио,
  5. правый аудио.
2 группа. 3 разъёма для видеовхода:
  1. композитный,
  2. левый аудио,
  3. правый аудио.
3 группа. 3 разъёма для видеовыхода:
  1. композитный,
  2. левый аудио,
  3. правый аудио.
Фото передней панели телевизора:

Разъёмы на передней панели:
4 группа:
  1. композитный,
  2. левый аудио,
  3. правый аудио.
Соответственно, вариантов подключения у меня оказалось не много - либо к группе 2 на задней панели, либо к группе 4 на передней панели. При этом используется композитный видеосигнал и два аудиосигнала. Это вариант подключения, обеспечивающий самое низкое качество видеосигнала.

Расстояние между телевизором и компьютером - примерно 2 метра. Итак, с кабелями я определился - мне нужны кабель S-Video-RCA и MiniJack-2RCA. Первая же попытка найти такие кабели в магазинах бытовой электроники окончилась неудачей - именно таких кабелей нигде не было. Вторая попытка оказалась успешной - я купил их в магазине, специализирующемся на продаже электронных компонентов. Были кабели длиной 1,5 метра и 3 метра, я взял трёхметровые.

Теперь дело стало за настройкой. Для начала воспользовался вот этой заметкой Подключение двух мониторов: Xinerama или TwinView?. Настроил Xinerama, т.к. мне показался этот способ более естественным для X-сервера.

Получился вот такой файл конфигурации /etc/X11/xorg.conf:
Section "ServerLayout"
  Identifier     "X.org Configured"
  Screen         "Screen0" 0 0
  Screen         "Screen1" RightOf "Screen0"
  InputDevice    "Mouse0" "CorePointer"
  InputDevice    "Keyboard0" "CoreKeyboard"
  Option         "Xinerama" "On"
EndSection

Section "Files"
  ModulePath      "/usr/lib/xorg/modules"
  FontPath        "/usr/share/fonts/X11/misc"
  FontPath        "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType"
EndSection

Section "Module"
  Load           "glx"
  Load           "dbe"
  Load           "record"
  Load           "extmod"
EndSection

Section "ServerFlags"
  Option         "AutoAddDevices" "False"
  Option         "AllowEmptyInput" "False"
  Option         "DontZap" "True"
EndSection

Section "InputDevice"
  Identifier     "Keyboard0"
  Driver         "kbd"
  Option         "XkbRules" "xorg"
  Option         "XkbModel" "pc104"
  Option         "XkbLayout" "us,ru"
  Option         "XkbOptions" "grp:alt_shift_toggle"
  Option         "XkbVariant" ",winkeys"
  Option         "AutoRepeat" "250 30"
EndSection

Section "InputDevice"
  Identifier     "Mouse0"
  Driver         "mouse"
  Option         "Protocol" "auto"
  Option         "Device" "/dev/input/mice"
  Option         "ZAxisMapping" "4 5 6 7"
EndSection

Section "Monitor"
  Identifier     "Monitor0"
  VendorName     "LG"
  ModelName      "Flatron L1730S"
  DisplaySize     338    270
  HorizSync       30.0 - 80.2
  VertRefresh     56.0 - 75.0
  ModeLine       "1280x1024_75.00" 138.54 1280 1368 1504 1728 1024 1025 1028 1069 -hsync +vsync
  ModeLine       "1024x768_75.00" 81.80 1024 1080 1192 1360 768 769 772 802 -hsync +vsync
  ModeLine       "800x600_75.00" 48.91 800 840 920 1040 600 601 604 627 -hsync +vsync
  ModeLine       "640x480_75.00" 30.72 640 664 728 816 480 481 484 502 -hsync +vsync
  Option         "DPMS"
EndSection

Section "Monitor"
  Identifier     "Monitor1"
  VendorName     "LG"
  ModelName      "Flatron RT-21FA32X"
  DisplaySize    450 350
  HorizSync      15.625 - 15.625
  VertRefresh    50.0 - 50.0
  Option         "DPMS"
EndSection

Section "Device"
  Identifier     "Card0"
  Driver         "nvidia"
  VendorName     "nVidia Corporation"
  BoardName      "NV43 [GeForce 6600]"
  BusID          "5:0:0"
EndSection

Section "Device"
  Identifier     "Card1"
  Driver         "nvidia"
  VendorName     "nVidia Corporation"
  BoardName      "NV43 [GeForce 6600]"
  BusID          "5:0:0"
  Screen         1
EndSection

Section "Screen"
  Identifier     "Screen0"
  Device         "Card0"
  Monitor        "Monitor0"
  DefaultDepth    24
  SubSection     "Display"
    Viewport    0 0
    Depth       8
    Modes      "1280x1024_75.00" "1024x768_75.00" "800x600_75.00" "640x480_75.00"
  EndSubSection
  SubSection     "Display"
    Viewport    0 0
    Depth       24
    Modes      "1280x1024_75.00" "1024x768_75.00" "800x600_75.00" "640x480_75.00"
  EndSubSection
  SubSection     "Display"
    Viewport    0 0
    Depth       32
    Modes      "1280x1024_75.00" "1024x768_75.00" "800x600_75.00" "640x480_75.00"
  EndSubSection
EndSection

Section "Screen"
  Identifier      "Screen1"
  Device          "Card1"
  Monitor         "Monitor1"
  DefaultDepth    24
  SubSection      "Display"
    Depth           24
    #Modes           "768x576"
    Modes           "800x600"
  EndSubSection
EndSection
Возможно, что некоторые настройки здесь избыточны и не необходимы для нормальной работы. Действительное разрешение S-Video 768x576 точек, поэтому я указал наиболее похожее из доступных - 800x600. Частоты вертикальной и горизонтальной развёртки для режима S-Video - 15,625 КГц и 50 Гц. Геометрические размеры растровой сетки телевизионного экрана - 450 на 350 мм (замерял линейкой).

Настройки монитора перекочевали из предыдущей конфигурации, где они были заданы явно, поскольку видеокарта по протоколу EDID принимает от монитора несколько заниженные режимы.

Действительные настройки видеокарты я смотрел с помощью программы nvidia-settings. Там можно найти доступные видеорежимы, посмотреть частоту вертикальной развёртки (действительная частота оказалась равной 60,32 Гц), можно отцентрировать картинку, задать её размеры на экране, настроить насыщенность цвета.

среда, 4 августа 2010 г.

Доступ к буферу обмена X Window System из командной строки с помощью xclip

Перевод статьи: Access the X Window System Clipboard from the Command Line with xclip

17 марта 2009, Эрик Фэлор (Erik Falor)

Вы когда-нибудь выделяли текст в окне терминала, чтобы скопировать его в X-приложение? Отбросьте мышь и воспользуйтесь вместо неё xclip. С помощью xclip вы просто перенаправляете через конвейер в xclip тот текст, который вы хотите скопировать:
$ lspci | xclip
Теперь перейдите в X-приложение и вставьте захваченный вывод в программу. xclip также позволит вам “вставить” выбранный текст в терминал. Просто воспользуйтесь опцией -o для вывода выделенного текста:
$ xclip -o
xclip можно найти на sourceforge.net/projects/xclip.