wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:2271回复:14

批量传输(bulk)问题,奇怪的现象,进来讨论讨论

楼主#
更多 发布于:2004-10-10 15:21
写usb2.0 EHCI host 驱动遇到的问题:
主机芯片是 vt6202,主机驱动是参考linux 下的驱动写的。 基本上是一样的,但是没有加定时器,和一些和操作系统相关的东西。 目前控制传输没有遇到问题,但批量传输有问题,没有解决。
从机是 isp1581,固件在windows的驱动下没有问题。


现象:
bulk out:
只能正常发出一个包。从机接收正常。主机的qTD Token 描述符里的Status 为 01,意思好象是下一次要发送ping。
这是这个位的英文解释。
1b Do Ping. This value directs the host controller to issue a PING PID to the endpoint.

从第二个开始,从机一点反映都没有,此时从机工作正常,控制传输正常。此时主机的qTD Token 为0x80。而且,显示我要发的数据已经发出去了。奇怪就在这里,明明已经发送下去了,但我的从机怎么会没有收到呢。而且,我感觉,qTD Token 为 80 是正常的呀, 80 位表示
Set to 1 by software to enable the execution of transactions by the Host Controller.

控制传输成功发送完的 qTD Token 也都为 80。



bulk in:
和out 一样,只能正常接收一个包。由于in 没有ping 的概念,所以这时候的 qTD Token 为80,应该属于正常现象。
从接收第二个包的开始,从机明明已经收到in 命令,而且也显示出主机成功把数据取走了,但是,主机这里却显示没有收到任何一个数据。不知道为什么会这样。



更奇怪的现象:
bulk out:
当我在发送一个包的urb中,添加一个长度为空的包。也就是说,向下先传递一个数据包,然后紧接着再传递一个长度为0的数据包。这个时候,从机会把把2个包都准确的接收到。 而且当我继续发送这样的包的时候,都能够接收到。没有出现从机收不到的情况。
跟上面的现象一样,发送完数据的 qTD Token 都为 01。

一次urb......|第二次urb....|...
out16 - out0 | out18 - out0 ... 这样,out16 ,out18,out0数据包都能够正常到达从机


bulk in:
当我发送一个in 包后,正确接收到数据了,再多发一个长度为0的in 包。当我按这样的次序发送的时候,主机能够正确的接收到从机的数据。
(注意,这里的再发一个长度为0的包和out 的不一样,out 的是在同一个urb中,而in 是不同的urb中,也可以说是,out是同一个qh,而不同qtd,in是不同的qh,不同的qtd,可能做过主机驱动的会明白)。

一次urb..|第二次urb..|第三次.|...
in10.....| in0.......|in16...|... 这样,in10,in0,in16 都能够正确接收到数据。


唉,好长啊!描述的够清楚么?
怎么会有这样的现象呢? 这个问题捆扰我快一个月了! 郁闷!
 有了解的讨论讨论吧。  



[编辑 -  10/10/04 by  wdy9927]
metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-10-10 17:57
你好,我也用过ISP1581这个芯片.对于你的问题我是这样理解的:
更奇怪的现象:
bulk out:
当我在发送一个包的urb中,添加一个长度为空的包。也就是说,向下先传递一个数据包,然后紧接着再传递一个长度为0的数据包。这个时候,从机会把把2个包都准确的接收到。 而且当我继续发送这样的包的时候,都能够接收到。没有出现从机收不到的情况。
跟上面的现象一样,发送完数据的 qTD Token 都为 01。

一次urb......|第二次urb....|...
out16 - out0 | out18 - out0 ... 这样,out16 ,out18,out0数据包都能够正常到达从机


bulk in:
当我发送一个in 包后,正确接收到数据了,再多发一个长度为0的in 包。当我按这样的次序发送的时候,主机能够正确的接收到从机的数据。
(注意,这里的再发一个长度为0的包和out 的不一样,out 的是在同一个urb中,而in 是不同的urb中,也可以说是,out是同一个qh,而不同qtd,in是不同的qh,不同的qtd,可能做过主机驱动的会明白)。

一次urb..|第二次urb..|第三次.|...
in10.....| in0.......|in16...|... 这样,in10,in0,in16 都能够正确接收到数据。

