Monitor i jego konfiguracja pod linux'em

Spis treści

Obecnie w linux'ach spora cześć sprzętu jest rozpoznawana prawidłowo, a my nie musimy poświęcać czasu na dodatkową konfigurację. Domyślne ustawienia sprawdzają się praktycznie za każdym razem, gdy w grę nie wchodzi nic bardziej zaawansowanego. W tym wpisie rzucimy okiem na konfigurację Xserver'a, która dotyczyć będzie wyświetlanego obrazu na monitorze. Pośrednio też będziemy musieli skonfigurować sobie kartę graficzną, bo to ona jest odpowiedzialna w dużej mierze za to, co jest odbierane przez nasz monitor.

Konfiguracja Xserver'a

Zainstalowanie sterowników do karty graficznej nie zawsze wystarcza. Zwłaszcza w przypadku, gdy mamy do czynienia z tymi o zamkniętym kodzie źródłowym. Te otwarte odpowiedniki powinny działać automatycznie. Tak czy inaczej, poniżej jest przykładowa konfiguracja, którą można obrać sobie jako punkt wyjścia. Tworzymy zatem plik /etc/X11/xorg.conf.d/20-monitor.conf , w którym to dodajemy tę poniższą treść:

Section "Device"
      Identifier  "Device0"
      Driver      "intel"
      BusID       "PCI:0:2:0"
      Option      "Backlight" "acpi_video0"
EndSection

Section "Monitor"
      Identifier   "LVDS1"

#     DisplaySize 344 193
      Modeline "1366x768x60.0-manual"  69.30  1366 1398 1422 1432  768 771 775 806  -HSync +Vsync
      Option "PreferredMode" "1366x768x60.0-manual"

#     Option      "VendorName"      ""
#     Option      "ModelName"       ""
      Option      "DPMS"            "true"
#     Option      "HorizSync"       "30-81"
#     Option      "VertRefresh"     "56-75"
#     Option      "Position"  "0 0"
#     Option      "LeftOf"    "VGA1"
#     Option      "Rotate"    "normal"
#     Option      "Gamma"     "1.0"
#     Option      "Enable"    "true"
#     Option      "Ignore"    "false"
#     Option      "Primary"   "true"
EndSection

Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "LVDS1"
    DefaultDepth    24
    SubSection     "Display"
            Depth     24
            Modes     "1366x768x60.0-manual"
    EndSubSection
EndSection

Wyżej mamy określone trzy sekcje: Monitor , Device oraz Screen . By ta konfiguracja byłą spójna i miała sens, musimy zwracać uwagę na identyfikatory, których używamy. W sekcji Screen , na pozycjach Device oraz Monitor są wartości ustawione w Identifier w poprzednich dwóch sekcjach. Sekcja Monitor odpowiada za konfigurację monitora, zaś sekcja Device za konfigurację karty graficznej.

Różnica między Monitor i Screen

Kluczowe też jest zrozumienie różnicy między użytymi wyżej pojęciami Monitor i Screen . Monitor to fizyczny obiekt, który zwykle swoi na biurku. Natomiast Screen wiąże ze sobą monitor z kartą graficzną. Jest to generalnie obraz karty graficznej, który musi zostać gdzieś wyświetlony. Do karty graficznej może być podpiętych szereg monitorów. Dlatego też wymagana jest konfiguracja każdego Screen'a. Mając skonfigurowanych kilka Screen'ów, możemy je ze sobą łączyć i otrzymać w ten sposób większy obraz, np. jego cześć może być wyświetlana na jednym monitorze, zaś druga część na drugim monitorze, itp. W taki sposób, mimo, że pracujemy na dwóch fizycznych monitorach, to tak naprawdę mamy do dyspozycji większą powierzchnię pulpitu.

Parametry dla poszczególnych monitorów powinny być w miarę zbliżone, a najlepiej by były takie same, ewentualnie proporcjonalnie większe lub mniejsze. Wtedy nie ma większego problemu ze skalowaniem obrazu czy rozdzielaniem go na poszczególne monitory. Jeśli parametry sprzętu różnią się, to wtedy Screen może wyglądać tak jak ten poniżej:

