[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: SVGA console
From: |
Peter 'p2' De Schrijver |
Subject: |
Re: SVGA console |
Date: |
Wed, 27 Aug 2003 21:21:41 +0200 |
User-agent: |
Mutt/1.5.4i |
Hi Marco,
On Wed, Aug 27, 2003 at 08:52:42PM +0200, Marco Gerards wrote:
> Hi,
>
> "Peter 'p2' De Schrijver" <p2@mind.be> writes:
>
> > struct syncinfo {
> > enum { SPLIT_SYNC, CSYNC, SYNC_ON_COLOR } type;
> > union {
> > struct {
> > polarity hsync_pol;
> > polarity vsync_pol;
> > } split_sync;
> > struct {
> > polarity csync_pol;
> > } csync;
> > struct {
> > polarity pol;
> > enum {RED, GREEN, BLUE} color;
> > } sync_on_color;
> > } sync_parameters;
> > };
> >
> > typedef unsigned int display_flags;
> >
> > #define DISPLAY_FLAGS_LACE (1<<0)
> > #define DISPLAY_FLAGS_EXTSYNC (1<<1)
> > #define DISPLAY_FLAGS_DOUBLE (1<<2)
>
> Ah, thanks. I've updated the interfaces to use this. I've changed it a
> bit and added some comments, can you have a look at the new interfaces
> if this update was sane?
>
Ok.
> [...]
>
> > I wuould rather have :
> > error_t (*set_horiz_timings) (unsigned xres, unsigned left, unsigned
> > right, unsigned hslen);
> >
> > /* set number of visible horizontal pixels to xres,
> > set number of left margin pixels to left,
> > set number of right margin pixels to right,
> > set horizontal sync pulse width to hslen */
>
> Yes, that is much better. I will update the interfaces soon. I haven't
> done this because it requires that all modelines will be updated (yes,
> I'm lazy :)).
>
Ok. I guess fb.modes has all knowledge on how to do this.
> [...]
>
> > error_t (*set_syncinfo) (struct syncinfo *si);
> >
> > error_t (*get_syncinfo) (struct syncinfo *si);
> >
> > error_t (*set_options) (display_flags flags);
> >
> > error_t (*get_options) (display_flags *flags);
>
> I've added these too. Thanks.
>
> Thanks,
> Marco
>
>
> The new interfaces:
>
> /* video-driver.h - Video driver interfaces.
> Copyright (C) 2003 Free Software Foundation, Inc.
> Written by Marco Gerards.
>
> This file is part of the GNU Hurd.
>
> The GNU Hurd is free software; you can redistribute it and/or
> modify it under the terms of the GNU General Public License as
> published by the Free Software Foundation; either version 2, or (at
> your option) any later version.
>
> The GNU Hurd is distributed in the hope that it will be useful, but
> WITHOUT ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> General Public License for more details.
>
> You should have received a copy of the GNU General Public License
> along with this program; if not, write to the Free Software
> Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
>
> /* The powermodes that can be used to configure the power state of the
> monitor. */
>
> #ifndef _VIDEO_DRIVER_H_
> #define _VIDEO_DRIVER_H_ 1
>
> /* DPMS powermodes. */
> enum powermode
> {
> /* Normal operation. */
> PM_ON,
> PM_STANDBY,
> PM_SUSPEND,
> /* Turn the screen off. */
> PM_OFF
> };
>
> typedef enum powermode powermode_t;
>
> /* Use polarity to use for syncing. */
> typedef enum polarity
> {
> POLARITY_LOW,
> POLARITY_HIGH
> } polarity_t;
>
> /* The kind of sync signal that should be used. */
> typedef struct syncinfo
> {
I would change line(s) to signal(s). Seems a bit more clear to me.
> enum
> {
> /* The videocard use the HSYNC and VSYNC lines to inform the
> monitor of the sync. */
> SPLIT_SYNC,
> /* The monitor uses only one line for both HSYNC and VSYNC. */
> CSYNC,
> /* The monitor uses no seperate line for the sync; it uses one
> of the color lines instead. */
> SYNC_ON_COLOR
> } type;
> union
> {
> struct
> {
> polarity_t hsync_pol;
> polarity_t vsync_pol;
> } split_sync;
> struct
> {
> polarity_t csync_pol;
> } csync;
> struct
> {
> polarity_t pol;
> /* The color line that is used for syncing. */
> enum
> {
> RED,
> GREEN,
> BLUE
> } color;
> } sync_on_color;
> } sync_parameters;
> } syncinfo_t;
>
> typedef unsigned int display_flags_t;
>
> /* Use interlacing. */
> #define DISPLAY_FLAGS_LACE (1 << 0);
> /* Use a pixelclock from an external source (genlock?) */
> #define DISPLAY_FLAGS_EXTSYNC (1 << 1);
> /* Use doublescan. Every line is shown twice, used for low resolution
> modes. */
> #define DISPLAY_FLAGS_DOUBLE (1 << 2);
>
> /* Information and interfaces for a video driver. */
> struct video_driver
> {
> /* Name of driver name. */
> const char *driver_name;
>
> /* Name of videocard or videochipset. This information is available
> after initialisation with init. It can be set to NULL when it is
> not relevant. */
> char *card_sub_name;
>
> /* Maximum allowed values. XXX: Are more maximum values
> required? */
> int max_hdisplay_end;
> int max_hsync_start;
> int max_hblank_start;
> int max_htotal;
> int max_vdisplay_end;
> int max_vsync_start;
> int max_vblank_start;
> int max_vtotal;
>
> /* Initialise video driver. If the hardware is not available or
> usable ENODEV is returned. */
> error_t (*init) (void);
>
> /* Deinitialize the driver. */
> error_t (*fini) (void);
>
> /* Set the last visible pixel on the display to END. Set the first
> pixel of the horizontal retrace to SYNC_START and its last pixel
> to SYNC_END. Set the last pixel of the screen to TOTAL, after
> this the new line will begin. END, SYNC_START, SYNC_END and
> TOTAL must be multiples of 8. Return EOVERFLOW when the hardware
> can't setup the hardware registers without overflowing them, in
> that case the videomode is not available. */
> error_t (*set_horiz_timings) (int xres, int sync_start, int sync_end,
> int total);
>
> /* Return in END the last visible pixel on the screen, in SYNC_START
> the pixel on which the horizontal retrace starts, in SYNC_END the
> pixel on which the horizontal retrace ends and in TOTAL the last
> pixel of the screen. Never return values that are not usable
> with set_horiz_timings. */
> error_t (*get_horiz_timings) (int *xres, int *sync_start, int *sync_end,
> int *total);
>
> /* Set the last visible scanline on the display to END. Set the
> first scanline of the horizontal retrace to SYNC_START and its
> last scanline to SYNC_END. Set the last scanline of the screen
> to TOTAL, after this the new vertical period will begin. Return
> EOVERFLOW when the hardware can't setup the hardware registers
> without overflowing them, in that case the videomode is not
> available. */
> error_t (*set_vert_timings) (int yres, int sync_start, int sync_end,
> int total);
>
> /* Return in END the last visible scanline on the screen, in
> SYNC_START the scanline on which the horizontal retrace starts,
> in SYNC_END the scanline on which the horizontal retrace ends and
> in TOTAL the last scanline of the screen. Never return values
> that are not usable with set_vert_timings. */
> error_t (*get_vert_timings) (int *yres, int *sync_start, int *sync_end,
> int *total);
>
> /* Set the timer to FREQUENCY Khz, the frequency used by the
> hardware may be DEVIATION Hhz more or less than FREQUENCY. If
> the pixelclock cannot be set to FREQUENCY with the deviation
> DEVIATION return EINVAL. */
> error_t (*set_pixclock) (long frequency, int deviation);
>
> /* Test if there is a pixelclock with FREQUENCY Khz available, the
> frequency used by the hardware may be DEVIATION Khz more or less
> than FREQUENCY. Return 1 if a clock is available, return 0
> otherwise. */
> int (*test_pixclock) (long frequency, int deviation);
>
> /* Set the powermode of the monitor connected to this card to
> POWERMODE. If this mode is not supported, return EINVAL. */
> error_t (*set_powermode) (powermode_t powermode);
>
> /* Get the current powermode, it is guaranteed that the returned
> powermode is setable with set_powermode. */
> powermode_t (*get_powermode) (void);
>
> /* Set the kind of syncronisation used to SI. */
> error_t (*set_syncinfo) (syncinfo_t *si);
>
> /* Get the kind of syncronisation that is used. Return the
> information in *SI. SI should have been allocated by the
> caller. */
> error_t (*get_syncinfo) (syncinfo_t *si);
>
> /* Use the options in FLAGS for producing display output. */
> error_t (*set_options) (display_flags_t flags);
>
> /* Get the currently used options and return them in FLAGS. */
> error_t (*get_options) (display_flags_t *flags);
> };
>
> typedef struct video_driver *video_driver_t;
>
>
> /* Available video drivers. */
>
> /* The video driver that is used. This is one of the drivers
> below. */
> video_driver_t video_driver;
>
> /* The VGA driver. It only supports the minimal VGA hardware, a 25
> and 28 Mhz clock. This driver is also used by other drivers for
> SVGA cards. */
> extern const video_driver_t video_driver_vga;
>
> /* The driver for S3 videochips. Only the S3 Trio is currently
> supported, this chipset has a programmable clock. */
> extern const video_driver_t video_driver_s3;
>
Cheers,
Peter.