Some devices, in addition to their commands, provide library-style
functions which can be directly called by applications. These functions
are documented in the device specific FD files and Autodocs of the Amiga
ROM Kernel Reference Manual: Includes and Autodocs, and in the Devices
volume of this manual set.
Devices with functions behave much like Amiga libraries, i.e., you set up
a base address pointer and call the functions as offsets from the pointer.
See the "Exec Libraries" chapter for more information.
The procedure for accessing a device's functions is as follows:
* Declare the device base address variable in the global data area.
The correct name for the base address can be found in the device's FD
file.
* Create a message port data structure.
* Create an I/O request data structure.
* Call OpenDevice(), passing the I/O request. If OpenDevice() is
successful (returns 0), the address of the device base may be found
in the io_Device field of the I/O request structure. Consult the
include file for the structure you are using to determine the full
name of the io_Device field. The base address is only valid while
the device is open.
* Set the device base address variable to the pointer returned in the
io_Device field.
We will use the timer device to illustrate the above method. The name of
the timer device base address is listed in its FD file as TimerBase.
#include <devices/timer.h>
struct Library *TimerBase; /* device base address pointer */
struct MsgPort *TimerMP; /* message port pointer */
struct timerequest *TimerIO; /* I/O request pointer */
if (TimerMP=CreatePort(NULL,NULL)) /* Create the message port. */
{
/* Create the I/O request. */
if ( TimerIO = (struct timerequest *)
CreateExtIO(TimerMP,sizeof(struct timerequest)) )
{
/* Open the timer device. */
if ( !(OpenDevice(TIMERNAME,UNIT_MICROHZ,TimerIO,0)) )
{
/* Set up pointer for timer functions. */
TimerBase = (struct Library *)TimerIO->tr_node.io_Device;
/* Use timer device library-style functions such as /*
/* CmpTime() ...*/
CloseDevice(TimerIO); /* Close the timer device. */
}
else
printf("Error: Could not open %s\n",TIMERNAME);
}
else
printf("Error: Could not create I/O request\n");
}
else
printf("Error: Could not create message port\n");
}
[Back to Amiga Developer Docs]