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