monitor-screen-arandr

W taki sposób nie damy rady, np. rozdzielić filmu na oba monitory bez obcinania kawałka obrazu, lub całkowitego wypełnienia obu monitorów. Podobnie sprawa ma się w przypadku powielania obrazu na oba te urządzenia, bo na tym mniejszym monitorze, obraz będzie lekko obcięty. Niemniej jednak, jeśli potrzebujemy jedynie większej przestrzeni pulpitu w celu rozmieszczenia większej ilości okien, to różnice w parametrach monitorów nie mają większego znaczenia.

Konfiguracja sekcji Device

W zależności od posiadanej karty graficznej, będziemy mieć do wyboru różne sterowniki. Te z kolei podzielić można na dwie grupy: opensource oraz proprietary (własnościowe). Pierwsza grupa zwykle cechuje się sporo gorszą wydajnością niż ta druga. Z kolei jeśli chodzi o sterowniki własnościowe, to w debianie one oficjalnie nie są wspierane i generują całą masę problemów.

Po zainstalowaniu odpowiednich sterowników, będziemy musieli skonfigurować sobie sekcję Device w utworzonym wcześniej pliku konfiguracyjnym. W zależności od wybranych sterowników, wartość parametru Driver ulegnie zmianie. To, jakie wartości mogą zostać określone, można znaleźć w katalogu /usr/lib/xorg/modules/drivers/ . Mamy tam przykładowo intel_drv.so . Obcinamy _drv.so , a pozostałą cześć wpisujemy w linijce z Driver .

Przyjrzyjmy się zatem bliżej sekcji Device . Dla przypomnienia wygląda ona mniej więcej tak:

Section "Device"
      Identifier  "Device0"
      Driver      "intel"
      BusID       "PCI:0:2:0"
      Option      "Backlight" "acpi_video0"
EndSection

Wszystkie możliwe do skonfigurowania opcje są opisane w man xorg.conf. Tutaj opiszę tylko te wyżej wymienione:

  • Identifier to identyfikator. Można wpisać dowolną frazę.
  • Driver odpowiada za użyty sterownik. Zwykle tylko tę opcję będziemy musieli dostosować.
  • BusID określa adres karty graficznej.

Możemy także definiować szereg opcji za pomocą Option . Wyżej mamy zdefiniowany jedynie "Backlight" , który odpowiada za manipulację jasnością matrycy w laptopie. Czasem w katalogu /sys/class/backlight/ może znaleźć się kila dowiązań i system może korzystać nie z tego modułu co potrzeba pociągając za sobą szereg problemów z zapisywaniem ustawień jasności monitora. Precyzując tę opcję tutaj, możemy określić z którego sterownika system ma korzystać.

Jak ustalić BusID karty graficznej

Jeśli chodzi zaś o BusID , to zwykle system potrafi bez problemu określić ścieżkę do karty graficznej. Niemniej jednak, nie stanowi problemu odszukanie jej w sposób manualny. Zapis jaki musimy podać Xserver'owi ma być w formie PCI:bus:device:function . Potrzebne wartości możemy odczytać z wyjścia lspci , przykładowo:

$ lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Core Processor Integrated Graphics Controller (rev 02)

W man lspci możemy odszukać informację, że ten numerek na początku ma format [domain:]bus:device.function , czyli pasuje do tego, który mamy podać Xserver'owi, z tym, że . zamieniamy na : . Dodatkowo, wartości na wyjściu lspci są w hexach. Natomiast Xserver korzysta z systemu dziesiętnego i te wartości trzeba pierw przekonwertować. Mamy zatem trzy pozycje: 00 -> 0 , 02 -> 2 oraz 0 -> 0 . W taki sposób otrzymujemy 0:2:0 , gdzie na początku doklejamy PCI: i tę frazę dodajemy do pliku konfiguracyjnego.

Konfiguracja sekcji Monitor

Sekcja Monitor jest z reguły opcjonalna, gdy mamy do czynienia z jednym monitorem. Zwykle wszystkie jego parametry są wykrywane poprawnie. Czasem jednak chcielibyśmy zmienić natywną rozdzielczość monitora, czy też przyciemnić go nieco, lub też rozjaśnić. Być może orientacja obrazu jest nie taka jak trzeba. To wszystko jesteśmy w stanie skonfigurować w tej sekcji. Dla przypomnienia, wygląda ona mniej więcej tak:

Section "Monitor"
      Identifier   "LVDS1"

#     DisplaySize 344 193
      Modeline "1366x768x60.0-manual"  69.30  1366 1398 1422 1432  768 771 775 806  -HSync +Vsync
      Option "PreferredMode" "1366x768x60.0-manual"

#     Option      "VendorName"      ""
#     Option      "ModelName"       ""
      Option      "DPMS"            "true"
#     Option      "HorizSync"       "30-81"
#     Option      "VertRefresh"     "56-75"
#     Option      "Position"  "0 0"
#     Option      "LeftOf"    "VGA1"
#     Option      "Rotate"    "normal"
#     Option      "Gamma"     "1.0"
#     Option      "Enable"    "true"
#     Option      "Ignore"    "false"
#     Option      "Primary"   "true"
EndSection

Poniżej znajduje się wyjaśnienie użytych opcji, zaś opis wszystkich można naturalnie odszukać w man xorg.conf:

  • Identifier to identyfikator. Można wpisać dowolną frazę.
  • DisplaySize określa wymiary (mm) tej części monitora, na której jest wyświetlany obraz. Gdy ten parametr zostanie określony, na jego podstawie zostaną także wyliczone DPI.
  • Modeline odpowiada za informacje EDID.
  • PreferredMode określa preferowany tryb pracy monitora.
  • VendorName oraz ModelName określają producenta i model monitora.
  • DPMS włącza funkcje DPMS (Display Power Management Signaling) dla monitora.
  • HorizSync odpowiada za częstotliwość odchylania poziomego lub jej zakres.
  • VertRefresh odpowiada za częstotliwość synchronizacji pionowej lub jej zakres.
  • Position określa pozycję lewego górnego rogu obrazu monitora.
  • LeftOf , RightOf , Below i Above określają położenie względem innych monitorów.
  • Rotate umożliwia obrócenie obrazu o 90 (left), 180 (inverted) i 270 (right) stopni.
  • Gamma odpowiada za jasność obrazu. Zakres od 0.1 to 10.0 . Można także podać osobne wartości dla Red, Green, Blue.
  • Enable jeśli ustawiony, domyślnie włącza dany monitor.
  • Ignore jeśli ustawiony, ten monitor będzie ignorowany w całości.
  • Primary jeśli ustawiony, określa monitor jako główny.

Nie wszystkie opcje w tej sekcji mogą być wspierane przez dany sterownik urządzenia.

Modeline

Przydałoby się jeszcze powiedzieć kilka słów na temat Modeline . Generalnie rzecz biorąc, wszystkie potrzebne wartości możemy odczytać z logu Xserver'a. Poniżej przykład:

[ 37422.916] (II) intel(0): clock: 69.3 MHz   Image Size:  344 x 193 mm
[ 37422.916] (II) intel(0): h_active: 1366  h_sync: 1398  h_sync_end 1422 h_blank_end 1432 h_border: 0
[ 37422.916] (II) intel(0): v_active: 768  v_sync: 771  v_sync_end 775 v_blanking: 806 v_border: 0

Na wiki znalazłem rozpiskę na temat formatu Modeline. Wygląda on mniej więcej tak:

pclk hdisp hsyncstart hsyncend htotal vdisp vsyncstart vsyncend vtotal [flags]
Flags (optional): +HSync, -HSync, +VSync, -VSync, Interlace, DoubleScan, CSync, +CSync, -CSync

Option      "Modeline" "1366x768x60.0"  69.30  1366 1398 1422 1432  768 771 775 806  -HSync -Vsync
                            (Label)     (clk)     (x-resolution)     (y-resolution)
                                          |
                                 (pixel clock in MHz)

