Как использовать нажатие клавиши для пробуждения приостановленного ноутбука при использовании KVM-переключателя?

Вопрос или проблема

Я использую беспроводную клавиатуру Logitech с ресивером Logitech Unifying, подключенным к коммутатору KVM. Я создал сочетание клавиш systemd для режима ожидания для ноутбука Lenovo IdeaPad. Крышка ноутбука всегда закрыта. Я не могу разбудить Lenovo из режима ожидания, если не открою крышку ноутбука. Как только крышка поднята, ноутбук просыпается. Я хочу иметь возможность разбудить ноутбук, не поднимая крышку. Я не уверен, как это сделать.

Я попробовал два варианта, ни один из них не сработал. Во-первых, я включил файл пробуждения для ресивера Logitech Unifying (proc/acpi/wakeup). Он действительно разбудил ноутбук, когда я использовал клавиатуру. Проблема заключалась в том, что ноутбук просыпался примерно через пять минут без какого-либо ввода с моей стороны. Никакой активности ни от клавиатуры, ни от чего-либо еще. Во-вторых, я попробовал исправление, описанное по адресу Как заставить беспроводную USB-клавиатуру разбудить Ubuntu 13.10 из режима ожидания? Та же проблема, что и первая – ноутбук просыпается в непредсказуемые моменты, похоже, сам по себе.

Когда я смотрю на устройства с помощью lsinput, я вижу клавиатуру Logitech. Ей присвоен физический адрес usb-0000:00:14.0-3.1.1:1. Когда я смотрю на proc/acpi/wakeup, я вижу pci:0000:00:14.0. Расширения 3.1.1 нет. Если я смотрю на /sys/bus/usb/devices/1-3.1.1, я вижу, что это ресивер Logitech Unifying.

Вот результат команды cat syslog во время события пробуждения:
syslog ноутбука при пробуждении

Как мне все это собрать, чтобы пробуждаться с ввода с клавиатуры, но при этом подавлять другие события пробуждения?

Прошло несколько дней, и я обнаружил это –
“Взаимодействие с встроенным контроллером. Здесь возникают действительно сложные для диагностики проблемы. Встроенный контроллер (EC) содержит проприетарный код для управления периферийными устройствами.”
Из https://wiki.ubuntu.com/Kernel/Reference/ACPITricksAndTips

Достаточно сказать, что это выглядит довольно сложно и, вероятно, специфично для моего Lenovo.

От: Пробуждение USB ИК-пульта из режима ожидания

У меня была такая же проблема, и я также был озадачен тем, что мои USB-устройства не отображаются в /proc/acpi/wakeup. В конечном итоге, несмотря на многие решения, предлагающие, что это необходимо, мне не нужно было включать USB в ACPI.

Вместо этого, включение пробуждения на USB-порту, к которому был подключен мой ИК-датчик, было достаточно.

Найдите идентификатор вашего устройства:

$ lsusb

Шина 002 Устройство 002: ID 8087:8001 Intel Corp.
Шина 002 Устройство 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Шина 001 Устройство 002: ID 8087:8009 Intel Corp.
Шина 001 Устройство 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Шина 004 Устройство 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Шина 003 Устройство 003: ID 13ba:0018 PCPlay Barcode PCP-BCG4209
Шина 003 Устройство 002: ID 1934:5168 Feature Integration Technology Inc. (Fintek) F71610A или F71612A Потребительский инфракрасный приемник/передатчик
Шина 003 Устройство 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

В приведенном выше примере мой идентификатор устройства – 5168.

Поиск по /sys/bus/usb, чтобы найти порт, к которому подключено ваше устройство:

