configfs USB小工具write()调用挂起

时间:2019-05-11 19:59:23

标签: c linux usb hid

我正在尝试使用带有内核v4.19.40的configfs从Raspberry Pi Zero模拟HID设备(PS3的游戏手柄)(与here几乎相同的过程)。按照gadget_hid.txt中的说明,我可以得到一个可以运行的原型,该原型可以将按钮的按下操作从Pi Zero发送到USB主机(PS3)。但是,当USB主机上的某些状态发生变化(即启动了某个游戏)时,程序将冻结。 strace说它停留在对configfs HID文件write()(在我的情况下为/dev/hidgX)的/dev/hidg0调用中。 USB主机如何阻止设备发送数据?如果USB主机尚未准备好接收,它会否只是忽略发送的数据?

在调试中,我发现this patch似乎是相关的,但应用后我看不到任何变化。

这是一个小代码示例(完整版本可以在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;
}

0 个答案:

没有答案