Subversion Repositories shark

Rev

Blame | Last modification | View Log | RSS feed


#ifndef TIMING_H
#define TIMING_H

/*
 * Generic mode timing module.
 */


/* This is the type of a basic (monitor-oriented) mode timing. */
typedef struct _MMT_S MonitorModeTiming;
struct _MMT_S {
    int pixelClock;             /* Pixel clock in kHz. */
    int HDisplay;               /* Horizontal Timing. */
    int HSyncStart;
    int HSyncEnd;
    int HTotal;
    int VDisplay;               /* Vertical Timing. */
    int VSyncStart;
    int VSyncEnd;
    int VTotal;
    int flags;
    MonitorModeTiming *next;
};

/* This is for the hardware (card)-adjusted mode timing. */
typedef struct {
    int pixelClock;             /* Pixel clock in kHz. */
    int HDisplay;               /* Horizontal Timing. */
    int HSyncStart;
    int HSyncEnd;
    int HTotal;
    int VDisplay;               /* Vertical Timing. */
    int VSyncStart;
    int VSyncEnd;
    int VTotal;
    int flags;
/* The following field are optionally filled in according to card */
/* specific parameters. */
    int programmedClock;        /* Actual clock to be programmed. */
    int selectedClockNo;        /* Index number of fixed clock used. */
    int CrtcHDisplay;           /* Actual programmed horizontal CRTC timing. */
    int CrtcHSyncStart;
    int CrtcHSyncEnd;
    int CrtcHTotal;
    int CrtcVDisplay;           /* Actual programmed vertical CRTC timing. */
    int CrtcVSyncStart;
    int CrtcVSyncEnd;
    int CrtcVTotal;
} ModeTiming;

/* Flags in ModeTiming. */
#define PHSYNC          0x1     /* Positive hsync polarity. */
#define NHSYNC          0x2     /* Negative hsync polarity. */
#define PVSYNC          0x4     /* Positive vsync polarity. */
#define NVSYNC          0x8     /* Negative vsync polarity. */
#define INTERLACED      0x10    /* Mode has interlaced timing. */
#define DOUBLESCAN      0x20    /* Mode uses VGA doublescan (see note). */
#define HADJUSTED       0x40    /* Horizontal CRTC timing adjusted. */
#define VADJUSTED       0x80    /* Vertical CRTC timing adjusted. */
#define USEPROGRCLOCK   0x100   /* A programmable clock is used. */
#define TVMODE          0x200
#define TVPAL           0x400
#define TVNTSC          0x800

/*
 * Note: Double scan implies that each scanline is displayed twice. The
 * vertical CRTC timings are programmed to double the effective vertical
 * resolution (the CRT still displays 400 scanlines for a 200 line
 * resolution).
 */


/* Cards specifications. */
typedef struct {
    int videoMemory;            /* Video memory in kilobytes. */
    int maxPixelClock4bpp;      /* Maximum pixel clocks in kHz for each depth. */
    int maxPixelClock8bpp;
    int maxPixelClock16bpp;
    int maxPixelClock24bpp;
    int maxPixelClock32bpp;
    int flags;                  /* Flags (e.g. programmable clocks). */
    int nClocks;                /* Number of fixed clocks. */
    int *clocks;                /* Pointer to array of fixed clock values. */
    int maxHorizontalCrtc;
    /*
     * The following function maps from a pixel clock and depth to
     * the raw clock frequency required.
     */

    int (*mapClock) (int bpp, int pixelclock);
    /*
     * The following function maps from a requested clock value
     * to the closest clock that the programmable clock device
     * can produce.
     */

    int (*matchProgrammableClock) (int desiredclock);
    /*
     * The following function maps from a pixel clock, depth and
     * horizontal CRTC timing parameter to the horizontal timing
     * that has to be programmed.
     */

    int (*mapHorizontalCrtc) (int bpp, int pixelclock, int htiming);
} CardSpecs;

/* Card flags. */
/* The card has programmable clocks (matchProgrammableClock is valid). */
#define CLOCK_PROGRAMMABLE              0x1
/* For interlaced modes, the vertical timing must be divided by two. */
#define INTERLACE_DIVIDE_VERT           0x2
/* For modes with vertical timing greater or equal to 1024, vertical */
/* timing must be divided by two. */
#define GREATER_1024_DIVIDE_VERT        0x4
/* The DAC doesn't support 64K colors (5-6-5) at 16bpp, just 5-5-5. */
#define NO_RGB16_565                    0x8
/* Card (or driver) can't do interlaced modes */
#define NO_INTERLACE                    0x10
/* Don't have banked memory - emulated with mmap from linear memory */
#define EMULATE_BANK                    0x20

/* Mode info. */
typedef struct {
/* Basic properties. */
    short width;                /* Width of the screen in pixels. */
    short height;               /* Height of the screen in pixels. */
    char bytesPerPixel;         /* Number of bytes per pixel. */
    char bitsPerPixel;          /* Number of bits per pixel. */
    char colorBits;             /* Number of significant bits in pixel. */
    char __padding1;
/* Truecolor pixel specification. */
    char redWeight;             /* Number of significant red bits. */
    char greenWeight;           /* Number of significant green bits. */
    char blueWeight;            /* Number of significant blue bits. */
    char __padding2;
    char redOffset;             /* Offset in bits of red value into pixel. */
    char blueOffset;            /* Offset of green value. */
    char greenOffset;           /* Offset of blue value. */
    char __padding3;
    unsigned redMask;           /* Pixel mask of read value. */
    unsigned blueMask;          /* Pixel mask of green value. */
    unsigned greenMask;         /* Pixel mask of blue value. */
/* Structural properties of the mode. */
    int lineWidth;              /* Offset in bytes between scanlines. */
    short realWidth;            /* Real on-screen resolution. */
    short realHeight;           /* Real on-screen resolution. */
    int flags;
} ModeInfo;


/* Prototypes of functions defined in timing.c. */

/*
 * This function will look up mode timings for a mode matching ModeInfo
 * that is within monitor spec and matches the capabilities (clocks etc.)
 * of the card.
 */


int __svgalib_getmodetiming(
                     ModeTiming *,      /* Resulting mode timing. */
                     ModeInfo *,        /* Structural mode info. */
                     CardSpecs *        /* Card specs (dot clocks etc.). */
);

void __svgalib_addusertiming(
                      MonitorModeTiming *
);

/* GTF constants */
#define GTF_lockVF      1               /* Lock to vertical frequency   */
#define GTF_lockHF      2               /* Lock to horizontal frequency */
#define GTF_lockPF      3               /* Lock to pixel clock frequency*/

#endif