nj6961
驱动牛犊
驱动牛犊
  • 注册日期2004-11-17
  • 最后登录2017-01-11
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望221点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:3293回复:20

68013A端点EP6OUT的BULK写失败求助,急!!

楼主#
更多 发布于:2008-04-02 17:02
正在对68013A采用slavefifo方式进行bulk读写操作
我用EP2做in端点,1024字节,2从缓冲
用EP6做OUT端点,512字节,4从缓冲

我写好了68013A的固件,用CYPRESS的开发工具能够进行实现正确的读写

现在正在用DS2.7写驱动,现在写的驱动,能够顺利读取EP2,却不能写入EP6(从SLAVEfifo连接的FPGA端看slavefifo的状态,EP6对应的fifo一直是空的)!

搞固件就郁闷了很久了,好不容易把固件的写搞定,现在驱动又来整我。唉,求大家帮忙了

相关代码如下:
------------------------------------
// 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;

}
......................................................
nj6961
驱动牛犊
驱动牛犊
  • 注册日期2004-11-17
  • 最后登录2017-01-11
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望221点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2008-04-02 17:19
参考ds的例程写的,感觉代码没有太大错误,而且读的部分已经实现
自己先顶哈!!!!!!!!!!111    
meibenchun
驱动牛犊
驱动牛犊
  • 注册日期2008-03-28
  • 最后登录2008-10-28
  • 粉丝0
  • 关注0
  • 积分110分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-04-02 18:07
我也是个新手,我固件都还没搞定呢,郁闷中!!
虚心学习
nj6961
驱动牛犊
驱动牛犊
  • 注册日期2004-11-17
  • 最后登录2017-01-11
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望221点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2008-04-02 18:13
楼上的,同情你!
gcc312628334417
驱动牛犊
驱动牛犊
  • 注册日期2008-03-16
  • 最后登录2008-06-13
  • 粉丝0
  • 关注0
  • 积分630分
  • 威望65点
  • 贡献值1点
  • 好评度64点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-04-02 21:21
我用EP2做in端点,1024字节,2从缓冲
用EP6做OUT端点,512字节,4从缓冲
EP6做OUT端点可以写么?
gcc312628334417
驱动牛犊
驱动牛犊
  • 注册日期2008-03-16
  • 最后登录2008-06-13
  • 粉丝0
  • 关注0
  • 积分630分
  • 威望65点
  • 贡献值1点
  • 好评度64点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-04-02 21:22
DS2.7   很好写的啊
估计你的端点设置的不对
尤其是地址
gcc312628334417
驱动牛犊
驱动牛犊
  • 注册日期2008-03-16
  • 最后登录2008-06-13
  • 粉丝0
  • 关注0
  • 积分630分
  • 威望65点
  • 贡献值1点
  • 好评度64点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-04-02 21:25
我看了
驱动应该没问题
是软件的问题么?
nj6961
驱动牛犊
驱动牛犊
  • 注册日期2004-11-17
  • 最后登录2017-01-11
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望221点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2008-04-03 01:58
引用第4楼gcc312628334417于2008-04-02 21:21发表的  :
我用EP2做in端点,1024字节,2从缓冲
用EP6做OUT端点,512字节,4从缓冲
EP6做OUT端点可以写么?





你的意思是EP6做OUT端点不好?
那明早改改看!

今天晚上在办公室
把驱动能改的地方全部改正了
DS32都用上了
效果还是一样哒
郁闷!
nj6961
驱动牛犊
驱动牛犊
  • 注册日期2004-11-17
  • 最后登录2017-01-11
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望221点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2008-04-03 02:28
引用第6楼gcc312628334417于2008-04-02 21:25发表的  :
我看了
驱动应该没问题
是软件的问题么?


如果驱动没有问题,是固件有问题
那么

我写好了68013A的固件,用CYPRESS的开发工具能够进行实现正确的读写

现在正在用DS2.7写驱动,现在写的驱动,能够顺利读取EP2,却不能写入EP6


如何解释?

难道驱动的人品没有固件调试工具好???????

nj6961
驱动牛犊
驱动牛犊
  • 注册日期2004-11-17
  • 最后登录2017-01-11
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望221点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2008-04-03 18:39
问题已经解决了哈,就是固件的问题!

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

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

不过奇怪的就是cypress的开发工具cyconle居然能写!寒一下!
看来还是集结号的那个版本可以补充一句了:
官方的测试工具,也不可靠哒!



------------------------------------------------------------------------------



如果说驱动有点点问题的话
    I.Information() = dwBytesSent; 这里最好改成    I.Information() = 0;否则会造成死机,不过这个算小问题哈!  
