LIUTANG
驱动大牛
驱动大牛
  • 注册日期2001-03-30
  • 最后登录2020-12-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望58点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:9686回复:29

如何发送多个包

楼主#
更多 发布于:2001-09-11 19:28
    请教各位高手,在DRIVERWORK所生成的BULK传输的例子里,如果数据长度大于最大传输包尺寸时只发送一个包,那么如果我想把所有数据都发送出去应该怎么做呢?比如有19个包想放在一帧里发送?

最新喜欢:

worldwarworldw...
qiuzhenqing
驱动牛犊
驱动牛犊
  • 注册日期2006-07-13
  • 最后登录2009-11-09
  • 粉丝0
  • 关注0
  • 积分610分
  • 威望62点
  • 贡献值0点
  • 好评度61点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2007-08-30 16:50
要求时间特性,干嘛用bulk传输啊,用等时传输方式才能保证时间上的特性
NorthMelon
驱动牛犊
驱动牛犊
  • 注册日期2004-06-15
  • 最后登录2004-06-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-06-15 11:53
如果是用driverstudio开发包中的driverworks开发的驱动,可以用如下方式来设置最大传输包的长度,在OnStartDevice功能里添加代码,但要在ActiveConfigration之前,例如一个KUsbPipe变量m_bulkEp1Out,可以增加如下代码来实现,
   m_bulkEp1Out.SetMaximumTransferSize(64 * 1024);
尺寸可以自己指定。如果不设置的话系统默认的是4096B.
我试过1M的尺寸,没有问题,但不需要太大,达到一定的大小之后速度也不会提高上去,所以自己要权衡一下。

如果是用DDK开发的驱动,可以在USBD_CreateConfigurationRequestEx功能实现后来设置。
创新是开发者的灵魂!
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-09-25 21:34
[QUOTE]原本由 singwoo 发表
[B]to sunkai:
  谈不上指教,为了共同爱好而互相学习。
对于你的这个问题,我的看法如下:
  1。如果你的A/D的连续的平均数据传输量有1MB/S或1MB/S左右,那么你的这个系统就很难实现。因为BULK传输的最大传输量是1.216MB(每祯19个包),而且BULK传输的数率是无法保证的。所以,你不能期望每祯都传15个包。
 2。如果你的A/D的连续的平均数据传输量远小于1MB/S,但瞬时传输率远大于1MB/S的话。则可通过大的缓冲区来实现。其实,就是把A/D传输与USB传输分开来对待。就让A/D已恒定的高速率传进来,FIFO溢出时把数据写入缓冲区,而USB传输只对缓冲区进行操作。这样的话,只要A/D的平均传输量远小于1MB/S,USB传输就没有问题。就象一个8KHZ的麦克风照样可以在1KHZ的USB总线上传输一样。

再次说明,我对你的系统并不熟悉,以上不一定正确。


 [/B][/QUOTE]

讲解的非常有用,多谢了。我的系统当然不需要那么高的传输速率,能达到500KB/s我就要烧高香了,受很多因素的限制目前只有可怜的100k。BULK传输的数率是无法保证的是个颇令人头痛的问题。
singwoo
驱动牛犊
驱动牛犊
  • 注册日期2001-09-10
  • 最后登录2002-02-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-09-25 15:21
to sunkai:
  谈不上指教,为了共同爱好而互相学习。
对于你的这个问题,我的看法如下:
  1。如果你的A/D的连续的平均数据传输量有1MB/S或1MB/S左右,那么你的这个系统就很难实现。因为BULK传输的最大传输量是1.216MB(每祯19个包),而且BULK传输的数率是无法保证的。所以,你不能期望每祯都传15个包。
 2。如果你的A/D的连续的平均数据传输量远小于1MB/S,但瞬时传输率远大于1MB/S的话。则可通过大的缓冲区来实现。其实,就是把A/D传输与USB传输分开来对待。就让A/D已恒定的高速率传进来,FIFO溢出时把数据写入缓冲区,而USB传输只对缓冲区进行操作。这样的话,只要A/D的平均传输量远小于1MB/S,USB传输就没有问题。就象一个8KHZ的麦克风照样可以在1KHZ的USB总线上传输一样。

再次说明,我对你的系统并不熟悉,以上不一定正确。