$ grep 5168 /sys/bus/usb/devices/*/idProduct  

/sys/bus/usb/devices/3-13/idProduct:5168

Это указывает на то, что мое устройство подключено к шине 3, порту 13.

Подтвердите, что порт правильный:

$lsusb -t

/: Шина 04.Порт 1: Устр 1, Класс=root_hub, Драйвер=xhci_hcd/6p, 5000M
/: Шина 03.Порт 1: Устр 1, Класс=root_hub, Драйвер=xhci_hcd/14p, 480M
|__ Порт 13: Устр 2, If 0, Класс=Класс, специфичный для поставщика, Драйвер=mceusb, 12M

|__ Порт 14: Устр 3, If 0, Класс=Устройство человека, Драйвер=usbhid, 1.5M
|__ Порт 14: Устр 3, If 1, Класс=Устройство человека, Драйвер=usbhid, 1.5M
/: Шина 02.Порт 1: Устр 1, Класс=root_hub, Драйвер=ehci-pci/2p, 480M
|__ Порт 1: Устр 2, If 0, Класс=Хаб, Драйвер=hub/8p, 480M
/: Шина 01.Порт 1: Устр 1, Класс=root_hub, Драйвер=ehci-pci/2p, 480M
|__ Порт 1: Устр 2, If 0, Класс=Хаб, Драйвер=hub/6p, 480M

Шина 3, порт 13 соответствует шине/порту, возвращаемому grep (3-13)

Проверьте, включено ли пробуждение:

$ cat /sys/bus/usb/devices/3-13/power/wakeup  

Отключено

Включите пробуждение на порту:

$ sudo sh -c 'echo "enabled" > /sys/bus/usb/devices/3-13/power/wakeup'

Проверьте, включено ли пробуждение:

$ cat /sys/bus/usb/devices/3-13/power/wakeup  

Включено

Проверьте ваше устройство, разбудите систему?

Сделайте это изменение постоянным при перезагрузках:

$ sudo nano /etc/rc.local

Добавьте следующие строки после комментариев и перед ‘exit 0’

# Включить Wake on IR для USB шины 3 порта 13.  
echo enabled > /sys/bus/usb/devices/3-13/power/wakeup

Теперь радуйтесь, разбудив ваш ПК с помощью вашего USB-устройства.

Ограничения
Одна проблема с этим подходом заключается в том, что если USB порт, к которому подключено ИК-устройство, изменится, то включение этого порта конкретно не поможет.

Этот пост предлагает способ включения любого ИК-порта в зависимости от устройства, подключенного к нему, с помощью правила Udev.

Ссылки
Kodi, MCE Remote и Ubuntu
Пробуждение из режима ожидания с помощью клавиатуры или мыши
Включение ИК-устройств с помощью правила Udev


#Оригинальный ответ ниже

На этот вопрос есть три ответа, которые могут вам подойти: Пробуждение из режима ожидания с помощью USB-устройства


#Ответ 1 (15 голосов)

введите в терминале:

grep . /sys/bus/usb/devices/*/power/wakeup

Результат для меня показал, что все USB были отключены. Так что теперь введите:

1.

sudo su

Теперь у нас есть права root.

2. У меня 8 USB-портов (вы делаете это для столько USB-портов, сколько у вас есть), так что:

echo enabled > /sys/bus/usb/devices/usb1/power/wakeup
echo enabled > /sys/bus/usb/devices/usb2/power/wakeup
echo enabled > /sys/bus/usb/devices/usb3/power/wakeup
echo enabled > /sys/bus/usb/devices/usb4/power/wakeup
echo enabled > /sys/bus/usb/devices/usb5/power/wakeup
echo enabled > /sys/bus/usb/devices/usb6/power/wakeup
echo enabled > /sys/bus/usb/devices/usb7/power/wakeup
echo enabled > /sys/bus/usb/devices/usb8/power/wakeup

Продолжайте и протестируйте это. Теперь вы можете просыпаться с любой беспроводной или проводной USB-клавиатуры и мыши.

Причина, по которой мы должны включить все из них, заключается в том, что на следующем этапе мы запишем это в rc.local, чтобы выполнить команду после каждой перезагрузки, и после перезагрузки некоторые дистрибутивы Linux (возможно, все) меняют USB-порты.
Нам не нужно беспокоиться о том, что что-то пойдет не так, включив все из них, так как Linux в режиме ожидания или гибернации, он не может использовать Wi-Fi для загрузки чего-либо, так что он не проснется без нашего вмешательства.

