Я пытаюсь эмулировать HID-устройство (геймпад для PS3) из Raspberry Pi Zero, используя configfs с ядром v4.19.40 (почти такой же процесс, как описано здесь ).Следуя инструкциям в gadget_hid.txt , я смог получить работающий прототип, способный отправлять нажатия кнопок с Pi Zero на USB-хост (PS3).Однако, когда на USB-хосте изменяется состояние (т. Е. Запускается определенная игра), программа зависает.strace
говорит, что он застрял при вызове write()
в HID-файле configfs (/dev/hidgX
, в моем случае /dev/hidg0
).Как USB-хост может заблокировать устройство от отправки данных?Если USB-хост не готов к приему, не будет ли он просто игнорировать отправленные данные?
При отладке я обнаружил этот патч , который, похоже, был связан, но я не увидел никаких изменений после примененияit.
Вот небольшой пример кода (полную версию можно найти в gadget_hid.txt ), который вызывает ту же проблему:
int main(int argc, const char *argv[]) {
int fd = 0;
char report[8];
int to_send = 8;
fd_set rfds;
if ((fd = open("/dev/hidg0", O_RDWR, 0666)) == -1) {
perror("/dev/hidg0");
return 3;
}
while (1) {
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
// Generate some data to send
fill_report(&report);
// Gets stuck here
write(fd, report, to_send);
}
close(fd);
return 0;
}