Последние несколько лет использовал для работы с 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.
|