Pull to refresh

Как жить, если у тебя ноутбук, а экранов стало не хватать

Reading time6 min
Views60K
image
Краткое HowTo о том, как жить, если у тебя ноутбук, а экранов стало не хватать.

Исторически так сложилось, что у меня нет и никогда не было стационарного ПК. Только ноутбуки, так как требуется мобильность. И последнее ныне актуальное приобретение — ультрабук Asus S300CA (с ненужным сенсорным экраном) с ArchLinux на борту.
Имеется монитор на 23.6". И все бы хорошо — два экрана, уют, комфорт, тайлинг. Но некоторое время назад, когда работы стало больше, я вновь ощутил нехватку экранов…

Казалось бы, делов-то — подключить еще один монитор в свободный VGA-порт… Любезным товарищем был найден в закромах монитор с VGA. Подключаем монитор и… И ничего! Совсем. Кроме некоей ошибки, выдаваемой xrandr.

Курение интернетов говорит, что установленный Intel HD4000 умеет 3 вывода одновременно, но, как я понял, при условии, что два из них через идентичные цифровые каналы, т.е. LVDS + HDMI + HDMI или LVDS + DP + DP (которого вообще нет).

Купить персональный ПК? Ну уж нет.

Решено попробовать DisplayLink, о котором ранее была статья. Технологией оснащаются, например, мониторы и проекторы. Устройство подключается по USB и создает в системе дополнительный видеоадаптер для передачи изображения. Аппаратной модификации ПК не требуется, только драйвер. Кроме перечисленного производятся и конвертеры, к которым подключается монитор. Такое устройство и решено попробовать.

Был найден вот такой конвертер от HP
image
Уютная поддержка обещана пользователям Mac и Windows, но в данном случае имеем Linux, так что достаем бубен…

По ссылке приведен неплохой мануал, который дает понять ряд необходимых вещей:

  • устройство поддерживается
  • необходим модуль udl вместо существующего udlfb (хотя я так и не смог понять, почему udlfb продолжает существовать в системе, если не применим для этой задачи)
  • все это отлично поддерживатся xrandr'ом

Подключаем устройство в USB, подключаем монитор к устройству — монитор горит ярко зеленым, чем сообщает о готовности.
Посмотрим, определилось ли устройство в системе:

[root@machine ~]$ lsusb
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 005: ID 03eb:8810 Atmel Corp. 
Bus 001 Device 004: ID 0bda:5705 Realtek Semiconductor Corp. 
Bus 001 Device 003: ID 13d3:3402 IMC Networks 
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 003: ID 17e9:01d7 DisplayLink 
Bus 003 Device 002: ID 045e:07b1 Microsoft Corp. 
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Видим строчку Bus 003 Device 003: ID 17e9:01d7 DisplayLink, а значит, надежды есть.

Требуется поддержка фрэймбуфера X-сервером, для чего существует пакет xf86-video-fbdev . Также нам потребуется xf86-video-modesetting.

Оба пакета доступны в репозитории Extra. Установим:

[root@machine ~]$ pacman -S xf86-video-fbdev xf86-video-modesetting

Попробуем перезагрузиться и получить работу «из коробки», но снова видим только зеленый экран.
Отключаем-подключаем устройство и смотрим вывод dmesg:

