Linux 具有 fsfs 功能的 USB 小工具:读取端点 1 不成功

Linux USB gadget with functionfs: reading endpoint 1 not successful

我想在带有 WINUSB 驱动程序的 Windows10-PC 上使用 iMX7-SOM 作为供应商特定设备(小工具)。我正在使用基于 Angstrom 的 Yocto 制作的图像和 Kernel v4.9.166。

我用 libusbgx 配置了小工具,将 functionfs 安装在 /ffs 并将描述符写入 /ffs/ep0。设备按预期枚举,我在端点 0 上获得命令(如 "BIND"、"ENABLE"、"DISABLE" 等)。

久违了...

在端点 0 接收到 "ENABLE" 后,我想打开 /ffs/ep1 并使用 poll() 读取传入数据。但是 poll() 立即 returning 而 read() 从不 returns (仅当我拔出设备时)。在主机端没有应用程序是 运行.

我改用 select() 但结果完全一样。

当我使用 ioctl(fd_of_ep_1, FUNCTIONFS_FIFO_STATUS) 时,我收到错误消息 "Operation not supported"。

int fd = open("/ffs/ep1", O_RDWR);

fd_set read_set;
FD_ZERO(&read_set);
FD_SET(fd, &read_set);

int ret = select(fd + 1, &read_set, NULL, NULL, NULL);
if (ret < 0)
{
    perror("select");
}
else if (FD_ISSET(fd, &read_set))
{
    int foo = ioctl(fd, FUNCTIONFS_FIFO_STATUS);
    if (foo < 0)    perror("ioctl");
    else            fprintf(stdout, "%i\n", foo);

    char buffer[1024];
    if (read(fd, buffer, sizeof(buffer)) < 0)
    {
        perror("ep read");
    }
}

我预计 select/poll 函数会在我打开我的应用程序时 return 并且端点将由主机写入。

我自己找到了答案:

好像只有端点0(ep0)支持轮询功能

当您查看 ep0 (link) you can find that 'poll' has a handler. In contrast the other endpoints (epX) don't have a similar function (link) 支持的操作时。

因此 epX 的 poll() 立即设置标志 POLLIN 和 returns (link)。