udev и аутоматско суспендовање усб уређаја _

Приказ табеле садржаја

Проблем

На линукс базираним системима сам често имао проблема са комплетима тастатура и мишева који се манифестовао као успорење и кашњење приликом уноса текста. Уносим мишем и није толико био страшан међутим унос тастатуром јесте зато што би унос каснио (ви упишете нешто и онда се убрзо све појави са кашњењем од рецимо 0.5-1 секунде). Није ме нервирало много све док нисам кренуо опет да користим Лоџитек тастатуру и миша, модел К240, за музичку продукцију ван виртуелних машина. Када сам у виртуелним машинама, у графичком окружењу, толеришем одређена кашњења и не обраћам пажњу на успореност. Годинама сам радио музичку продукцију у Виндоуз (енгл. Windows) виртуелној машини (Vbox а касније и KVM) тако да ми кашњење заиста не смета. Средином 2020. сам прешао на Битвиг и ово кашњење уноса је почело да се примећује директније. У 2021. години се ситуација погоршала зато што сам престао да користим непотребно јак рачунар и почео да заиста користим ресурсе које имам.

Први покушај анализе

Више година сам мислио да је проблем у батеријама зато што пуњиве АА/ААА батерије користе мањи напон него регуларне батерије (1.2 волта наспрам 1.5 за ААА батерије, рецимо). Користим искључиво пуњиве батерије зато што се оне исплате кроз 6 месеци и практичније су у сваком могућем смислу. Штавише, у Лидлу сам нашао фине батерије нешто већег капацитета (АА су 2400mAh док су ААА 1000mAh) које сам узео у покушају да кажем себи да сам пробао све доступне батерије на нашем тржишту. За сада имам врло мало доказа но субјективно ми се чини да мој бежични сет тастатуре и миша ради доста боље са батеријама напона 1.5 волта. Исто се дешавало и раније са Џинијус СлимСтар комплетом (Genius SlimStar нешто нешто, не сећам се тог модела из 2012.).

Други део проблема је везан за опште успорење система. На системима са слабим процесорима, верујем да долази до прекида улазног сигнала када је заузеће ресурса високо. Ситуација се погоршава ако се користи неки од Блутут (енгл. Bluetooth) стандарда који нису актуелни. Неретко се налазе приступачније тастатуре које користе стандард 2.0 и 3.0 док новијих и нема много. Скупљи комплети користе радио везу која је доста стабилнија. Пробао сам оба стандарда али је резултат увек био исти.

Наставак анализе: бежична слушалица

Рад од куће 2020. године ми је поприлично пријао зато што сам се мало и бавио својим радним окружењем код куће. Лаптоп је добио бежичну тастатуру и миша, почео сам да користим бубице као слушалице (класичне, не оне које се убацују дубоко у ушну шкољку), лаптоп стоји на подизачу за тај модерни изглед и да бих подигао висину екрана. Такође сам купио и своју прву бежичну бубицу за разговор на конференцијама и састанцима.

Модел беше Plantronics Explorer 55 и био сам задовољан читав један дан, док је нисам продао. Испоставило се да та слушалица није за мене (жуља иза увета, мора да се пуни батерија сваки дан) али сам тада открио нешто о чему нисам активно размишљао: режим уштеде енергије за бежичне уређаје и подразумевана подешавања. Логично са обзиром да не волим пуњиве уређаје много и избегавам их ако могу.

Режим уштеде енергије за бежичне, пуњиве уређаје и аутоматско усб суспендовање

Виндоуз оперативни систем подразумевано користи режим уштеде енергије и убацује уређај у режим мировања зарад уштеде батерије. Врло корисна опција која појачава аутономију са тим што ми није јасно да ли је то добро или лоше. Имао сам потешкоћа приликом разговора на бежичној бубици зато што се звук губио на кратко. Ово је заступљеније било код блутут слушалице која је користила пренос везе верзије 2.1 (неки Самсунг модел). Лаптоп подржава стандард верзије 4.2 тако да није био најбољи али далеко беше од најгорег и боље је радила са Plantronics Explorer 55.

Одлазак у подешавања режима рада и потрошње ел. енергије ме је довео до решења: гашење режима уштеде енергије и мировања за блутут у оперативном систему је довео до решавања свих проблема. Потрошња батерије слушалице се повећала али није било ништа драстично нити вредно помена.

Оставићу кључне термине за претрагу, за све Виндоуз кориснике: USB selective suspend. Такође додајем на листу још нешто, може да помогне: Bluetooth Collaboration

