当前位置:  技术问答>linux和unix

urb传输过程出错,初学,不知问题在哪,请教!

    来源: 互联网  发布时间:2016-11-20

    本文导语:    我只是单纯的对read的函数进行了测试,想简单的获取下U盘的设备描述符,代码如下:   status的值一直都是-22,提示说是invalid arguments,我也仔细检查过参数,应该没有问题。不过由于我也是刚刚接触linux编程...

  我只是单纯的对read的函数进行了测试,想简单的获取下U盘的设备描述符,代码如下:
  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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 在open中成功提交了urb,usb_submit_urb 返回值为0,但是为什么不进 urb回调函数?
  • usb_submit_urb函数的问题
  • 如何在urb回调函数中访问共享资源?
  • 哪位知道URB中ASAP是什么意思?
  • no URB for end 0


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3