阅读:3977回复:43
十万火急!!
各位朋友、版主大人、高手们:
救救我吧!我的问题咋没有人来帮我了。咋样才能连续对INBUF进行操作! |
|
沙发#
发布于:2002-07-22 09:01
host要连续in请求,device对每个in请求ack(提供源数据,设置相应标志)
|
|
板凳#
发布于:2002-07-22 10:12
host 不断发IN 请求我是在这样做的
bulkControl.pipeNum = 0; inPacketSize=3; // Perform the BULK IN bResult = DeviceIoControl (hDevice, IOCTL_EZUSB_BULK_READ, &bulkControl, sizeof(BULK_TRANSFER_CONTROL), &inBuffer[0], inPacketSize, &nBytes, NULL); 你说的DEVICE 不断响应IN 发ACK 我觉的应该是自动完成的吧!不过我在固件里是这样做的 if( !(EPIO[OUT2BUF_ID].cntrl & bmEPBUSY) ) if(!(EPIO[IN2BUF_ID].cntrl & bmEPBUSY) ) { 这里添加自己的代码!! } 你说的设置相应的标志是?可以详细一点嘛,我是新手!谢谢你了! |
|
地板#
发布于:2002-07-22 11:35
host 不断发IN 请求我是在这样做的 inPacketSize=3;是什么?这里要的不是包数,要一个length,3个字节算什么?最好是最大包(64byte)的整数倍,().连续的意思是要循环DeviceIoControl . 提供数据和设置的意思是检测到(!busy)时装填数据,设置inBC(最大包,不是最大包就不能连续in--意味本次传输结束).剩下的事内核自动完成.firmware初始化时要设置一次inBC--应付第一次in请求,c51我看不懂. [编辑 - 7/22/02 by sunkai] |
|
地下室#
发布于:2002-07-22 13:28
一个包最大是64BYTE 我只想每次传3个字节。因为这样我能较方便的与ADSP2181IDMA 的PM区接口。就是还有你说的要连续的话 是不是必须设置成64BYTE?连续的意思是要循环DeviceIoControl .我是在我的应用程序里完成的。
|
|
5楼#
发布于:2002-07-22 13:30
补充一点 就是2181的PM 区的单元是24BYTE.
|
|
6楼#
发布于:2002-07-22 14:57
不是必须设置成64,3个字节当然也可以,连续进出DeviceIoControl,每次3个字节,这样开销未免太大了.我的原意是,当inBC小于定义的最大包大小时,每次进出最多返回一包,满包传输才能做到:假设想一次最多读回来64KB, length为64K,DeviceIoControl能一次返回64KB数据.我有个想法,看是否可行:inbc用64,前3个数有效,后面61个无效数据,返回时做后处理,抛掉无效数据,应该比每次读3字节的效率高得多,length的大小要多实验才决定,为64的n倍,太大也不好,会等待数据返回,有延迟感,我认为n取2-10不错,最好不大于17(峰值).
你的做法也没有问题,不能连续in的原因多跟firmware和硬件有关 |
|
7楼#
发布于:2002-07-22 15:40
可以尝试一下先把64字节写到OUT BUFFER里,然后让固件3个3个字节的送到2181上。
|
|
8楼#
发布于:2002-07-22 16:47
还有就是2181 的IDMA口需要的读写信号片选信号是我自己在固件里产生的。没有用AN2131产生的RD/WR 。我不明白你说的Length 是啥意思?你说的最大是64K 但是我觉的length的最大值是64
|
|
9楼#
发布于:2002-07-22 17:10
length就是你指的inPacketSize,一次请求的数据字节数,最大达到64kB
|
|
10楼#
发布于:2002-07-22 17:26
nOutBufferSize : sizeof(lpOutBuffer)
This parameter determines the total size of the USB transfer.The transfer size must be less than 64KB. |
|
11楼#
发布于:2002-07-23 08:21
在这里我非常感谢你对我得帮助!谢谢你!
|
|
12楼#
发布于:2002-07-23 09:06
你说的nOutBufferSize : sizeof(lpOutBuffer)和我说的inPacketsize 和outPacketsize 是一个意思吧!还有你说的那个办法,前三个字节有效,但是我要传的是一个文件,不可能在其间插入无效的数据。我还是不太明白你为啥要设置成最大64 设置成3 就不能工作嘛!还有你说的64K 我觉得好象是USB2.0的包大小。USB1.1一次最大只有64byte。
|
|
13楼#
发布于:2002-07-23 11:38
1,你要传的是一个文件,难道不也是一批数据,从2进制上有什么区别?无所谓可能不可能在其间插入无效的数据(我也说了要抛掉无效数据的,为什么不可能插入?理解成低级的编码解码行不行?),只是看是否适用实际情况.
2,我啥时候说过设置成3 就不能工作?\"不是必须设置成64,3个字节当然也可以...你的做法也没有问题\", :( :( :( 3,USB1.1一次最大只有64byte,你理解成是一包的大小MaxPacketSize,我指的length是DeviceIoControl的参数nOutBufferSize,其最大值是64K,跟协议无关,比如length=10*64,底层会安排10次传输事务,每次一个包,再不能理解我也很无奈和无助了, :o |
|
14楼#
发布于:2002-07-23 13:53
谢谢你!不好意思!
我在DeviceIoControl中把参数nOutBufferSize定义成了inPacketsize 和outPacketsize .我不晓得在那里定义成10×64(假设的),你能说得具体一点嘛! bResult = DeviceIoControl (hDevice, IOCTL_EZUSB_BULK_READ, &bulkControl, sizeof(BULK_TRANSFER_CONTROL), &inBuffer[0], inPacketSize, &nBytes, NULL); bResult = DeviceIoControl (hDevice, IOCTL_EZUSB_BULK_WRITE, &bulkControl, sizeof(BULK_TRANSFER_CONTROL), &outBuffer[0], outPacketSize, &nBytes, NULL); 而其中inPacketSize和outPacketSize 等于3。 |
|
15楼#
发布于:2002-07-23 14:26
n=inPacketsize =outPacketsize =10*64;
outBuffer=malloc(n); --------------------------------- bResult = DeviceIoControl (hDevice, IOCTL_EZUSB_BULK_READ, &bulkControl, sizeof(BULK_TRANSFER_CONTROL), &inBuffer[0], inPacketSize, &nBytes, NULL); bResult = DeviceIoControl (hDevice, IOCTL_EZUSB_BULK_WRITE, &bulkControl, sizeof(BULK_TRANSFER_CONTROL), &outBuffer[0], outPacketSize, &nBytes, NULL); ------------------------------------------------ 要这样传多包,就要设置bytecount寄存器为MaxPacketSize,调用DeviceIoControl一次就能搞定;如果bytecount<MaxPacketSize,调用DeviceIoControl一次只能传一包(尽管想传多包) [编辑 - 7/23/02 by sunkai] |
|
16楼#
发布于:2002-07-23 16:28
我现在感觉数据好象没有送出去,只是在EZ_USB内部做了一个交换,没有写到外部片内。如果不接外部片子(总线处于悬空)读回来的数是全‘1’。不明白为啥?
|
|
17楼#
发布于:2002-07-23 16:30
sunkai,你在线呀!你有QQ吗?
|
|
18楼#
发布于:2002-07-23 16:33
外部接上2181。读回来的数 有些正确有些不正确。好奇怪!
|
|
19楼#
发布于:2002-07-23 16:58
信息不全,无法判断,什么叫\"在EZ_USB内部做了一个交换\",不明不白,不好乱讲.
|
|
上一页
下一页