Открытие / dev / hidraw2 может зависать с steamcontroller - PullRequest
0 голосов
/ 09 марта 2019

Моя проблема связана с открытием парового контроллера через / dev / hidraw2, что иногда приводит к зависанию программы. Моя самая большая проблема - я не знаю, где сообщить об этой проблеме, поэтому я надеюсь, что кто-то знает, куда идти с этой проблемой.

Проблема: У меня работает arch Linux, к которому подключен контроллер Steam (связанный с предоставленным ключом) Когда я пытаюсь получить доступ к устройству, открыв / dev / hidraw2, моя программа застревает в вызове open. Моя программа просто не возвращается. Также невозможно убить его с помощью kill -9. Единственный способ восстановления - перезагрузить компьютер.

Я уменьшил проблемный код до:

// compiled with gcc main.c
#include <stdio.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <fcntl.h>

int main() {
    for(;;) {
        printf("opening steam controller\n");
        # It doesn't return from the following open
        int fd = open("/dev/hidraw2", O_RDWR | O_NONBLOCK | O_CLOEXEC);

        printf("closing steam controller\n");
        if (fd != -1) {
            close(fd);
        }
        usleep(100000);
    }
    return 0;
}

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

Еще немного информации о моей машине:

$ uname -a
Linux schenker 4.20.7-arch1-1-ARCH #1 SMP PREEMPT Wed Feb 6 18:42:40 UTC 2019 x86_64 GNU/Linux
$ gcc --version                                                                                                   
gcc (GCC) 8.2.1 20181127

Как я могу узнать больше об этой проблеме? Нужно ли погружаться в драйверы парового контроллера? или это больше проблема со слоем hidraw?

Обновление:

Запрошенный dmesg вывод. Потребовалось три попытки воспроизвести ошибку. Кажется, мне кажется подозрительным:

[  141.161817] hid-steam 0003:28DE:1142.0002: Steam Controller 'XXXXXXXXXX' connected
[  141.163527] input: Wireless Steam Controller as /devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1:1.1/0003:28DE:1142.0002/input/input34                                                                                                         
[  151.291873] input: Wireless Steam Controller as /devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1:1.1/0003:28DE:1142.0002/input/input35                                                                                                         
[  152.940759] input: Wireless Steam Controller as /devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1:1.1/0003:28DE:1142.0002/input/input36                                                                                                         
[  155.287349] input: Wireless Steam Controller as /devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1:1.1/0003:28DE:1142.0002/input/input37                                                                                                         
[  160.634001] hid-steam 0003:28DE:1142.0002: Steam Controller 'XXXXXXXXXX' disconnected
[  172.665613] hid-steam 0003:28DE:1142.0002: Steam Controller 'XXXXXXXXXX' connected
[  172.667006] input: Wireless Steam Controller as /devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1:1.1/0003:28DE:1142.0002/input/input38                                                                                                         
[  181.306918] hid-steam 0003:28DE:1142.0002: Steam Controller 'XXXXXXXXXX' disconnected
[  185.465807] hid-steam 0003:28DE:1142.0002: Steam Controller 'XXXXXXXXXX' connected
[  185.467249] input: Wireless Steam Controller as /devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1:1.1/0003:28DE:1142.0002/input/input39                                                                                                         
[  187.030851] input: Wireless Steam Controller as /devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1:1.1/0003:28DE:1142.0002/input/input40                                                                                                         
[  192.673722] hid-steam 0003:28DE:1142.0002: Steam Controller 'XXXXXXXXXX' disconnected
[  196.937743] hid-steam 0003:28DE:1142.0002: Steam Controller 'XXXXXXXXXX' connected
[  196.939272] input: Wireless Steam Controller as /devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1:1.1/0003:28DE:1142.0002/input/input41

Update2 Также вывод некоторых строк:

openat(AT_FDCWD, "/dev/hidraw1", O_RDWR|O_NONBLOCK|O_CLOEXEC) = 3
write(1, "closing steam controller /dev/hi"..., 38closing steam controller /dev/hidraw1
) = 38
close(3)                                = 0
nanosleep({tv_sec=0, tv_nsec=100000000}, NULL) = 0
write(1, "opening steam controller /dev/hi"..., 38opening steam controller /dev/hidraw1
) = 38
openat(AT_FDCWD, "/dev/hidraw1", O_RDWR|O_NONBLOCK|O_CLOEXEC

Эта проблема не ограничивается hidraw2, которая также может возникать на hidraw1 (я полагаю, это зависит от того, к чему подключен настоящий контроллер пара)

Я также замечаю, что когда моя программа застревает, и я вызываю запуск второго экземпляра на другой консоли, она немедленно зависает на open() независимо от состояния выключения / включения контроллера.

1 Ответ

0 голосов
/ 13 марта 2019

Оказывается, ошибка между драйвером hid_steam при взаимодействии с acpid.

Я связался с автором (Родриго Ривас Коста) из драйвера hid_steam, что является правильным решением для LKML.протокол (см. http://vger.kernel.org/lkml/#s2-1)

. Для меня краткосрочным решением является выгрузка hid_steam, так как я обращаюсь к / dev / hidrawX напрямую:

# modprobe -R hid_steam

Родриго уже работает над патчем. AПривет Родриго за то, что он так быстро решил проблему. Спасибо!

...