在1581芯片中,有一个寄存器(08H),他的低8位的第五位(NOEMPT)表示
包后是否跟0长度包表征包结束.可能是你的这位的问题.
新手上路,请多关照.
wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2004-10-10 18:36
好象有这个可能。

那也就是说我发送,和接收根本就是有错误的。
不然,按理说,如果发送和接收正确,那芯片会自动发一个0长度的包给设备。

metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-10-11 08:44
我不明白你是做HOST还是CLIENT?当这位置上时,发送是自动加上一个
0包,你接收时要以这个0包为结束标识,即在收到0包后表示收完了.接
收时要等到0包才表示收完.
你可能在HOST发送时没加0包,接收时没等0包.
新手上路,请多关照.
wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2004-10-11 09:10
我在做host ,但从机的固件不敢说 100% 正确。 但从机和pc连接是没问题。

我想,问题还是出在我这边。

好象应该是你说的,没发0包。 但如果正常的话,这个0包应该是硬件发送的。 当要发送,或者要接收的数据都完成后,硬件会自动发送一个0包给设备。

这是原文,希望我没理解错。
Note that the Total Bytes To Transfer field may be zero when all the other criteria for executing a transaction
are met. When this occurs, the host controller will execute a zero-length transaction to the endpoint.

如果真是这样的话,那我的问题又是没有0包的话,就说明我的发送和接收的程序还是有问题!  有可能是这样。


还有,最后那个0包,从机应该对它没有反映才对吧。因为我在和pc连接的时候,pc发送一个包从机只产生一次out中断,但当用我的主机,按我的方法的时候,从机会产生2次out中断,0包也产生一次中断。这好象没什么道理呀。

metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-10-12 09:02
你的从机可以调试吗?如果可以的话,你把NOEMPTY位置1(没有0包),看
看是什么情况.如果一切正常的话,表示就是那一位的问题;如果还不
正常,那就有可能是其他问题了.
新手上路,请多关照.
wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2004-10-12 11:10
刚才试了一下 。 还是不行。
情况跟0 一样。

metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-10-12 16:08
这可能是你的发送机制的问题,你在D+,D-线上引出观测点,用仪器(逻
辑分析仪,USB侦测设备)看一下,在你的第二次BULK时,总线上是否有
数据.如果有的话,看看从机是否产生中断,注意开中断.
新手上路,请多关照.
wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2004-10-12 17:19
示波器能不能显示呀。

out 下位机没有中断。
in  下位机有中断。

没有usb分析仪来测量数据。

唉。 看看示波器行不行吧。
metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-10-14 08:37
D+,D-线上的频率太高,示波器不能显示的,用逻辑分析仪看看.
OUT没中断?说明数据没收到(收到的话相应端点应该产生RX中断).
IN有中断,说明数据发送出去了(相应端点产生TX中断).
你最好一次传输的数据量不要太大,要在一个最大分组内传完最好,这
样好看.
新手上路,请多关照.
wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2004-10-14 09:04
out: 主机显示数据成功下去,但从机没有中断

in:  从机有in中断,但主机根本没有收到任何数据


哈,真是弄不清楚到底怎么回事。 老板都快要杀了我了。

哈哈

hjg80
驱动牛犊
驱动牛犊
  • 注册日期2006-07-10
  • 最后登录2007-07-30
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望6点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-07-10 18:01
我也在调usb bulk transfer 遇到和你一样的问题,不知道你怎么解决的?
wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2007-08-02 15:56
哎呀,忘记怎么调的了。

把怎么调的写上来好了。

等我回家给你找找。
oushengfen
驱动牛犊
驱动牛犊
  • 注册日期2007-06-28
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分747分
  • 威望124点
  • 贡献值1点
  • 好评度82点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-08-02 16:11
我不会,帮你们顶一下,
vip0126
驱动牛犊
驱动牛犊
  • 注册日期2006-08-31
  • 最后登录2010-07-12
  • 粉丝0
  • 关注0
  • 积分162分
  • 威望27点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2007-09-05 18:52
搂主怎么解决的?我也遇到相同的问题
游客

返回顶部