我正在尝试使用带有内核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;
}