Следующий шаг:

3.

sudo nano /etc/rc.local

и вставьте все из шага 2 туда (перед exit 0, конечно).

Вот и все. С этого момента мы можем использовать нашу беспроводную USB и мышь, чтобы проснуться из режима ожидания.

Надеюсь, это сработает для всех вас. Этот гид был создан после тестирования всех других возможных решений в интернете.


#Ответ 2 (7 голосов)

В дополнение к моему гиду выше я хочу добавить эту информацию, потому что недавно я обнаружил, что некоторые беспроводные USB-устройства после пробуждения из сна возвращаются к отключенному состоянию.
Повторяю, только некоторые USB-устройства делают это, не все. Вот почему я не добавил этот маленький гид в свой гайд.

Итак, вы сделали, как я указал выше, и ваш ПК успешно просыпается, но позже в тот же день он вдруг снова не просыпается.

Решение:

Откройте терминал и выполните:

lsusb

В информации о вашем идентификаторе устройства клавиатуры первые 4 цифры – это идентификатор поставщика, а следующие 4 цифры – это идентификатор продукта (см. скриншот)
введите описание изображения здесь

Затем выполните:

sudo nano /etc/udev/rules.d/10-wakeup.rules

Где “wakeup” введите желаемое имя скрипта. Число 10 – это приоритет на случай, если у вас много других правил udev, чем ниже номер, тем раньше ‘правило’ будет выполнено по сравнению с другими.

Скопируйте и вставьте это и замените идентификатор поставщика и идентификатор продукта на идентификатор вашего собственного беспроводного клавиатуры.

ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="062a", ATTRS{idProduct}=="4101" RUN+="/bin/sh -c 'echo enabled > /sys/bus/usb/devices/usb8/power/wakeup'"

*usb8 для меня является моей беспроводной клавиатурой (вы также можете увидеть это на скриншоте (Шина 008)), замените это на ваше собственное.

Ctrl + O для сохранения, Ctrl + X для выхода и перезагрузки.


#Ответ 3

Ответ Павлоса Теодору очень полезен. Я хотел бы добавить, что вы можете найти USB-устройство, к которому подключена ваша мышь/клавиатура при запуске, перенаправив dmesg через grep несколько раз, затем egrep один раз и, наконец, используя tail, чтобы убедиться, что это была самая последняя запись.

Используя этот метод, вы не должны включать пробуждение на ВСЕХ USB-портах.

Я помещаю следующее в мой файл /etc/rc.local, и он находит мой ресивер Logitech каждый раз, даже если он перемещен с одного USB-порта на другой. Просто замените имя вашей клавиатуры или мыши из dmesg на “Logitech K270”

KB="$(dmesg | grep "Logitech K270 как" | grep -o -P "usb.{0,5}" | egrep -o ".{0,3}$" | tail -1)"
echo enabled > /sys/bus/usb/devices/${KB}/power/wakeup

Это работает при запуске, но, похоже, не выполняется при пробуждении из режима ожидания, поэтому мне пришлось поместить файл скрипта в /lib/systemd/system-sleep/. Создайте его, установите как выполняемый и дайте ему имя, начинающееся с двузначного числа от 00 до 99. Мой скрипт выглядит следующим образом, снова замените ваши слова клавиатуры/мыши из dmesg:

#!/bin/sh

# Скрипт действия для включения пробуждения после режима ожидания с помощью клавиатуры или мыши

if [ $1 = post ]
    then
    KB="$(dmesg | grep "Logitech K270 как" | grep -o -P "usb.{0,5}" | egrep -o ".{0,3}$" | tail -1)"
    echo enabled > /sys/bus/usb/devices/${KB}/power/wakeup
fi

if [ $1 = pre ]
    then
    KB="$(dmesg | grep "Logitech K270 как" | grep -o -P "usb.{0,5}" | egrep -o ".{0,3}$" | tail -1)"
    echo enabled > /sys/bus/usb/devices/${KB}/power/wakeup
fi

