Compartilhar via


Installable ISRs and Device Drivers

Windows Mobile Not SupportedWindows Embedded CE Supported

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