Возможно потому, что я сам скорее железячник, чем программист, я избегаю написания собственных драйверов. Ведь для того, чтобы мое устройство заработало на чужом компьютере, туда придется поставить собственный драйвер кустарного производства, а это, во- первых, неудобно, во- вторых, может привести к . Как мне кажется, большая часть пользователей склоняется к применению того, что нам досталось от Microsoft в том убогом виде как это есть.
Интересуют клавиатурные 60h/61h порты. GiveIO - работает под. DLL / драйвер для доступа к портам ввода/вывода в Win7/WinXP - C++ WinAPI. Windows следует идеологии многоуровневых драйверов. 32-разрядное слово и строится по определенному правилу, которое учитывает тип устройства, вид и метод доступа. Прямого соответствия между битами ParInfo.
Опция "Используя драйвер Windows" - включена, файл icprog.sys лежит в. Надо установить драйвер прямого доступа к порту, если не . Большинство нуждавшихся в доступе к портам ввода/вывода. Этот проект, включает в себя специальный драйвер LPTWDMIO.sys, который .
Именно для этих людей я и решил написать статью, чтобы помочь им избежать трудностей, с которыми я столкнулся. Начну с того, что объясню общие правила работы клиента с каким- либо драйвером Windows. Вообще говоря, под клиентом понимается или другой драйвер, работающий в режиме ядра, или приложение, работающее в пользовательском режиме. В MSDN, к сожалению, не часто проводят эту грань различия в том или ином документе, а разница есть: не все, что может использовать клиент- драйвер, может применить клиент- приложение. Проходит время пока следуя тексту, наконец поймешь, что вот именно ЭТО пригодно только для драйвера. Windows следует идеологии многоуровневых драйверов. В качестве примера можно привести драйвер от производителя принтера, использующий для своей работы драйвер параллельного порта Microsoft, тот же самый которым мы хотели бы воспользоваться непосредственно из приложения.
Забегая вперед скажу, что поскольку мое тестовое устройство все- таки не захотело сразу работать из под Windows, несмотря на нормальную работу в EPP режиме из под DOS, мне пришлось, вооружившись цифровым осциллографом с памятью и логическим анализатором, более внимательно изучить, что же все- таки предлагает Майкрософт за рамками собственной документации. Результаты и побудили меня к написанию этой статьи.
Работа с драйвером устройства (bus driver) из приложения сводится к четырем шагам: открыть устройство; настроить нужный режим; читать из и писать в устройство; закрыть устройство. Все эти операции проделываются с помощью механизма запросов ввода- вывода драйвера (IRPs). Пользователю доступны функции, формирующие такие запросы.
В Delphi для их использования нужно подключить модуль Windows. Windows; 1 ШАГФункция Create. File формирует запрос, открывающий устройство. Например, такой вызов открывает порт LPT1 для операций асинхронного чтения и записи.
LPT : = Create. File('LPT1', GENERIC. В режиме пользователя поддерживается только запрос первого типа - он формируется с помощью функции Device. Io. Control. В качестве одного из параметров этой функции фигурирует код операции (IOCTL), который определяет действие, выполняемое драйвером. Для некоторых устройств (например, COM- порта) в API Win. Device. Io. Control при определенном значении IOCTL. Это делает программу более наглядной и читаемой.
Для параллельного порта я такой возможности не обнаружил, хотя это не вызывает трудностей, поскольку никто не мешает описать такие функции самому. Тело такой функции будет сводится к вызову Device.
Io. Control с определенным набором параметров. Чертежи Багги На Базе Ваз 2106. Игра Пряничные Человечки Супер Прыжки. Гораздо более неприятный момент заключается в том, что для LPTx невозможно определить коммуникационное событие, чтобы затем обработать его в отдельном потоке как это можно сделать, например, для последовательного порта с помощью вызова Set.
Comm. Events. Поэтому о готовности Вашего устройства к каким- либо операциям, оно может сообщить, только выставив флаг в некотором своем регистре, который Вы будете регулярно опрашивать (например, по таймеру), что конечно не очень удобно и эффективно. Вообще говоря, в режиме EPP параллельного порта определено внешнее прерывание по положительному переходу на линии 1. ACK), и драйвер содержит его обработчик.
Доступ к обработчику можно получить с помощью IRP. Еще раз хочу подчеркнуть, что все изложенное - результат моих собственных поисков, поэтому не исключено, что какое- то решение от Microsoft для обработки событий параллельного порта в режиме пользователя существует.
Если кто- нибудь знает, поделитесь. В конце статьи я укажу E- mail для связи.
Рассмотрим по порядку все коды операций доступные в качестве аргумента в вызове Device. Io. Control при работе с LPTx. Код представляет собой 3. Не вдаваясь в подробности, перечислим значения кодов для управления параллельным портом и их идентификаторы, принятые в Microsoft. Идентификатор кода IOCTLЗначение кода. IOCTL. Коды в таблице указаны в шестнадцатеричном формате (т. Код IOCTL. Следующий параметр сообщает драйверу размер буфера, а параметр ret возвращает размер структуры, через которую передаются данные.
Структура PARCLASS. Вот возможные значения этих переменных.
CENTRONICS= $0. 00. Только для записи. IEEE. Маска представляет собой произвольную сумму, указанных выше констант. Драйвер выполняет последовательность согласования с устройством для каждого указанного в маске режима в соответствии со спецификацией IEEE 1. Если соответствующий бит в маске выставлен в 1, то данный режим проверяется на возможность его применения при работе с подключенным устройством, а затем выбирается режим с максимальной пропускной способностью. Этот режим устанавливается в качестве текущего, а соответствующие ему значения драйвер возвращает в структуре Lpt.
Mode. Кроме указанных выше констант, однозначно обозначающих режимы, Windows определяет еще две маски для запроса. EPP! Он оставляет их в состоянии инициализации: СигналКонт. Состояниеn. Select. In(1. 28. 4 Active)1. Auto. Feed4высокийn. Strobe1высокий.
Initialize1. 6высокий. В таком состоянии выводы находятся сразу после открытия порта, или после сброса драйвера (см. При первом обращении к порту на предмет ввода- вывода драйвер сначала сообщит устройству о начале работы повторением последовательности согласования (на этот раз только для выбранного режима), а затем осуществит обмен данными. После этого состояние линий будет соответствовать выбранному режиму, и уже каждый последующий цикл ввода- вывода будет происходить по обычной схеме.
Код IOCTL. Может быть возможны и другие варианты, поэтому приведу команду целиком. Майкрософт заявляет о поддержке их драйвером спецификации IEEE1. К сожалению, у меня нет на руках самого документа, потому что IEEE просит за него около $1. Майкрософт не прав не могу.
Если у кого- то есть pdf оригинала, поделитесь с народом. Я говорю про IEEE1. А то без исходников происходит вечная путаница. Спецификация IEEE1.
Centronics); полубайтный (Nibble); байтный (Byte. Затем результат проверки возвращается в уже известной структуре PARCLASS. Соответственно и включить никакие другие режимы будет невозможно. Исключение составляет только NIBBLE, который согласно спецификации должен поддерживаться всеми IEEE1. Чтобы использовать другой режим, например EPP, необходимо подключить устройство, поддерживающее последовательность согласования для этого режима. В ходе цикла согласования хост выставляет на шину данных байт совместимости, который уникален для каждого режима: EPP0.
Затем по отрицательному переходу сигнала Paper End (конт. Select (конт. Если устройство подтверждает режим, то на эту линию оно должно выставить 1, в противном случае - 0.