打印

BULK写失败求助

[复制链接]
2436|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lium|  楼主 | 2013-5-18 21:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
68013A端点EP6OUT的BULK写失败求助,急!!
易用专业的PCI、USB、LED方案正在对68013A采用slavefifo方式进行bulk读写操作
我用EP2做in端点,1024字节,2从缓冲
用EP6做OUT端点,512字节,4从缓冲
沙发
lium|  楼主 | 2013-5-18 21:26 | 只看该作者
我写好了68013A的固件,用CYPRESS的开发工具能够进行实现正确的读写

使用特权

评论回复
板凳
hanwe| | 2013-5-18 21:29 | 只看该作者
搞固件就郁闷,驱动又来整你。。。。

使用特权

评论回复
地板
lium|  楼主 | 2013-5-18 21:30 | 只看该作者
是啊,从SLAVEfifo连接的FPGA端看slavefifo的状态,EP6对应的fifo一直是空的

使用特权

评论回复
5
guoyt| | 2013-5-18 21:31 | 只看该作者
能看下你的代码吗?

使用特权

评论回复
6
lium|  楼主 | 2013-5-18 21:33 | 只看该作者
------------------------------------
// USB30ioctl.h

#ifndef __USB30ioctl__h_
#define __USB30ioctl__h_

#define IOCTL_CTRL_READ  CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_CTRL_WRITE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_BULK_READ  CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_BULK_WRITE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS)
#endif
------------------------------------
// USB30Device.h
....................................

        // Unit number for this device (0-9)
    ULONG                m_Unit;
    KUsbLowerDevice        m_Lower;
    KUsbInterface      m_Interface;
        // Pipe for USB endpoint 2 IN (address 0x82)
    KUsbPipe            m_Endpoint2IN;
        // Pipe for USB endpoint 6 OUT (address 0x6)
    KUsbPipe            m_Endpoint6OUT;
....................................

------------------------------------
// USB30Device.CPP

.............................
    #define m_buffer_size 1048592;
    #define USB_transfer_size 1024
    #define USB_WRITE_SIZE 512
............................

    m_Unit = Unit;
    m_Lower.Initialize(this, Pdo);
    m_Interface.Initialize(
                        m_Lower, //KUsbLowerDevice
        0,        //InterfaceNumber
        1,        //ConfigurationValue
        0        //Initial Interface Alternate Setting    );

    // Initialize each Pipe object
    m_Endpoint2IN.Initialize(m_Lower, 0x82, 1024);
    m_Endpoint6OUT.Initialize(m_Lower, 0x06, 512);

  .............................................
...............................................//批量读,每次1024字节

NTSTATUS USB30Device::USB30_BULK_READ(KIrp I)
{
    NTSTATUS status = STATUS_INSUFFICIENT_RESOURCES;
    t < < "Entering USB30_BULK_READ\n";
    PURB pUrb=NULL;
    USB_current_buffer=m_buffer1;

        pUrb = m_Endpoint2IN.BuildBulkTransfer(
            USB_current_buffer,  // Where data write to?
            USB_transfer_size,  // How much data to read?
            TRUE,        // direction (TRUE = IN)
            NULL        // Link to next URB);
if ( pUrb != NULL)
{
    pUrb->UrbBulkOrInterruptTransfer.TransferFlags =(USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK);

                  status = m_Endpoint2IN.SubmitUrb(pUrb, NULL, NULL,URB_mSecTimeOut);
    t < <"after send SubmitUrb ,status=" < <ULONG(status) < <"\n";
                      //返回0x00000000

            if ( status==0x00000000 )
            {
    dwBytesRead = pUrb->UrbBulkOrInterruptTransfer.TransferBufferLength;
            }
    delete pUrb;
                    pUrb = NULL;
}


    RtlCopyMemory((PUCHAR)Request_Buffer, (PUCHAR)m_buffer1,TotalRead);
                    I.Information() = TotalRead;

  return status;
}
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////批量写,每次512字节
NTSTATUS USB30Device:: USB30_BULK_WRITE(KIrp I)
{    NTSTATUS status = STATUS_INSUFFICIENT_RESOURCES;

    t < < "Entering USB30_BULK_WRITE\n";
    // Declare a memory object
//    KMemory Mem(I.Mdl());
//    KMemory Mem( I.IoctlBuffer());

    Request_Buffer_char= (PUCHAR) I.IoctlBuffer();
    ULONG URB_mSecTimeOut=((PULONG)Request_Buffer_char)[0];

                    UCHAR WrData_Buf        =  Request_Buffer_char+4;
                    ULONG dwBytesSent = 0;
                    PURB pUrb2=NULL;

                  pUrb2 = m_Endpoint6OUT.BuildBulkTransfer(
            WrData_Buf,          // Where the data is from?
            USB_WRITE_SIZE,  // How much data to write?
            FALSE,        // direction (FALSE = OUT)
            NULL,        // Link to next URB
            FALSE,        
             NULL);
    t < < "Entering BuildBulkTransfer ok!\n";

    if ( pUrb2 != NULL)
    {
    // pUrb->UrbBulkOrInterruptTransfer.TransferFlags =
    //    (USBD_TRANSFER_DIRECTION_OUT | USBD_SHORT_TRANSFER_OK);
status = m_Endpoint6OUT.SubmitUrb(pUrb2, NULL, NULL,URB_mSecTimeOut);//
t < <"after send SubmitUrb ,status=" < <ULONG(status) < <"\n";
//返回0x00000102(超时!URB_mSecTimeOut设置为1000ms)


            if ( status==0x00000000 )
        
     {
              dwBytesSent = pUrb2->UrbBulkOrInterruptTransfer.TransferBufferLength;
    }


      delete pUrb2;
    pUrb2 = NULL;
               

}
        

                  I.Information() = dwBytesSent;
    Request_Buffer_char=NULL;
          return status;

}
......................................................

使用特权

评论回复
7
lium|  楼主 | 2013-5-18 21:35 | 只看该作者
因为固件调试工具能够正常进行读写
所以就把问题放在驱动身上
在DS27下把驱动翻了个遍

无果

使用特权

评论回复
8
guoyt| | 2013-5-18 21:37 | 只看该作者
在DS32下重新开发驱动 呢

使用特权

评论回复
9
lium|  楼主 | 2013-5-18 21:40 | 只看该作者
效果一样!

郁闷!!!!!

使用特权

评论回复
10
guoyt| | 2013-5-18 21:58 | 只看该作者
开发工具是  cyconsole 吧

使用特权

评论回复
11
lium|  楼主 | 2013-5-18 22:01 | 只看该作者
是的,正在重新测试,貌视有点苗头了

使用特权

评论回复
12
lium|  楼主 | 2013-5-18 22:11 | 只看该作者
问题已经解决了哈,就是固件的问题!

初始化out端点EP6时候
只做了
SYNCDELAY;                      OUTPKTEND=0x86;
未加
    SYNCDELAY;      EP6BCH= 0x02;  
   SYNCDELAY;          EP6BCL = 0x00;  

这个就是不能写的根本原因

使用特权

评论回复
13
lium|  楼主 | 2013-5-18 22:13 | 只看该作者
不过奇怪的就是cypress的开发工具cyconle居然能写!寒一下!
看来还是集结号的那个版本可以补充一句了:
官方的测试工具,也不可靠哒!

使用特权

评论回复
14
guoyt| | 2013-5-18 22:17 | 只看该作者
I.Information() = dwBytesSent; 这里最好改成    I.Information() = 0;否则会造成死机,不过这个算小问题哈!

使用特权

评论回复
15
yufe| | 2013-5-18 22:19 | 只看该作者
一猜就知道楼主端点搞错了

使用特权

评论回复
16
llia| | 2013-5-18 22:44 | 只看该作者
对于USB我还是个菜鸟,问下楼主,USB BULK out 传输 字节数量有限制么?我用的是EP6做PUT 端点 EP2做IN端点,我想在PC机用cypress的开发工具EZ-USB Control Panel用EP6 out 端点写32个数,然后再用EP2 IN端点拿到EZ-USB Control Panel 上来,但是怎么得到的数都是错误的,急 谢谢了

使用特权

评论回复
17
wangpe| | 2013-5-18 22:45 | 只看该作者
68013的学习相对来说还不难,难的是CYUSB3014的开发。

使用特权

评论回复
18
langgq| | 2013-5-18 22:51 | 只看该作者
碰到过,初始化out端点EP6时候
只做了
SYNCDELAY; OUTPKTEND=0x86;
未加
SYNCDELAY; EP6BCH= 0x02;
SYNCDELAY; EP6BCL = 0x00;

这个就是不能写的根本原因

使用特权

评论回复
19
langgq| | 2013-5-18 22:51 | 只看该作者

如果说驱动有点点问题的话
I.Information() = dwBytesSent; 这里最好改成 I.Information() = 0;否则会造成死机,不过这个算小问题哈!

使用特权

评论回复
20
lium|  楼主 | 2013-5-18 22:55 | 只看该作者
哦,了解了,我再看看

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

915

主题

9578

帖子

3

粉丝