具有functionfs的Linux USB小工具:读取端点1失败

时间:2019-06-25 12:48:44

标签: c linux embedded usb embedded-linux

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

我用libusbgx配置了该小工具,在/ ffs上安装了functionfs并将解密器写入了/ ffs / ep0。该设备已按预期枚举,并且在端点0上获得了命令(例如“ BIND”,“ ENABLE”,“ DISABLE”等)。

好久好...

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

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

当我使用ioctl(fd_of_ep_1,FUNCTIONFS_FIFO_STATUS)时,出现错误消息“不支持操作”。

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函数将返回,并且端点将由主机写入。

1 个答案:

答案 0 :(得分:0)

我自己找到了答案:

似乎只有端点0(ep0)支持轮询功能。

查看ep0(https://api.apixu.com/v1/current.json?key=...&q=California)支持的操作时,您会发现'poll'具有处理程序。相反,其他端点(epX)没有类似的功能(link)。

因此epX的poll()设置了标志POLLIN并立即返回(link)。