Installable ISRs and Device Drivers
9/8/2008
Interrupção instalável serviço rotinas (ISRs) permitem múltiplo dispositivos para compartilhar interrupções e para compartilhar uma solicitação hardware única plataforma interrupção (IRQ). ISRs também estender a capacidade do OS para processo o dispositivo no ISR in addition to o segmento serviço interrupção (ist). Se você desejar permitir que o compartilhamento interrupção, você deve atualização os ISRs para o driver de dispositivo. Se um ISR instalável deve reconhecer o dispositivo gerando a entrada, você geralmente pode usar o genérico instalável ISR exemplo, GIISR.dll.
Porque a maioria dos dispositivos indicam atividade interrupção em um único registrar que possivelmente é mascarado, o manipulador ISR instalável exemplo, GIISR.dll, é suficiente para vários dispositivos. Se necessário, você pode escrever um personalizado instalável manipulador ISR para implementar complexo detecção interrupção.
Você pode escolher para instalar um ISR para interrupções identificador para o dispositivo. Isso é exigido se a interrupção é compartilhada entre dois ou mais dispositivos, que é um comum ocorrência com dispositivos PCI. O ISR instalado pode ser um genérico rotina que simplesmente verifica se o dispositivo é o serviço solicitando um, ou ele pode ser um personalizado design. Giisr.dll é o genérico instalável ISR. Se a pasta IsrHandler e IsrDll Os valores são fornecidos na chave Registro do dispositivo e, em seguida, o driver deve carregar o ISR DLL através de LoadIntChainHandler chamar.
Depois que o ISR é carregado com LoadIntChainHandler, GIISR_INFO, definido em Giisr.h, é preenchido e passado para o ISR através de KernelLibIoControlIntChainHandlerIoControl Com IOCTL_GIISR_INFO. Manipulador de interrupção é descarregado com FreeIntChainHandler.
O seguinte mostra exemplo de código como para carregar o ISR DLL com LoadIntChainHandler.
#include <mkfuncs.h>
#include <giisr.h>
// InstallIsr is a flag that indicates that there is an ISR to be installed.
// IsrDll is the ISR DLL name, obtained from the registry.
// IsrHandler is the ISR function name, obtained from the registry.
// IfcType is the bus interface type, obtained from the registry.
// BusNumber is the PCI bus number, obtained from the registry.
// Install ISR handler if there is one.
if (InstallIsr) {
// Install ISR handler
g_IsrHandle = LoadIntChainHandler(IsrDll, IsrHandler, (BYTE)Irq);
if (!g_IsrHandle) {
DEBUGMSG(ZONE_ERROR, (L"WAVEDEV: Couldn't install ISR handler\r\n"));
} else {
GIISR_INFO Info;
PVOID PhysAddr;
DWORD inIoSpace = 1; // io space
PHYSICAL_ADDRESS PortAddress = {ulIoBase, 0};
if (!TransBusAddrToStatic(PCIBus, 0, PortAddress, ulIoLen, &inIoSpace, &PhysAddr)) {
DEBUGMSG(ZONE_ERROR, (L"WAVEDEV: Failed TransBusAddrToStatic\r\n"));
return FALSE;
}
DEBUGMSG(ZONE_PDD, (L"WAVEDEV: Installed ISR handler, Dll = '%s', Handler = '%s', Irq = %d, PhysAddr = 0x%x\r\n", IsrDll, IsrHandler, Irq, PhysAddr));
// Set up ISR handler
Info.SysIntr = ulSysIntr;
Info.CheckPort = TRUE;
Info.PortIsIO = TRUE;
Info.UseMaskReg = FALSE;
Info.PortAddr = (DWORD)PhysAddr + ES1371_dSTATUS_OFF;
Info.PortSize = sizeof(DWORD);
Info.Mask = ES1371_INTSTAT_PENDING;
if (!KernelLibIoControl(g_IsrHandle, IOCTL_GIISR_INFO, &Info, sizeof(Info), NULL, 0, NULL)) {
DEBUGMSG(ZONE_ERROR, (L"WAVEDEV: KernelLibIoControl call failed.\r\n"));
}
}
}
See Also
Reference
Other Resources
Implementing an ISR
Loader
PCI Bus Driver
Real-Time Priority System