DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH PRINT BOOK
 
UDI driver coding basics

Driver initialization structure

The udi_init_info, or driver initialization, structure is used by the UDI environment to link a newly loaded driver into the kernel, to launch new instantiations of a loaded driver, and to manage the regions, operations data, and other aspects of already instantiated drivers.

The udi_init_info structure contains pointers to constant information the environment needs to initialize a driver. Each driver module must include a constant initialized structure of type udi_init_t named udi_init_info.

Exactly one module in a multi-module driver must be the primary module, identified in the driver's udiprops.txt file as the module with a region declaration for region index zero, which identifies the primary region.

The udi_cmos and pseudod sample drivers provide very similar udi_init_info structures, though the underlying data is quite different.

The following figure shows the udi_init_info structure as defined in the Core Specification, along with the sample driver definitions.

udi_init_t from the Core Specification;
   typedef struct {
   	const udi_primary_init_t	*primary_init_info ;
   	const udi_secondary_init_t	*secondary_init_list ;
   	const udi_ops_init_t		*ops_init_list ;
   	const udi_cb_init_t		*cb_init_list ;
   	const udi_gcb_init_t		*gcb_init_list ;
   	const udi_cb_select_t		*cb_select_list ;
   } udi_init_t ;
   T}
cmos_udi.c sample code (cont.); T{
   udi_init_t udi_init_info = {
   	&udi_cmos_primary_init_info,
   	NULL,				/* secondary_init_list */
   	udi_cmos_ops_init_list,
   	udi_cmos_cb_init_list,
   	NULL,				/* gcb_init_list */
   	NULL				/* cb_select_list */
   };
pseudod.c sample code (cont.);
   udi_init_t udi_init_info = {
   	&pseudo_primary_init,
   	NULL,				/* Secondary init list */
   	pseudo_ops_init_list,
   	pseudo_cb_init_list,
   	NULL,				/* gcb init list */
   	NULL				/* cb select list */
   };

The elements of the udi_init_info structure include by reference the region, operation, control block, and other data defined previously in the driver code, as shown in the descriptions below.


primary_init_info
The primary module of all UDI drivers must have a non-NULL primary_init_info. In secondary module code, which also must provide a udi_init_info structure, this element is set to NULL. The primary_init_info element is a pointer to a structure containing information about the driver's primary region. The primary region structures for the udi_cmos and pseudod drivers were defined earlier in the driver code; see ``Primary region initialization'' for a description.

secondary_init_list
If the primary module also manages some secondary regions, the module must also include a non-empty secondary_init_list, a list of structures containing information about each secondary region implemented in the module. The list is terminated with an entry containing a zero region_idx, and a NULL pointer is treated the same as a list with only one entry containing a zero region_idx. Both the udi_cmos and pseudod drivers define a single module with a single region, and so this element is NULL for both drivers. The subject of secondary regions is treated in the description of the sample NIC driver; see ``Network Driver Coding Specifics''.

ops_init_list
All UDI drivers must include a pointer to an ops_init_list array that must contain at least one member with a non-zero ops_idx. This list must include at least one entry for each metalanguage used in this module. ops_init_list is a pointer to a list of structures containing information about channel operations usage for each operations vector implemented in this module. The list is terminated with an entry containing a zero ops_idx. The channel operations initialization lists for the udi_cmos and pseudod drivers were defined earlier in the driver code; see ``Channel operations initialization'' for a description.

cb_init_list is a pointer to a list of structures containing information about each control block type used by this module. The list is terminated with an entry containing a zero cb_idx, and NULL pointer is treated the same as a list with only one entry containing a zero cb_idx. The control block initialization lists for the udi_cmos and pseudod drivers were defined earlier in the driver code; see ``Control block indexes and structures'' for a description.

gcb_init_list is a pointer to a list of structures containing information about generic control block usage in this module, if any. Generally, these are control blocks used only for asynchronous environment service calls, such as udi_mem_alloc(3udi). The list is terminated with an entry containing a zero cb_idx, and a NULL pointer is treated the same as a list with only one entry containing a zero cb_idx. The sample UDI drivers do not use gcb_init_list; see udi_init_info(3udi) for more information.

cb_select_list is a pointer to a list of structures containing information about special overrides for scratch requirements when using specific control blocks with specific operations vectors. The list is terminated with an entry containing a zero cb_idx, and a NULL pointer is treated the same as a list with only one entry containing a zero cb_idx. The sample UDI drivers do not use cb_select_list; see udi_cb_init_t(3udi) and udi_cb_select_t(3udi) for more information.

Next topic: Channel operations
Previous topic: Channel operation data layouts

© 2005 The SCO Group, Inc. All rights reserved.
OpenServer 6 and UnixWare (SVR5) HDK - 19 June 2005