По какой-то причине, которую я не могу объяснить, оператор ‘post’ пробуждения if срабатывает только при каждом втором пробуждении… но оператор ‘pre’ пробуждения if кажется, срабатывает каждый раз.

По состоянию на 10 сентября 2021 года, сделать состояние включенным постоянным не работает для некоторых устройств на Ubuntu 18+.

Фантастический ответ @Павлоса Теодору, также Ответ 2 здесь, решает эту проблему. Ссылка на пост здесь.

Ответ или решение

Чтобы проснуться из спящего режима вашего ноутбука Lenovo IdeaPad, используя беспроводную клавиатуру Logitech, подключенную через KVM переключатель, вам необходимо выполнить несколько шагов и рекомендаций, чтобы обеспечить правильную настройку устройства и устранить проблемы с непреднамеренными пробуждениями. Мы разберем, как это сделать, и остановимся на wichtigen аспектах для достижения желаемого результата.

Шаг 1: Подключите клавиатуру и проверьте идентификаторы устройств

Сначала убедитесь, что ваша беспроводная клавиатура правильно подключена к KVM переключателю и вашему ноутбуку. Используйте команду lsusb, чтобы отобразить список USB-устройств и определить идентификаторы (id) вашей клавиатуры. Пример команды:

lsusb

Вы увидите список подключенных устройств, например:

Bus 001 Device 002: ID 046d:c537 Logitech, Inc. Unifying Receiver

Запомните или сохраните идентификатор устройства для дальнейших шагов.

Шаг 2: Проверьте возможность пробуждения

Теперь вам нужно проверить, включена ли функция пробуждения для USB-порта. Для этого выполните команду:

cat /sys/bus/usb/devices/*/power/wakeup

Ищите строку, связанную с вашей клавиатурой. Если пробуждение отключено, вам нужно будет его включить.

Шаг 3: Включите пробуждение для USB-устройства

Определите порт, к которому подключено ваше устройство, и включите возможность пробуждения. Например, если ваше устройство подключено к USB-порту /sys/bus/usb/devices/3-14, используйте следующую команду:

echo enabled | sudo tee /sys/bus/usb/devices/3-14/power/wakeup

Шаг 4: Сделайте изменения постоянными

Чтобы изменения сохранялись после перезагрузки, вам нужно добавить соответствующие команды в файл /etc/rc.local. Откройте файл:

sudo nano /etc/rc.local

Добавьте следующее после комментариев, перед строкой exit 0:

echo enabled > /sys/bus/usb/devices/3-14/power/wakeup

Сохраните файл и выйдите из редактора.

Шаг 5: Устранение проблем с непреднамеренным пробуждением

Если после выполнения вышеперечисленных действий ваш ноутбук продолжает пробуждаться без вашего ввода с клавиатуры, возможно, некоторые другие устройства или события вызывают пробуждение. Вам стоит просмотреть список потоков пробуждения с помощью:

cat /proc/acpi/wakeup

Посмотрите, какие устройства могут вызывать пробуждение, и отключите их, если они не нужны. Например, если ваш тачпад или другие устройства могут вызывать пробуждение, именно им необходимо отключить эту функцию.

Шаг 6: Используйте Udev правила (по желанию)

Если вышеуказанный метод не решит проблему, создайте правила Udev, чтобы более точно управлять пробуждением устройства. Создайте новый файл правил:

sudo nano /etc/udev/rules.d/99-wakeup.rules

Добавьте следующее, заменив idVendor и idProduct на ваши значения из команды lsusb:

ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="046d", ATTR{idProduct}=="c537", RUN+="/bin/sh -c 'echo enabled > /sys/bus/usb/devices/$env{DEVPATH}/power/wakeup'"

Заключение

Следуя данным шагам, вы сможете пробуждать ваш ноутбук Lenovo IdeaPad без необходимости открывать крышку, просто нажимая клавиши на клавиатуре Logitech. Обратите внимание, что если вы столкнетесь с дальнейшими неполадками, возможно, в BIOS/UEFI вашего устройства необходимо настроить дополнительные параметры, касающиеся управления питанием. Удачи!

Оцените материал
Добавить комментарий

Капча загружается...