Приказ табеле садржаја
Проблем
На линукс базираним системима сам често имао проблема са комплетима тастатура и мишева који се манифестовао као успорење и кашњење приликом уноса текста. Уносим мишем и није толико био страшан међутим унос тастатуром јесте зато што би унос каснио (ви упишете нешто и онда се убрзо све појави са кашњењем од рецимо 0.5-1 секунде). Није ме нервирало много све док нисам кренуо опет да користим Лоџитек тастатуру и миша, модел К240, за музичку продукцију ван виртуелних машина. Када сам у виртуелним машинама, у графичком окружењу, толеришем одређена кашњења и не обраћам пажњу на успореност. Годинама сам радио музичку продукцију у Виндоуз (енгл. Windows) виртуелној машини (Vbox а касније и KVM) тако да ми кашњење заиста не смета. Средином 2020. сам прешао на Битвиг и ово кашњење уноса је почело да се примећује директније. У 2021. години се ситуација погоршала зато што сам престао да користим непотребно јак рачунар и почео да заиста користим athlon 3000g.
Основна анализа
Више година сам мислио да је проблем у батеријама зато што пуњиве АА/ААА батерије користе мањи напон него регуларне батерије (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
команда међутим то захтева посебан чланак због могуће комплексности и анализе која је неопходна пре употребе тог алата.