新手,求助大家关于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;
}
请问这个部分的报错是出于什么原因呢?
说白了,这个代码在去年都是没问题的,今年重新使用的时候就这样了,换新板子也不行,没有头绪啊。
谢谢各位了!!!
|