PATH 
ADC Home > Documentation > Hardware > Device Managers and Drivers > PCI Card Services > Designing PCI Cards and Drivers for Power Macintosh Computers


  

Interrupt Code Example

The code sample in Listing 11-3 shows a typical interrupt registration process during driver initialization.

Listing 11-3 Interrupt registration

#include <Devices.h>
#include <Interrupts.h>
#include <NameRegistry.h>

/* useful global data within my driver */

DriverRefNum                myDriverRefNum;
RegEntryID                  myRegEntryID;
InterruptSetMember          myISTMember;
void *                      theDefaultRefCon;
InterruptHandler            theDefaultHandlerFunction;
InterruptEnabler            theDefaultEnableFunction;
InterruptDisabler           theDefaultDisableFunction;

// the ISR function to be registered

InterruptMemberNumber
myISRHandler(       InterruptSetMember          member,
                    void *                      refCon,
                    UInt32                      theIntCount)
    {

    Boolean myDeviceWantsService( void );
    void serviceMyDevice( void );

    // see if your device was the one that requested an interrupt
    if( myDeviceWantsService() == false )
        return kIsrIsNotComplete

    // do what ever is required to service your hardware here
    serviceMyDevice();

    // tell the system that this interrupt has been serviced
    return kIsrIsComplete;
    }

// the main entry point for interrupt initialization

OSErr
DoInitializeCommand(        DriverRefNum        myRefNum,
                            RegEntryID          myRegID )
    {
    OSErr                           Status;
    RegPropertyValueSize            propertySize;
    ISTProperty                     theISTProperty;

    // remember our RefNum and Registry Entry ID
    myDriverRefNum = myRefNum;
    myRegEntryID = myRegID;

    // get 'driver-ist' property from the Registry for my device
    propertySize = sizeof( theISTProperty );

    Status = RegistryPropertyGet(           &myRegEntryID,
                                            kISTPropertyName,
                                            theISTProperty,
                                            &propertySize );

    // return if we got an error
    if( Status != noErr )
        return Status;

    // remember the first InterruptSetMember in the 'driver-ist'
    // as the IST member that my driver is connected to
    myISTMember.setID = theISTProperty[ kISTChipInterruptSource ].setID;
    myISTMember.member = theISTProperty[ kISTChipInterruptSource ].member;

    // get the default "enabler" function for my IST member
    Status = GetInterruptFunctions(             myISTMember.setID,
                                                myISTMember.member,
                                                &theDefaultRefCon,
                                                &theDefaultHandlerFunction,
                                                &theDefaultEnableFunction,
                                                &theDefaultDisableFunction );
    
    // return if we got an error
    if( Status != noErr )
        return Status;

    // register my ISR with my IST member. Don't register an
    // "enabler" or "disabler" function since the IST member
    // my driver is connected to is a Macintosh on-board device.
    Status = InstallInterruptFunctions(             myISTMember.setID,
                                                 myISTMember.member,
                                                 0,
                                                    (InterruptHandler)myISRHandler,
                                                 (InterruptEnabler)0,
                                                 (InterruptDisabler)0 );

    // return if we got an error
    if( Status != noErr )
        return Status;

    // make sure that interrupts are enabled for my IST member
    theDefaultEnableFunction(           myISTMember,
                                     0 );

    return Status;
    }

Timing Services


© 1999 Apple Computer, Inc. – (Last Updated 26 March 99)