难以在USB驱动程序中建立批量传输

时间:2015-02-27 17:51:25

标签: linux linux-kernel usb driver linux-device-driver

我尝试使用BULK终结点发送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;
    }
}

刚发现一个有趣的&amp;同时烦人的事。

如果在上面的代码中我使用usb_fill_bulk_urb声明了buffer_length=4,那么它的效果非常好。我可以从我的Android设备获取数据。即使我创建了8字节的缓冲区大小,我也无法使用buffer_length=8。我也玩过其他数字,但似乎只适用于buffer_length=4

确保使用lsusb -v命令检查了设备的端点描述符,该命令显示其容量为512 bytes。同样在我的Android应用程序中,我已经注意了我想读的字节数。 Android应用程序没有任何问题。我无法理解为什么我一次能够发送超过4个字节的原因。顺便说一句,如果我发送少于4个字节,那也可以。

0 个答案:

没有答案