Последние несколько лет использовал для работы с CY7C68013 библиотеки от Cypress, но жизнь заставляет отойти от Visual Studio, поэтому пришлось написать собственный код для работы с драйвером СyUSB.sys. К сожалению, здесь возникла проблема, которую никак не получается обойти - не получается послать данные по Control Endpoint в чип.
Для анализа результатов использую USBlyzer. Посылаю единицу в регистр CPUCS, что необходимо сделать перед загрузкой прошивки. Если это делаю с помощью DeviceIoControl (код приведен ниже), то USBlyzer показывает что передача была Cancelled, при посылке этой же команды с использованием библиотек Cypress, передача проходит.
Буду очень признателен если кто то подскажет, что я делаю не так.
union{
struct{
UCHAR Recipient:5;
UCHAR Type:2;
UCHAR Direction:1;
}
bmRequest;
UCHAR bmReq;
};
bmRequest.Recipient = 0; // Device
bmRequest.Type = 2; // Vendor
bmRequest.Direction = 0; // OUT command (from Host to Device)
int bufLen = 1; // we send only one command
int iXmitBufSize = sizeof(SINGLE_TRANSFER) + bufLen; // The size of the two-part structure
UCHAR *pXmitBuf = new UCHAR[iXmitBufSize]; // Allocate the memory
ZeroMemory(pXmitBuf, iXmitBufSize);
PSINGLE_TRANSFER pTransfer = (PSINGLE_TRANSFER)pXmitBuf; // The SINGLE_TRANSFER comes first
pTransfer->SetupPacket.bmRequest = bmReq;
pTransfer->SetupPacket.bRequest = 0xA0;
pTransfer->SetupPacket.wValue = 0xE600; // CPUCS register in FX2
pTransfer->SetupPacket.wIndex = 0x0000;
pTransfer->SetupPacket.wLength = bufLen;
pTransfer->SetupPacket.ulTimeOut = 0x1000;
pTransfer->reserved = 0;
pTransfer->ucEndpointAddress = 0x00; // Control pipe
pTransfer->IsoPacketLength = 0;
pTransfer->BufferOffset = sizeof (SINGLE_TRANSFER);
pTransfer->BufferLength = bufLen;
pTransfer->NtStatus = 1;
pTransfer->UsbdStatus = 1;
DWORD dwReturnBytes = 0;
pXmitBuf[iXmitBufSize-1] = 1;
DeviceIoControl (hDevice, IOCTL_ADAPT_SEND_EP0_CONTROL_TRANSFER,
pXmitBuf, iXmitBufSize,
pXmitBuf, iXmitBufSize,
&dwReturnBytes, NULL);
DWORD err = GetLastError();
cout << "last error" << err << endl;
cout << dwReturnBytes << endl;
delete[] pXmitBuf;
Код ошибки после команды GetLastError() 995.
Код для получения ссылки на девайс hDevice взял без изменений из Cypress CyUSB.sys Programmer's Reference.