singwoo
lig
lig
驱动牛犊
驱动牛犊
  • 注册日期2001-04-24
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-09-25 09:45
这里我有一个问题,一帧在协议上不是说最多只能19个packet吗?你用的是不是USB2.0的协议?
能具体说一下吗?
我只做过一个USB设备,用的AVR8515,8M晶振
一帧只能传4个packet
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2001-09-24 23:13
大佬,我对怎么写驱动几乎一窍不通,更别说怎么通知应用层了。先把这个很好的方案搁在一边吧,等我把手头的做完了有空了再慢慢地啃,如果斑竹有闲暇就搬点代码出来,多谢多谢。
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2001-09-24 09:53
[QUOTE]原本由 sunkai 发表
[B]> wdm层启动了一个线程来查询获取数据
很不错的主意!我也想过这么做,但在wdm层获取的数据怎样传到应用层呢?普通的做法是把应用层的内存传到wdm层来获得数据,请指点。 [/B][/QUOTE]
这个线程可以通知应用层来拿数据啊!
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2001-09-22 13:56
> wdm层启动了一个线程来查询获取数据
很不错的主意!我也想过这么做,但在wdm层获取的数据怎样传到应用层呢?普通的做法是把应用层的内存传到wdm层来获得数据,请指点。
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2001-09-22 13:49
[QUOTE]原本由 singwoo 发表
[B]to sunkai:
   很佩服你对USB钻研的那么细。
“主机根本来不及来读取,导致设备的外存取器数据溢出(用示波器可以看到溢出信号)。
我估测了一下,这样可以达到500-600KB/s,但还是不够10个包/ms,何解?”
   我的愚见是:
BULK IN 事务的过程如下:
1。主机发送IN 令牌,EOP后,等待设备DATA包。
2。设备接到令牌后按令牌中的同步序列发送DATA,EOP。
3。主机收到DATA后,发送ACK。

同步序列由主机产生,设备必须按此同步序列来发送数据。
所以,不存在“主机根本来不及来读取”的问题。 问题在于
你的设备没有与主机同步。

 [/B][/QUOTE]

    谢谢singwoo 。
    我想说清楚点,请你继续指教。我的设备有个FIFO存储器,写存储器由A/D微转换器独立控制(假定为恒定的高速率),指示USB芯片读存储器的信号也是由转换器发出(A/D字节数到达64B时触发一次USB芯片外部中断,端点可写时firmware读入64B数据写入端点),IN令牌到达时,数据被发送。如果主机发送IN令牌的速率不够高(端点清空的速率不够高,可写的速率也随之降低),FIFO就因为读速率过低而满溢,变为不可写,A/D数据因此丢失。
    据此,我想首先要保证主机客户应用程序要维持一个速率比较高的读操作,我能做的是用一个线程专门读数据,每次的数据请求量接近传输极限,假设为15packets * 64B,我想象中的理想情况是这么多数据必须在1个frame中完成,绝对不能被分拆完成。因为我对底层协议一无所知,不敢断定每个frame的确能完成这么大的传输,同时我也不知道是否在客户驱动层(或更底层)也可以人为地控制传输速率。我的系统是按照这样的思路完成的,低速率没问题,高了就不行了,摸不准是设备硬件方面还是软件方面的原因,我甚至都怀疑有没有WINDOWS方面和主机硬件的原因了,请多多指教。
singwoo
驱动牛犊
驱动牛犊
  • 注册日期2001-09-10
  • 最后登录2002-02-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2001-09-19 13:53
引用:
--------------------------------------------------------------------------------
原本由 singwoo 发表

主要原因在于你的DEVICE上。是你的设备来不及处理主机的要求。

我的一个测试如下:
我的设备比较快,一个FRAME 中有94个bulk 包,数据量为6Kb/ms。
相当于6Mb/s。即便如此快,主机的发送请求与设备的响应(指带数据的响应,不是NAK)的比例是3:1(一个FRAME中)。可见主机的响应有多快!
--------------------------------------------------------------------------------
对不起,各位!以上的测试是有问题的。我的包分析器出了些问题,
当时我也没有仔细考虑。正确的测试如下:
一个FRAME 中有34个bulk in 请求包,NAK 为21个。其余13个为数据包。每个数据包PAYLOAD 大小64byte。数据量为13*64=832byte/ms。
相当于832KB/s。主机的发送请求与设备的响应(指带数据的响应,不是NAK)的比例是2.5:1(一个FRAME中)。所以一个FRAME中10个BULK
还是没有问题的。

再次抱歉,上次并非随意乱写的。



singwoo
singwoo
驱动牛犊
驱动牛犊
  • 注册日期2001-09-10
  • 最后登录2002-02-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2001-09-19 09:26
to sunkai:
   很佩服你对USB钻研的那么细。
“主机根本来不及来读取,导致设备的外存取器数据溢出(用示波器可以看到溢出信号)。
我估测了一下,这样可以达到500-600KB/s,但还是不够10个包/ms,何解?”
   我的愚见是:
BULK IN 事务的过程如下:
1。主机发送IN 令牌,EOP后,等待设备DATA包。
2。设备接到令牌后按令牌中的同步序列发送DATA,EOP。
3。主机收到DATA后,发送ACK。

同步序列由主机产生,设备必须按此同步序列来发送数据。
所以,不存在“主机根本来不及来读取”的问题。 问题在于
你的设备没有与主机同步。