Jeśli nie chce nam się ręcznie uzupełniać tych wartości w oparciu o log Xserver'a, to zawsze możemy skorzystać z narzędzi cvt lub gtf . Częstotliwość odświeżania tego monitora wynosi 60Hz. Wiemy to z powyższych parametrów. Wzór na wyliczenie częstotliwości jest następujący: 69.30MHz/(1432806)=69300000/(1432806)=60.04Hz.

Jak możemy wyczytać w podlinkowanym wyżej wpisie, ręczne ustawianie Modeline jest już przestarzałe, bo Xserver sam wylicza konkretne wartości podczas swojego startu w oparciu o zapytania EDID oraz pozostałą konfigurację określoną w pliku konfiguracyjnym. Jeśli jednak chcemy ręcznie dodać nowy modeline, to musimy także zainteresować się sekcją Screen .

Konfiguracja sekcji Screen

Pozostała nam jeszcze jedna sekcja do skonfigurowania i jest nią Screen . Jak już wspomnieliśmy, ma ona na celu spięcie monitora z kartą graficzną. Jakby ktoś zapomniał jak ona wygląda, to poniżej przypomnienie:

Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "LVDS1"
    DefaultDepth    24
    SubSection     "Display"
            Depth     24
            Modes     "1366x768x60.0-manual"
    EndSubSection
EndSection

Wszystkie parametry, jakie możemy skonfigurować w tej sekcji, również można odszukać w man xorg.conf. Poniżej wyjaśnienie tych opcji, które zostały użyte wyżej:

  • Identifier to identyfikator.
  • Device musi pasować do pola Identifier w sekcji Device .
  • Monitor musi pasować do pola Identifier w sekcji Monitor .
  • DefaultDepth odpowiada za domyślną głębię kolorów.

Mamy również określoną podsekcję z dwoma parametrami: Depth oraz Modes . Ten pierwszy jest podobny do DefaultDepth , zaś Modes przydaje się jedynie w przypadku definiowania własnych wartości dla modeline.

Display Power Management Signaling (DPMS)

Jeśli włączyliśmy w opcjach monitora DPMS, to potrzebujemy dodatkowej konfiguracji, która skonfiguruje nam zarządzenie energią tego urządzenia. W tym celu stwórzmy sobie dwie dodatkowe sekcje: ServerLayout oraz ServerFlags . Coś na wzór tych poniższych:

Section "ServerLayout"
      Identifier "Main"
      Screen      0 "Screen0"
EndSection

Section "ServerFlags"
      Option "DefaultServerLayout" "Main"
      Option "BlankTime" "10"
      Option "StandbyTime" "10"
      Option "SuspendTime" "10"
      Option "OffTime" "10"
EndSection

Wartość opcji Screen w sekcji ServerLayout musi pasować do wartości Identifier w sekcji Screen , którą zdefiniowaliśmy wyżej. Dodatkowo wartość opcji DefaultServerLayout ma wskazywać na Identifier w sekcji ServerLayout . W ten sposób jesteśmy w stanie definiować szereg flag dla Xserver'a. Poniżej wyjaśnienie użytych opcji:

  • BlankTime to czas wygaszenia monitora.
  • StandbyTime to czas, po którym monitor przejdzie w stan czuwania.
  • SuspendTime to czas, po którym monitor przejdzie w stan uśpienia.
  • OffTime to czas, po którym nastąpi wyłączenie monitora.

Wszystkie określone wyżej czasy są w minutach. Zatem monitor powinien się wyłączyć po 10 minutach. Różnica pomiędzy poszczególnymi trybami pracy jest w poborze prądu. Konfigurację DPMS możemy sprawdzić za pomocą xset , przykładowo:

$ xset -q
...
Screen Saver:
  prefer blanking:  yes    allow exposures:  yes
  timeout:  600    cycle:  600
...
DPMS (Energy Star):
  Standby: 600    Suspend: 600    Off: 600
  DPMS is Enabled
  Monitor is On

Z kolei tutaj czasy są w sekundach, a 600 sekund to 10 minut.

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.