How to add an (S)VGA driver to XFree86
: The Driver Itself
: Data Structures
Previous: Multiple Chipsets And Options
Next: The Ident() function
6.2. Data Structures
Once you have an understanding of what is needed from the above description,
it is time to fill in the driver data structures. First we will deal with
the `vgaSDCRec' structure. This data structure is the driver-local structure
that holds the SVGA state information. The first entry in this data structure
is ALWAYS `vgaHWRec std'. This piece holds the generic VGA portion of the
information. After that, you will have one `unsigned char' field for each
register that will be manipulated by your driver. That's all there is to
this data structure.
Next you must initialize the `SDC' structure (type `vgaVideoChipRec'). This
is the global structure that identifies your driver to the server. Its name
MUST be `SDC', in all caps - i.e. it must match the directory name for your
driver. This is required so that the Link Kit reconfiguration can identify
all of the requisite directories and global data structures.
The first section of this structure simply holds pointers to the driver
functions.
Next, you must initialize the information about how your chipset does
bank switching. The following fields must be filled in:
- ChipMapSize - the amount of memory that must be mapped into
the server's address space. This is almost always 64k (from
0xA0000 to 0xAFFFF). Some chipsets use a 128k map (from
0xA0000 to 0xBFFFF). If your chipset gives an option, use the
64k window, as a 128k window rules out using a Hercules or
Monochrome Display Adapter card with the SVGA.
- ChipSegmentSize - the size of each bank within the ChipMapSize
window. This is usually also 64k, however, some chipsets split
the mapped window into a read portion and a write portion (for
example the PVGA1/Western Digital chipsets).
- ChipSegmentShift - the number of bits by which an address will
be shifted right to mask of the bank number. This is log-base-2
of ChipSegmentSize.
- ChipSegmentMask - a bitmask used to mask off the address within
a given bank. This is (ChipSegmentSize-1).
- ChipReadBottom,ChipReadTop - the addresses within the mapped
window in which read operations can be done. Usually 0, and
64k, respectively, except for those chipset that have separate
read and write windows.
- ChipWriteBottom,ChipWriteTop - same as above, for write operations.
- ChipUse2Banks - a boolean value for whether this chipset has one
or two bank registers. This is used to set up the screen-to-screen
operations properly.
There are three more fields that must be filled in:
- ChipInterlaceType - this is either VGA_NO_DIVIDE_VERT or
VGA_DIVIDE_VERT. Some chipsets require that the vertical timing
numbers be divided in half for interlaced modes. Setting this
flag will take care of that.
- ChipOptionFlags - this should always be `{0,}' in the data
structure initialization. This is a bitfield that contains
the Option flags that are valid for this driver. The appropriate
bits are initialized at the end of the Probe function.
- ChipRounding - this gets set to the multiple by which the
virtual width of the display must be rounded for the 256-color
server. This value is usually 8, but may be 4 or 16 for some
chipsets.
How to add an (S)VGA driver to XFree86
: The Driver Itself
: Data Structures
Previous: Multiple Chipsets And Options
Next: The Ident() function