FreeBSD Device Driver Writer's Guide : Supported Busses : ISA -- Industry Standard Architecture : Data Structures
Previous: ISA -- Industry Standard Architecture
Next: Entry Points

3.1.1. Data Structures

3.1.1.1. struct isa_device Structure

This structure is required, but generally it is created by config(8) from the kernel configuration file. It is required on a per-device basis, meaning that if you have a driver which controls two serial boards, you will have two isa_device structures. If you build a device as an LKM, you must create your own isa_device structure to reflect your configuration. (lines 85 - 131 in pcaudio_lkm.c) There is nearly a direct mapping between the config file and the isa_device structure. The definition from /usr/src/sys/i386/isa/isa_device.h is:


struct isa_device {
        int     id_id;          /* device id */
        struct  isa_driver *id_driver;
        int     id_iobase;      /* base i/o address */
        u_short id_irq;         /* interrupt request */
        short   id_drq;         /* DMA request */
        caddr_t id_maddr;       /* physical i/o memory address on bus (if any)*/
        int     id_msize;       /* size of i/o memory */
        inthand2_t *id_intr;    /* interrupt interface routine */
        int     id_unit;        /* unit number */
        int     id_flags;       /* flags */
        int     id_scsiid;      /* scsi id if needed */
        int     id_alive;       /* device is present */
#define RI_FAST         1               /* fast interrupt handler */
        u_int   id_ri_flags;    /* flags for register_intr() */
        int     id_reconfig;    /* hot eject device support (such as PCMCIA) */
        int     id_enabled;     /* is device enabled */
        int     id_conflicts;   /* we're allowed to conflict with things */
        struct isa_device *id_next; /* used in isa_devlist in userconfig() */
};

3.1.1.2. struct isa_driver Structure

This structure is defined in ``/usr/src/sys/i386/isa/isa_device.h''. These are required on a per-driver basis. The definition is:


struct isa_driver {
        int     (*probe) __P((struct isa_device *idp));
                                        /* test whether device is present */
        int     (*attach) __P((struct isa_device *idp));
                                        /* setup driver for a device */
        char    *name;                  /* device name */
        int     sensitive_hw;           /* true if other probes confuse us */
};

This is the structure used by the probe/attach code to detect and initialize your device. The probe member is a pointer to your device probe function; the attach member is a pointer to your attach function. The name member is a character pointer to the two or three letter name for your driver. This is the name reported during the probe/attach process (and probably also in lsdev(8)). The sensitive_hw member is a flag which helps the probe code determine probing order.

A typical instantiation is:


struct  isa_driver      mcddriver = { mcd_probe, mcd_attach, "mcd" };


FreeBSD Device Driver Writer's Guide : Supported Busses : ISA -- Industry Standard Architecture : Data Structures
Previous: ISA -- Industry Standard Architecture
Next: Entry Points
freebsd-questions@freebsd.org