免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3305 | 回复: 5
打印 上一主题 下一主题

Linux USB驱动读数据问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-09 19:19 |只看该作者 |倒序浏览
我用USB驱动框架改写了一个与ARM开发板通信的驱动,但是发现从设备读数据时速度很慢。
我把开发板拿到windows下读,速度很快,很正常,如果windows下的帧率是50帧的话,在linux下我用这个驱动征率只有10帧左右!
读得代码如下:
  1. static ssize_t device_driver_read(struct file *filp,char *user_buffer,size_t count,loff_t *ppos)
  2. {
  3.         struct device_device *dev;
  4.         int retval = 0;
  5.         int readed_size=0;
  6.         int bytes_read;

  7.         dev = (struct usb_skel *)filp->private_data;
  8.        
  9.         while(1)
  10.         {
  11.                 retval = usb_bulk_msg(dev->device,
  12.                                           usb_rcvbulkpipe(dev->device, dev->bulk_in_endpoint_addr),
  13.                                           dev->bulk_in_buffer,
  14.                                           dev->bulk_in_size,
  15.                                           &bytes_read, 1000);
  16.        
  17.                 if (retval==0)
  18.                 {
  19.                         if(readed_size+bytes_read<=count)
  20.                         {
  21.                                 if(bytes_read>0)
  22.                                 {
  23.                                         if (copy_to_user(user_buffer+readed_size, dev->bulk_in_buffer, bytes_read))
  24.                                         {
  25.                                                 err("copy_to_use error");
  26.                                                 retval = -EFAULT;
  27.                                                 break;
  28.                                         }
  29.                                 }
  30.                         }
  31.                         readed_size += bytes_read;
  32.                         if(bytes_read<64)
  33.                         {
  34.                                 retval = readed_size;
  35.                                 break;
  36.                         }
  37.                 }
  38.                 else
  39.                 {
  40.                         err("usb_bulk_msg error:%d",retval);
  41.                         break;
  42.                 }
  43.         }

  44.         return retval;
  45. }
复制代码
我测了一下usb_bulk_msg拿一个包最大是64字节,要消耗3毫秒左右的时间,如果我一次拿6400字节的数据,那就要用usb_bulk_msg重复拿100个包,发现这样算下来,速度才21KB/S左右,为什么速度会这么慢?
是我的read函数写错了吗?如果要提高速度应该怎么写?
或者说如果一次要拿大于64字节的数据,要怎么写read函数?

论坛徽章:
0
2 [报告]
发表于 2011-11-09 19:23 |只看该作者
我用的linux版本是 dedora 10 2.6.27.5
设备插入在终端提示下显示的是 Full speed device 是USB2.0的设备

论坛徽章:
0
3 [报告]
发表于 2011-11-10 10:19 |只看该作者
求高手 我顶
另求使用URB异步读数据的例子

论坛徽章:
0
4 [报告]
发表于 2014-06-21 20:25 |只看该作者
你的hub是1.1设备的,FULL speed 表示1.1,2.0是HIGH SPEED,你找个2.0的主机试试,一包能传512

论坛徽章:
3
卯兔
日期:2013-08-26 22:14:57未羊
日期:2013-09-08 19:16:05未羊
日期:2014-10-23 10:34:12
5 [报告]
发表于 2014-06-22 18:46 |只看该作者
fedora上的USB host驱动没装好吧

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
6 [报告]
发表于 2014-06-23 08:25 |只看该作者
copy_to_user
打点看看这个要多长时间?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP