hustdj
驱动牛犊
驱动牛犊
  • 注册日期2003-06-06
  • 最后登录2008-07-02
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
阅读:2234回复:13

为什么read10一次可以读取大于USB芯片buffer的数据量?

楼主#
更多 发布于:2004-03-31 18:28
计算机读取U盘上的数据时,使用bot方式,每次用read10读取的数据量都远远大于USB芯片的buffer容量。难到不会出现DataOverrun(传送数据大于buffer)的错误吗?
boycn
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2010-08-21
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-03-31 18:44
计算机读取U盘上的数据时,使用bot方式,每次用read10读取的数据量都远远大于USB芯片的buffer容量。难到不会出现DataOverrun(传送数据大于buffer)的错误吗?  

用BULK方式读
zf_98412
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2004-08-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-03-31 19:37
如果你写过USB设备的firmware就知道了,底层驱会自动分包成你的端点所能支持的最大包的。不用你担心。
windyguy
驱动牛犊
驱动牛犊
  • 注册日期2003-05-07
  • 最后登录2004-05-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-04-01 08:55
read10是SCSI命令,所以没有考虑到什么usb buffer之类的东西。read10不出自USB协议。
hustdj
驱动牛犊
驱动牛犊
  • 注册日期2003-06-06
  • 最后登录2008-07-02
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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]
SUNSHANGXIN
驱动老牛
驱动老牛
  • 注册日期2002-11-19
  • 最后登录2009-08-01
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望19点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-04-01 09:34
这个是u盘反应时间的问题 我碰到过
后来65536个也没问题
[b]苍白的,不是文字,是人的思想 虚伪的,不是网络,是人的灵魂 伤心的,不是爱情,是人的心灵 难忘的,不是容貌,是人的思诀 黎明的曙光早已不见了夕日的辉煌 东方的日出早就失去了往日的灿烂 而我也尽脱了昨日的笑容去迎接明天的枯涩 [/b]
SUNSHANGXIN
驱动老牛
驱动老牛
  • 注册日期2002-11-19
  • 最后登录2009-08-01
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望19点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-04-01 09:46
还有地址也不可忽略 反正就是些小问题了 自己想了
[b]苍白的,不是文字,是人的思想 虚伪的,不是网络,是人的灵魂 伤心的,不是爱情,是人的心灵 难忘的,不是容貌,是人的思诀 黎明的曙光早已不见了夕日的辉煌 东方的日出早就失去了往日的灿烂 而我也尽脱了昨日的笑容去迎接明天的枯涩 [/b]
jiangyiyong
驱动大牛
驱动大牛
  • 注册日期2002-11-28
  • 最后登录2004-08-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-04-01 11:16
计算机读取U盘上的数据时,使用bot方式,每次用read10读取的数据量都远远大于USB芯片的buffer容量。难到不会出现DataOverrun(传送数据大于buffer)的错误吗?  


如果大于端口的最大传输长度的话,会将数据分割发送
我来自中国 抵制日货
hustdj
驱动牛犊
驱动牛犊
  • 注册日期2003-06-06
  • 最后登录2008-07-02
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
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。



hustdj
驱动牛犊
驱动牛犊
  • 注册日期2003-06-06
  • 最后登录2008-07-02
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
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。



zf_98412
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2004-08-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-04-09 09:17
你的HOST端在请求大于超过端点长度的数据时似乎应该自动分包才成!最大不能超过你的端点所允许的数据包长度.

if(iTransLen>caEpLen[cTransEP])
  len=caEpLen[cTransEP];
else
  len=iTransLen;
SUNSHANGXIN
驱动老牛
驱动老牛
  • 注册日期2002-11-19
  • 最后登录2009-08-01
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望19点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
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
[b]苍白的,不是文字,是人的思想 虚伪的,不是网络,是人的灵魂 伤心的,不是爱情,是人的心灵 难忘的,不是容貌,是人的思诀 黎明的曙光早已不见了夕日的辉煌 东方的日出早就失去了往日的灿烂 而我也尽脱了昨日的笑容去迎接明天的枯涩 [/b]
hustdj
驱动牛犊
驱动牛犊
  • 注册日期2003-06-06
  • 最后登录2008-07-02
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
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就进行状态检察一次了。
 :) :) :) :) :) :)
Shentu
驱动小牛
驱动小牛
  • 注册日期2004-04-05
  • 最后登录2011-01-24
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望24点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-04-09 11:46
不错,不错
就是这样子的,呵呵
游客

返回顶部