我正在尝试使用 BULK endpoints 发送 BULK 数据 . 但每次我提交 URB 时,它都不会触发 URB Callback 功能,直到我断开设备 . 一旦我断开连接,它就会触发回调抛出 EPROTO 错误 . 有人遇到类似的情况?我做错了什么吗?我确定我的设备和数据线没问题 . 这是我的代码 . 请建议可能的解决方案

static void urb_received(struct urb *urb)
{
    printk("URB Received\n");

    switch (urb->status) {
    case 0:
        printk("case SUCCESS\n");
        break;
    case -ETIMEDOUT:
        printk("case ETIMEDOUT\n");
        return;
    case -ENOENT:
        printk("case ENONET\n");
        return;
    case -EPROTO:
        printk("case EPROTO\n");
        return;
    case -ECONNRESET:
        printk("case ECONNRESET\n");
        return;
    case -ESHUTDOWN:
        printk("case ESHUTDOWN\n");
        return;
    default:
        printk("unknown urb status %i\n", urb->status);
    }
    printk("URB Received Exit\n");
}

static int myprobe(struct usb_interface *intf,
    const struct usb_device_id *id)
{
    static int intfcount = 0;
    int ret = 0;
    int i;
    struct device *dev = &intf->dev;
    struct mydevice *mydev;
    struct usb_device *usb_dev = interface_to_usbdev(intf);
    struct usb_host_interface *interface_descriptor;
    struct usb_endpoint_descriptor *endpoint;

    if (id->idVendor == MY_DEVICE_ID && id->idProduct == MY_PRODUCT_ID){
        interface_descriptor = intf->cur_altsetting;

        mydev = kzalloc(sizeof(struct mydev), GFP_KERNEL);
        mydev->dev = dev;
        mydev->udev = usb_get_dev(interface_to_usbdev(intf));


        interface_descriptor = intf->cur_altsetting;


        for(i=0; i<interface_descriptor->desc.bNumEndpoints; i++){
            endpoint = &interface_descriptor->endpoint[i].desc;

            if (((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) && 
                (endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK
               ){
                    printk("MEDEV: Bulk out endpoint");
                    mydev->bulk_out_endpointAddr = endpoint->bEndpointAddress;
                    break;
                }
        }

        bulk_urb = usb_alloc_urb(0, GFP_ATOMIC);
        bulk_urb->transfer_buffer = kzalloc(8, GFP_ATOMIC);
        usb_fill_bulk_urb(bulk_urb, usb_dev, usb_sndbulkpipe(mydev->udev, endpoint->bEndpointAddress),
            bulk_urb->transfer_buffer, 8,
            urb_received, NULL);
        printk("BULK OUT PIPE = %d\n", mydev->bulk_out_pipe);

        ret = usb_submit_urb(bulk_urb, GFP_ATOMIC);

        return 0;
    }
}

刚发现一个有趣且同时烦人的事情 .

如果在上面的代码中我用 buffer_length=4 声明 usb_fill_bulk_urb ,那么它完美地工作 . 我可以从我的Android设备获取数据 . 即使我'm creating a buffer size of 8 bytes, I can' t使用 buffer_length=8 . 我也玩过其他数字,但似乎只适用于 buffer_length=4 .

为了确保我使用 lsusb -v 命令检查了我的设备的 endpoints 描述符,该命令显示它的容量为 512 bytes . 同样在我的Android应用程序中,我've taken care off how many bytes I want to read. There is nothing wrong with the android app. I just can' t了解为什么我一次不能发送超过4个字节 . 顺便说一句,如果我发送少于4个字节,这也有效 .