Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
Вопрос про программирование USB. Help! (+)
Отправлено
mayn 02 марта 2008 г. 23:25
У меня плата с микроконтроллером LPC2148. Использую интерфейс USB с 1 дополнительной конечной точкой типа Bulk IN. Все дескрипторы вроде правильные и процедура прерывания, кажется, тоже (во всяком случае я сравнивал с другими программами от Keil для LPC2xxx, сдирал с них, разбирался, тестировал, но, может быть, и не достаточно). Для написания драйвера использовал DriverStudio, все работает, кроме процедуры драйвера Read. Застревает в функции SubmitUrb, не пойму почему. А в остальном все нормально, создается устройство, открывается, закрывается и т.п. Но не читается в ReadFile, повисает. Вот функция Read драйвера:
NTSTATUS BoardDevice::Read(KIrp I)
{
NTSTATUS status = STATUS_SUCCESS;
// Always ok to read 0 elements
if (I.ReadSize() == 0)
{
I.Information() = 0;
I.PnpComplete(this, status);
return status;
}
// Get a pointer to the caller's buffer.
PUCHAR pBuffer = (PUCHAR) I.BufferedReadDest();
ULONG bytesRead = 0;
ULONG dwTotalSize = I.ReadSize(CURRENT);
ULONG dwMaxSize = Endpoint2IN.MaximumTransferSize();
if (dwTotalSize > dwMaxSize)
{
dwTotalSize = dwMaxSize;
}
for (int i=0; i<8; i++)
((PCHAR)(pBuffer))[i] = (CHAR)(7-i);
PURB pUrb = Endpoint2IN.BuildBulkTransfer(
pBuffer, // Where is data coming from?
dwTotalSize, // How much data to read?
TRUE, // TRUE = IN
NULL,
FALSE, // Short
NULL
);
if (pUrb == NULL)
{
I.Information() = 0;
return I.PnpComplete(this, STATUS_INSUFFICIENT_RESOURCES);
}
// Submit the URB to our USB device, synchronously - say less is OK
pUrb->UrbBulkOrInterruptTransfer.TransferFlags =
(USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK);
if (!Endpoint2IN.IsOpen())
{
I.Information() = 0;
return I.PnpComplete(this, STATUS_INSUFFICIENT_RESOURCES);
}
status = Endpoint2IN.SubmitUrb(pUrb);
bytesRead = pUrb->UrbBulkOrInterruptTransfer.TransferBufferLength;
if ( status == STATUS_SUCCESS)
{
T.Trace(TraceInfo, __FUNCTION__" Read SUCCESS %d bytes\n", bytesRead);
}
else
{
T.Trace(TraceInfo, __FUNCTION__" ERROR: SubmitUrb (%d) error code=%X\n", bytesRead, status);
}
for (i=0; i<8; i++)
{
T.Trace(TraceInfo, __FUNCTION__" %d\n",((PCHAR)(pBuffer))[i]);
}
delete pUrb;
I.Information() = bytesRead;
I.PnpComplete(this, status);
return status;
}
Составить ответ | Вернуться на конференцию
Ответы