Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3977回复:43

十万火急!!

楼主#
更多 发布于:2002-07-22 08:31
各位朋友、版主大人、高手们:
  救救我吧!我的问题咋没有人来帮我了。咋样才能连续对INBUF进行操作!
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-07-22 09:01
host要连续in请求,device对每个in请求ack(提供源数据,设置相应标志)
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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) )       {
                    这里添加自己的代码!!
                   }
                    
    你说的设置相应的标志是?可以详细一点嘛,我是新手!谢谢你了!            
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-07-22 11:35
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) )       {
                    这里添加自己的代码!!
                   }
                    
    你说的设置相应的标志是?可以详细一点嘛,我是新手!谢谢你了!              

inPacketSize=3;是什么?这里要的不是包数,要一个length,3个字节算什么?最好是最大包(64byte)的整数倍,().连续的意思是要循环DeviceIoControl .
提供数据和设置的意思是检测到(!busy)时装填数据,设置inBC(最大包,不是最大包就不能连续in--意味本次传输结束).剩下的事内核自动完成.firmware初始化时要设置一次inBC--应付第一次in请求,c51我看不懂.

[编辑 -  7/22/02 by  sunkai]
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-07-22 13:28
一个包最大是64BYTE 我只想每次传3个字节。因为这样我能较方便的与ADSP2181IDMA 的PM区接口。就是还有你说的要连续的话 是不是必须设置成64BYTE?连续的意思是要循环DeviceIoControl .我是在我的应用程序里完成的。

Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-07-22 13:30
补充一点 就是2181的PM 区的单元是24BYTE.
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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和硬件有关
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-07-22 15:40
可以尝试一下先把64字节写到OUT BUFFER里,然后让固件3个3个字节的送到2181上。
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-07-22 16:47
还有就是2181 的IDMA口需要的读写信号片选信号是我自己在固件里产生的。没有用AN2131产生的RD/WR 。我不明白你说的Length 是啥意思?你说的最大是64K 但是我觉的length的最大值是64
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-07-22 17:10
length就是你指的inPacketSize,一次请求的数据字节数,最大达到64kB
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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.
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-07-23 08:21
在这里我非常感谢你对我得帮助!谢谢你!
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-07-23 09:06
你说的nOutBufferSize : sizeof(lpOutBuffer)和我说的inPacketsize 和outPacketsize 是一个意思吧!还有你说的那个办法,前三个字节有效,但是我要传的是一个文件,不可能在其间插入无效的数据。我还是不太明白你为啥要设置成最大64  设置成3 就不能工作嘛!还有你说的64K 我觉得好象是USB2.0的包大小。USB1.1一次最大只有64byte。
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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

Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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。
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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]
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-07-23 16:28
我现在感觉数据好象没有送出去,只是在EZ_USB内部做了一个交换,没有写到外部片内。如果不接外部片子(总线处于悬空)读回来的数是全‘1’。不明白为啥?
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-07-23 16:30
sunkai,你在线呀!你有QQ吗?
Phoritto
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2002-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-07-23 16:33
外部接上2181。读回来的数 有些正确有些不正确。好奇怪!
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-07-23 16:58
信息不全,无法判断,什么叫\"在EZ_USB内部做了一个交换\",不明不白,不好乱讲.
上一页
游客

返回顶部