Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: USB, Interrupt. Не удается зациклить опрос девайса  (Прочитано 4519 раз)
0 Пользователей и 1 Гость смотрят эту тему.
HSA
Гость
« : 19-01-2004 18:06 » 

Всем доброго времени суток.
Вопрос в следующем. Для формирования запросов на точку Interrupt(In) взял целиком класс KUsbInterruptTransfer из примеров Numeg'и. В описании там дают понять, что для запуска процедуры постоянного опроса точки необходимо вызвать две процедуры:
   NTSTATUS Initialize(
      KUsbLowerDevice* Dev,
      KUsbPipe* InterruptPipe,
      BOOLEAN bShortOk=TRUE
      );
и, собственно метод:
   NTSTATUS StartPolling(
      KMemory& Mdl,
      ULONG Length,
      USB_INTERRUPT_CALLBACK pfnOnInterrupt,
      PVOID pClientContext=NULL
      );
Взято из примера исходника EzUsb. Так же, как и в примере инициализирую, все проходит нормально (правда, там и подругому быть не может).
В методе OnStartDevice(KIrp I) вызываю StartPolling...
Кстати, его внутненности:
NTSTATUS KUsbInterruptTransfer::StartPolling(
   PVOID Buffer,
   ULONG Length,
   USB_INTERRUPT_CALLBACK pfnOnInterrupt,
   PVOID pClientContext
   )
{
   ASSERT( m_InterruptPipe->IsOpen() );

   if( ! m_InterruptPipe->IsOpen() )
   {
      return STATUS_INVALID_DEVICE_STATE;
   }

   // allocate a new context structure
   PINT_COMPLETION_INFO pCompInfo = new (NonPagedPool) INT_COMPLETION_INFO;

   // make sure it succeeded
   if( NULL == pCompInfo )
   {
      return STATUS_INSUFFICIENT_RESOURCES;
   }

   // initialize the context structure
   pCompInfo->m_pClass = this;
   pCompInfo->m_pfnOnInterrupt = pfnOnInterrupt;
   pCompInfo->m_pClientContext = pClientContext;

   m_InterruptPipe->BuildInterruptTransfer(
      Buffer,
      Length,
      m_bShortOk,
      NULL,
      m_pIntUrb
      );

   return m_InterruptPipe->SubmitUrb(
      m_KIrp,
      m_pIntUrb,
      LinkTo(InterruptTransferComplete),
      pCompInfo
      );
}

Вылетает система (UNEXPECTED_KERNEL_MODE_TRAP) на последней строке (при выполнении SubmitUrb). Как побороть эту беду?
Записан
HSA
Гость
« Ответ #1 : 20-01-2004 13:51 » 

Да, еще в догонку к предыдущему вопросу по interrupt. Пробовал переделать Bulk на Interrupt, так одиночный запрос проходил, но не больше. Что еще нужно тогда добавить в такой переделке, чтобы Interrupt постоянно слал запрос на девайс?
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines