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

nj6961 2008-04-03 02:37:04
68013A端点EP6OUT的BULK写失败求助,急!!
易用专业的PCI、USB、LED方案正在对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;

}
......................................................
...全文
241 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
nj6961 2008-04-11
  • 打赏
  • 举报
回复
居然是UBS-B连接器里面的一根的pin断了
白白换了两次芯片
我晕死
nj6961 2008-04-03
  • 打赏
  • 举报
回复
不果郁闷依然在继续
板子做了一个版本的两块
由于芯片版本
居然一个成功,另外一个打死都不能枚举
晕死!
CYPRESS官网上关于不能枚举的7大原因我都检查了,都不是
哭!!!


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

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



不能枚举
CY7C68013A-
128AXC TWN0525
B 04 629736
nj6961 2008-04-03
  • 打赏
  • 举报
回复
问题已经解决了哈,就是固件的问题!

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

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

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



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



如果说驱动有点点问题的话
I.Information() = dwBytesSent; 这里最好改成 I.Information() = 0;否则会造成死机,不过这个算小问题哈!
oushengfen 2008-04-03
  • 打赏
  • 举报
回复
楼主是不是端点搞错了,我也使用这个啊,没有出现什么问题啊
nj6961 2008-04-03
  • 打赏
  • 举报
回复
CYPRESS的开发工具是 cyconsole
nj6961 2008-04-03
  • 打赏
  • 举报
回复
因为固件调试工具能够正常进行读写
所以就把问题放在驱动身上
晚上在DS27下把驱动翻了个遍

无果

在DS32下重新开发驱动

效果一样!

郁闷!!!!!

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