flycat0101
驱动小牛
驱动小牛
  • 注册日期2002-06-24
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望22点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1320回复:7

请问一个比较简单的问题

楼主#
更多 发布于:2003-08-01 14:33
在PC端的USB驱动中每次向USB设备写入数据时,每一个Write的最大数据量是多少?如果我在USB设备的固件中固定一个Buffer,用来接收每次的Write数据,接收完后才写入。我发现当数据很大时,比如几MB的数据,每次Write时,数据为64KB,请问一下,有没有比这更大的情况?
多谢多谢,给分给分
我思,故我在
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-08-01 14:46
可以,但是你的在驱动例完成,把这些数据通过mdl传到驱动里,然后每次bulid一个64k的urb发动到底层驱动,循环进行,直到把数据传完返回!
flytomoon
驱动巨牛
驱动巨牛
  • 注册日期2003-07-09
  • 最后登录2004-10-18
  • 粉丝1
  • 关注1
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-08-01 15:13
可以,可以把一次DECIVEIOCONTROL的数据大小改变,大小随你自己定,这样就可以实现你的要求了,你用的是68013的开发板吧?
flycat0101
驱动小牛
驱动小牛
  • 注册日期2002-06-24
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望22点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2003-08-01 16:19
多谢
我现在不写PC端的驱动,我主要的问题是在设备固件里。
我想提高我固件的运行速度,在接收PC端的数据时开了一个64KB大小的固定buffer,我担心pc机在每个Write事务中会发送超过64KB的数据,这样的话,我的usb设备就会出现数据丢失的情况。请问一下,有没有超过64KB的Write事务?
我发现我的机器上在传输大文件时都是每次write 64KB的,当然,如果是小文件的话,就不用担心了。
我思,故我在
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-08-01 16:33
一般不会大于64k的,不过我觉得这样的write事务对你固件方没有影响呀,因为即使是64k或者更多,主机每次的out事务中数据量还是一个包1.1是64,2.0是512,因此你固件中每次也就是读取这一个包而已,你不用管主机发多少个,只要你固件里能处理两个连续的包,那么就能处理更多个连续的包
flycat0101
驱动小牛
驱动小牛
  • 注册日期2002-06-24
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望22点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2003-08-01 16:43
一般不会大于64k的,不过我觉得这样的write事务对你固件方没有影响呀,因为即使是64k或者更多,主机每次的out事务中数据量还是一个包1.1是64,2.0是512,因此你固件中每次也就是读取这一个包而已,你不用管主机发多少个,只要你固件里能处理两个连续的包,那么就能处理更多个连续的包

对固件有影响啊,如果我接收满64bytes或者是512bytes就向存储介质写的话,这样就要频繁的调用我的写函数的;而如果我在每次write发完数据,返回CSW前一次写完的话,就省掉了很多的函数调用的入栈、出栈操作,这样也能提高我的执行速度啊。
这时就要预先知道在每次write事务时最大的数据长度(就是CBW中的长度值),我把这个事务中的所有数据都放在这个buffer中,如果buffer太小的话,后面一部分数据就丢失了,所以要这个buffer足够大才行。我向我的U盘中拷贝了一个30MB的文件,发现在开始时CBW中的数据长度都是64KB(0x80),所以我认为开一个64KB的buffer是可以的
我思,故我在
szzwm
驱动牛犊
驱动牛犊
  • 注册日期2003-06-12
  • 最后登录2005-05-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-08-02 00:33
既然你有一个64KB的缓冲,你大可不必担心HOST一次写出的数据会超过你的缓冲。如果真的出现这种情况的话,你在接收满64KB之后优先处理缓冲区里的数据,此时如果主机继续发送数据,固件可以响应NAK信号给主机,主机就会不断重复发送从64KB之后的数据了。当你的固件处理完缓冲区的数据之后,可以继续响应被主机反复传出的“超过64KB”的那部分数据。
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-08-02 12:46
哦,我说的是通用设备的情况,你也没说你做的是u盘呀!就当我前面的没说吧。
游客

返回顶部