jinqihhh 发表于 2019-1-4 18:20

usb gadget驱动报错

新手,求助大家关于arm-Linux中usb gadget驱动的报错问题。代码是师兄写的,之前也测试过没有问题。但是今年拿出来用的时候,只要程序(这个程序也是之前测试通过的)里调用了write函数把数据放入驱动传输,就会报错。
硬件:板子是sama5d31,Linux3.6.9,内核配置已经打开了usb gadget功能
报错内容:start ep1 error --> -108
出现报错的驱动代码:
ssize_t usb_msc_write (struct file * file, const char __user * userbuf, size_t nbytes) //读设备
{
    struct msc_dev *dev =file->private_data;
    struct usb_request *req;
    int status;
    struct usb_ep *ep;
//    struct usb_gadget *gadget = dev->gadget;
//    ssize_t ret = 0;
//    int result;
//   printk("nbytes=%d \n",nbytes);
    if (nbytes < 0)
      return -EINVAL;
    ep = dev->in_ep;
//   printk("usb_msc_write !ep.desc =%d\n", !ep->desc);
    if(nbytes > 128)
    {
      printk("Error :too much bytes to write.\n");
      return 0;
    }
    req = alloc_ep_req(ep, 128);
    if (!req)
    {
        printk("alloc_ep_req(ep, 128) error\n");
      return 0;
    }
    copy_from_user(req->buf, userbuf, nbytes);
    req->length = nbytes;
    req->complete = source_sink_complete; //请求完成函数
    status = usb_ep_queue(ep, req, GFP_ATOMIC); //递交请求
    if (status)
    {
      struct msc_dev *dev = ep->driver_data;
      printk("start %s error--> %d \n", ep->name, status);
      free_ep_req(ep, req);
      req = NULL;
    }
    else
    {
//   printk("usb_ep_queue(ep, req, GFP_ATOMIC) succeed \n");
    }
    //interruptible_sleep_on (&dev->bulkrq);//睡眠,等到请求完成
    wait_for_completion(&dev->bulkrq);
//   printk("sleep back! \n");
//   printk("req->actual=%d \n", req->actual);
    return req->actual;
}


请问这个部分的报错是出于什么原因呢?
说白了,这个代码在去年都是没问题的,今年重新使用的时候就这样了,换新板子也不行,没有头绪啊。
谢谢各位了!!!

页: [1]
查看完整版本: usb gadget驱动报错