singwoo
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2001-09-18 20:34
[QUOTE]原本由 singwoo 发表
[B]

顺便说一句,用一个包分析器,你会看的很清楚的。

但话又说回来,带宽的管理是由USBD来实现的。驱动程序无法安
排一个frame中传输10个bulk 包。但是在设备较少的情况下,
一个frame中传输10个bulk 包是没有问题的。

 [/B][/QUOTE]
没问题?!太好了,你敢肯定?
谢谢了。我可以安心睡觉了。:)
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2001-09-18 20:29
非常谢谢各位!
我的设备已经是用最快的方式来响应主机请求了,firmware中没有任何多余的语句,由硬件决定填充端点的速率,有主机请求就可以应答,在填充端点的速率比较慢的时候会可能出现主机等待设备,在高速率的时候则不会,而是主机根本来不及来读取,导致设备的外存取器数据溢出(用示波器可以看到溢出信号)。
我估测了一下,这样可以达到500-600KB/s,但还是不够10个包/ms,何解?
study
驱动牛犊
驱动牛犊
  • 注册日期2001-05-14
  • 最后登录2010-08-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2001-09-18 20:26
我用cypress的an2131qc芯片,一次发送过64kbytes的包,windows的底层驱动会将其分割。
学无止境
DK-boy
驱动中牛
驱动中牛
  • 注册日期2001-07-22
  • 最后登录2005-09-21
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2001-09-18 13:29
[QUOTE]原本由 singwoo 发表
[B]
主要原因在于你的DEVICE上。是你的设备来不及处理主机的要求。

我的一个测试如下:
我的设备比较快,一个FRAME 中有94个bulk 包,数据量为6Kb/ms。
相当于6Mb/s。即便如此快,主机的发送请求与设备的响应(指带数据的响应,不是NAK)的比例是3:1(一个FRAME中)。可见主机的响应有多快!

顺便说一句,用一个包分析器,你会看的很清楚的。

但话又说回来,带宽的管理是由USBD来实现的。驱动程序无法安
排一个frame中传输10个bulk 包。但是在设备较少的情况下,
一个frame中传输10个bulk 包是没有问题的。

我没有具体做过USB DEVICE,只做USB 主机协议栈的。

 [/B][/QUOTE]
高手!
喜欢清静?享受人生
singwoo
驱动牛犊
驱动牛犊
  • 注册日期2001-09-10
  • 最后登录2002-02-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2001-09-18 12:30

主要原因在于你的DEVICE上。是你的设备来不及处理主机的要求。

我的一个测试如下:
我的设备比较快,一个FRAME 中有94个bulk 包,数据量为6Kb/ms。
相当于6Mb/s。即便如此快,主机的发送请求与设备的响应(指带数据的响应,不是NAK)的比例是3:1(一个FRAME中)。可见主机的响应有多快!

顺便说一句,用一个包分析器,你会看的很清楚的。

但话又说回来,带宽的管理是由USBD来实现的。驱动程序无法安
排一个frame中传输10个bulk 包。但是在设备较少的情况下,
一个frame中传输10个bulk 包是没有问题的。

我没有具体做过USB DEVICE,只做USB 主机协议栈的。

singwoo
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2001-09-18 10:06
[QUOTE]原本由 sunkai 发表
[B][QUOTE]原本由 无心快语 发表
[B]在usbn9604的wdm层你可以在对设备的初始化中这样来设置
m_endpointxin.initialize(m_lower,0x8x,maxsize);
其中maxsize是所要发送的数据的字节数(必须大于64)
在接收的时候把接收的urb中的length值设置为maxsize即可
但usb端相应的设置必须设置正确

 [/B][/QUOTE]
设置maxsize我已经完成了,"但usb端相应的设置必须设置正确",指的是什么?请明示,谢谢. [/B][/QUOTE]
应该是firmware的endpoint descriptor吧?
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2001-09-17 23:05
[QUOTE]原本由 DK-boy 发表
BULK传对时间要求不严格的数据传输是有效的。
在空闭的总线上应该没有问题,即无法完成BULK传输对时间的要求! [/B][/QUOTE]
太糟糕了,真搞不懂USB为什么要这样设计.我该这么办?
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2001-09-17 23:02
[QUOTE]原本由 无心快语 发表
[B]在usbn9604的wdm层你可以在对设备的初始化中这样来设置
m_endpointxin.initialize(m_lower,0x8x,maxsize);
其中maxsize是所要发送的数据的字节数(必须大于64)
在接收的时候把接收的urb中的length值设置为maxsize即可
但usb端相应的设置必须设置正确

 [/B][/QUOTE]
设置maxsize我已经完成了,"但usb端相应的设置必须设置正确",指的是什么?请明示,谢谢.
上一页
游客

返回顶部