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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: The Windows 2000 Device Driver Book - Пример к 8 главе  (Прочитано 4902 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Raptor
Гость
« : 22-02-2006 06:29 » 

Изучаю книгу Windows 2000 Device Driver Book и столкнулся с тем, что в примере простейшего драйвера для LPT порта в восьмой главе книги не генерируется прерывание. В настройках LPT я уже поставил опцию использовать прерывания, саму заглушку тоже спаял верно потому что сигналы устанавливаются верно, проверял путем записи и считывания значений, но прерывания нет, поэтому тестовая программа при попытке записать что то в устройство уходит в бесконечное ожидание конца записи. Под SoftIce проверял, программа выполняет StartIO и даже записывает один байт в порт, но ISR ни разу не выполняется. Наверняка эту книгу читало много людей, подскажите в чем проблема?
Код взят из примера от книги, весь не привожу так как он немаленький, наиболее важное:

// создание прерывания
// оно точно нормально создается и совпадает с прерыванием реально 
// назначенным для LPT в ресурсах драйвера LPT, да и в BIOS стоит обычный режим работы ДЗЕ
   KIRQL kIrql;
   KAFFINITY kAffinity;
   ULONG kVector =
      HalGetInterruptVector(Isa, 0, pDevExt->Irq, 0,
                     &kIrql, &kAffinity);

#if DBG==1
   DbgPrint("PPORT: Interrupt %X converted to kIrql = %X, kAffinity = %X, kVector = %X\n",
            pDevExt->Irq, kIrql, kAffinity, kVector);
#endif
   
   status =
      IoConnectInterrupt(
         &pDevExt->pIntObj,   // the Interrupt object
         Isr,         // our ISR
         pDevExt,      // Service Context
         NULL,         // no spin lock
         kVector,         // vector
         kIrql,      // DIRQL
         kIrql,      // DIRQL
         Latched,   // Latched or LevelSensitive
         TRUE,         // Shared?
         kAffinity,      // processors in an MP set
         FALSE );      // save FP registers?
   if (!NT_SUCCESS(status)) {
      // if it fails now, must delete Device object
      IoDeleteDevice( pDevObj );
      return status;
   }
   
#if DBG==1
   DbgPrint("PPORT: Interrupt successfully connected\n");
#endif

// то что должно генерировать прерывание
// но еально не генерирует
#define CTL_INTENB   0x10   // 1 Interrupt enable
#define CTL_SELECT   0x08   // 1 Select printer
#define CTL_NOT_RST   0x04   // 0 Reset printer

   // Enable interrupts, raise BUSY
   WriteControl( pDevExt, CTL_INTENB | CTL_SELECT | CTL_DEFAULT );
   // Lower BUSY
   WriteControl( pDevExt, CTL_INTENB | CTL_DEFAULT );
   // Pulse ACK#
   WriteControl( pDevExt, CTL_INTENB | CTL_NOT_RST | CTL_DEFAULT);
   // hold it for about 50 uS
   KeStallExecutionProcessor(50);
   WriteControl( pDevExt, CTL_INTENB | CTL_DEFAULT );
Записан
Raptor
Гость
« Ответ #1 : 01-06-2006 13:17 » 

Ответов нет, отвечаю сам себе, так как уже разобрался:
Солдатов, Программирование драйверов Windows.
"В упомянутом тесте, описанном Артом Бейкером и Джерри Лозано, распознавание поступившего прерывания в ISR процедуре производится по значению бита SR.2 (PIRQ, внутренний бит 2 регистра состояния SR). В некоторых реализация параллельного порта этот бит действительно хранит флаг прерывания. Он имеет нулевое значение, если прерывание имело место (напряжение на выводе Ack#, SR.6, контакт 10, выполнило отрицательный перепад — переход из высокого в низкое значения при условии CR.4=1). Единичное значение бита SR.2 устанавливается по аппаратному с6росу или при чтении регистра состояния. Однако на всех компьютерах, доступных автору, параллельный порт в конфигурации SPP вел себя, точно следуя первоисточникам (например, ]an Axelson, Parallel Port Complete), где указывается, что бит SR.2 не используется. Соответственно, тест Арта Бейкера и Джерри Лозано не работает без отключения строки кода, выполняющего эту проверку. Строго говоря, такому обстоятельству может быть и несколько иное объяснение. В Windows XP, где разрабатывались приведенные ниже примеры, тяжело отказаться от услуг всех системных компонентов, потенциально касающихся параллельного порта. Поэтому при тестах представляемых драйверов сам стандартный системный драйвер параллельного порта было решено не отключать, а именно он (его процедура обслуживания прерывания) и считывает регистр состояния SR перед тем как получит управление Isr процедура собственно испытываемых драйверов. Даже если сам порт и позволил бы использовать бит SR, то все равно Isr процедура собственно испытываемых драйверов могла бы считать только единичное значение бита SR.2 (что говорило бы об отсутствии прерывания)."
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines