A .c file for a device driver contains the data declarations and the code for the entry points of the driver. It contains the #include statements the driver needs, declares extern references, declares local data, sets up the cb_ops and dev_ops structures, declares and initializes the module configuration section, makes any other necessary declarations, and defines the driver entry points. The following sections describe these driver components. Example E-3 shows the layout of an xx.c file.
/* xx.c */ #include "xximpl.h" #include "xxio.h" #include <sys/ddi.h> /* must include these two files */ #include <sys/sunddi.h> /* and they must be the last system */ /* includes */ /* forward declaration of entry points */ /* static declarations of cb_ops entry point functions...*/ static struct cb_ops xx_cb_ops = { /* set cb_ops fields */ }; /* static declarations of dev_ops entry point functions */ static struct dev_ops xx_ops = { /* set dev_ops fields*/ }; /* declare and initialize the module configuration section */ static struct modldrv modldrv = { /* set modldrv fields */ }; static struct modlinkage modlinkage = { /* set modlinkage fields */ }; int _init(void) { /* definition */ } int _info(struct modinfo *modinfop) { /* definition */ } int _fini(void) { /* definition */ } static int xxprobe(dev_info_t *dip) { /* definition */ } static int xxattach(dev_info_t *dip, ddi_attach_cmd_t cmd) { /* definition */ } static int xxdetach(dev_info_t *dip, ddi_detach_cmd_t cmd) { /* definition */ } static int xxgetinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **result) { /* definition */ } static int xxopen(dev_t *devp, int flag, int otyp, cred_t *credp) { /* definition */ } static int xxclose(dev_t dev, int flag, int otyp, cred_t *credp) { /* definition */ } static int xxstrategy(struct buf *bp) { /* definition */ } /* for character-oriented devices */ static int xxread(dev_t dev, struct uio *uiop, cred_t *credp) { /* definition */ } /* for asynchronous I/O */ static int xxaread(dev_t dev, struct aio_req *aiop, cred_t *cred_p) { /* definition */ } static int xxwrite(dev_t dev, struct uio *uiop, cred_t *credp) { /* definition */ } /* for asynchronous I/O */ static int xxawrite(dev_t dev, struct aio_req *aiop, cred_t *cred_p) { /* definition */ } static int xxioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp, int *rvalp) { /* definition */ } /* for memory-mapped character-oriented devices */ static int xxdevmap(dev_t dev, devmap_cookie_t dhp, offset_t off, size_t len, size_t *maplen, uint_t model) { /* definition */ } /* for support of the poll(2) system call */ static int xxchpoll(dev_t dev, short events, int anyyet, short *reventsp, struct pollhead **phpp) { /* definition */ } /* for drivers needing a xxprop_op routine */ static int xxprop_op(dev_t dev, dev_info_t *dip, ddi_prop_op_t prop_op, int mod_flags, char *name, caddr_t valuep, int *lengthp) { /* definition */ }