xiaorain
驱动牛犊
驱动牛犊
  • 注册日期2003-04-21
  • 最后登录2005-11-05
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1656回复:8

2000和XP的USB驱动层次有何不同?USbbuildInterruptOrBulkTransfer()的问题

楼主#
更多 发布于:2005-01-18 10:39
VOID
  UsbBuildGetInterruptOrBulkTransferRequest(
    IN OUT PURB Urb,
    IN USHORT Length,
    IN USBD_PIPE_HANDLE PipeHandle,
    IN PVOID TransferBuffer    OPTIONAL,
    IN PMDL TransferBufferMDL    OPTIONAL,
    IN ULONG TransferBufferLength,
    IN ULONG TransferFlags,
    IN PURB Link
    )同样是这一个函数,用相同的参数,在XP下可以正常的读取数据,但是到了2000下,从BUSHound上抓取的数据显示 Parm Invalid,即参数错误。

我的参数是这样填写的:
设备是DMA传输方式,一次传输4K。但是一个包的大小实际上是64Byte。我用的是BUFFER_IO方式。

现在应用程序调用readfile(),每次读取4096个字节,我在驱动中调用UsbBuildGetInterruptOrBulkTransferRequest(),将它的TransferBufferLength这个参数设置成应用的长度,即4096.
在XP下完全没有问题,但是在2000下从BUShound上就抓到了参数错误的提示。

请问2000和XP的的usb总线驱动有何不同?
为了在2000下可用,是不是TransferBufferLength这个参数只能设置成64呢?

最新喜欢:

dregsdregs
Shentu
驱动小牛
驱动小牛
  • 注册日期2004-04-05
  • 最后登录2011-01-24
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望24点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-18 17:47
实际上你把TransferBufferLength设成4096是没有任何效果的,因为每次收到数据的时候肯定小于或者等于64(一个IN包的大小),一般我们都会在设置TransferFlags的时候把少收数据不报错的那位给置上,所以一个IRP也就只能收到=<64个字节了。。。
至于你碰到的问题倒是满奇怪的,你的2000是sp4的吗?
xiaorain
驱动牛犊
驱动牛犊
  • 注册日期2003-04-21
  • 最后登录2005-11-05
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-19 13:52
谢谢shentu大哥!!
我的2000是sp4的,我设置flags也是usbd_short_transfer_ok|usbd_transfer-direction_In,
这样的结果是:
在xp下可以一次收回来4096个字节(我在bushound上看的),
而在2000下则出现参数错。
设备那边是DMA传输,据设备生产者说设备可以一次向总线发送4096字节,然后总线是一次搬64个字节。
我想是不是xp下总线驱动可以将数据都从总线上收回来然后一次性传给我的设备驱动(可能是总线将数据分包成64字节大小,循环收取数据,并将所有的数据保存好,然后一次性发给我的驱动),而在2000下,必须我分成64字节,然后再让总线驱动收数据,总线不给负责分包。

xiaorain
驱动牛犊
驱动牛犊
  • 注册日期2003-04-21
  • 最后登录2005-11-05
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-19 13:54
如果我指定buffer的长度是64,在XP和2000下都没有问题,可是指定成4096的话,XP的照样没有问题,2000的就不行了,显示参数错误。
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-19 14:24
如果我指定buffer的长度是64,在XP和2000下都没有问题,可是指定成4096的话,XP的照样没有问题,2000的就不行了,显示参数错误。

那就使用64好了,你的每次只串64字节的包,效率可能会比较低
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
xiaorain
驱动牛犊
驱动牛犊
  • 注册日期2003-04-21
  • 最后登录2005-11-05
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-01-19 15:46
就是为了提高速度,我一次要求从总线读取4096数据,以前分成64字节来读的速度太慢了。
按理说在2000和XP下不该有这么大的差别啊。
xiaorain
驱动牛犊
驱动牛犊
  • 注册日期2003-04-21
  • 最后登录2005-11-05
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-01-19 18:20
在配置管道的时候,我把MaxTransferSize设置成64。这个元素好像可以随便设置,windows默认应该是4096。他与每次传输64字节是什么关系??

是总线驱动分成64字节的包从总线上读取数据,而功能驱动只要传输缓冲区长度(这个长度可以自己设置了,比如MaxTransferSize)下去就行了。

AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-01-19 19:56
就是为了提高速度,我一次要求从总线读取4096数据,以前分成64字节来读的速度太慢了。
按理说在2000和XP下不该有这么大的差别啊。
 
你使用的是什么型号的USB芯片,具体硬件方面参考说明文档进行设计。
我以前写的驱动在app中一次读1M都没有问题,当然那个是USB2.0的芯片
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
xiaorain
驱动牛犊
驱动牛犊
  • 注册日期2003-04-21
  • 最后登录2005-11-05
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-01-20 10:01
我知道为什么了,因为我再配置管道的时候,把MaximumTransferSize写成了64,结果导致总线驱动认为我一次最多传64的长度。xp好像不在意这个值,但是2000就会检测这个值,如果我一次性和总线要超过64长度的数据,就会显示参数错。
现在改成了4096就没有问题了。

ALlenzhang你应该把这个值设置成为1M了吧:)).

2000和xp的usb驱动的层次有所不同,2000下包括了一个单独的uhcd.sys,xp没有这个驱动,不知道放到usbhub.sys还是usbd.sys中去了。

Allenzhang能给我讲一下usb2.0和usb1.1的主要差别吗,驱动开发上有何不同?
游客

返回顶部