红联Linux门户
Linux帮助

Linux USB驱动读数据问题

发布时间:2011-11-09 19:48:55来源:红联作者:七绝梦天
我用USB驱动框架改写了一个与ARM开发板通信的驱动,但是发现从设备读数据时速度很慢。
我把开发板拿到windows下读,速度很快,很正常,如果windows下的帧率是50帧的话,在linux下我用这个驱动征率只有10帧左右!
读得代码如下:[code]static ssize_t device_driver_read(struct file *filp,char *user_buffer,size_t count,loff_t *ppos)
{
struct device_device *dev;
int retval = 0;
int readed_size=0;
int bytes_read;

dev = (struct usb_skel *)filp->private_data;

while(1)
{
retval = usb_bulk_msg(dev->device,
usb_rcvbulkpipe(dev->device, dev->bulk_in_endpoint_addr),
dev->bulk_in_buffer,
dev->bulk_in_size,
&bytes_read, 1000);

if (retval==0)
{
if(readed_size+bytes_read<=count)
{
if(bytes_read>0)
{
if (copy_to_user(user_buffer+readed_size, dev->bulk_in_buffer, bytes_read))
{
err("copy_to_use error");
retval = -EFAULT;
break;
}
}
}
readed_size += bytes_read;
if(bytes_read<64)
{
retval = readed_size;
break;
}
}
else
{
err("usb_bulk_msg error:%d",retval);
break;
}
}

return retval;
}[/code]我测了一下usb_bulk_msg拿一个包最大是64字节,要消耗3毫秒左右的时间,如果我一次拿6400字节的数据,那就要用usb_bulk_msg重复拿100个包,发现这样算下来,速度才21KB/S左右,为什么速度会这么慢?
是我的read函数写错了吗?如果要提高速度应该怎么写?
或者说如果一次要拿大于64字节的数据,要怎么写read函数?
我用的linux版本是 dedora 10 2.6.27.5
设备插入在终端提示下显示的是 Full speed device 是USB2.0的设备
文章评论

共有 1 条评论

  1. 七绝梦天 于 2011-11-10 10:21:19发表:

    高手进来看看啊 我顶
    另求urb异步读数据的代码例子