阅读:2234回复:13
为什么read10一次可以读取大于USB芯片buffer的数据量?
计算机读取U盘上的数据时,使用bot方式,每次用read10读取的数据量都远远大于USB芯片的buffer容量。难到不会出现DataOverrun(传送数据大于buffer)的错误吗?
|
|
沙发#
发布于:2004-03-31 18:44
计算机读取U盘上的数据时,使用bot方式,每次用read10读取的数据量都远远大于USB芯片的buffer容量。难到不会出现DataOverrun(传送数据大于buffer)的错误吗? 用BULK方式读 |
|
板凳#
发布于:2004-03-31 19:37
如果你写过USB设备的firmware就知道了,底层驱会自动分包成你的端点所能支持的最大包的。不用你担心。
|
|
地板#
发布于:2004-04-01 08:55
read10是SCSI命令,所以没有考虑到什么usb buffer之类的东西。read10不出自USB协议。
|
|
地下室#
发布于:2004-04-01 09:22
感谢各位大侠的回帖。看来我表达不是很清楚。
我是在作单片机读写U盘,使用pingpong传输(双缓冲)方式遇到问题后才发这个帖子的。也就是说,底层驱动是要自己编程的。 现在的问题是,我的host端的bulk endpoint为2048byte,把它分成了ping buffer 1024 byte和pong buffer 1024 byte。因为U盘是用的bulk only传输方式,所以我想发送一个read10 命令读取32k的数据,我的程序读取方式如下: send read10 命令,读取32k(普通的bulk传输) --->ping buffer in 1k(使用ping pong的bulk传输) --->pong buffer in 1k(使用ping pong的bulk传输) --->重复上面两步,数据完成后用普通的bulk读取csw。 但是程序运行时,第一次ping buffer in时报错,错误原因DataOverrun(传送数据大于buffer) 所以我想问一下各位大侠,在bot传输方式下,如何正确使用pingpong(双缓冲)。 [编辑 - 4/1/04 by hustdj] |
|
5楼#
发布于:2004-04-01 09:34
这个是u盘反应时间的问题 我碰到过
后来65536个也没问题 |
|
|
6楼#
发布于:2004-04-01 09:46
还有地址也不可忽略 反正就是些小问题了 自己想了
|
|
|
7楼#
发布于:2004-04-01 11:16
计算机读取U盘上的数据时,使用bot方式,每次用read10读取的数据量都远远大于USB芯片的buffer容量。难到不会出现DataOverrun(传送数据大于buffer)的错误吗? 如果大于端口的最大传输长度的话,会将数据分割发送 |
|
|
8楼#
发布于:2004-04-01 11:36
感谢各位大侠。最后一个问题。
ping pong 传输时,ping 和 pong的传送数据大小可以不一样长吗? 也就是说,下面的传输合法吗? send read10 命令,读取32k(使用ping pong的bulk传输) --->pong buffer in 1k(使用ping pong的bulk传输) --->ping buffer in 0.5k(使用ping pong的bulk传输) --->重复上面两步,数据完成后用pingpong的bulk读取csw。 |
|
9楼#
发布于:2004-04-01 11:36
感谢各位大侠。最后一个问题。
ping pong 传输时,ping 和 pong的传送数据大小可以不一样长吗? 也就是说,下面的传输合法吗? ping send read10 命令,读取32k(使用ping pong的bulk传输) --->pong buffer in 1k(使用ping pong的bulk传输) --->ping buffer in 0.5k(使用ping pong的bulk传输) --->重复上面两步,数据完成后用pingpong的bulk读取csw。 |
|
10楼#
发布于:2004-04-09 09:17
你的HOST端在请求大于超过端点长度的数据时似乎应该自动分包才成!最大不能超过你的端点所允许的数据包长度.
if(iTransLen>caEpLen[cTransEP]) len=caEpLen[cTransEP]; else len=iTransLen; |
|
11楼#
发布于:2004-04-09 09:19
我刚看懂你的提问
因为不是一个包 :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D |
|
|
12楼#
发布于:2004-04-09 10:16
让各位大侠见笑了。我己经想通了。
我原来以为read10每次最大只能读取USB芯片buffer大小的数据,读完后就必须进行状态检察。 实际不是这样的,就主机端而言。假如主机端buffer为0.5k. 向外部设备发送一个in 32k 的cbw, 可以先in 0.5k,然后把这0。5k数据保存。 然后再in 0.5k, 保存数据。 如此重复,直到数据传完。 最后进行状态检察。 这样就不要发0.5k就进行状态检察一次了。 :) :) :) :) :) :) |
|
13楼#
发布于:2004-04-09 11:46
不错,不错
就是这样子的,呵呵 |
|