[root@machine ~]$ dmesg
[ 53.300045] usb 1-2: new high-speed USB device number 9 using xhci_hcd
[ 53.479369] udlfb: DisplayLink HP USB Graphics Adap - serial #319454
[ 53.479387] udlfb: vid_17e9&pid_01d7&rev_0102 driver's dlfb_data struct at ffff8800ab8e7800
[ 53.479395] udlfb: console enable=1
[ 53.479398] udlfb: fb_defio enable=1
[ 53.479404] udlfb: shadow enable=1
[ 53.479546] udlfb: vendor descriptor length:1b data:1b 5f 01 0019 05 00 01 03 00 04
[ 53.479558] udlfb: DL chip limited to 2080000 pixel modes
[ 53.479653] udlfb: allocated 4 65024 byte urbs
[ 53.578156] udlfb: 1280x1024 @ 60 Hz valid mode
[ 53.578167] udlfb: 720x400 @ 70 Hz valid mode
[ 53.578171] udlfb: 640x480 @ 60 Hz valid mode
[ 53.578175] udlfb: 640x480 @ 67 Hz valid mode
[ 53.578178] udlfb: 640x480 @ 72 Hz valid mode
[ 53.578181] udlfb: 640x480 @ 75 Hz valid mode
[ 53.578184] udlfb: 800x600 @ 56 Hz valid mode
[ 53.578187] udlfb: 800x600 @ 60 Hz valid mode
[ 53.578190] udlfb: 800x600 @ 72 Hz valid mode
[ 53.578193] udlfb: 800x600 @ 75 Hz valid mode
[ 53.578196] udlfb: 832x624 @ 75 Hz valid mode
[ 53.578200] udlfb: 1024x768 @ 60 Hz valid mode
[ 53.578203] udlfb: 1024x768 @ 70 Hz valid mode
[ 53.578206] udlfb: 1024x768 @ 75 Hz valid mode
[ 53.578209] udlfb: 1280x1024 @ 75 Hz valid mode
[ 53.578213] udlfb: 1152x864 @ 75 Hz valid mode
[ 53.578216] udlfb: 1152x864 @ 75 Hz valid mode
[ 53.578219] udlfb: 1280x960 @ 60 Hz valid mode
[ 53.578222] udlfb: 1280x1024 @ 60 Hz valid mode
[ 53.578226] udlfb: Reallocating framebuffer. Addresses will change!
[ 53.579838] udlfb: 1280x1024 @ 60 Hz valid mode
[ 53.579849] udlfb: set_par mode 1280x1024
[ 53.589240] udlfb: DisplayLink USB device /dev/fb1 attached. 1280x1024 resolution. Using 5120K framebuffer memory

udlfb обнаружил устройство, прочитал доступные режимы и привязал устройство /dev/fb1.
В принципе, этого достаточно, если настройка выводов будет производиться через конфиги X-сервера, но желаемое — поддержка xrandr.

Собственно, цепляясь за факт, что udlfb обнаружил устройство, хотя udl в системе есть, принимаем за факт, что модули конфликтуют и потому вносим udlfb в список не загружаемых. Создадим файл displaylink.conf и запишем это туда:

[root@machine ~]$ echo 'blacklist udlfb' >> /etc/modprobe.d/displaylink.conf

Вновь перезагружаемся и смотрим доступные адаптеры:

[user@machine ~]$ xrandr —listproviders:
Provider 0: id: 0x7b cap: 0xb, Source Output, Sink Output, Sink Offload crtcs: 4 outputs: 5 associated providers: 0 name:Intel
Provider 1: id: 0x41 cap: 0x2, Sink Output crtcs: 1 outputs: 1 associated providers: 0 name:modesetting

Ура, теперь их два! Первый — через встроенный Intel HD4000, второй — через наш адаптер.

Теперь сообщим xrandr как с этим жить:

[user@machine ~]$ xrandr —setprovideroutputsource 1 0

… и посмотрим вывод:

[user@machine ~]$ xrandr 
Screen 0: minimum 8 x 8, current 4566 x 1080, maximum 32767 x 32767
LVDS1 connected 1366x768+1280+0 (normal left inverted right x axis y axis) 293mm x 164mm
   1366x768      60.02*+
   1024x768      60.00  
   800x600       60.32    56.25  
   640x480       59.94  
