реклама на сайте
подробности

 
 
> ошибка в программировании CY7C68013, Не получается загрузить прошивку в RAM с помощью DeviceIoControl
kostya79
сообщение Mar 26 2012, 10:49
Сообщение #1





Группа: Новичок
Сообщений: 2
Регистрация: 26-03-12
Пользователь №: 71 005



Последние несколько лет использовал для работы с 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.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 17:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01347 секунд с 7
ELECTRONIX ©2004-2016