我正在尝试使用 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个字节,这也有效 .