metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
阅读:3528回复:8

请教,关于USB Bulk传输的数据量的问题

楼主#
更多 发布于:2004-08-05 11:11
Usb的Bulk传输的传输量有限制吗?
我在Usb设备驱动中定义的MaxTransferSize为10M;驱动中的write()使用DS自生成的函数。超时设为1000L。使用ISP1581Usb接口芯片(有四字节DMA计数器),MaxPackageSize为512,外接8M Ram,固件设计为DMA传输方式。写好驱动程序加载成功。开始传输,当一次传输的数据量为528、2M、3M时没有问题,但当传输量大于4M时就会出错。使用SoftIce跟踪,他报了内核异常(在汇编代码情况下(系统自己的程序),在源程序中未报(我编的驱动程序))。不知什么原因?能帮我解释一下吗?
新手上路,请多关照.
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-05 16:28
如果是Intel的Host Controller,那么一个URB携带的数据量限制就是4M,多了肯定会出错!因此不建议内核里面一次携带这么多数据。
metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-06 01:58
谢谢jinghuiren大侠。那我现在该怎么办?
我想在驱动程序中解决这个问题,不想让应用程序来解决。这样好吗?你说的“不建议内核里面一次携带这么多数据。”是不是建议最好由应用程序来解决这个问题的意思?
如果在驱动中解决这个问题,就要自己分包发送了。你能给我一个着方面的例子吗?最好是DS的。或者告诉我在哪能找到这方面的东东?谢谢了先。
新手上路,请多关照.
metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-08-06 02:27
刚才作了个测试,使用DMA方式,在应用程序中,先发一个DMA起始包通知固件程序即将发送的DMA数据长度(200Bytes),然后连续调用WriteFile函数,向ISP1581发送两次Bulk传输(每次100Bytes),但固件程序只处理了第一次的100Bytes数据,并处于等待DMA传输循环中,而第二次的Bulk传输却发不下去。怎么办呢?大侠再帮我看一下吧。
新手上路,请多关照.
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-08-06 09:33
你可以这样做:
设立个循环,循环里调用WriteFile函数,每次WriteFile发送64K数据下去,设备里收到中断就读数据。这样效率就不错,不需要每次让内核携带4M这么大的数据。
metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-08-06 12:32
再次感谢。
做测试时的问题找到了,是因为发的数据量少与Bulk管道的MaxPackageSize,固件程序还在等DMA数据,应用程序却完成了数据本次的传输。而第二次的传输请求被挡住了进行不了,所以就...了。将第一次的传输量改为MaxPackageSize的整数倍,就没问题了。
你说的办法的确是没问题的。但我想知道如果内核携带了很大的数据,会有什么问题(知道这样好像不是很好,但了解的不是很清晰)?因为是第一次作驱动,而调用我的驱动的是一个DLL(可能)。具体说,我完成设备的通信驱动他完成设备的功能驱动,老板又要求符合规范。我却不知什么样的才是符合规范的。所以才这样做(看很多例子中都是使用这种驱动中循环的做法)来减少DLL的工作。
新手上路,请多关照.
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-08-06 14:07
因为内核状态下的内存资源是有限的,再说USB的带宽也是有限的,如果你一个设备占用了太多的资源,虽然也是允许的,但很容易导致问题,再说,如果你确实是实时大批量的数据传输,这样也是允许的,可是这样就没有灵活性了。因此通常都是64K或者几百k,上兆的就很少了。
metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-08-06 14:36
欧,是这样的。谢谢你。
再问个低级问题,我的BULK传输是使用METHOD_DERICT_IO方式的,也就是并未在内核中另外开辟一个10M存储空间,我想仅是开辟了一个描述这10M空间的映射。(这10M空间是不是在调用(WriteFile)时,被系统锁住了,这是不是也算占用了内核资源?)。然后再将这这样也不行吗?
另外,能帮我看一下另一个问题吗?
http://www.driverdevelop.com/forum/html_74878.html?1091774122
[能帮我解释一下USB打印机USB端口传输的通常做法]
谢谢

[编辑 -  8/6/04 by  metalwing]

[编辑 -  8/6/04 by  metalwing]

[编辑 -  8/6/04 by  metalwing]
新手上路,请多关照.
zhyf2008
驱动牛犊
驱动牛犊
  • 注册日期2003-11-07
  • 最后登录2008-05-01
  • 粉丝0
  • 关注0
  • 积分33分
  • 威望5点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-08-06 15:16
Usb的Bulk传输的传输量有限制吗?
我在Usb设备驱动中定义的MaxTransferSize为10M;驱动中的write()使用DS自生成的函数。超时设为1000L。使用ISP1581Usb接口芯片(有四字节DMA计数器),MaxPackageSize为512,外接8M Ram,固件设计为DMA传输方式。写好驱动程序加载成功。开始传输,当一次传输的数据量为528、2M、3M时没有问题,但当传输量大于4M时就会出错。使用SoftIce跟踪,他报了内核异常(在汇编代码情况下(系统自己的程序),在源程序中未报(我编的驱动程序))。不知什么原因?能帮我解释一下吗?


好象USB协议里说的不多
游客

返回顶部