nj6961
驱动牛犊
驱动牛犊
  • 注册日期2004-11-17
  • 最后登录2017-01-11
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望221点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2008-04-03 18:43
不果郁闷依然在继续
板子做了一个版本的两块
由于芯片版本
居然一个成功,另外一个打死都不能枚举
晕死!
CYPRESS官网上关于不能枚举的7大原因我都检查了,都不是
哭!!!
  

附芯片上的ID号码,后面那个台湾的不能枚举哒!郁闷!

能够枚举:
CY7C68013A-
128AXC 0631
B 04 651142



不能枚举
CY7C68013A-
128AXC TWN0525
B 04 629736
nj6961
驱动牛犊
驱动牛犊
  • 注册日期2004-11-17
  • 最后登录2017-01-11
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望221点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2008-04-03 18:47
谢谢6楼,你的言语让我感觉到了“组织”的不可靠
所以今天重新切检查固件
就找到问题了哒!          
nj6961
驱动牛犊
驱动牛犊
  • 注册日期2004-11-17
  • 最后登录2017-01-11
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望221点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2008-04-03 19:38
看来不是我一个人用"台湾货"出问题
下面这个帅哥也是哒
CYPRESS官方论坛上的


http://www.cypress.com/portal/server.pt/gateway/PTARGS_0_654587_739_205_211_43/http%3B/app.cypress.com/cf_apps/design_supports/forums/messageview.cfm?catid=77&threadid=25813



  

cnMichaelXie

Message ID: 30683

  Date Posted: Aug/13/2007 3:15 AM            
 
I have desinged a new board according to the sch file of Dev Board cy4611. When I connect the new board with PC, PC can't identify it by reporting 'Unknowned USB Device!'

I have checked the schematic files for several time and assured there are no difference between mine and the demo's.

But when I connect the board with a EEPROM from the Dev Board, the PC CAN recognized it as 'Cypress EZ-USB FX2 Development Board'quickly. But when I opened the 'EZ-USB Contral Panel', it can not find the cy68013a by reporting 'No Cypress EZ-USB Devices detected.' Why?

The batch number of the CY7C68013A is
'CY7C68013A-
128AXC TWN0525
B 04 631003'

I NEED YOUR HELP!!!

Thank you!  
 
fish_liu06202
驱动牛犊
驱动牛犊
  • 注册日期2008-03-20
  • 最后登录2009-03-30
  • 粉丝0
  • 关注0
  • 积分121分
  • 威望24点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2008-04-04 09:56
楼主能不能帮帮我?我也做这个,只不过有个别地方不同,我用的是EP2做OUT端口,EP6做IN端口,我 写的驱动没弄成,你能不能把你做的发给我让我看一下,固件部分也顺便给我哈,非常谢谢!
E:mail:   fish_liu06202@sina.com
QQ:285741664
meibenchun
驱动牛犊
驱动牛犊
  • 注册日期2008-03-28
  • 最后登录2008-10-28
  • 粉丝0
  • 关注0
  • 积分110分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2008-04-06 21:59
引用第9楼nj6961于2008-04-03 18:39发表的  :
问题已经解决了哈,就是固件的问题!

初始化out端点EP6时候
只做了
 SYNCDELAY;                      OUTPKTEND=0x86;
.......

请问你用2端口做输入时有加
SYNCDELAY;      EP6BCH= 0x02;  
  SYNCDELAY;          EP6BCL = 0x00;  
吗?希望仁兄帮忙哈, 我固件还没写对,很急!谢谢!
虚心学习
nj6961
驱动牛犊
驱动牛犊
  • 注册日期2004-11-17
  • 最后登录2017-01-11
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望221点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2008-04-07 03:47
void TD_Init(void)             // Called once at startup
{


  int i;
   BREAKPT &= ~bmBPEN;      // to see BKPT LED go out TGE
   Rwuen = TRUE;            // Enable remote-wakeup
   OEA=0x03;  //定义A端口的低两位为计算机输出USB端口信息的端口    
   // set the CPU clock to 48MHz
  CPUCS = ((CPUCS & ~bmCLKSPD) | bmCLKSPD1) ;

  // set the slave FIFO interface to 48MHz

         IFCONFIG=0x03;   //外部提供时钟,非反相,SLAVEFIFO模式
      //REVCTL用于控制芯片版本,一般复位后最后两位均为哦,一般在程序中需要设置为11

     //------------------------------------
   SYNCDELAY;
   REVCTL=0x03;      

  // we are just using the default values, yes this is not necessary...
      SYNCDELAY;                    // see TRM section 15.14
  EP1OUTCFG = 0x20;
  SYNCDELAY;                    // see TRM section 15.14
  EP1INCFG = 0x20;
  SYNCDELAY;                    //
  EP4CFG = 0x20;
  SYNCDELAY;                    //
  EP8CFG = 0x20;

   SYNCDELAY;                    // see TRM section 15.14
  EP2CFG = 0xEA;
  SYNCDELAY;                    //
  EP6CFG = 0xA0;


   //复位所有FIFO
         //寄存器FIFO复位的操作是先写入0X80,对主机发送的数据传输进行握手
         //然后依次写入    0x02,0x04,0x06,0x08,将复位各个独立的FIFO
         //最后写入0X00,保存操作
    SYNCDELAY;
    FIFORESET=0x80;            
    SYNCDELAY;                    
    FIFORESET=0x02;
    SYNCDELAY;
    FIFORESET=0x04;
    SYNCDELAY;
    FIFORESET=0x06;
    SYNCDELAY;
    FIFORESET=0x08;
    SYNCDELAY;
    FIFORESET=0x00;

     //-------------------------------------
    
    SYNCDELAY;
    PINFLAGSAB=0x00;     //    SlaveFIFO的FLAGA/FLAGB设置
    SYNCDELAY;            
    PINFLAGSCD=0x00;     //    SlaveFIFO的FLAGC/FLAGD设置

                         // 设置为0,FLAGA=PF;FLAGB=FF;FLAGCEF;FLAGD=EP2PF
                         //A B C 的标志对应的FIFO由FIFOADR来选择
    
    SYNCDELAY;
    FIFOPINPOLAR=0x00;     //FIFO接口引脚极性设置,00表示均为低电平有效
    //----------------------------------------

                          //端点2可编程标志的定义 当缓冲小于  
    SYNCDELAY;
    EP2FIFOPFH=0x90;    //当fifo中数据小于等于1KBytes(1个包)有效 ,每个包为1024字节;        此时FLAGA拉低。
    SYNCDELAY;
    EP2FIFOPFL=0x00;
    //------------------------------------

        SYNCDELAY;
   EP2FIFOCFG=0x0D;     //端点2的SlaveFIFO寄存器配置: 16bit, 使能0长度的IN包,AUTOin模式  

  // out endpoints do not come up armed
  



    SYNCDELAY;
    EP2AUTOINLENH=0x04;     //端点2AUTOIN的包长度高位
    SYNCDELAY;
    EP2AUTOINLENL=0x00;     //端点2AUTOIN的包长度低位

  // since the defaults are double buffered we must write dummy byte counts twice
  for (i=0;i<4;i++)
  {
    SYNCDELAY;                    //
    OUTPKTEND=0x86;
  }
 
 for (i=0;i<4;i++)
  {
    SYNCDELAY;                    //
    EP6BCH= 0x02;                // arm EP2OUT by writing byte count w/skip.
    SYNCDELAY;                    //
    EP6BCL = 0x00;                // arm EP2OUT by writing byte count w/skip.
   }
      SYNCDELAY;
    EP6FIFOCFG=0x11;     //端点6的SlaveFIFO寄存器配置: 16bit, 无使能0长度的包,AUTOout模式                        

  //--------------------------------
  //初始化串口和IOA口
       SYNCDELAY;
  IOA=0;    
  PORTECFG=0x08;//设置PE.3为其交替功能RXD0OUT功能;
   SCON0=0;         //设置串口0方式
  //----------------------------

  // enable dual autopointer feature
  AUTOPTRSETUP |= 0x01;


 
}
nj6961
驱动牛犊
驱动牛犊
  • 注册日期2004-11-17
  • 最后登录2017-01-11
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望221点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
16楼#
发布于:2008-04-11 12:22
引用第10楼nj6961于2008-04-03 18:43发表的  :
不果郁闷依然在继续
板子做了一个版本的两块
由于芯片版本
居然一个成功,另外一个打死都不能枚举
晕死!
.......




居然是UBS-B连接器里面的一根的pin断了
白白换了两次芯片
我晕死          
xiaoyeah
驱动牛犊
驱动牛犊
  • 注册日期2008-04-11
  • 最后登录2008-07-21
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2008-04-11 13:35
最近一直在做这方面的实验室项目
可是总是越看越乱
项目又非常着急

不知楼主能否把完整工程发给我参考一下?
非常感谢!

邮箱:
yeah.yuan@gmail.com
matom
驱动牛犊
驱动牛犊
  • 注册日期2008-07-08
  • 最后登录2008-11-18
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望15点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2008-07-22 11:34
我是做硬件的,boss 让我做USB板的开发,我所使用的模式也是SLAVE FIFO的模式,一直搞不定!楼主能否把完整工程发给我参考一下?非常感谢!
邮箱:matom@163.com
fuxgao
驱动牛犊
驱动牛犊
  • 注册日期2008-08-08
  • 最后登录2008-08-17
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望5点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2008-08-08 11:20
向楼主的成功表示祝贺。
开发就是个不容易的活啊。

向楼主学习。
上一页
游客

返回顶部