Примена логике на линукс базиране системе

На линукс базираним системима постоји уштеда енергије уређаја и користи се иста терминологија за претрагу. Решење проблема код мене је лежало у томе да онемогућим суспендовање усб уређаја које праве проблем уместо да оставим да систем сам одлучи и користи аутоматска подешавања.

За ову операцију сам користио udev и подесио сам да оба Лоџитек сета која имам, К240 и К400 Плус, не користе аутоматско суспендовање. Више детаља о овим функцијама можете наћи на званичној страни линукс кернела 1

Напомена: Постоји могућност да се ово онемогући на нивоу целог система коришћењем grub параметра usbcore.autosuspend=-1 међутим нисам желео да ризикујем због спољних усб дискова које користим. Ако желите да се играте, можете променити GRUB_CMDLINE_LINUX_DEFAULT, додати тај параметар и понового генерисати граб конфигурацију. Трећа опција је коришћење powertop програма, који се показао као најједноставније решење.

Провера аутоматског суспендовања на линукс базираним системима

Провера вредности на нивоу целог система се своди на извлачење вредности на путањи /sys/module/usbcore/parameters/autosuspend:

cat /sys/module/usbcore/parameters/autosuspend

Све различито од вредности -1 значи да је суспендовање омогућено на нивоу целог система.

Друга опција је провера на нивоу индивидуалних уређаја уз следећу команду са детаљима усб уређаја као што су брзина везе и да ли се користи контрола потрошње енергије:

for d in /sys/bus/usb/devices/[0-9]* ; do
  if [[ -e $d/product ]]; then
  echo -e "`basename $d`\t`cat $d/power/control`\t`cat $d/speed`\t`cat $d/product`"
  fi
done

Нажалост, извор ове команде ми више није познат. Свакако, ево једног примера резултата, након покретања команде:

1-4	on	12	USB Receiver
3-3	on	480	Komplete Audio 1
4-1	on	5000	M3 Portable

Колоне показују следеће резултате:

  • прва колона садржи локацију уређаја у /sys/bus/usb/devices/ директоријуму;
  • друга да ли се користи контрола режима рада уређаја;
  • трећа колона је брзина усб уређаја у мегабитима по секунди (Mbps) што је истовремено и индикатор типа усб везе која се користи: усб 1 са спором 1.5 Mbps или брзом 12 Mbps везом, усб 2 са 480 Mbps везом или усб 3 5000 Mbps тј. 10000 Mbps ако користите усб 3.1 друге генерације.

Преглед посебно прављених udev правила

Ево садржаја датотеке коју сам направио за моје потребе:

$ cat /etc/udev/rules.d/91-local.rules
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="046d", ATTR{idProduct}=="c534", ATTR{product}=="Logitech, Inc. Unifying Receiver", TEST=="power/control", ATTR{power/control}:="on"

ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="046d", ATTR{idProduct}=="c52b", ATTR{product}=="Logitech, Inc. Unifying Receiver", TEST=="power/control", ATTR{power/control}:="on"

Изнад видите да сам додао 2 различита Лоџитек сета и користим опције да се аутоматско суспендовање не користи и да урежаји увек буду укључени (енгл. on). Ако би on пребацили у auto онда би активирали аутоматско усб суспендовање.

У остатку текста ћу објаснити како да додате нови уређај и омогућите та udev правила. За потребе мог примера, користићемо спољни аудио интерфејс "Native Instruments Komplete Audio 1".

Извлачење листе ваших усб уређаја

Извлачење листе свих уређаја је врло просто и користи се опција lsusb. Ево једног примера:

$ lsusb
Bus 004 Device 002: ID 0bc2:61b6 Seagate RSS LLC Maxtor HX-M101TCB/GM [M3 Portable 1TB]
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 002: ID 17cc:1830 Native Instruments Komplete Audio 1
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 016: ID 046d:c534 Logitech, Inc. Unifying Receiver
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Добили сте листу усб уређаја који се налазе повезани на ваш рачунар. Након тога можете чак и да извучете детаље неког уређаја. Хајде да извучемо конкретно аудио интерфејс који користим, Native Instruments Komplete Audio 1:

$ lsusb -d 17cc:1830
Bus 003 Device 002: ID 17cc:1830 Native Instruments Komplete Audio 1

Детаље можете видети коришћењем -v опције.

За пример мог уређаја, са свим детаљима, кликните овде
$ lsusb -v -d 17cc:1830

