configfs USB-гаджет write () вызывает зависание - PullRequest
1 голос
/ 11 мая 2019

Я пытаюсь эмулировать 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;
}
...