Здравствуйте, Аноним, Вы писали:
S>> Под NT — писать parallel port class driver, пример есть в DDK, под 9х — в принципе, и так (in/out) сойдет. По крайней мере, в некоторых версиях 95 работало.
А>Да ну!
А>Обычный Legasy драйвер сойдет , многое зависит от того какой контроллер прерываний используется APIC или PIC.
А>Если PIC то понятно какое софтверное прерывание будет соответствовать IRQ принтера,
А>если APIC все несколько сложнее.
А>Для PIC контроллера , соответствие SOftware Interrupt и IRQ расчитываются следующим образом:
А>SoftInt = IrqN + 0x30h — для NT подобных операционок , к примеру прерывание таймера IRQ0
А>SoftInt = 0 + 0x30h = > int 0x30h в таблице idt соответственно находится адресс обработчика прерывания таймеры по вектору 0x30.
А>Для машин с hypertrading или просто многопроццесорных машин обладающих APIC контроллерами все сложнее те могут индивидуальным IQR присвоить индивидуальные int x .
А>Соответственно расчитаем int для LPT (для PIC контроллера):
А>для LPT1 — IRQ7
А>int 0x37
А>lkz ДЗЕ2 — IRQ5
А>int 0x35
А>Подключить свой обработчик к прерыванию можно с помощью системного вызова
А>IoConnectInterrupt или както так, точно непомню, самостоятельно корректировать IDT
А>не рекомендую можно такой херни накрутить.
А>status = IoConnectInterrupt(&DeviceExtension->InterruptObject, // InterruptObject
А> InterruptIsr, // ServiceRoutine
А> DeviceObject, // ServiceContext
А> NULL, // SpinLock
А> MappedVector, // Vector
А> Irql, // Irql
А> Irql, // SynchronizeIrql
А> Latched, // InterruptMode
А> FALSE, // ShareVector
А> DeviceExtension->Affinity, // ProcessorEnableMask
А> FALSE);
Многое так-же зависит от типа прерывания , как известно они (прерывания бывают Latched и не лэтчед), разница лишь в том что считать прерыванием , изменение фронта сигнала на соответствующей ножке процессора/контроллера , или извменение уровня.
К примеру прерывания от COM портов меняются по фронту , это неизбежно приводит к неправильной работе мыши на com1 и модема на com3.
Напоминаю что устройства впринципе вполне спокойной могут бесконфликтно работать на одном irq вместе если драйвер написан правильно(исключение COM порты).