Bus 003 Device 002: ID 17cc:1830 Native Instruments Komplete Audio 1
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass          239 Miscellaneous Device
  bDeviceSubClass         2 
  bDeviceProtocol         1 Interface Association
  bMaxPacketSize0        64
  idVendor           0x17cc Native Instruments
  idProduct          0x1830 
  bcdDevice            0.13
  iManufacturer           1 Native Instruments
  iProduct                4 Komplete Audio 1
  iSerial                 2 00004166
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x0118
    bNumInterfaces          4
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              480mA
    Interface Association:
      bLength                 8
      bDescriptorType        11
      bFirstInterface         0
      bInterfaceCount         3
      bFunctionClass          1 Audio
      bFunctionSubClass       0 
      bFunctionProtocol      32 
      iFunction               0 
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      1 Control Device
      bInterfaceProtocol     32 
      iInterface              4 
      AudioControl Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      1 (HEADER)
        bcdADC               2.00
        bCategory               8
        wTotalLength       0x0077
        bmControls           0x00
      AudioControl Interface Descriptor:
        bLength                 8
        bDescriptorType        36
        bDescriptorSubtype     10 (CLOCK_SOURCE)
        bClockID               41
        bmAttributes            3 Internal programmable clock 
        bmControls           0x07
          Clock Frequency Control (read/write)
          Clock Validity Control (read-only)
        bAssocTerminal          0
        iClockSource           10 
      AudioControl Interface Descriptor:
        bLength                 8
        bDescriptorType        36
        bDescriptorSubtype     11 (CLOCK_SELECTOR)
        bClockID               40
        bNrInPins               1
        baCSourceID(0)         41
        bmControls           0x03
          Clock Selector Control (read/write)
        iClockSelector          9 
      AudioControl Interface Descriptor:
        bLength                17
        bDescriptorType        36
        bDescriptorSubtype      2 (INPUT_TERMINAL)
        bTerminalID             2
        wTerminalType      0x0101 USB Streaming
        bAssocTerminal          0
        bCSourceID             40
        bNrChannels             2
        bmChannelConfig    0x00000000
        iChannelNames          12 
        bmControls         0x0000
        iTerminal               7 
      AudioControl Interface Descriptor:
        bLength                18
        bDescriptorType        36
        bDescriptorSubtype      6 (FEATURE_UNIT)
        bUnitID                10
        bSourceID               2
        bmaControls(0)     0x0000000f
          Mute Control (read/write)
          Volume Control (read/write)
        bmaControls(1)     0x0000000f
          Mute Control (read/write)
          Volume Control (read/write)
        bmaControls(2)     0x0000000f
          Mute Control (read/write)
          Volume Control (read/write)
        iFeature                0 
      AudioControl Interface Descriptor:
        bLength                12
        bDescriptorType        36
        bDescriptorSubtype      3 (OUTPUT_TERMINAL)
        bTerminalID            20
        wTerminalType      0x0301 Speaker
        bAssocTerminal          0
        bSourceID              10
        bCSourceID             40
        bmControls         0x0000
        iTerminal               0 
      AudioControl Interface Descriptor:
        bLength                17
        bDescriptorType        36
        bDescriptorSubtype      2 (INPUT_TERMINAL)
        bTerminalID             1
        wTerminalType      0x0201 Microphone
        bAssocTerminal          0
        bCSourceID             40
        bNrChannels             2
        bmChannelConfig    0x00000000
        iChannelNames          14 
        bmControls         0x0000
        iTerminal               0 
      AudioControl Interface Descriptor:
        bLength                18
        bDescriptorType        36
        bDescriptorSubtype      6 (FEATURE_UNIT)
        bUnitID                11
        bSourceID               1
        bmaControls(0)     0x0000000f
          Mute Control (read/write)
          Volume Control (read/write)
        bmaControls(1)     0x0000000f
          Mute Control (read/write)
          Volume Control (read/write)
        bmaControls(2)     0x0000000f
          Mute Control (read/write)
          Volume Control (read/write)
        iFeature                0 
      AudioControl Interface Descriptor:
        bLength                12
        bDescriptorType        36
        bDescriptorSubtype      3 (OUTPUT_TERMINAL)
        bTerminalID            22
        wTerminalType      0x0101 USB Streaming
        bAssocTerminal          0
        bSourceID              11
        bCSourceID             40
        bmControls         0x0000
        iTerminal               8 
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol     32 
      iInterface              4 
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       1
      bNumEndpoints           2
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol     32 
      iInterface              4 
      AudioStreaming Interface Descriptor:
        bLength                16
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink           2
        bmControls           0x00
        bFormatType             1
        bmFormats          0x00000001
          PCM
        bNrChannels             2
        bmChannelConfig    0x00000000
        iChannelNames          12 
      AudioStreaming Interface Descriptor:
        bLength                 6
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType             1 (FORMAT_TYPE_I)
        bSubslotSize            4
        bBitResolution         24
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            5
          Transfer Type            Isochronous
          Synch Type               Asynchronous
          Usage Type               Data
        wMaxPacketSize     0x00c8  1x 200 bytes
        bInterval               1
        AudioStreaming Endpoint Descriptor:
          bLength                 8
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes         0x00
          bmControls           0x00
          bLockDelayUnits         2 Decoded PCM samples
          wLockDelay         0x0008
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes           17
          Transfer Type            Isochronous
          Synch Type               None
          Usage Type               Feedback
        wMaxPacketSize     0x0004  1x 4 bytes
        bInterval               4
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol     32 
      iInterface              5 
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       1
      bNumEndpoints           1
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol     32 
      iInterface              5 
      AudioStreaming Interface Descriptor:
        bLength                16
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink          22
        bmControls           0x00
        bFormatType             1
        bmFormats          0x00000001
          PCM
        bNrChannels             2
        bmChannelConfig    0x00000000
        iChannelNames          14 
      AudioStreaming Interface Descriptor:
        bLength                 6
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType             1 (FORMAT_TYPE_I)
        bSubslotSize            4
        bBitResolution         24
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            5
          Transfer Type            Isochronous
          Synch Type               Asynchronous
          Usage Type               Data
        wMaxPacketSize     0x00c8  1x 200 bytes
        bInterval               1
        AudioStreaming Endpoint Descriptor:
          bLength                 8
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes         0x00
          bmControls           0x00
          bLockDelayUnits         2 Decoded PCM samples
          wLockDelay         0x0008
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        3
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass       254 Application Specific Interface
      bInterfaceSubClass      1 Device Firmware Update
      bInterfaceProtocol      1 
      iInterface             11 
      Device Firmware Upgrade Interface Descriptor:
        bLength                             9
        bDescriptorType                    33
        bmAttributes                        7
          Will Not Detach
          Manifestation Tolerant
          Upload Supported
          Download Supported
        wDetachTimeout                    250 milliseconds
        wTransferSize                      64 bytes
        bcdDFUVersion                   1.10

Прављење ваших udev правила

Рецимо да желите додати мој уређај, Native Instruments Komplete Audio 1, у листу зарад омогућавања аутоматског суспендовања и контроле струје:

$ echo 'ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="17cc", ATTR{idProduct}=="1830", ATTR{product}=="Native Instruments Komplete Audio 1", TEST=="power/control", ATTR{power/control}:="on"' > /etc/udev/rules.d/91-local.rules

Систем ће направити нову датотеку на изабраној путањи, /etc/udev/rules.d/91-local.rules. Напомињем да можете изабрати другу датотеку али знајте да број, који се префикс самог имена, означава приоритет извршавања. У мом случају, ја користим број 91 зато што личне измене чувам у распону бројева од 90 до 100. На вама је да изаберете број и дефинишете приоритет. Увек проверите шта се налази све у директоријуму са правилима како би могли да знате шта је битно и којим редоследом ће правила бити примењена:

ls /usr/lib/udev/rules.d/
ls /etc/udev/rules.d/

udev упутство каже да се правила из /etc/udev/rules.d/ директоријума последња извршавају стога бих се лично фокусирао на редослед у том директоријуму.

Учитавање ваших udev правила

Учитајте udev правила одмах, без поновног покретања система, коришћењем следеће команде:

udevadm control --reload-rules && udevadm trigger

За крај: употреба ресурса система

Један од потенцијално нерешивих проблема је употреба ресурса самог система. За сад нема ефикасног начина да се реши овај проблем осим да се користи nice команда међутим то захтева посебан чланак због могуће комплексности и анализе која је неопходна пре употребе тог алата.


  1. званична документација на тему управљања усб уређајима: https://www.kernel.org/doc/Documentation/usb/power-management.txt  ↩︎


Написано - Ажурирано
Кратка веза ове стране: 12820
QR код ове стране
QR код ове стране