Subject: Re: qtopia
To: Michael Lorenz <macallan@NetBSD.org>
From: Garrett D'Amore <garrett_damore@tadpole.com>
List: tech-kern
Date: 06/03/2006 10:44:39
Michael Lorenz wrote:
> Hello,
>
> there as been some talk about getting qtopia to work on wscons - is
> anyone actually working on it? If so - which version? I might be
> inclined to use my sparcbook as testbed, besides that it would be an
> obvious target for a generic graphics acceleration framework we've
> been talking about as well.
>
> And finally we'll need ways to switch colour depth and video modes
> from userland, at least the former is simple enough. What about
> something like
> ioctl(fd, FBIOSCDEPTH, &bits_per_pixel)
> and
> ioctl(fd, WSDISPLAYIO_SCDEPTH, &bits_per_pixel)
> ?
>
> They would be useful on the P9100 to actually switch colour depth, on
> things like ffb, tcx etc. they could select which colour plane we
> mmap() - 8 or 24 bit.  Things like the cg6 would just ignore it.

I've been intending to add some WSDISPLAY ioctls for managing
resolutions/modes.  The problem is a little stickier than you might
suppose at first, especially when you consider devices with multiple
output ports, etc.  Even with a single output port (typically VGA) you
have the questions of detecting monitor resolutions, virtual vs.
physical resolutions (you can use a much bigger virtual desktop with
panning), and e.g. autoexpansion to drive a lower resolution on a higher
resolution monitor (ratiometric expansion that is supported on Radeon
and perhaps other devices.)

I should probably write a paper describing this all, but here's a first
pass strawman:

#define   MAXMODES 64
struct wsdisplayio_modelist {
    int nmodes;
    struct videomode   preferred;
    struct videomode   list[MAXMODES];
}


struct wsdisplayio_port {
    int  nport;
    int   flags;
    int   type;   // port type, VGA, DVI, etc
    int   xres;   // virtual resolutions used with panning
    int   yres;
    int  hpos;   //  Xinerama-like offsets
    int  vpos;
    struct wsdisplayio_modelist   modes;
}
#define    WSDISPLAY_PORT_FIXED_RESOLUTION   // for native panels with a
fixed resolution
#define    WSDISPLAY_PORT_PAN
#define    WSDISPLAY_PORT_NPRESENT   // no display plugged in, if can
detect that

#define    WSDISPLAY_PORT_VGA            // external VGA port
#define    WSDISPLAY_PORT_DVI            // external DVI port
#define   WSDISPLAY_PORT_BUILTIN   // ala LVDS or builtin panels
#define   WSDISPLAY_PORT_SVIDEO
#define   WSDISPLAY_PORT_COMPOSITE
#define   WSDISPLAY_PORT_RGB         // old Red/Green/Blue cables
#define   WSDISPLAY_PORT_HDMI
#define   WSDISPLAY_PORT_COMPONENT
#define   WSDISPLAY_PORT_13W3         // old sun monitors
#define   WSDISPLAY_PORT_OTHER

// Hmmm.... should we support using GTF/CVT to support *arbitrary
modes*?  For now I think an enumeration is sufficient.

#define WSDISPLAY_MAXPORTS   4

struct wsdisplay_mode {
    int   xres;
    int   yres;
    int  bpp;
}

int count;
struct wsdisplay_port port;
struct wsdisplay_port mode;

icotl(fd, WSDISPLAY_GNPORTS, &count);
ioctl(fd, WSDISPLAY_GPORTINFO, &port);
ioctl(fd, WSDISPLAY_SPORTINFO, &port);
ioctl(fd, WSDISPLAY_GMODE, &mode);
ioctl(fd, WSDISPLAY_SMODE, &mode);
ioctl(fd, WSDISPLAY_GMAXMODE, &mode);   // query limits of board for
virtual resolutions

By default, setting the mode with SMODE would assume reasonable defaults
for port configuration, which could then be changed for individual ports
(VGA, DVI, LVDS, TV-out, whatever).

One thing missing is the ability to enable/disable active ports.  (I.e.
save power by turning off VGA port on a laptop while using the internal
screen.)

These ioctls (GPORTINFO in particular) can make use of EDID gathered
data to query physically connected ports.  Basically, the driver should
return a list of valid modes along with

It might also be nice to have an event call back so that applications
can detect monitor changes.  E.g. some boards have a way to check for
the existence of a monitor.  (And DVI/TMDS actually has pins defined for
the purpose.)  But maybe we can leave this a poll interface for now.

No doubt I've missed things.  I've not tried to implement any of this --
this is all just intended to act as food for thought.  Let me know your
opinions.

    -- Garrett
>
> have fun
> Michael
>
> -- 
> Garrett D'Amore, Principal Software Engineer
> Tadpole Computer / Computing Technologies Division,
> General Dynamics C4 Systems
> http://www.tadpolecomputer.com/
> Phone: 951 325-2134  Fax: 951 325-2191
>