DP1 disconnected (normal left inverted right x axis y axis)
HDMI1 connected 1920x1080+2646+0 (normal left inverted right x axis y axis) 509mm x 286mm
   1920x1080     60.00*+  50.00    59.94    30.00    29.97  
   1680x1050     59.88  
   1280x1024     60.02  
   1440x900      59.90  
   1280x800      59.91  
   1152x864      75.00  
   1280x720      60.00    50.00    59.94  
   1024x768      70.07    60.00  
   800x600       60.32    56.25  
   720x576       50.00  
   720x480       60.00    59.94  
   640x480       66.67    60.00    59.94  
   720x400       70.08  
VGA1 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)
DVI-1-0 connected 1280x1024+0+0 (normal left inverted right x axis y axis) 338mm x 270mm
   1280x1024     60.02*+  75.02  
   1280x960      60.00  
   1152x864      75.00  
   1024x768      75.08    70.07    60.00  
   832x624       74.55  
   800x600       72.19    75.00    60.32    56.25  
   640x480       75.00    72.81    66.67    60.00  
   720x400       70.08  
  1280x1024 (0x42) 108.000MHz
        h: width  1280 start 1328 end 1440 total 1688 skew    0 clock  63.98KHz
        v: height 1024 start 1025 end 1028 total 1066           clock  60.02Hz
  1152x864 (0x45) 108.000MHz
        h: width  1152 start 1216 end 1344 total 1600 skew    0 clock  67.50KHz
        v: height  864 start  865 end  868 total  900           clock  75.00Hz
  1024x768 (0x47) 75.000MHz
        h: width  1024 start 1048 end 1184 total 1328 skew    0 clock  56.48KHz
        v: height  768 start  771 end  777 total  806           clock  70.07Hz
  1024x768 (0x48) 65.000MHz
        h: width  1024 start 1048 end 1184 total 1344 skew    0 clock  48.36KHz
        v: height  768 start  771 end  777 total  806           clock  60.00Hz
  800x600 (0x4c) 40.000MHz
        h: width   800 start  840 end  968 total 1056 skew    0 clock  37.88KHz
        v: height  600 start  601 end  605 total  628           clock  60.32Hz
  800x600 (0x4d) 36.000MHz
        h: width   800 start  824 end  896 total 1024 skew    0 clock  35.16KHz
        v: height  600 start  601 end  603 total  625           clock  56.25Hz
  640x480 (0x50) 30.240MHz
        h: width   640 start  704 end  768 total  864 skew    0 clock  35.00KHz
        v: height  480 start  483 end  486 total  525           clock  66.67Hz
  640x480 (0x51) 25.200MHz
        h: width   640 start  656 end  752 total  800 skew    0 clock  31.50KHz
        v: height  480 start  490 end  492 total  525           clock  60.00Hz
  720x400 (0x52) 28.320MHz
        h: width   720 start  738 end  846 total  900 skew    0 clock  31.47KHz
        v: height  400 start  412 end  414 total  449           clock  70.08Hz

DVI-1-0 — наш искомый вывод.

На этом небольшой квест завершается. Далее остается только указать xrandr'у как работать с выводами. Любители GUI могут использовать arandr, в противном случае можно сделать, например, так:

[user@machine ~]$ xrandr --output LVDS1 --auto --output HDMI1 --auto --right-of LVDS1 --output DVI-1-0 --auto --left-of LVDS1

, где LVDS1 — встроенный вывод ноутбука. Для всех выводов параметры устанавливаются автоматически, HDMI1 вывести справа от LVDS1, DVI-1-0 вывести слева от LVDS1.

Получаем что-то подобное:

image
DVI-1-0 — LVDS1 — HDMI1

И вид общим планом:

image

P.S.: Обнаружил проблему с Chromium — при загрузке страницы, а также на панели вкладок, курсор постоянно мерцает. При том проблема наблюдается на всех мониторах кроме того, который выведен через DisplayLink. Спасибо за комментарий lopatoid — проблема действительно исправилась отключением аппаратного ускорения в настройках Chromium.

Буду благодарен сообществу за замечания об ошибках и неточностях и надеюсь, что кому-то эта статья-мануал пригодится.
Tags:
Hubs:
+41
Comments28

Articles