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 );
|