Форум: "Система";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];
ВнизКак отловить прерывание от LPT - IRQ7 Найти похожие ветки
← →
Serge Pik (2003-02-26 17:00) [0]Пишу интерфейс для управления прибором. Все было хорошо пока небыло необходимости быстро реагировать на "событие" прибора.
В петле опрашивать порт не хочеться. Хочу попробывать установить разрешение прерывания и ждать себе ACK. По идее это генерирует IRQ7. Но как его увидеть?
Не знаю, есть ли такое сообщение - по идее должно быть.
Дайте на Водку кто может.
← →
Слесарь Матерящийся (2003-02-26 17:33) [1]А какова частота запросов с прибора?
← →
Serge Pik (2003-02-26 19:12) [2]Может быть разной. Где - то от 1 кГц и выше (очень выше - 100кГц - очень запросто), но успокаивает одно - если пропущу пару - тройку событие из 4-ех-5-и -- ничего страшного, хотя хотелось - бы не пропускать.
← →
Слесарь Матерящийся (2003-02-26 19:38) [3]Да, прерывание вполне в тему.
В любом случае, проблема решается написанием драйвера.
Либо на замену parport.sys, либо драйвер-"паразит".
Причём обработку придётся писать внутри interrupt service routine, и использовать буферирование, чтобы снизить частоту обращений в user-mode программу. IMHO, разумеется.
← →
Serge Pik (2003-02-26 20:35) [4]NuMege WinDriwer генерит код (для Delphi в т.ч.) к своим *.vxd и *.sys драйверам. Что касается обращения к порту то более менее понятно, а вот с прерываниями разобраься не могу (хотя код NuMega с прерываниями явно работает (даже больше, чем мне того хотелось)). Да и вообще: стоит ли разбираться с этим? Спрашиваю потому что понимаю предыдущее замечание весьма интуитивно, а Драйвер сам не напишу быстро точно (опять же понимаю, что NuMege WinDriwer врядли ли широко известен Мастерам Delphi, я набрел на него случайно). Если у Вас есть мнение поделитесь пожалуйста.
← →
Слесарь Матерящийся (2003-02-27 09:53) [5]Про vxd ничего не буду советовать, но для машин с ОС Windows 2000/XP можно запросто "попросить" у драйвера параллельного порта parport.sys CALLBACK на прерывание.
Т.е. в вашем драйвере добавляете ф-ю, которая будет вызываться из parport.sys, когда на линию приходит прерывание.
Ваш драйвер вызывает parport.sys (IoAttachDevice() на линк "\Device\ParallelPortX", потом через IoCallDriver()), выполняете запросы:
-- IOCTL_INTERNAL_GET_PARALLEL_PORT_INFO - заполнит структуру PARALLEL_PORT_INFORMATION данными о регистрах порта -- можем узнать базовый адрес порта;
-- IOCTL_INTERNAL_GET_MORE_PARALLEL_PORT_INFO - он заполняет структуру MORE_PARALLEL_PORT_INFORMATION, записывая туда данные о прерывании, штатно назначенном порту -- выполнив этот запрос, можно узнать, сможем использовать прерывание или нет;
-- IOCTL_INTERNAL_PARALLEL_PORT_ALLOCATE - чтобы монопольно блокировать порт, если решились его использовать;
-- IOCTL_INTERNAL_PARALLEL_CONNECT_INTERRUPT - чтобы получить доступ к прерыванию порта. В этом запросе передаётся адрес callback-процедуры в вашем драйвере.
Останется установить бит разрешения прерывания в регистре управления порта.
Да, и ещё придётся прописать в реестре ключ, разрешающий parport-у расшаривать прерывания.
Так что ничего сложного!
Где искать информацию:
1. MSDN, свежая документация для Windows DDK.
2. Windows 2000 DDK - старая справка; +исходники там же.
В DDK есть исходники parclass.sys и parport.sys. Mожно посмотреть по исходникам parclass, как надо коннектиться к parport и передавать ему запросы.
Заодно интересно разобраться в логике работы parport.sys.
По поводу использования NuMega - я пробовал - не понравилось. Использую мастер от Walter O"ney (только WDM-ки, VxD-шек нет) - WDMWIZ.AWX. Взять эту фичу можно здесь:
http://src.fitkursk.ru/detail.asp?id=925
http://src.fitkursk.ru/detail_book.asp?id=83
Он генерит достаточно понятный скелет драйвера. Добавляем свой код - и - о-па!
Ну вот - что знал - рассказал...
← →
Serge Pik (2003-02-27 14:22) [6]М-да. Похоже оно. Сам бы не накопал бы. Большое Вам Спасибо.
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c