当前位置: 技术问答>linux和unix
urb传输过程出错,初学,不知问题在哪,请教!
来源: 互联网 发布时间:2016-11-20
本文导语: 我只是单纯的对read的函数进行了测试,想简单的获取下U盘的设备描述符,代码如下: status的值一直都是-22,提示说是invalid arguments,我也仔细检查过参数,应该没有问题。不过由于我也是刚刚接触linux编程...
我只是单纯的对read的函数进行了测试,想简单的获取下U盘的设备描述符,代码如下:
status的值一直都是-22,提示说是invalid arguments,我也仔细检查过参数,应该没有问题。不过由于我也是刚刚接触linux编程,不知道对参数是不是有什么特殊要求,暂时还察觉不出哪里出了什么问题。所有希望大家帮忙看下,解决问题。再三感谢。
status的值一直都是-22,提示说是invalid arguments,我也仔细检查过参数,应该没有问题。不过由于我也是刚刚接触linux编程,不知道对参数是不是有什么特殊要求,暂时还察觉不出哪里出了什么问题。所有希望大家帮忙看下,解决问题。再三感谢。
static ssize_t skel_read(struct file *file, char *buffer, size_t size, loff_t *ppos)
{
unsigned long p = *ppos;
unsigned int count = size;
struct usb_skel *dev;
struct urb *urb;
dev = (struct usb_skel *)file->private_data;
if(p >= USB_READ_MAXSIZE)
return count ? -ENXIO:0;
if(count > USB_READ_MAXSIZE - p)
count = USB_READ_MAXSIZE - p;
struct usb_ctrlrequest *dr = kmalloc(sizeof(struct usb_ctrlrequest),GFP_NOIO);
if(!dr) return -ENOMEM;
int *ret = NULL;
dr->bRequestType = USB_DIR_IN;
dr->bRequest = USB_REQ_GET_DESCRIPTOR;
dr->wValue = 256;
dr->wIndex = 0;
dr->wLength = 20;
struct urb *urb = usb_alloc_urb(0,GFP_NOIO);
if(!urb) return -ENOMEM;
usb_fill_control_urb(urb,
dev->udev,
usb_rcvctrlpipe(dev->udev,0),
(unsigned char *)dr,
dev->bulk_in_buffer,
count,
NULL,
NULL);
urb->actual_length = 0;
int status = usb_submit_urb(urb,GFP_NOIO);
if(status)
{
printk(KERN_INFO "Status: %d",status);
return status;
}
if(!ret) *ret = urb->actual_length;
if(ret)
{
if(copy_to_user(buffer,dev->bulk_in_buffer,ret))
{
printk(KERN_INFO "Copy to user wrong !n");
return -EFAULT;
}
else
{
*ppos += count;
printk("Read %d bytes form the device !n",ret);
}
}
return status;
}
|
你这个函数我还真没看出有啥问题
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。