Программирование драйверов Windows

         

Тестовое приспособление CheckIt Loopback Device


Читатель вправе задать вопрос: для повторения эксперимента, с каким бы то ни было драйвером и аппаратными прерываниями на его персональном компьютере, обязательно понадобится устройство, которое эти прерывания генерирует. Где его взять?

Идея простых тестовых устройств, позволяющих тестировать параллельный порт (до сих пор все еще существующий в персональных компьютерах на пока еще существующей внутренней шине ISA) и получать в нем прерывания, возникла практически в момент появления параллельного порта. Одно из таких устройств называется "заглушка CheckIt" (CheckIt Loopback Device), которую по настоящее время производит фирма Smith Micro Software (см. Интернет сайт smithmicro.com). Данная конструкция неоднократно использовалась авторами книг по драйверам, например, Артом Бейкером и Джерри Лозано, и идеально подходит для практического ознакомления с процедурами обслуживания прерываний. Внутреннее устройство этого приспособления давно является всеобщим достоянием, и его несложно найти в Интернете. Самостоятельное "приготовление" доступно каждому и состоит в том, что следует взять стандартный 25-выводной male-разъем и замкнуть в нем 5 пар контактов. Схему для выполнения этой манипуляции можно взять, например, в книге Михаила Гука "Аппаратные средства IMM PC, Энциклопедия", 2-е издание, СПб, Питер, 2002, в разделе "Неисправности и тестирование параллельных портов". Однако чтобы не отвлекать читателя поисками столь простой схемы, приведем ее еще раз, см. рис. 11.1.

Если сопоставить схему с информацией, приведенной ранее в таблице 5.1, Регистры интерфейса стандартного параллельного порта (SPP), то становится вполне понятной идея этого приспособления. Стандартный параллельный порт имеет регистр данных DR (для ввода/вывода), регистр управления CR (для вывода) и регистр состояния SR (для ввода). Согласно схеме 11.1, выполняя вывод в регистр данных и управления, можно получать выведенные данные в регистре состояния. Поскольку один из разрядов (один из пяти используемых для вывода) поступает на вывод ACK# (бит 6 регистра состояния, SR.6), предназначенный для получения сигнала о прерывании, то получается, что передать можно 4 бита информации и сигнал о прерывании.
При выводе данных в регистры DR и CR, они поступят снова в параллельный порт в регистр SR. Включив определенное воображение, можно считать, что к параллельному порту компьютера подключено "сложное" внешнее устройство, которое способно генерировать сигналы прерываний.

Рис. 11.1



Разводка тестовой заглушки CheckIt, вид со стороны пайки
В соответствии со схемой рис. 11.1 и свойствами параллельного порта (режим SPP), получаем следующие переносы данных.

  • Бит CR.0 (Strobe#, контакт 1, единичное значение бита соответствует низкому уровню на линии) поступает в регистр состояния как бит SR.4 (Select, контакт 13, высокий уровень напряжения на линии соответствует единичному значение бита, низкий &#8212 нулю в регистре), то есть CR.0=1 -&#62 SR.4=0. Бит при передаче инвертируется.


  • Бит CR.1 (Auto LF#, контакт 14, единичное значение бита соответствует низкому уровню на линии) поступает в регистр состояния как бит SR.5 (Paper End, контакт 12, высокий уровень напряжения на линии соответствует единичному значение бита, низкий &#8212 нулю в регистре), то есть CR.1=1 -&#62 SR.5=0. Бит при передаче инвертируется.


  • Бит CR.2 (Init#, контакт 16, нулевое значение бита соответствует низкому уровню на линии) поступает в регистр состояния как бит SR.6 (Ack#, контакт 10, высокий уровень напряжения на линии соответствует единичному значению бита, низкий &#8212 нулю в регистре), то есть CR.2=0 -&#62 SR.6=0. Бит передается нормально.


  • Бит CR.3 (Select In#, контакт 17, единичное значение бита соответствует низкому уровню на линии) поступает в регистр состояния как бит SR.7 (Busy, контакт 11, низкий уровень в линии соответствует единичному значению бита), то есть CR.3=1 -&#62 SR.7=1. Бит при передаче инвертируется дважды, то есть передается нормально.


  • Бит DR.0 (нулевой бит регистра данных, вывод 2) поступает в регистр состояния как бит SR.3 (Error#, контакт 15, высокий уровень на линии соответствует единичному значению бита), то есть DR.0=1 -&#62 SR.3 =1.


    Бит передается нормально.


  • Таким образом, передача данных в заглушку с моментальным возвратом данных возможна по пол-байта, что и будет реализовано в примерах, приводимых далее.

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

    Содержание раздела