Включение/отключение wakeup-событий от устройств в Linux

()

Современные компьютеры могут выходить из спящего режима ("WakeUp") по событиям от переферийных устройств. Это позволяет экономить электричество: например при использовании компьютера в качестве медиа-центра он может находиться в спящем режиме и выходить из него по событию от пульта. Однако в ряде случаев это может доставлять неудобства. Например ноутбук, просыпающийся в сумке по сигналу от беспроводной мыши, на которой случайно была задета кнопка, может оказаться разряженным в самый неподходящий момент.

К счастью в Linux можно включать и выключать wakeup для отдельных устройств. К сожалению сделать это можно только через запись флагов в специальные файлы в недрах SysFS. Какого-либо графического интерфейса для этого не предусмотрено.

Собственно включение и выключение wakeup для устройства производиться путём записи строки "enabled"/"disabled" в файл "wakeup", расположенный в поддиректории "power", директории устройства в недрах SysFS (обычно монтируется как "/sys"). Остаётся определить директорию устройства. Сделать это удобнее всего запустив при отключенном устройстве команду:

sudo udevadm monitor --kernel | grep '/devices/' -m 1

И после этого сразу подключить устройство. В результате получим примерно вот такой вывод:

KERNEL[885240.361166] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1 (usb)

Здесь "/devices/pci0000:00/0000:00:14.0/usb1/1-1" и есть искомый путь. Соответствено включить wakeup для этого устройства можно командой:

echo enabled > /sys//devices/pci0000:00/0000:00:14.0/usb1/1-1/power/wakeup

А выключить командой:

echo disabled > /sys//devices/pci0000:00/0000:00:14.0/usb1/1-1/power/wakeup

Вобщем-то ничего сверхсложного, но задавать режим (если нас не устраивает режим по умолчанию) нужно после каждого подключения устройства. К тому же USB-устройство может получить другой путь если оно подключено в другой порт и/или через USB-хаб. К счастью и здесь есть решение.

Для начала чтобы уйти от абстракции и рассматривать живой пример конкретизируем задачу: нужно отключить wakeup для Microsoft Sculpt Mobile Mouse.

Первым делом нужно узнать VendorID/ProductID нашего USB-устройства. Для этого выполняем команду:

lsusb

В результате получаем примерно вот такой вывод:

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 138a:00ab Validity Sensors, Inc. 
Bus 001 Device 003: ID 04f2:b669 Chicony Electronics Co., Ltd HP HD Camera
Bus 001 Device 034: ID 8087:0aaa Intel Corp. 
Bus 001 Device 046: ID 045e:07b2 Microsoft Corp. 2.4GHz Transceiver v8.0 used by mouse Wireless Desktop 900
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Находим наше устройство. В данном случае оно определилось как "Bus 001 Device 046: ID 045e:07b2 Microsoft Corp. 2.4GHz Transceiver v8.0 used by mouse Wireless Desktop 900". Здесь VendorID это "045e", а ProductID это "07b2". Получив эти данные мы можем воспользоваться ими чтобы написать правила для сервиса udev, ответственного за начальную настройку устройств в Linux.

Правила udev храняться в нескольких локациях. Для пользовательских правил предпочтительной является директория "/etc/udev/rules.d". Создадим в ней файл "99-wakeup.rules" следующего содержания:

SUBSYSTEM=="usb", \
        ENV{DEVTYPE}=="usb_device", \
        ATTR{idVendor}=="045e", \
        ATTR{idProduct}=="07b2", \
        RUN+="/bin/sh -c 'echo disabled > /sys$devpath/power/wakeup'"

Здесь описывается правило, которое в ответ на любое событие от USB-устройства 045e:07b2 выполняет команду, отклчюающую wakeup для этого устройства. Правило начнёт работать после перезагрузки системы. ЧТобы правило начало работать до перезагрузки необходимо "попросить" udev перечитать правила. Делается это командой:

udevadm control --reload

После этого достаточно переподключить устройство и всё должно работать. Если же что-то не работает то надо внимательно всё перепроверить. Если сходу ошибка не видно то можно включить режим отладки udev и внимательно изучить логи. Режим отладки включается командой:

udevadm control --log-priority=debug

Логи можно смотреть командой:

journalctl -f

Отключить режим отладки можно командой:

udevadm control --log-priority=info

На этом всё. Приятной работы!

Ключевые слова: wakeup, udev, linux, udevadm.

Подписаться на обновления: RSS-лента Канал в TamTam Telegram канал Канал в ICQ

Комментарии:

Новый комментарий

Жирный текстКурсивный текстПодчёркнутый текстЗачёркнутый текстПрограммный кодСсылкаИзображение




© 2006-2021 Вадим Калинников aka MooSE
Политика конфиденциальности

https://corvette-americana.com/topics/