Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; 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;
}


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
увеличьте 2 вдвое:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru