阅读:3293回复:20
68013A端点EP6OUT的BULK写失败求助,急!!
正在对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; } ...................................................... |
|
沙发#
发布于:2008-04-02 17:19
参考ds的例程写的,感觉代码没有太大错误,而且读的部分已经实现
自己先顶哈!!!!!!!!!!111 |
|
板凳#
发布于:2008-04-02 18:07
我也是个新手,我固件都还没搞定呢,郁闷中!!
|
|
|
地板#
发布于:2008-04-02 18:13
楼上的,同情你!
|
|
驱动牛犊
|
地下室#
发布于:2008-04-02 21:21
我用EP2做in端点,1024字节,2从缓冲
用EP6做OUT端点,512字节,4从缓冲 EP6做OUT端点可以写么? |
驱动牛犊
|
5楼#
发布于:2008-04-02 21:22
DS2.7 很好写的啊
估计你的端点设置的不对 尤其是地址 |
驱动牛犊
|
6楼#
发布于:2008-04-02 21:25
我看了
驱动应该没问题 是软件的问题么? |
7楼#
发布于:2008-04-03 01:58
引用第4楼gcc312628334417于2008-04-02 21:21发表的 : 你的意思是EP6做OUT端点不好? 那明早改改看! 今天晚上在办公室 把驱动能改的地方全部改正了 DS32都用上了 效果还是一样哒 郁闷! |
|
8楼#
发布于:2008-04-03 02:28
引用第6楼gcc312628334417于2008-04-02 21:25发表的 : 如果驱动没有问题,是固件有问题 那么 我写好了68013A的固件,用CYPRESS的开发工具能够进行实现正确的读写 如何解释? 难道驱动的人品没有固件调试工具好??????? |
|
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;否则会造成死机,不过这个算小问题哈! |
|
10楼#
发布于:2008-04-03 18:43
不果郁闷依然在继续
板子做了一个版本的两块 由于芯片版本 居然一个成功,另外一个打死都不能枚举 晕死! CYPRESS官网上关于不能枚举的7大原因我都检查了,都不是 哭!!! 附芯片上的ID号码,后面那个台湾的不能枚举哒!郁闷! 能够枚举: CY7C68013A- 128AXC 0631 B 04 651142 不能枚举 CY7C68013A- 128AXC TWN0525 B 04 629736 |
|
11楼#
发布于:2008-04-03 18:47
谢谢6楼,你的言语让我感觉到了“组织”的不可靠
所以今天重新切检查固件 就找到问题了哒! |
|
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
|
|
13楼#
发布于:2008-04-04 09:56
楼主能不能帮帮我?我也做这个,只不过有个别地方不同,我用的是EP2做OUT端口,EP6做IN端口,我 写的驱动没弄成,你能不能把你做的发给我让我看一下,固件部分也顺便给我哈,非常谢谢!
E:mail: fish_liu06202@sina.com QQ:285741664 |
|
14楼#
发布于:2008-04-06 21:59
引用第9楼nj6961于2008-04-03 18:39发表的 : 请问你用2端口做输入时有加 SYNCDELAY; EP6BCH= 0x02; SYNCDELAY; EP6BCL = 0x00; 吗?希望仁兄帮忙哈, 我固件还没写对,很急!谢谢! |
|
|
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; } |
|
16楼#
发布于:2008-04-11 12:22
引用第10楼nj6961于2008-04-03 18:43发表的 : 居然是UBS-B连接器里面的一根的pin断了 白白换了两次芯片 我晕死 |
|
17楼#
发布于:2008-04-11 13:35
|
|
18楼#
发布于:2008-07-22 11:34
我是做硬件的,boss 让我做USB板的开发,我所使用的模式也是SLAVE FIFO的模式,一直搞不定!楼主能否把完整工程发给我参考一下?非常感谢!
邮箱:matom@163.com |
|
19楼#
发布于:2008-08-08 11:20
向楼主的成功表示祝贺。
开发就是个不容易的活啊。 向楼主学习。 |
|
上一页
下一页