aboutsummaryrefslogtreecommitdiffhomepage
path: root/TVout
diff options
context:
space:
mode:
Diffstat (limited to 'TVout')
-rwxr-xr-xTVout/Mon-640x4003
-rwxr-xr-xTVout/Mon-640x4803
-rwxr-xr-xTVout/TV-640x5122
-rwxr-xr-xTVout/TV-640x5283
-rwxr-xr-xTVout/TV-704x5283
-rwxr-xr-xTVout/TV-704x5763
-rwxr-xr-xTVout/TV-720x5763
-rwxr-xr-xTVout/clean.sh13
-rwxr-xr-xTVout/cloning14
-rwxr-xr-xTVout/compile.sh15
-rw-r--r--TVout/con2fb/con2fb.c79
-rw-r--r--TVout/fbset.db34
-rw-r--r--TVout/fbset/INSTALL20
-rw-r--r--TVout/fbset/Makefile41
-rw-r--r--TVout/fbset/fb.h497
-rw-r--r--TVout/fbset/fb.modes.5228
-rw-r--r--TVout/fbset/fbset.8242
-rw-r--r--TVout/fbset/fbset.c1054
-rw-r--r--TVout/fbset/fbset.h82
-rwxr-xr-xTVout/fbset/modeline2fb150
-rw-r--r--TVout/fbset/modes.l136
-rw-r--r--TVout/fbset/modes.y175
-rwxr-xr-xTVout/independ16
-rw-r--r--TVout/matroxset/Makefile10
-rw-r--r--TVout/matroxset/fb.h502
-rw-r--r--TVout/matroxset/matroxfb.h32
-rw-r--r--TVout/matroxset/matroxset.c162
-rwxr-xr-xTVout/matroxset/normal12
-rwxr-xr-xTVout/matroxset/swapit5
-rwxr-xr-xTVout/matroxset/swapped12
-rwxr-xr-xTVout/modules8
31 files changed, 3559 insertions, 0 deletions
diff --git a/TVout/Mon-640x400 b/TVout/Mon-640x400
new file mode 100755
index 0000000000..84238371cb
--- /dev/null
+++ b/TVout/Mon-640x400
@@ -0,0 +1,3 @@
+
+fbset/fbset -fb /dev/fb1 -db fbset.db 640x400-60
+
diff --git a/TVout/Mon-640x480 b/TVout/Mon-640x480
new file mode 100755
index 0000000000..6d7d257b8e
--- /dev/null
+++ b/TVout/Mon-640x480
@@ -0,0 +1,3 @@
+
+fbset/fbset -fb /dev/fb1 -db fbset.db 640x480-60
+
diff --git a/TVout/TV-640x512 b/TVout/TV-640x512
new file mode 100755
index 0000000000..aa3924e27a
--- /dev/null
+++ b/TVout/TV-640x512
@@ -0,0 +1,2 @@
+
+fbset/fbset -fb /dev/fb0 -left 60 -right 0 -upper 70 -lower 39 -hslen 76 -vslen 4 -xres 640 -yres 512 -bcast true
diff --git a/TVout/TV-640x528 b/TVout/TV-640x528
new file mode 100755
index 0000000000..6edeb82164
--- /dev/null
+++ b/TVout/TV-640x528
@@ -0,0 +1,3 @@
+
+fbset/fbset -fb /dev/fb0 -left 40 -right 0 -upper 63 -lower 29 -hslen 56 -vslen 4 -xres 640 -yres 528 -vxres 640 -vyres 528 -depth 32 -laced false -bcast true
+
diff --git a/TVout/TV-704x528 b/TVout/TV-704x528
new file mode 100755
index 0000000000..2554239e10
--- /dev/null
+++ b/TVout/TV-704x528
@@ -0,0 +1,3 @@
+
+fbset/fbset -fb /dev/fb0 -left 40 -right 0 -upper 63 -lower 29 -hslen 56 -vslen 4 -xres 640 -yres 528 -vxres 704 -vyres 528 -depth 32 -laced false -bcast true
+
diff --git a/TVout/TV-704x576 b/TVout/TV-704x576
new file mode 100755
index 0000000000..9585e6e5f1
--- /dev/null
+++ b/TVout/TV-704x576
@@ -0,0 +1,3 @@
+
+fbset/fbset -fb /dev/fb0 -left 42 -right 0 -upper 29 -lower 20 -hslen 46 -vslen 4 -xres 704 -yres 576 -vxres 704 -vyres 576 -depth 32 -laced false -bcast true
+
diff --git a/TVout/TV-720x576 b/TVout/TV-720x576
new file mode 100755
index 0000000000..fb5272a8c3
--- /dev/null
+++ b/TVout/TV-720x576
@@ -0,0 +1,3 @@
+
+fbset/fbset -fb /dev/fb0 -left 18 -right 0 -upper 39 -lower 10 -hslen 46 -vslen 4 -xres 720 -yres 576 -vxres 720 -vyres 576 -depth 32 -laced false -bcast true
+
diff --git a/TVout/clean.sh b/TVout/clean.sh
new file mode 100755
index 0000000000..56d7fd13b6
--- /dev/null
+++ b/TVout/clean.sh
@@ -0,0 +1,13 @@
+
+# Compile TVout tools
+
+rm -f con2fb/con2fb
+
+cd matroxset
+make clean
+cd ..
+
+cd fbset
+make clean
+cd ..
+
diff --git a/TVout/cloning b/TVout/cloning
new file mode 100755
index 0000000000..c8c545c254
--- /dev/null
+++ b/TVout/cloning
@@ -0,0 +1,14 @@
+
+# SETUP TVout
+# Same picture on TV & Monitor
+
+# CRTC1 -> TVout & Monitor
+matroxset/matroxset -f /dev/fb1 -m 0
+matroxset/matroxset -f /dev/fb0 -m 3
+
+# Enable TV
+matroxset/matroxset 1
+
+# Keep consoles on CRTC1
+con2fb/con2fb /dev/fb0 /dev/tty1
+con2fb/con2fb /dev/fb0 /dev/tty2
diff --git a/TVout/compile.sh b/TVout/compile.sh
new file mode 100755
index 0000000000..51160101bd
--- /dev/null
+++ b/TVout/compile.sh
@@ -0,0 +1,15 @@
+
+# Compile TVout tools
+
+cd con2fb
+gcc con2fb.c -o con2fb
+cd ..
+
+cd matroxset
+make
+cd ..
+
+cd fbset
+make
+cd ..
+
diff --git a/TVout/con2fb/con2fb.c b/TVout/con2fb/con2fb.c
new file mode 100644
index 0000000000..8ca7a9deaa
--- /dev/null
+++ b/TVout/con2fb/con2fb.c
@@ -0,0 +1,79 @@
+/* this is userspace utility which allows you to redirect console to another fb device
+ * You can specify devices & consoles by both numbers and devices. Framebuffers numbers
+ * are zero based (/dev/fb0 ... ), consoles begins with 1 (/dev/tty1 ... )
+ */
+#include <linux/fb.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+int main(int argc, char* argv[]) {
+ struct fb_con2fbmap c2m;
+ char* fbPath;
+ u_int32_t con, fb;
+ char* e;
+ char* progname = strrchr(argv[0], '/');
+ int f;
+
+ if (progname)
+ progname++;
+ else
+ progname = argv[0];
+ if (argc < 3) {
+ fprintf(stderr, "usage: %s fbdev console\n", progname);
+ return 1;
+ }
+ fb = strtoul(argv[1], &e, 10);
+ if (*e) {
+ struct stat sbf;
+
+ if (stat(argv[1], &sbf)) {
+ fprintf(stderr, "%s: are you sure that %s can be used to describe fbdev?\n", progname, argv[1]);
+ return 1;
+ }
+ if (!S_ISCHR(sbf.st_mode)) {
+ fprintf(stderr, "%s: %s must be character device\n", progname, argv[1]);
+ return 1;
+ }
+ fb = sbf.st_rdev & 0xFF;
+ if (fb >= 32)
+ fb >>= 5;
+ fbPath = argv[1];
+ } else
+ fbPath = "/dev/fb0";
+ con = strtoul(argv[2], &e, 10);
+ if (*e) {
+ struct stat sbf;
+
+ if (stat(argv[2], &sbf)) {
+ fprintf(stderr, "%s: are you sure that %s can be used to describe vt?\n", progname, argv[2]);
+ return 1;
+ }
+ if (!S_ISCHR(sbf.st_mode)) {
+ fprintf(stderr, "%s: %s must be character device\n", progname, argv[2]);
+ return 1;
+ }
+ con = sbf.st_rdev & 0xFF;
+ }
+ c2m.console = con;
+ c2m.framebuffer = fb;
+ f = open(fbPath, O_RDWR);
+ if (f < 0) {
+ fprintf(stderr, "%s: Cannot open %s\n", progname, fbPath);
+ return 1;
+ }
+ if (ioctl(f, FBIOPUT_CON2FBMAP, &c2m)) {
+ fprintf(stderr, "%s: Cannot set console mapping\n", progname);
+ close(f);
+ return 1;
+ }
+ close(f);
+ return 0;
+}
+
+
diff --git a/TVout/fbset.db b/TVout/fbset.db
new file mode 100644
index 0000000000..0dff5fb377
--- /dev/null
+++ b/TVout/fbset.db
@@ -0,0 +1,34 @@
+
+# FBset mode database
+
+mode "640x480" # H: 33.78 kHz, V: 67.56 Hz
+ geometry 640 480 640 480 4
+ timings 35242 24 64 17 1 112 2
+endmode
+
+mode "640x480-60"
+ # D: 25.176 MHz, H: 31.469 kHz, V: 59.942 Hz
+ geometry 640 480 640 480 16
+ timings 39721 48 16 33 10 96 2
+ hsync high
+ accel true
+# rgba 5/11,6/5,5/0,0/0
+endmode
+
+mode "640x400-60"
+ # D: 25.176 MHz, H: 31.469 kHz, V: 59.942 Hz
+ geometry 640 400 640 400 16
+ timings 39721 48 16 33 10 96 2
+ hsync high
+ accel true
+# rgba 5/11,6/5,5/0,0/0
+endmode
+
+mode "vga70"
+ # H: 31.113 kHz, V: 69.294 Hz
+ geometry 640 400 640 400 4
+ timings 35242 64 96 35 12 112 2
+# vsync high
+# csync high
+endmode
+
diff --git a/TVout/fbset/INSTALL b/TVout/fbset/INSTALL
new file mode 100644
index 0000000000..87780aa30d
--- /dev/null
+++ b/TVout/fbset/INSTALL
@@ -0,0 +1,20 @@
+
+
+ FBSET INSTALLATION GUIDE
+
+
+Change the current directory to the directory containing the fbset sources and
+type
+
+ make install
+
+This will create the fbset binary and install it, together with the manual
+pages. It also creates the standard frame buffer special device nodes.
+
+
+The etc subdirectory contains sample frame buffer mode definitions files. Copy
+one of them to /etc/fb.modes and edit it to your needs.
+
+
+Enjoy!
+
diff --git a/TVout/fbset/Makefile b/TVout/fbset/Makefile
new file mode 100644
index 0000000000..3a71024b01
--- /dev/null
+++ b/TVout/fbset/Makefile
@@ -0,0 +1,41 @@
+#
+# Linux Frame Buffer Device Configuration
+#
+
+CC = gcc -Wall -O2 -I.
+BISON = bison -d
+FLEX = flex
+INSTALL = install
+RM = rm -f
+
+All: fbset
+
+
+fbset: fbset.o modes.tab.o lex.yy.o
+
+fbset.o: fbset.c fbset.h fb.h
+modes.tab.o: modes.tab.c fbset.h fb.h
+lex.yy.o: lex.yy.c fbset.h modes.tab.h
+
+lex.yy.c: modes.l
+ $(FLEX) modes.l
+
+modes.tab.c: modes.y
+ $(BISON) modes.y
+
+install: fbset
+ if [ -f /sbin/fbset ]; then rm /sbin/fbset; fi
+ $(INSTALL) fbset /usr/sbin
+ $(INSTALL) fbset.8 /usr/man/man8
+ $(INSTALL) fb.modes.5 /usr/man/man5
+ if [ ! -c /dev/fb0 ]; then mknod /dev/fb0 c 29 0; fi
+ if [ ! -c /dev/fb1 ]; then mknod /dev/fb1 c 29 32; fi
+ if [ ! -c /dev/fb2 ]; then mknod /dev/fb2 c 29 64; fi
+ if [ ! -c /dev/fb3 ]; then mknod /dev/fb3 c 29 96; fi
+ if [ ! -c /dev/fb4 ]; then mknod /dev/fb4 c 29 128; fi
+ if [ ! -c /dev/fb5 ]; then mknod /dev/fb5 c 29 160; fi
+ if [ ! -c /dev/fb6 ]; then mknod /dev/fb6 c 29 192; fi
+ if [ ! -c /dev/fb7 ]; then mknod /dev/fb7 c 29 224; fi
+
+clean:
+ $(RM) *.o fbset lex.yy.c modes.tab.c modes.tab.h
diff --git a/TVout/fbset/fb.h b/TVout/fbset/fb.h
new file mode 100644
index 0000000000..b901d9e204
--- /dev/null
+++ b/TVout/fbset/fb.h
@@ -0,0 +1,497 @@
+#ifndef _LINUX_FB_H
+#define _LINUX_FB_H
+
+#include <asm/types.h>
+
+/* Definitions of frame buffers */
+
+#define FB_MAJOR 29
+
+#define FB_MODES_SHIFT 5 /* 32 modes per framebuffer */
+#define FB_NUM_MINORS 256 /* 256 Minors */
+#define FB_MAX (FB_NUM_MINORS / (1 << FB_MODES_SHIFT))
+#define GET_FB_IDX(node) (MINOR(node) >> FB_MODES_SHIFT)
+
+/* ioctls
+ 0x46 is 'F' */
+#define FBIOGET_VSCREENINFO 0x4600
+#define FBIOPUT_VSCREENINFO 0x4601
+#define FBIOGET_FSCREENINFO 0x4602
+#define FBIOGETCMAP 0x4604
+#define FBIOPUTCMAP 0x4605
+#define FBIOPAN_DISPLAY 0x4606
+/* 0x4607-0x460B are defined below */
+/* #define FBIOGET_MONITORSPEC 0x460C */
+/* #define FBIOPUT_MONITORSPEC 0x460D */
+/* #define FBIOSWITCH_MONIBIT 0x460E */
+#define FBIOGET_CON2FBMAP 0x460F
+#define FBIOPUT_CON2FBMAP 0x4610
+
+#define FB_TYPE_PACKED_PIXELS 0 /* Packed Pixels */
+#define FB_TYPE_PLANES 1 /* Non interleaved planes */
+#define FB_TYPE_INTERLEAVED_PLANES 2 /* Interleaved planes */
+#define FB_TYPE_TEXT 3 /* Text/attributes */
+#define FB_TYPE_VGA_PLANES 4 /* EGA/VGA planes */
+
+#define FB_AUX_TEXT_MDA 0 /* Monochrome text */
+#define FB_AUX_TEXT_CGA 1 /* CGA/EGA/VGA Color text */
+#define FB_AUX_TEXT_S3_MMIO 2 /* S3 MMIO fasttext */
+#define FB_AUX_TEXT_MGA_STEP16 3 /* MGA Millenium I: text, attr, 14 reserved bytes */
+#define FB_AUX_TEXT_MGA_STEP8 4 /* other MGAs: text, attr, 6 reserved bytes */
+
+#define FB_AUX_VGA_PLANES_VGA4 0 /* 16 color planes (EGA/VGA) */
+#define FB_AUX_VGA_PLANES_CFB4 1 /* CFB4 in planes (VGA) */
+#define FB_AUX_VGA_PLANES_CFB8 2 /* CFB8 in planes (VGA) */
+
+#define FB_VISUAL_MONO01 0 /* Monochr. 1=Black 0=White */
+#define FB_VISUAL_MONO10 1 /* Monochr. 1=White 0=Black */
+#define FB_VISUAL_TRUECOLOR 2 /* True color */
+#define FB_VISUAL_PSEUDOCOLOR 3 /* Pseudo color (like atari) */
+#define FB_VISUAL_DIRECTCOLOR 4 /* Direct color */
+#define FB_VISUAL_STATIC_PSEUDOCOLOR 5 /* Pseudo color readonly */
+
+#define FB_ACCEL_NONE 0 /* no hardware accelerator */
+#define FB_ACCEL_ATARIBLITT 1 /* Atari Blitter */
+#define FB_ACCEL_AMIGABLITT 2 /* Amiga Blitter */
+#define FB_ACCEL_S3_TRIO64 3 /* Cybervision64 (S3 Trio64) */
+#define FB_ACCEL_NCR_77C32BLT 4 /* RetinaZ3 (NCR 77C32BLT) */
+#define FB_ACCEL_S3_VIRGE 5 /* Cybervision64/3D (S3 ViRGE) */
+#define FB_ACCEL_ATI_MACH64GX 6 /* ATI Mach 64GX family */
+#define FB_ACCEL_DEC_TGA 7 /* DEC 21030 TGA */
+#define FB_ACCEL_ATI_MACH64CT 8 /* ATI Mach 64CT family */
+#define FB_ACCEL_ATI_MACH64VT 9 /* ATI Mach 64CT family VT class */
+#define FB_ACCEL_ATI_MACH64GT 10 /* ATI Mach 64CT family GT class */
+#define FB_ACCEL_SUN_CREATOR 11 /* Sun Creator/Creator3D */
+#define FB_ACCEL_SUN_CGSIX 12 /* Sun cg6 */
+#define FB_ACCEL_SUN_LEO 13 /* Sun leo/zx */
+#define FB_ACCEL_IMS_TWINTURBO 14 /* IMS Twin Turbo */
+#define FB_ACCEL_3DLABS_PERMEDIA2 15 /* 3Dlabs Permedia 2 */
+#define FB_ACCEL_MATROX_MGA2064W 16 /* Matrox MGA2064W (Millenium) */
+#define FB_ACCEL_MATROX_MGA1064SG 17 /* Matrox MGA1064SG (Mystique) */
+#define FB_ACCEL_MATROX_MGA2164W 18 /* Matrox MGA2164W (Millenium II) */
+#define FB_ACCEL_MATROX_MGA2164W_AGP 19 /* Matrox MGA2164W (Millenium II) */
+#define FB_ACCEL_MATROX_MGAG100 20 /* Matrox G100 (Productiva G100) */
+#define FB_ACCEL_MATROX_MGAG200 21 /* Matrox G200 (Myst, Mill, ...) */
+#define FB_ACCEL_SUN_CG14 22 /* Sun cgfourteen */
+#define FB_ACCEL_SUN_BWTWO 23 /* Sun bwtwo */
+#define FB_ACCEL_SUN_CGTHREE 24 /* Sun cgthree */
+#define FB_ACCEL_SUN_TCX 25 /* Sun tcx */
+#define FB_ACCEL_MATROX_MGAG400 26 /* Matrox G400 */
+
+struct fb_fix_screeninfo {
+ char id[16]; /* identification string eg "TT Builtin" */
+ char *smem_start; /* Start of frame buffer mem */
+ /* (physical address) */
+ __u32 smem_len; /* Length of frame buffer mem */
+ __u32 type; /* see FB_TYPE_* */
+ __u32 type_aux; /* Interleave for interleaved Planes */
+ __u32 visual; /* see FB_VISUAL_* */
+ __u16 xpanstep; /* zero if no hardware panning */
+ __u16 ypanstep; /* zero if no hardware panning */
+ __u16 ywrapstep; /* zero if no hardware ywrap */
+ __u32 line_length; /* length of a line in bytes */
+ char *mmio_start; /* Start of Memory Mapped I/O */
+ /* (physical address) */
+ __u32 mmio_len; /* Length of Memory Mapped I/O */
+ __u32 accel; /* Type of acceleration available */
+ __u16 reserved[3]; /* Reserved for future compatibility */
+};
+
+/* Interpretation of offset for color fields: All offsets are from the right,
+ * inside a "pixel" value, which is exactly 'bits_per_pixel' wide (means: you
+ * can use the offset as right argument to <<). A pixel afterwards is a bit
+ * stream and is written to video memory as that unmodified. This implies
+ * big-endian byte order if bits_per_pixel is greater than 8.
+ */
+struct fb_bitfield {
+ __u32 offset; /* beginning of bitfield */
+ __u32 length; /* length of bitfield */
+ __u32 msb_right; /* != 0 : Most significant bit is */
+ /* right */
+};
+
+#define FB_NONSTD_HAM 1 /* Hold-And-Modify (HAM) */
+
+#define FB_ACTIVATE_NOW 0 /* set values immediately (or vbl)*/
+#define FB_ACTIVATE_NXTOPEN 1 /* activate on next open */
+#define FB_ACTIVATE_TEST 2 /* don't set, round up impossible */
+#define FB_ACTIVATE_MASK 15
+ /* values */
+#define FB_ACTIVATE_VBL 16 /* activate values on next vbl */
+#define FB_CHANGE_CMAP_VBL 32 /* change colormap on vbl */
+#define FB_ACTIVATE_ALL 64 /* change all VCs on this fb */
+
+#define FB_ACCELF_TEXT 1 /* text mode acceleration */
+
+#define FB_SYNC_HOR_HIGH_ACT 1 /* horizontal sync high active */
+#define FB_SYNC_VERT_HIGH_ACT 2 /* vertical sync high active */
+#define FB_SYNC_EXT 4 /* external sync */
+#define FB_SYNC_COMP_HIGH_ACT 8 /* composite sync high active */
+#define FB_SYNC_BROADCAST 16 /* broadcast video timings */
+ /* vtotal = 144d/288n/576i => PAL */
+ /* vtotal = 121d/242n/484i => NTSC */
+#define FB_SYNC_ON_GREEN 32 /* sync on green */
+
+#define FB_VMODE_NONINTERLACED 0 /* non interlaced */
+#define FB_VMODE_INTERLACED 1 /* interlaced */
+#define FB_VMODE_DOUBLE 2 /* double scan */
+#define FB_VMODE_MASK 255
+
+#define FB_VMODE_YWRAP 256 /* ywrap instead of panning */
+#define FB_VMODE_SMOOTH_XPAN 512 /* smooth xpan possible (internally used) */
+#define FB_VMODE_CONUPDATE 512 /* don't update x/yoffset */
+
+struct fb_var_screeninfo {
+ __u32 xres; /* visible resolution */
+ __u32 yres;
+ __u32 xres_virtual; /* virtual resolution */
+ __u32 yres_virtual;
+ __u32 xoffset; /* offset from virtual to visible */
+ __u32 yoffset; /* resolution */
+
+ __u32 bits_per_pixel; /* guess what */
+ __u32 grayscale; /* != 0 Graylevels instead of colors */
+
+ struct fb_bitfield red; /* bitfield in fb mem if true color, */
+ struct fb_bitfield green; /* else only length is significant */
+ struct fb_bitfield blue;
+ struct fb_bitfield transp; /* transparency */
+
+ __u32 nonstd; /* != 0 Non standard pixel format */
+
+ __u32 activate; /* see FB_ACTIVATE_* */
+
+ __u32 height; /* height of picture in mm */
+ __u32 width; /* width of picture in mm */
+
+ __u32 accel_flags; /* acceleration flags (hints) */
+
+ /* Timing: All values in pixclocks, except pixclock (of course) */
+ __u32 pixclock; /* pixel clock in ps (pico seconds) */
+ __u32 left_margin; /* time from sync to picture */
+ __u32 right_margin; /* time from picture to sync */
+ __u32 upper_margin; /* time from sync to picture */
+ __u32 lower_margin;
+ __u32 hsync_len; /* length of horizontal sync */
+ __u32 vsync_len; /* length of vertical sync */
+ __u32 sync; /* see FB_SYNC_* */
+ __u32 vmode; /* see FB_VMODE_* */
+ __u32 reserved[6]; /* Reserved for future compatibility */
+};
+
+struct fb_cmap {
+ __u32 start; /* First entry */
+ __u32 len; /* Number of entries */
+ __u16 *red; /* Red values */
+ __u16 *green;
+ __u16 *blue;
+ __u16 *transp; /* transparency, can be NULL */
+};
+
+struct fb_con2fbmap {
+ __u32 console;
+ __u32 framebuffer;
+};
+
+struct fb_monspecs {
+ __u32 hfmin; /* hfreq lower limit (Hz) */
+ __u32 hfmax; /* hfreq upper limit (Hz) */
+ __u16 vfmin; /* vfreq lower limit (Hz) */
+ __u16 vfmax; /* vfreq upper limit (Hz) */
+ unsigned dpms : 1; /* supports DPMS */
+};
+
+#ifdef __KERNEL__
+
+#include <linux/fs.h>
+
+
+struct fb_info;
+struct fb_info_gen;
+struct vm_area_struct;
+struct file;
+
+ /*
+ * Frame buffer operations
+ */
+
+struct fb_ops {
+ /* open/release and usage marking */
+ int (*fb_open)(struct fb_info *info, int user);
+ int (*fb_release)(struct fb_info *info, int user);
+ /* get non settable parameters */
+ int (*fb_get_fix)(struct fb_fix_screeninfo *fix, int con,
+ struct fb_info *info);
+ /* get settable parameters */
+ int (*fb_get_var)(struct fb_var_screeninfo *var, int con,
+ struct fb_info *info);
+ /* set settable parameters */
+ int (*fb_set_var)(struct fb_var_screeninfo *var, int con,
+ struct fb_info *info);
+ /* get colormap */
+ int (*fb_get_cmap)(struct fb_cmap *cmap, int kspc, int con,
+ struct fb_info *info);
+ /* set colormap */
+ int (*fb_set_cmap)(struct fb_cmap *cmap, int kspc, int con,
+ struct fb_info *info);
+ /* pan display */
+ int (*fb_pan_display)(struct fb_var_screeninfo *var, int con,
+ struct fb_info *info);
+ /* perform fb specific ioctl */
+ int (*fb_ioctl)(struct inode *inode, struct file *file, unsigned int cmd,
+ unsigned long arg, int con, struct fb_info *info);
+ /* perform fb specific mmap */
+ int (*fb_mmap)(struct fb_info *info, struct file *file, struct vm_area_struct *vma);
+ /* switch to/from raster image mode */
+ int (*fb_rasterimg)(struct fb_info *info, int start);
+};
+
+
+ /*
+ * This is the interface between the low-level console driver and the
+ * low-level frame buffer device
+ */
+
+struct display {
+ /* Filled in by the frame buffer device */
+
+ struct fb_var_screeninfo var; /* variable infos. yoffset and vmode */
+ /* are updated by fbcon.c */
+ struct fb_cmap cmap; /* colormap */
+ char *screen_base; /* pointer to top of virtual screen */
+ /* (virtual address) */
+ int visual;
+ int type; /* see FB_TYPE_* */
+ int type_aux; /* Interleave for interleaved Planes */
+ u_short ypanstep; /* zero if no hardware ypan */
+ u_short ywrapstep; /* zero if no hardware ywrap */
+ u_long line_length; /* length of a line in bytes */
+ u_short can_soft_blank; /* zero if no hardware blanking */
+ u_short inverse; /* != 0 text black on white as default */
+ struct display_switch *dispsw; /* low level operations */
+ void *dispsw_data; /* optional dispsw helper data */
+
+#if 0
+ struct fb_fix_cursorinfo fcrsr;
+ struct fb_var_cursorinfo *vcrsr;
+ struct fb_cursorstate crsrstate;
+#endif
+
+ /* Filled in by the low-level console driver */
+
+ struct vc_data *conp; /* pointer to console data */
+ struct fb_info *fb_info; /* frame buffer for this console */
+ int vrows; /* number of virtual rows */
+ unsigned short cursor_x; /* current cursor position */
+ unsigned short cursor_y;
+ int fgcol; /* text colors */
+ int bgcol;
+ u_long next_line; /* offset to one line below */
+ u_long next_plane; /* offset to next plane */
+ u_char *fontdata; /* Font associated to this display */
+ unsigned short _fontheightlog;
+ unsigned short _fontwidthlog;
+ unsigned short _fontheight;
+ unsigned short _fontwidth;
+ int userfont; /* != 0 if fontdata kmalloc()ed */
+ u_short scrollmode; /* Scroll Method */
+ short yscroll; /* Hardware scrolling */
+ unsigned char fgshift, bgshift;
+ unsigned short charmask; /* 0xff or 0x1ff */
+};
+
+
+struct fb_info {
+ char modename[40]; /* default video mode */
+ kdev_t node;
+ int flags;
+#define FBINFO_FLAG_MODULE 1 /* Low-level driver is a module */
+ struct fb_ops *fbops;
+ struct fb_monspecs monspecs;
+ struct display *disp; /* initial display variable */
+ struct vc_data *display_fg; /* Console visible on this display */
+ char fontname[40]; /* default font name */
+ int (*changevar)(int); /* tell console var has changed */
+ int (*switch_con)(int, struct fb_info*);
+ /* tell fb to switch consoles */
+ int (*updatevar)(int, struct fb_info*);
+ /* tell fb to update the vars */
+ void (*blank)(int, struct fb_info*); /* tell fb to (un)blank the screen */
+ /* arg = 0: unblank */
+ /* arg > 0: VESA level (arg-1) */
+
+ /* From here on everything is device dependent */
+};
+
+#ifdef MODULE
+#define FBINFO_FLAG_DEFAULT FBINFO_FLAG_MODULE
+#else
+#define FBINFO_FLAG_DEFAULT 0
+#endif
+
+ /*
+ * This structure abstracts from the underlying hardware. It is not
+ * mandatory but used by the `generic' frame buffer operations.
+ * Read drivers/video/skeletonfb.c for more information.
+ */
+
+struct fbgen_hwswitch {
+ void (*detect)(void);
+ int (*encode_fix)(struct fb_fix_screeninfo *fix, const void *par,
+ struct fb_info_gen *info);
+ int (*decode_var)(const struct fb_var_screeninfo *var, void *par,
+ struct fb_info_gen *info);
+ int (*encode_var)(struct fb_var_screeninfo *var, const void *par,
+ struct fb_info_gen *info);
+ void (*get_par)(void *par, struct fb_info_gen *info);
+ void (*set_par)(const void *par, struct fb_info_gen *info);
+ int (*getcolreg)(unsigned regno, unsigned *red, unsigned *green,
+ unsigned *blue, unsigned *transp, struct fb_info *info);
+ int (*setcolreg)(unsigned regno, unsigned red, unsigned green,
+ unsigned blue, unsigned transp, struct fb_info *info);
+ int (*pan_display)(const struct fb_var_screeninfo *var,
+ struct fb_info_gen *info);
+ int (*blank)(int blank_mode, struct fb_info_gen *info);
+ void (*set_disp)(const void *par, struct display *disp,
+ struct fb_info_gen *info);
+};
+
+struct fb_info_gen {
+ struct fb_info info;
+
+ /* Entries for a generic frame buffer device */
+ /* Yes, this starts looking like C++ */
+ u_int parsize;
+ struct fbgen_hwswitch *fbhw;
+
+ /* From here on everything is device dependent */
+};
+
+ /*
+ * `Generic' versions of the frame buffer device operations
+ */
+
+extern int fbgen_get_fix(struct fb_fix_screeninfo *fix, int con,
+ struct fb_info *info);
+extern int fbgen_get_var(struct fb_var_screeninfo *var, int con,
+ struct fb_info *info);
+extern int fbgen_set_var(struct fb_var_screeninfo *var, int con,
+ struct fb_info *info);
+extern int fbgen_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+ struct fb_info *info);
+extern int fbgen_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+ struct fb_info *info);
+extern int fbgen_pan_display(struct fb_var_screeninfo *var, int con,
+ struct fb_info *info);
+extern int fbgen_ioctl(struct inode *inode, struct file *file,
+ unsigned int cmd, unsigned long arg, int con,
+ struct fb_info *info);
+
+ /*
+ * Helper functions
+ */
+
+extern int fbgen_do_set_var(struct fb_var_screeninfo *var, int isactive,
+ struct fb_info_gen *info);
+extern void fbgen_set_disp(int con, struct fb_info_gen *info);
+extern void fbgen_install_cmap(int con, struct fb_info_gen *info);
+extern int fbgen_update_var(int con, struct fb_info *info);
+extern int fbgen_switch(int con, struct fb_info *info);
+extern void fbgen_blank(int blank, struct fb_info *info);
+
+
+struct fb_videomode {
+ const char *name;
+ struct fb_var_screeninfo var;
+};
+
+
+/* drivers/char/fbmem.c */
+extern int register_framebuffer(struct fb_info *fb_info);
+extern int unregister_framebuffer(const struct fb_info *fb_info);
+extern int fbmon_valid_timings(u_int pixclock, u_int htotal, u_int vtotal,
+ const struct fb_info *fb_info);
+extern int fbmon_dpms(const struct fb_info *fb_info);
+
+
+extern int num_registered_fb;
+extern struct fb_info *registered_fb[FB_MAX];
+extern char con2fb_map[MAX_NR_CONSOLES];
+
+/* drivers/video/fbcon.c */
+extern struct display fb_display[MAX_NR_CONSOLES];
+
+/* drivers/video/fbcmap.c */
+extern int fb_alloc_cmap(struct fb_cmap *cmap, int len, int transp);
+extern void fb_copy_cmap(struct fb_cmap *from, struct fb_cmap *to,
+ int fsfromto);
+extern int fb_get_cmap(struct fb_cmap *cmap, int kspc,
+ int (*getcolreg)(u_int, u_int *, u_int *, u_int *,
+ u_int *, struct fb_info *),
+ struct fb_info *fb_info);
+extern int fb_set_cmap(struct fb_cmap *cmap, int kspc,
+ int (*setcolreg)(u_int, u_int, u_int, u_int, u_int,
+ struct fb_info *),
+ struct fb_info *fb_info);
+extern struct fb_cmap *fb_default_cmap(int len);
+extern void fb_invert_cmaps(void);
+
+/* VESA Blanking Levels */
+#define VESA_NO_BLANKING 0
+#define VESA_VSYNC_SUSPEND 1
+#define VESA_HSYNC_SUSPEND 2
+#define VESA_POWERDOWN 3
+
+#endif /* __KERNEL__ */
+
+#if 1
+
+#define FBCMD_GET_CURRENTPAR 0xDEAD0005
+#define FBCMD_SET_CURRENTPAR 0xDEAD8005
+
+#endif
+
+
+#if 1 /* Preliminary */
+
+ /*
+ * Hardware Cursor
+ */
+
+#define FBIOGET_FCURSORINFO 0x4607
+#define FBIOGET_VCURSORINFO 0x4608
+#define FBIOPUT_VCURSORINFO 0x4609
+#define FBIOGET_CURSORSTATE 0x460A
+#define FBIOPUT_CURSORSTATE 0x460B
+
+
+struct fb_fix_cursorinfo {
+ __u16 crsr_width; /* width and height of the cursor in */
+ __u16 crsr_height; /* pixels (zero if no cursor) */
+ __u16 crsr_xsize; /* cursor size in display pixels */
+ __u16 crsr_ysize;
+ __u16 crsr_color1; /* colormap entry for cursor color1 */
+ __u16 crsr_color2; /* colormap entry for cursor color2 */
+};
+
+struct fb_var_cursorinfo {
+ __u16 width;
+ __u16 height;
+ __u16 xspot;
+ __u16 yspot;
+ __u8 data[1]; /* field with [height][width] */
+};
+
+struct fb_cursorstate {
+ __s16 xoffset;
+ __s16 yoffset;
+ __u16 mode;
+};
+
+#define FB_CURSOR_OFF 0
+#define FB_CURSOR_ON 1
+#define FB_CURSOR_FLASH 2
+
+#endif /* Preliminary */
+
+#endif /* _LINUX_FB_H */
diff --git a/TVout/fbset/fb.modes.5 b/TVout/fbset/fb.modes.5
new file mode 100644
index 0000000000..0918f08f5d
--- /dev/null
+++ b/TVout/fbset/fb.modes.5
@@ -0,0 +1,228 @@
+.TH fb.modes 8 "Aug 1996" local "Linux frame buffer utils"
+.SH NAME
+fb.modes \- frame buffer modes file
+.SH DESCRIPTION
+.I /etc/fb.modes
+contains an unlimited number of video mode descriptions. The general format
+of a video mode is:
+.sp
+mode
+.RI \" name \"
+.RS
+geometry
+.RI < xres >
+.RI < yres >
+.RI < vxres >
+.RI < vyres >
+.RI < depth >
+.br
+timings
+.RI < pixclock >
+.RI < left >
+.RI < right >
+.RI < upper >
+.RI < lower >
+.RI < hslen >
+.RI < vslen >
+.br
+.B options
+.RI < value >
+.RE
+endmode
+.SH OPTIONS
+geometry options:
+.RS
+.TP
+.I xres
+visible horizontal resolution (in pixels)
+.TP
+.I yres
+visible vertical resolution (in pixels)
+.TP
+.I vxres
+virtual horizontal resolution (in pixels)
+.TP
+.I vyres
+virtual vertical resolution (in pixels)
+.TP
+.I depth
+display depth (in bits per pixel)
+.RE
+.PP
+timing options:
+.RS
+.TP
+.I pixclock
+length of one pixel (in picoseconds)
+.TP
+.I left
+left margin (in pixels)
+.TP
+.I right
+right margin (in pixels)
+.TP
+.I upper
+upper margin (in pixel lines)
+.TP
+.I lower
+lower margin (in pixel lines)
+.TP
+.I hslen
+horizontal sync length (in pixels)
+.TP
+.I vslen
+vertical sync length (in pixel lines)
+.RE
+.PP
+other options:
+.RS
+the first value of this options is the default
+.TP
+.IR \fBhsync "\ {" low | high }
+the horizontal sync polarity
+.TP
+.IR \fBvsync "\ {" low | high }
+the vertical sync polarity
+.TP
+.IR \fBcsync "\ {" low | high }
+the composite sync polarity
+.TP
+.IR \fBextsync "\ {" false | true }
+enable or disable external resync. If enabled the sync timings are not
+generated by the frame buffer device and must be provided externally
+instead. Note that this option may not be supported by every frame buffer
+device
+.TP
+.IR \fBlaced "\ {" false | true }
+enable or disable interlace. If enabled the display will be split in two
+frames, each frame contains only even and odd lines respectively. These two
+frames will be displayed alternating, this way twice the lines can be
+displayed and the vertical frequency for monitor stays the same, but the
+visible vertical frequency gets halved
+.TP
+.IR \fBdouble "\ {" false | true }
+enable or disable doublescan. If enabled every line will be displayed twice
+and this way the horizontal frequency can easily be doubled, so that the
+same resolution can be displayed on different monitors, even if the
+horizontal frequency specification differs. Note that this option may not be
+supported by every frame buffer device
+.RE
+.SH INTERNALS
+Generally a frame buffer display is organized as follows:
+.sp
+.ad c
++\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-+\-\-\-+
+.br
+.RB "|\ \ \ |\ \ \ \ \ \ \ " ^ "\ \ \ \ \ \ \ |\ \ \ |\ \ \ |"
+.br
+.RB "|\ \ \ |\ \ \ \ \ \ \ " | "\ " \fI5 "\ \ \ \ \ |\ \ \ |\ \ \ |"
+.br
+.RB "|\ \ \ |\ \ \ \ \ \ \ " v "\ \ \ \ \ \ \ |\ \ \ |\ \ \ |"
+.br
++\-\-\-#################\-\-\-+\-\-\-+
+.br
+.RB "|\ \ \ #\ \ \ \ \ \ \ " ^ "\ \ \ \ \ \ \ #\ \ \ |\ \ \ |"
+.br
+.RB "|\ \ \ #\ \ \ \ \ \ \ " | "\ \ \ \ \ \ \ #\ \ \ |\ \ \ |"
+.br
+.RB "|\ \ \ #\ \ \ \ \ \ \ " | "\ \ \ \ \ \ \ #\ \ \ |\ \ \ |"
+.br
+.RI "| " 1 " # " \fB| " " 2 " # " 3 " | " 4 " |"
+.br
+.RB "|" "<\->" "#" "<\-\-\-\-\-\-+\-\-\-\-\-\->" "#" "<\->" "|" "<\->" "|"
+.br
+.RB "|\ \ \ #\ \ \ \ \ \ \ " | "\ \ \ \ \ \ \ #\ \ \ |\ \ \ |"
+.br
+.RB "|\ \ \ #\ \ \ \ \ \ \ " | "\ " \fI6 "\ \ \ \ \ #\ \ \ |\ \ \ |"
+.br
+.RB "|\ \ \ #\ \ \ \ \ \ \ " | "\ \ \ \ \ \ \ #\ \ \ |\ \ \ |"
+.br
+.RB "|\ \ \ #\ \ \ \ \ \ \ " v "\ \ \ \ \ \ \ #\ \ \ |\ \ \ |"
+.br
++\-\-\-#################\-\-\-+\-\-\-+
+.br
+.RB "|\ \ \ |\ \ \ \ \ \ \ " ^ "\ \ \ \ \ \ \ |\ \ \ |\ \ \ |"
+.br
+.RB "|\ \ \ |\ \ \ \ \ \ \ " | "\ " \fI7 "\ \ \ \ \ |\ \ \ |\ \ \ |"
+.br
+.RB "|\ \ \ |\ \ \ \ \ \ \ " v "\ \ \ \ \ \ \ |\ \ \ |\ \ \ |"
+.br
++\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-+\-\-\-+
+.br
+.RB "|\ \ \ |\ \ \ \ \ \ \ " ^ "\ \ \ \ \ \ \ |\ \ \ |\ \ \ |"
+.br
+.RB "|\ \ \ |\ \ \ \ \ \ \ " | "\ " \fI8 "\ \ \ \ \ |\ \ \ |\ \ \ |"
+.br
+.RB "|\ \ \ |\ \ \ \ \ \ \ " v "\ \ \ \ \ \ \ |\ \ \ |\ \ \ |"
+.br
++\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-+\-\-\-+
+.sp
+.ad n
+.RS
+.I 1
+\t left margin
+.br
+.I 2
+\t xres
+.br
+.I 3
+\t right margin
+.br
+.I 4
+\t horizontal sync len
+.br
+.I 5
+\t upper margin
+.br
+.I 6
+\t yres
+.br
+.I 7
+\t lower margin
+.br
+.I 8
+\t vertical sync len
+.RE
+.sp
+The area bordered with `#' is the visible display area. Horizontal and
+vertical frequencies can now easily be calculated, for this the sum of
+horizontal or vertical values are important
+.RS
+.sp
+htotal\ =\ left\ +\ xres\ +\ right\ +\ hslen
+.br
+vtotal\ =\ upper\ +\ yres\ +\ lower\ +\ vslen
+.sp
+.RE
+The length of one line can now be calculated with pixclock
+.RS
+.sp
+line\ =\ pixclock\ *\ htotal
+.sp
+.RE
+and we have the horizontal frequency
+.RS
+.sp
+hfreq\ =\ 1E12\ /\ line\ =\ 1E12\ /\ (pixclock\ *\ htotal)
+.sp
+.RE
+To get the vertical frequency vtotal must eventually adjusted. If the
+display is laced, vtotal must be halved or if the display is a doublescan
+one, vtotal must be doubled. Now we can calculate the length of one frame
+.RS
+.sp
+if\ (lace)\ \ \ vtotal\ /=\ 2
+.br
+if\ (double)\ vtotal\ *=\ 2
+.sp
+frame\ =\ vtotal\ *\ line
+.sp
+.RE
+and we get also the vertical frequency
+.RS
+.sp
+vfreq\ =\ 1E12\ /\ frame\ =\ hfreq\ /\ vtotal
+.sp
+.RE
+.SH SEE ALSO
+.BR fbset "(8), " fbdev (4)
diff --git a/TVout/fbset/fbset.8 b/TVout/fbset/fbset.8
new file mode 100644
index 0000000000..74e7d3c1b8
--- /dev/null
+++ b/TVout/fbset/fbset.8
@@ -0,0 +1,242 @@
+.TH fbset 8 "July 1998" local "Linux frame buffer utils"
+.SH NAME
+fbset \- show and modify frame buffer device settings
+.SH SYNOPSIS
+.B fbset
+.RI [ options ]
+.RI [ mode ]
+.SH DESCRIPTION
+.B This documentation is out of date!!
+.PP
+.B fbset
+is a system utility to show or change the settings of the frame buffer
+device. The frame buffer device provides a simple and unique interface to
+access different kinds of graphic displays.
+.PP
+Frame buffer devices are accessed via special device nodes located in the
+/dev directory. The naming scheme for these nodes is always
+.IR \fBfb < n >,
+where
+.I n
+is the number of the used frame buffer device.
+.PP
+.B fbset
+uses an own video mode database located in /etc/fb.modes. An unlimited
+number of video modes can be defined in this database. For further
+information see
+.BR fb.modes (5).
+.SH OPTIONS
+If no option is given,
+.B fbset
+will display the current frame buffer settings.
+.sp
+General options:
+.RS
+.TP
+.BR \-\-help ",\ " \-h
+display an usage information
+.TP
+.BR \-\-now ",\ " \-n
+change the video mode immediately. If no frame buffer device is given via
+.B \-fb
+, then this option is activated by default
+.TP
+.BR \-\-show ",\ " \-s
+display the video mode settings. This is default if no further option or
+only a frame buffer device via
+.B \-fb
+is given
+.TP
+.BR \-\-info ",\ " \-i
+display all available frame buffer information
+.TP
+.BR \-\-verbose ",\ " \-v
+display information what
+.B fbset
+is currently doing
+.TP
+.BR \-\-version ",\ " \-V
+display the version information about
+.B fbset
+.TP
+.BR \-\-xfree86 ",\ " \-x
+display the timing information as it's needed by XFree86
+.RE
+.PP
+Frame buffer device nodes:
+.RS
+.TP
+.BR \-fb "\ <" \fIdevice >
+.I device
+gives the frame buffer device node. If no device via
+.B \-fb
+is given,
+.I /dev/fb0
+is used
+.TP
+.RE
+.PP
+Video mode database:
+.RS
+.TP
+.BR \-db "\ <" \fIfile >
+set an alternative video mode database file (default is
+.IR /etc/fb.modes ),
+see also
+.BR fb.modes (5)
+.RE
+.PP
+Display geometry:
+.RS
+.TP
+.BR \-xres "\ <" \fIvalue >
+set visible horizontal resolution (in pixels)
+.TP
+.BR \-yres "\ <" \fIvalue >
+set visible vertical resolution (in pixels)
+.TP
+.BR \-vxres "\ <" \fIvalue >
+set virtual horizontal resolution (in pixels)
+.TP
+.BR \-vyres "\ <" \fIvalue >
+set virtual vertical resolution (in pixels)
+.TP
+.BR \-depth "\ <" \fIvalue >
+set display depth (in bits per pixel)
+.TP
+.BR \-\-geometry ",\ " \-g "\ ..."
+set all geometry parameters at once in the order
+.RI < xres >
+.RI < yres >
+.RI < vxres >
+.RI < vyres >
+.RI < depth >,
+e.g.
+.B \-g
+.I 640 400 640 400 4
+.TP
+.BR \-match "\ \ \ \ \ \ "
+make the physical resolution match the virtual resolution
+.RE
+.PP
+Display timings:
+.RS
+.TP
+.BR \-pixclock "\ <" \fIvalue >
+set the length of one pixel (in picoseconds). Note that the frame buffer
+device may only support some pixel lengths
+.TP
+.BR \-left "\ <" \fIvalue >
+set left margin (in pixels)
+.TP
+.BR \-right "\ <" \fIvalue >
+set right margin (in pixels)
+.TP
+.BR \-upper "\ <" \fIvalue >
+set upper margin (in pixel lines)
+.TP
+.BR \-lower "\ <" \fIvalue >
+set lower margin (in pixel lines)
+.TP
+.BR \-hslen "\ <" \fIvalue >
+set horizontal sync length (in pixels)
+.TP
+.BR \-vslen "\ <" \fIvalue >
+set vertical sync length (in pixel lines)
+.TP
+.BR \-\-timings ",\ " \-t "\ ..."
+set all timing parameters at once in the order
+.RI < pixclock >
+.RI < left >
+.RI < right >
+.RI < upper >
+.RI < lower >
+.RI < hslen >
+.RI < vslen >,
+e.g.
+.B \-g
+.I 35242 64 96 35 12 112 2
+.RE
+.PP
+Display flags:
+.RS
+.TP
+.IR \fB\-hsync "\ {" low | high }
+set the horizontal sync polarity
+.TP
+.IR \fB\-vsync "\ {" low | high }
+set the vertical sync polarity
+.TP
+.IR \fB\-csync "\ {" low | high }
+set the composite sync polarity
+.TP
+.IR \fB\-extsync "\ {" false | true }
+enable or disable external resync. If enabled the sync timings are not
+generated by the frame buffer device and must be provided externally
+instead. Note that this option may not be supported by every frame buffer
+device
+.TP
+.IR \fB\-bcast "\ {" false | true }
+enable or disable broadcast modes. If enabled the frame buffer generates the
+exact timings for several broadcast modes (e.g. PAL or NTSC). Note that
+this option may not be supported by every frame buffer device
+.TP
+.IR \fB\-laced "\ {" false | true }
+enable or disable interlace. If enabled the display will be split in two
+frames, each frame contains only even and odd lines respectively. These two
+frames will be displayed alternating, this way twice the lines can be
+displayed and the vertical frequency for the monitor stays the same, but the
+visible vertical frequency gets halved
+.TP
+.IR \fB\-double "\ {" false | true }
+enable or disable doublescan. If enabled every line will be displayed twice
+and this way the horizontal frequency can easily be doubled, so that the
+same resolution can be displayed on different monitors, even if the
+horizontal frequency specification differs. Note that this option may not be
+supported by every frame buffer device
+.RE
+.PP
+Display positioning:
+.RS
+.TP
+.IR \fB\-move "\ {" left | right | up | down }
+move the visible part of the display in the specified direction
+.TP
+.BR \-step "\ <" \fIvalue >
+set step size for display positioning (in pixels or pixel lines), if
+.B \-step
+is not given display will be moved 8 pixels horizontally or 2 pixel lines
+vertically
+.RE
+.SH EXAMPLE
+To set the used video mode for
+.B X
+insert the following in rc.local:
+.RS
+.sp
+.B fbset
+-fb
+.I /dev/fb0
+vga
+.sp
+.RE
+and make the used frame buffer device known to
+.BR X :
+.RS
+.sp
+.B export
+.RI FRAMEBUFFER= /dev/fb0
+.RE
+.SH FILES
+.I /dev/fb*
+.br
+.I /etc/fb.modes
+.SH SEE ALSO
+.BR fb.modes "(5), " fbdev (4)
+.SH AUTHORS
+.TP
+Geert Uytterhoeven <Geert.Uytterhoeven@cs.kuleuven.ac.be>
+.TP
+Roman Zippel <zippel@fh-brandenburg.de>
+.br
+man files
diff --git a/TVout/fbset/fbset.c b/TVout/fbset/fbset.c
new file mode 100644
index 0000000000..a9da078ede
--- /dev/null
+++ b/TVout/fbset/fbset.c
@@ -0,0 +1,1054 @@
+/*
+ * Linux Frame Buffer Device Configuration
+ *
+ * © Copyright 1995-1999 by Geert Uytterhoeven
+ * (Geert.Uytterhoeven@cs.kuleuven.ac.be)
+ *
+ * --------------------------------------------------------------------------
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details.
+ *
+ * Petr Vandrovec <vandrove@vc.cvut.cz>:
+ * -grayscale, -rgba, -nonstd, VGA modes reporting
+ *
+ * Brad Midgley <brad@exodus.pht.com>:
+ * -match
+ *
+ */
+
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+#include <ctype.h>
+#include <sys/stat.h>
+
+struct file;
+struct inode;
+
+#include "fb.h"
+
+#include "fbset.h"
+
+
+ /*
+ * Default Frame Buffer Special Device Node
+ */
+
+#define DEFAULT_FRAMEBUFFER "/dev/fb0"
+
+
+ /*
+ * Default Video Mode Database File
+ */
+
+#define DEFAULT_MODEDBFILE "/etc/fb.modes"
+
+
+ /*
+ * Command Line Options
+ */
+
+static const char *ProgramName;
+
+static int Opt_test = 0;
+static int Opt_show = 0;
+static int Opt_info = 0;
+static int Opt_version = 0;
+static int Opt_verbose = 0;
+static int Opt_xfree86 = 0;
+static int Opt_change = 0;
+static int Opt_all = 0;
+
+static const char *Opt_fb = NULL;
+const char *Opt_modedb = DEFAULT_MODEDBFILE;
+static const char *Opt_xres = NULL;
+static const char *Opt_yres = NULL;
+static const char *Opt_vxres = NULL;
+static const char *Opt_vyres = NULL;
+static const char *Opt_depth = NULL;
+static const char *Opt_pixclock = NULL;
+static const char *Opt_left = NULL;
+static const char *Opt_right = NULL;
+static const char *Opt_upper = NULL;
+static const char *Opt_lower = NULL;
+static const char *Opt_hslen = NULL;
+static const char *Opt_vslen = NULL;
+static const char *Opt_accel = NULL;
+static const char *Opt_hsync = NULL;
+static const char *Opt_vsync = NULL;
+static const char *Opt_csync = NULL;
+static const char *Opt_gsync = NULL;
+static const char *Opt_extsync = NULL;
+static const char *Opt_bcast = NULL;
+static const char *Opt_laced = NULL;
+static const char *Opt_double = NULL;
+static const char *Opt_move = NULL;
+static const char *Opt_step = NULL;
+static const char *Opt_modename = NULL;
+static const char *Opt_rgba = NULL;
+static const char *Opt_nonstd = NULL;
+static const char *Opt_grayscale = NULL;
+static const char *Opt_matchyres = NULL;
+
+static struct {
+ const char *name;
+ const char **value;
+ const int change;
+} Options[] = {
+ { "-fb", &Opt_fb, 0 },
+ { "-db", &Opt_modedb, 0 },
+ { "-xres", &Opt_xres, 1 },
+ { "-yres", &Opt_yres, 1 },
+ { "-vxres", &Opt_vxres, 1 },
+ { "-vyres", &Opt_vyres, 1 },
+ { "-depth", &Opt_depth, 1 },
+ { "-nonstd", &Opt_nonstd, 1},
+ { "-pixclock", &Opt_pixclock, 1 },
+ { "-left", &Opt_left, 1 },
+ { "-right", &Opt_right, 1 },
+ { "-upper", &Opt_upper, 1 },
+ { "-lower", &Opt_lower, 1 },
+ { "-hslen", &Opt_hslen, 1 },
+ { "-vslen", &Opt_vslen, 1 },
+ { "-accel", &Opt_accel, 1 },
+ { "-hsync", &Opt_hsync, 1 },
+ { "-vsync", &Opt_vsync, 1 },
+ { "-csync", &Opt_csync, 1 },
+ { "-gsync", &Opt_gsync, 1 },
+ { "-extsync", &Opt_extsync, 1 },
+ { "-bcast", &Opt_bcast, 1 },
+ { "-laced", &Opt_laced, 1 },
+ { "-double", &Opt_double, 1 },
+ { "-move", &Opt_move, 1 },
+ { "-step", &Opt_step, 1 },
+ { "-rgba", &Opt_rgba, 1 },
+ { "-grayscale", &Opt_grayscale, 1 },
+ { NULL, NULL, 0 }
+};
+
+
+ /*
+ * Video Mode Database
+ */
+
+struct VideoMode *VideoModes = NULL;
+
+
+ /*
+ * Hardware Text Modes
+ */
+
+static struct textentry {
+ __u32 id;
+ const char *name;
+} Textmodes[] = {
+ { FB_AUX_TEXT_MDA, "Monochrome text" },
+ { FB_AUX_TEXT_CGA, "CGA/EGA/VGA Color text" },
+ { FB_AUX_TEXT_S3_MMIO, "S3 MMIO fasttext" },
+ { FB_AUX_TEXT_MGA_STEP16, "MGA Millennium I step 16 text" },
+ { FB_AUX_TEXT_MGA_STEP8, "MGA step 8 text" },
+};
+
+static struct textentry VGAModes[] = {
+ { FB_AUX_VGA_PLANES_VGA4, "VGA 16 colors in 4 planes" },
+ { FB_AUX_VGA_PLANES_CFB4, "VGA 16 colors in 1 plane" },
+ { FB_AUX_VGA_PLANES_CFB8, "VGA 256 colors in 4 planes" },
+ /* last entry has name == NULL */
+ { 0, NULL}
+};
+
+ /*
+ * Hardware Accelerators
+ */
+
+static struct accelentry {
+ __u32 id;
+ const char *name;
+} Accelerators[] = {
+ { FB_ACCEL_NONE, "No" },
+ { FB_ACCEL_ATARIBLITT, "Atari Blitter" },
+ { FB_ACCEL_AMIGABLITT, "Amiga Blitter" },
+ { FB_ACCEL_S3_TRIO64, "S3 Trio64" },
+ { FB_ACCEL_NCR_77C32BLT, "NCR 77C32BLT" },
+ { FB_ACCEL_S3_VIRGE, "S3 ViRGE" },
+ { FB_ACCEL_ATI_MACH64GX, "ATI Mach64GX" },
+ { FB_ACCEL_DEC_TGA, "DEC 21030 TGA" },
+ { FB_ACCEL_ATI_MACH64CT, "ATI Mach64CT" },
+ { FB_ACCEL_ATI_MACH64VT, "ATI Mach64VT" },
+ { FB_ACCEL_ATI_MACH64GT, "ATI Mach64GT" },
+ { FB_ACCEL_SUN_CREATOR, "Sun Creator/Creator3D" },
+ { FB_ACCEL_SUN_CGSIX, "Sun cg6" },
+ { FB_ACCEL_SUN_LEO, "Sun leo/zx" },
+ { FB_ACCEL_IMS_TWINTURBO, "IMS Twin Turbo" },
+ { FB_ACCEL_3DLABS_PERMEDIA2, "3Dlabs Permedia 2" },
+ { FB_ACCEL_MATROX_MGA2064W, "Matrox MGA2064W (Millennium)" },
+ { FB_ACCEL_MATROX_MGA1064SG, "Matrox MGA1064SG (Mystique)" },
+ { FB_ACCEL_MATROX_MGA2164W, "Matrox MGA2164W (Millennium II)" },
+ { FB_ACCEL_MATROX_MGA2164W_AGP, "Matrox MGA2164W (Millennium II AGP)" },
+ { FB_ACCEL_MATROX_MGAG100, "Matrox G100 (Productiva G100)" },
+ { FB_ACCEL_MATROX_MGAG200, "Matrox G200 (Millennium, Mystique)" },
+ { FB_ACCEL_SUN_CG14, "Sun cg14" },
+ { FB_ACCEL_SUN_BWTWO, "Sun bw2" },
+ { FB_ACCEL_SUN_CGTHREE, "Sun cg3" },
+ { FB_ACCEL_SUN_TCX, "Sun tcx" },
+ { FB_ACCEL_MATROX_MGAG400, "Matrox G400" },
+};
+
+
+ /*
+ * Current Video Mode
+ */
+
+struct VideoMode Current;
+
+
+ /*
+ * Function Prototypes
+ */
+
+int OpenFrameBuffer(const char *name);
+void CloseFrameBuffer(int fh);
+void GetVarScreenInfo(int fh, struct fb_var_screeninfo *var);
+void SetVarScreenInfo(int fh, struct fb_var_screeninfo *var);
+void GetFixScreenInfo(int fh, struct fb_fix_screeninfo *fix);
+static void ConvertFromVideoMode(const struct VideoMode *vmode,
+ struct fb_var_screeninfo *var);
+static void ConvertToVideoMode(const struct fb_var_screeninfo *var,
+ struct VideoMode *vmode);
+static int atoboolean(const char *var);
+static void ReadModeDB(void);
+static struct VideoMode *FindVideoMode(const char *name);
+static void ModifyVideoMode(struct VideoMode *vmode);
+static void DisplayVModeInfo(struct VideoMode *vmode);
+static void DisplayFBInfo(struct fb_fix_screeninfo *fix);
+static int FillScanRates(struct VideoMode *vmode);
+static void Usage(void) __attribute__ ((noreturn));
+int main(int argc, char *argv[]);
+
+
+ /*
+ * Print an Error Message and Exit
+ */
+
+void Die(const char *fmt, ...)
+{
+ va_list ap;
+
+ fflush(stdout);
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ exit(1);
+}
+
+
+ /*
+ * Open the Frame Buffer Device
+ */
+
+int OpenFrameBuffer(const char *name)
+{
+ int fh;
+
+ if (Opt_verbose)
+ printf("Opening frame buffer device `%s'\n", name);
+
+ if ((fh = open(name, O_RDONLY)) == -1)
+ Die("open %s: %s\n", name, strerror(errno));
+ return fh;
+}
+
+
+ /*
+ * Close the Frame Buffer Device
+ */
+
+void CloseFrameBuffer(int fh)
+{
+ close(fh);
+}
+
+ /*
+ * Get the Variable Part of the Screen Info
+ */
+
+void GetVarScreenInfo(int fh, struct fb_var_screeninfo *var)
+{
+ if (ioctl(fh, FBIOGET_VSCREENINFO, var))
+ Die("ioctl FBIOGET_VSCREENINFO: %s\n", strerror(errno));
+}
+
+
+ /*
+ * Set (and Get) the Variable Part of the Screen Info
+ */
+
+void SetVarScreenInfo(int fh, struct fb_var_screeninfo *var)
+{
+ if (ioctl(fh, FBIOPUT_VSCREENINFO, var))
+ Die("ioctl FBIOPUT_VSCREENINFO: %s\n", strerror(errno));
+}
+
+
+ /*
+ * Get the Fixed Part of the Screen Info
+ */
+
+void GetFixScreenInfo(int fh, struct fb_fix_screeninfo *fix)
+{
+ if (ioctl(fh, FBIOGET_FSCREENINFO, fix))
+ Die("ioctl FBIOGET_FSCREENINFO: %s\n", strerror(errno));
+}
+
+
+ /*
+ * Conversion Routines
+ */
+
+static void ConvertFromVideoMode(const struct VideoMode *vmode,
+ struct fb_var_screeninfo *var)
+{
+ memset(var, 0, sizeof(struct fb_var_screeninfo));
+ var->xres = vmode->xres;
+ var->yres = vmode->yres;
+ var->xres_virtual = vmode->vxres;
+ var->yres_virtual = vmode->vyres;
+ var->bits_per_pixel = vmode->depth;
+ var->nonstd = vmode->nonstd;
+ if (Opt_test)
+ var->activate = FB_ACTIVATE_TEST;
+ else
+ var->activate = FB_ACTIVATE_NOW;
+ if (Opt_all)
+ var->activate = FB_ACTIVATE_ALL;
+ var->accel_flags = vmode->accel_flags;
+ var->pixclock = vmode->pixclock;
+ var->left_margin = vmode->left;
+ var->right_margin = vmode->right;
+ var->upper_margin = vmode->upper;
+ var->lower_margin = vmode->lower;
+ var->hsync_len = vmode->hslen;
+ var->vsync_len = vmode->vslen;
+ if (vmode->hsync == HIGH)
+ var->sync |= FB_SYNC_HOR_HIGH_ACT;
+ if (vmode->vsync == HIGH)
+ var->sync |= FB_SYNC_VERT_HIGH_ACT;
+ if (vmode->csync == HIGH)
+ var->sync |= FB_SYNC_COMP_HIGH_ACT;
+ if (vmode->gsync == HIGH)
+ var->sync |= FB_SYNC_ON_GREEN;
+ if (vmode->extsync == TRUE)
+ var->sync |= FB_SYNC_EXT;
+ if (vmode->bcast == TRUE)
+ var->sync |= FB_SYNC_BROADCAST;
+ if (vmode->laced == TRUE)
+ var->vmode = FB_VMODE_INTERLACED;
+ else if (vmode->dblscan == TRUE)
+ var->vmode = FB_VMODE_DOUBLE;
+ else
+ var->vmode = FB_VMODE_NONINTERLACED;
+ var->vmode |= FB_VMODE_CONUPDATE;
+ var->red.length = vmode->red.length;
+ var->red.offset = vmode->red.offset;
+ var->green.length = vmode->green.length;
+ var->green.offset = vmode->green.offset;
+ var->blue.length = vmode->blue.length;
+ var->blue.offset = vmode->blue.offset;
+ var->transp.length = vmode->transp.length;
+ var->transp.offset = vmode->transp.offset;
+ var->grayscale = vmode->grayscale;
+}
+
+
+static void ConvertToVideoMode(const struct fb_var_screeninfo *var,
+ struct VideoMode *vmode)
+{
+ vmode->name = NULL;
+ vmode->xres = var->xres;
+ vmode->yres = var->yres;
+ vmode->vxres = var->xres_virtual;
+ vmode->vyres = var->yres_virtual;
+ vmode->depth = var->bits_per_pixel;
+ vmode->nonstd = var->nonstd;
+ vmode->accel_flags = var->accel_flags;
+ vmode->pixclock = var->pixclock;
+ vmode->left = var->left_margin;
+ vmode->right = var->right_margin;
+ vmode->upper = var->upper_margin;
+ vmode->lower = var->lower_margin;
+ vmode->hslen = var->hsync_len;
+ vmode->vslen = var->vsync_len;
+ vmode->hsync = var->sync & FB_SYNC_HOR_HIGH_ACT ? HIGH : LOW;
+ vmode->vsync = var->sync & FB_SYNC_VERT_HIGH_ACT ? HIGH : LOW;
+ vmode->csync = var->sync & FB_SYNC_COMP_HIGH_ACT ? HIGH : LOW;
+ vmode->gsync = var->sync & FB_SYNC_ON_GREEN ? TRUE : FALSE;
+ vmode->extsync = var->sync & FB_SYNC_EXT ? TRUE : FALSE;
+ vmode->bcast = var->sync & FB_SYNC_BROADCAST ? TRUE : FALSE;
+ vmode->grayscale = var->grayscale;
+ vmode->laced = FALSE;
+ vmode->dblscan = FALSE;
+ switch (var->vmode & FB_VMODE_MASK) {
+ case FB_VMODE_INTERLACED:
+ vmode->laced = TRUE;
+ break;
+ case FB_VMODE_DOUBLE:
+ vmode->dblscan = TRUE;
+ break;
+ }
+ vmode->red.length = var->red.length;
+ vmode->red.offset = var->red.offset;
+ vmode->green.length = var->green.length;
+ vmode->green.offset = var->green.offset;
+ vmode->blue.length = var->blue.length;
+ vmode->blue.offset = var->blue.offset;
+ vmode->transp.length = var->transp.length;
+ vmode->transp.offset = var->transp.offset;
+ FillScanRates(vmode);
+}
+
+
+static int atoboolean(const char *var)
+{
+ int value = 0;
+
+ if (!strcasecmp(var, "false") || !strcasecmp(var, "low") ||
+ !strcasecmp(var, "no") || !strcasecmp(var, "off") ||
+ !strcmp(var, "0"))
+ value = 0;
+ else if (!strcasecmp(var, "true") || !strcasecmp(var, "high") ||
+ !strcasecmp(var, "yes") || !strcasecmp(var, "on") ||
+ !strcmp(var, "1"))
+ value = 1;
+ else
+ Die("Invalid value `%s'\n", var);
+
+ return value;
+}
+
+
+void AddVideoMode(const struct VideoMode *vmode)
+{
+ struct VideoMode *vmode2;
+
+ if (FindVideoMode(vmode->name))
+ Die("%s:%d: Duplicate mode name `%s'\n", Opt_modedb, line,
+ vmode->name);
+ vmode2 = malloc(sizeof(struct VideoMode));
+ *vmode2 = *vmode;
+ if (!FillScanRates(vmode2))
+ Die("%s:%d: Bad video mode `%s'\n", Opt_modedb, line, vmode2->name);
+ vmode2->next = VideoModes;
+ VideoModes = vmode2;
+}
+
+
+ /*
+ * Read the Video Mode Database
+ */
+
+static void ReadModeDB(void)
+{
+ if (Opt_verbose)
+ printf("Reading mode database from file `%s'\n", Opt_modedb);
+
+ if (!(yyin = fopen(Opt_modedb, "r")))
+ Die("fopen %s: %s\n", Opt_modedb, strerror(errno));
+ yyparse();
+ fclose(yyin);
+}
+
+
+static void getColor(struct color *color, const char** opt)
+{
+ char* ptr;
+
+ color->length = 0;
+ color->offset = 0;
+ ptr = (char*)(*opt);
+ if (!ptr)
+ return;
+ color->length = strtoul(ptr, &ptr, 0);
+ if (!ptr)
+ return;
+ if (*ptr == '/')
+ color->offset = strtoul(ptr+1, &ptr, 0);
+ if (ptr) {
+ while (*ptr && isspace(*ptr))
+ ptr++;
+ if (*ptr == ',') {
+ ptr++;
+ } else if (*ptr)
+ Die("Bad RGBA syntax, rL/rO,gL/gO,bL/bO,tL/tO or rL,gL,bL,tL\n");
+ }
+ *opt = ptr;
+ return;
+}
+
+void makeRGBA(struct VideoMode *vmode, const char* opt)
+{
+ getColor(&vmode->red, &opt);
+ getColor(&vmode->green, &opt);
+ getColor(&vmode->blue, &opt);
+ getColor(&vmode->transp, &opt);
+}
+
+ /*
+ * Find a Video Mode
+ */
+
+static struct VideoMode *FindVideoMode(const char *name)
+{
+ struct VideoMode *vmode;
+
+ for (vmode = VideoModes; vmode; vmode = vmode->next)
+ if (!strcmp(name, vmode->name))
+ break;
+
+ return vmode;
+}
+
+
+ /*
+ * Modify a Video Mode
+ */
+
+static void ModifyVideoMode(struct VideoMode *vmode)
+{
+ u_int hstep = 8, vstep = 2;
+
+ if (Opt_xres)
+ vmode->xres = strtoul(Opt_xres, NULL, 0);
+ if (Opt_yres)
+ vmode->yres = strtoul(Opt_yres, NULL, 0);
+ if (Opt_vxres)
+ vmode->vxres = strtoul(Opt_vxres, NULL, 0);
+ if (Opt_vyres)
+ vmode->vyres = strtoul(Opt_vyres, NULL, 0);
+ if (Opt_depth)
+ vmode->depth = strtoul(Opt_depth, NULL, 0);
+ if (Opt_nonstd)
+ vmode->nonstd = strtoul(Opt_nonstd, NULL, 0);
+ if (Opt_accel)
+ vmode->accel_flags = atoboolean(Opt_accel) ? FB_ACCELF_TEXT : 0;
+ if (Opt_pixclock)
+ vmode->pixclock = strtoul(Opt_pixclock, NULL, 0);
+ if (Opt_left)
+ vmode->left = strtoul(Opt_left, NULL, 0);
+ if (Opt_right)
+ vmode->right = strtoul(Opt_right, NULL, 0);
+ if (Opt_upper)
+ vmode->upper = strtoul(Opt_upper, NULL, 0);
+ if (Opt_lower)
+ vmode->lower = strtoul(Opt_lower, NULL, 0);
+ if (Opt_hslen)
+ vmode->hslen = strtoul(Opt_hslen, NULL, 0);
+ if (Opt_vslen)
+ vmode->vslen = strtoul(Opt_vslen, NULL, 0);
+ if (Opt_hsync)
+ vmode->hsync = atoboolean(Opt_hsync);
+ if (Opt_vsync)
+ vmode->vsync = atoboolean(Opt_vsync);
+ if (Opt_csync)
+ vmode->csync = atoboolean(Opt_csync);
+ if (Opt_gsync)
+ vmode->gsync = atoboolean(Opt_gsync);
+ if (Opt_extsync)
+ vmode->extsync = atoboolean(Opt_extsync);
+ if (Opt_bcast)
+ vmode->bcast = atoboolean(Opt_bcast);
+ if (Opt_laced)
+ vmode->laced = atoboolean(Opt_laced);
+ if (Opt_double)
+ vmode->dblscan = atoboolean(Opt_double);
+ if (Opt_grayscale)
+ vmode->grayscale = atoboolean(Opt_grayscale);
+ if (Opt_step)
+ hstep = vstep = strtoul(Opt_step, NULL, 0);
+ if (Opt_matchyres)
+ vmode->vyres = vmode->yres;
+ if (Opt_move) {
+ if (!strcasecmp(Opt_move, "left")) {
+ if (hstep > vmode->left)
+ Die("The left margin cannot be negative\n");
+ vmode->left -= hstep;
+ vmode->right += hstep;
+ } else if (!strcasecmp(Opt_move, "right")) {
+ if (hstep > vmode->right)
+ Die("The right margin cannot be negative\n");
+ vmode->left += hstep;
+ vmode->right -= hstep;
+ } else if (!strcasecmp(Opt_move, "up")) {
+ if (vstep > vmode->upper)
+ Die("The upper margin cannot be negative\n");
+ vmode->upper -= vstep;
+ vmode->lower += vstep;
+ } else if (!strcasecmp(Opt_move, "down")) {
+ if (vstep > vmode->lower)
+ Die("The lower margin cannot be negative\n");
+ vmode->upper += vstep;
+ vmode->lower -= vstep;
+ } else
+ Die("Invalid direction `%s'\n", Opt_move);
+ }
+ if (Opt_rgba) {
+ makeRGBA(vmode, Opt_rgba);
+ }
+ if (!FillScanRates(vmode))
+ Die("Bad video mode\n");
+}
+
+
+ /*
+ * Display the Video Mode Information
+ */
+
+static void DisplayVModeInfo(struct VideoMode *vmode)
+{
+ u_int res, sstart, send, total;
+
+ puts("");
+ if (!Opt_xfree86) {
+ printf("mode \"%dx%d", vmode->xres, vmode->yres);
+ if (vmode->pixclock) {
+ printf("-%d\"\n", (int)(vmode->vrate+0.5));
+ printf(" # D: %5.3f MHz, H: %5.3f kHz, V: %5.3f Hz\n",
+ vmode->drate/1E6, vmode->hrate/1E3, vmode->vrate);
+ } else
+ puts("\"");
+ printf(" geometry %d %d %d %d %d\n", vmode->xres, vmode->yres,
+ vmode->vxres, vmode->vyres, vmode->depth);
+ printf(" timings %d %d %d %d %d %d %d\n", vmode->pixclock,
+ vmode->left, vmode->right, vmode->upper, vmode->lower,
+ vmode->hslen, vmode->vslen);
+ if (vmode->hsync)
+ puts(" hsync high");
+ if (vmode->vsync)
+ puts(" vsync high");
+ if (vmode->csync)
+ puts(" csync high");
+ if (vmode->gsync)
+ puts(" gsync true");
+ if (vmode->extsync)
+ puts(" extsync true");
+ if (vmode->bcast)
+ puts(" bcast true");
+ if (vmode->laced)
+ puts(" laced true");
+ if (vmode->dblscan)
+ puts(" double true");
+ if (vmode->nonstd)
+ printf(" nonstd %u\n", vmode->nonstd);
+ if (vmode->accel_flags)
+ puts(" accel true");
+ if (vmode->grayscale)
+ puts(" grayscale true");
+ printf(" rgba %u/%u,%u/%u,%u/%u,%u/%u\n",
+ vmode->red.length, vmode->red.offset, vmode->green.length,
+ vmode->green.offset, vmode->blue.length, vmode->blue.offset,
+ vmode->transp.length, vmode->transp.offset);
+ puts("endmode\n");
+ } else {
+ printf("Mode \"%dx%d\"\n", vmode->xres, vmode->yres);
+ if (vmode->pixclock) {
+ printf(" # D: %5.3f MHz, H: %5.3f kHz, V: %5.3f Hz\n",
+ vmode->drate/1E6, vmode->hrate/1E3, vmode->vrate);
+ printf(" DotClock %5.3f\n", vmode->drate/1E6+0.001);
+ } else
+ puts(" DotClock Unknown");
+ res = vmode->xres;
+ sstart = res+vmode->right;
+ send = sstart+vmode->hslen;
+ total = send+vmode->left;
+ printf(" HTimings %d %d %d %d\n", res, sstart, send, total);
+ res = vmode->yres;
+ sstart = res+vmode->lower;
+ send = sstart+vmode->vslen;
+ total = send+vmode->upper;
+ printf(" VTimings %d %d %d %d\n", res, sstart, send, total);
+ printf(" Flags ");
+ if (vmode->laced)
+ printf(" \"Interlace\"");
+ if (vmode->dblscan)
+ printf(" \"DoubleScan\"");
+ if (vmode->hsync)
+ printf(" \"+HSync\"");
+ else
+ printf(" \"-HSync\"");
+ if (vmode->vsync)
+ printf(" \"+VSync\"");
+ else
+ printf(" \"-VSync\"");
+ if (vmode->csync)
+ printf(" \"Composite\"");
+ if (vmode->extsync)
+ puts(" # Warning: XFree86 doesn't support extsync\n");
+ if (vmode->bcast)
+ printf(" \"bcast\"");
+ if (vmode->accel_flags)
+ puts(" # Warning: XFree86 doesn't support accel\n");
+ if (vmode->grayscale)
+ puts(" # Warning: XFree86 doesn't support grayscale\n");
+ puts("\nEndMode\n");
+ }
+}
+
+
+ /*
+ * Display the Frame Buffer Device Information
+ */
+
+static void DisplayFBInfo(struct fb_fix_screeninfo *fix)
+{
+ int i;
+
+ puts("Frame buffer device information:");
+ printf(" Name : %s\n", fix->id);
+ printf(" Address : %p\n", fix->smem_start);
+ printf(" Size : %d\n", fix->smem_len);
+ printf(" Type : ");
+ switch (fix->type) {
+ case FB_TYPE_PACKED_PIXELS:
+ puts("PACKED PIXELS");
+ break;
+ case FB_TYPE_PLANES:
+ puts("PLANES");
+ break;
+ case FB_TYPE_INTERLEAVED_PLANES:
+ printf("INTERLEAVED PLANES (%d bytes interleave)\n",
+ fix->type_aux);
+ break;
+ case FB_TYPE_TEXT:
+ for (i = 0; i < sizeof(Textmodes)/sizeof(*Textmodes); i++)
+ if (fix->type_aux == Textmodes[i].id)
+ break;
+ if (i < sizeof(Textmodes)/sizeof(*Textmodes))
+ puts(Textmodes[i].name);
+ else
+ printf("Unknown text (%d)\n", fix->type_aux);
+ break;
+ case FB_TYPE_VGA_PLANES:
+ {
+ struct textentry *t;
+
+ for (t = VGAModes; t->name; t++)
+ if (fix->type_aux == t->id)
+ break;
+ if (t->name)
+ puts(t->name);
+ else
+ printf("Unknown VGA mode (%d)\n", fix->type_aux);
+ }
+ break;
+ default:
+ printf("%d (UNKNOWN)\n", fix->type);
+ printf(" Type_aux : %d\n", fix->type_aux);
+ break;
+ }
+ printf(" Visual : ");
+ switch (fix->visual) {
+ case FB_VISUAL_MONO01:
+ puts("MONO01");
+ break;
+ case FB_VISUAL_MONO10:
+ puts("MONO10");
+ break;
+ case FB_VISUAL_TRUECOLOR:
+ puts("TRUECOLOR");
+ break;
+ case FB_VISUAL_PSEUDOCOLOR:
+ puts("PSEUDOCOLOR");
+ break;
+ case FB_VISUAL_DIRECTCOLOR:
+ puts("DIRECTCOLOR");
+ break;
+ case FB_VISUAL_STATIC_PSEUDOCOLOR:
+ puts("STATIC PSEUDOCOLOR");
+ break;
+ default:
+ printf("%d (UNKNOWN)\n", fix->visual);
+ break;
+ }
+ printf(" XPanStep : %d\n", fix->xpanstep);
+ printf(" YPanStep : %d\n", fix->ypanstep);
+ printf(" YWrapStep : %d\n", fix->ywrapstep);
+ printf(" LineLength : %d\n", fix->line_length);
+ if (fix->mmio_len) {
+ printf(" MMIO Address: %p\n", fix->mmio_start);
+ printf(" MMIO Size : %d\n", fix->mmio_len);
+ }
+ printf(" Accelerator : ");
+ for (i = 0; i < sizeof(Accelerators)/sizeof(*Accelerators); i++)
+ if (fix->accel == Accelerators[i].id)
+ break;
+ if (i < sizeof(Accelerators)/sizeof(*Accelerators))
+ puts(Accelerators[i].name);
+ else
+ printf("Unknown (%d)\n", fix->accel);
+}
+
+
+ /*
+ * Calculate the Scan Rates for a Video Mode
+ */
+
+static int FillScanRates(struct VideoMode *vmode)
+{
+ u_int htotal = vmode->left+vmode->xres+vmode->right+vmode->hslen;
+ u_int vtotal = vmode->upper+vmode->yres+vmode->lower+vmode->vslen;
+
+ if (vmode->dblscan)
+ vtotal <<= 2;
+ else if (!vmode->laced)
+ vtotal <<= 1;
+
+ if (!htotal || !vtotal)
+ return 0;
+
+ if (vmode->pixclock) {
+ vmode->drate = 1E12/vmode->pixclock;
+ vmode->hrate = vmode->drate/htotal;
+ vmode->vrate = vmode->hrate/vtotal*2;
+ } else {
+ vmode->drate = 0;
+ vmode->hrate = 0;
+ vmode->vrate = 0;
+ }
+
+ return 1;
+}
+
+
+ /*
+ * Print the Usage Template and Exit
+ */
+
+static void Usage(void)
+{
+ puts(VERSION);
+ Die("\nUsage: %s [options] [mode]\n\n"
+ "Valid options:\n"
+ " General options:\n"
+ " -h, --help : display this usage information\n"
+ " --test : don't change, just test whether the mode is "
+ "valid\n"
+ " -s, --show : display video mode settings\n"
+ " -i, --info : display all frame buffer information\n"
+ " -v, --verbose : verbose mode\n"
+ " -V, --version : print version information\n"
+ " -x, --xfree86 : XFree86 compatibility mode\n"
+ " -a, --all : change all virtual consoles on this device\n"
+ " Frame buffer special device nodes:\n"
+ " -fb <device> : processed frame buffer device\n"
+ " (default is " DEFAULT_FRAMEBUFFER ")\n"
+ " Video mode database:\n"
+ " -db <file> : video mode database file\n"
+ " (default is " DEFAULT_MODEDBFILE ")\n"
+ " Display geometry:\n"
+ " -xres <value> : horizontal resolution (in pixels)\n"
+ " -yres <value> : vertical resolution (in pixels)\n"
+ " -vxres <value> : virtual horizontal resolution (in pixels)\n"
+ " -vyres <value> : virtual vertical resolution (in pixels)\n"
+ " -depth <value> : display depth (in bits per pixel)\n"
+ " -nonstd <value> : select nonstandard video mode\n"
+ " -g, --geometry ... : set all geometry parameters at once\n"
+ " -match : set virtual vertical resolution by virtual resolution\n"
+ " Display timings:\n"
+ " -pixclock <value> : pixel clock (in picoseconds)\n"
+ " -left <value> : left margin (in pixels)\n"
+ " -right <value> : right margin (in pixels)\n"
+ " -upper <value> : upper margin (in pixel lines)\n"
+ " -lower <value> : lower margin (in pixel lines)\n"
+ " -hslen <value> : horizontal sync length (in pixels)\n"
+ " -vslen <value> : vertical sync length (in pixel lines)\n"
+ " -t, --timings ... : set all timing parameters at once\n"
+ " Display flags:\n"
+ " -accel <value> : hardware text acceleration enable (false or "
+ "true)\n"
+ " -hsync <value> : horizontal sync polarity (low or high)\n"
+ " -vsync <value> : vertical sync polarity (low or high)\n"
+ " -csync <value> : composite sync polarity (low or high)\n"
+ " -gsync <value> : synch on green (false or true)\n"
+ " -extsync <value> : external sync enable (false or true)\n"
+ " -bcast <value> : broadcast enable (false or true)\n"
+ " -laced <value> : interlace enable (false or true)\n"
+ " -double <value> : doublescan enable (false or true)\n"
+ " -rgba <r,g,b,a> : recommended length of color entries\n"
+ " -grayscale <value> : grayscale enable (false or true)\n"
+ " Display positioning:\n"
+ " -move <direction> : move the visible part (left, right, up or "
+ "down)\n"
+ " -step <value> : step increment (in pixels or pixel lines)\n"
+ " (default is 8 horizontal, 2 vertical)\n",
+ ProgramName);
+}
+
+
+ /*
+ * Main Routine
+ */
+
+int main(int argc, char *argv[])
+{
+ struct VideoMode *vmode;
+ struct fb_var_screeninfo var;
+ struct fb_fix_screeninfo fix;
+ int fh = -1, i;
+
+ ProgramName = argv[0];
+
+ /*
+ * Parse the Options
+ */
+
+ while (--argc > 0) {
+ argv++;
+ if (!strcmp(argv[0], "-h") || !strcmp(argv[0], "--help"))
+ Usage();
+ else if (!strcmp(argv[0], "-v") || !strcmp(argv[0], "--verbose"))
+ Opt_verbose = 1;
+ else if (!strcmp(argv[0], "-V") || !strcmp(argv[0], "--version"))
+ Opt_version = 1;
+ else if (!strcmp(argv[0], "--test"))
+ Opt_test = 1;
+ else if (!strcmp(argv[0], "-s") || !strcmp(argv[0], "--show"))
+ Opt_show = 1;
+ else if (!strcmp(argv[0], "-i") || !strcmp(argv[0], "--info")) {
+ Opt_show = 1;
+ Opt_info = 1;
+ } else if (!strcmp(argv[0], "-x") || !strcmp(argv[0], "--xfree86"))
+ Opt_xfree86 = 1;
+ else if (!strcmp(argv[0], "-a") || !strcmp(argv[0], "--all"))
+ Opt_all = 1;
+ else if (!strcmp(argv[0], "-g") || !strcmp(argv[0], "--geometry")) {
+ if (argc > 5) {
+ Opt_xres = argv[1];
+ Opt_yres = argv[2];
+ Opt_vxres = argv[3];
+ Opt_vyres = argv[4];
+ Opt_depth = argv[5];
+ Opt_change = 1;
+ argc -= 5;
+ argv += 5;
+ } else
+ Usage();
+ } else if (!strcmp(argv[0], "-t") || !strcmp(argv[0], "--timings")) {
+ if (argc > 7) {
+ Opt_pixclock = argv[1];
+ Opt_left = argv[2];
+ Opt_right = argv[3];
+ Opt_upper = argv[4];
+ Opt_lower = argv[5];
+ Opt_hslen = argv[6];
+ Opt_vslen = argv[7];
+ Opt_change = 1;
+ argc -= 7;
+ argv += 7;
+ } else
+ Usage();
+ } else if (!strcmp(argv[0], "-match")) {
+ Opt_matchyres = argv[0];
+ Opt_change = 1;
+ } else {
+ for (i = 0; Options[i].name; i++)
+ if (!strcmp(argv[0], Options[i].name))
+ break;
+ if (Options[i].name) {
+ if (argc-- > 1) {
+ *Options[i].value = argv[1];
+ Opt_change |= Options[i].change;
+ argv++;
+ } else
+ Usage();
+ } else if (!Opt_modename) {
+ Opt_modename = argv[0];
+ Opt_change = 1;
+ } else
+ Usage();
+ }
+ }
+
+ if (Opt_version || Opt_verbose)
+ puts(VERSION);
+
+ if (!Opt_fb)
+ Opt_fb = DEFAULT_FRAMEBUFFER;
+
+ /*
+ * Open the Frame Buffer Device
+ */
+
+ fh = OpenFrameBuffer(Opt_fb);
+
+ /*
+ * Get the Video Mode
+ */
+
+ if (Opt_modename) {
+
+ /*
+ * Read the Video Mode Database
+ */
+
+ ReadModeDB();
+
+ if (!(vmode = FindVideoMode(Opt_modename)))
+ Die("Unknown video mode `%s'\n", Opt_modename);
+
+ Current = *vmode;
+ if (Opt_verbose)
+ printf("Using video mode `%s'\n", Opt_modename);
+ } else {
+ GetVarScreenInfo(fh, &var);
+ ConvertToVideoMode(&var, &Current);
+ if (Opt_verbose)
+ printf("Using current video mode from `%s'\n", Opt_fb);
+ }
+
+ if (Opt_change) {
+
+ /*
+ * Optionally Modify the Video Mode
+ */
+
+ ModifyVideoMode(&Current);
+
+ /*
+ * Set the Video Mode
+ */
+
+ ConvertFromVideoMode(&Current, &var);
+ if (Opt_verbose)
+ printf("Setting video mode to `%s'\n", Opt_fb);
+ SetVarScreenInfo(fh, &var);
+ ConvertToVideoMode(&var, &Current);
+ }
+
+ /*
+ * Display some Video Mode Information
+ */
+
+ if (Opt_show || !Opt_change)
+ DisplayVModeInfo(&Current);
+
+ if (Opt_info) {
+ if (Opt_verbose)
+ puts("Getting further frame buffer information");
+ GetFixScreenInfo(fh, &fix);
+ DisplayFBInfo(&fix);
+ }
+
+ /*
+ * Close the Frame Buffer Device
+ */
+
+ CloseFrameBuffer(fh);
+
+ exit(0);
+}
diff --git a/TVout/fbset/fbset.h b/TVout/fbset/fbset.h
new file mode 100644
index 0000000000..9b1d2acfa0
--- /dev/null
+++ b/TVout/fbset/fbset.h
@@ -0,0 +1,82 @@
+/*
+ * Linux Frame Buffer Device Configuration
+ *
+ * © Copyright 1995-1998 by Geert Uytterhoeven
+ * (Geert.Uytterhoeven@cs.kuleuven.ac.be)
+ *
+ * --------------------------------------------------------------------------
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details.
+ */
+
+
+#include <stdio.h>
+#include <sys/types.h>
+
+#ifdef __GLIBC__
+#include <asm/types.h>
+#endif
+
+#define VERSION "Linux Frame Buffer Device Configuration " \
+ "Version 2.1 (23/06/1999)\n" \
+ "(C) Copyright 1995-1999 by Geert Uytterhoeven\n"
+
+#define LOW (0)
+#define HIGH (1)
+
+#define FALSE (0)
+#define TRUE (1)
+
+struct color {
+ unsigned int length;
+ unsigned int offset;
+};
+
+struct VideoMode {
+ struct VideoMode *next;
+ const char *name;
+ /* geometry */
+ __u32 xres;
+ __u32 yres;
+ __u32 vxres;
+ __u32 vyres;
+ __u32 depth;
+ __u32 nonstd;
+ /* acceleration */
+ __u32 accel_flags;
+ /* timings */
+ __u32 pixclock;
+ __u32 left;
+ __u32 right;
+ __u32 upper;
+ __u32 lower;
+ __u32 hslen;
+ __u32 vslen;
+ /* flags */
+ unsigned hsync : 1;
+ unsigned vsync : 1;
+ unsigned csync : 1;
+ unsigned gsync : 1;
+ unsigned extsync : 1;
+ unsigned bcast : 1;
+ unsigned laced : 1;
+ unsigned dblscan : 1;
+ unsigned grayscale : 1;
+ /* scanrates */
+ double drate;
+ double hrate;
+ double vrate;
+ /* RGB entries */
+ struct color red, green, blue, transp;
+};
+
+extern FILE *yyin;
+extern int line;
+extern const char *Opt_modedb;
+
+extern int yyparse(void);
+extern void Die(const char *fmt, ...) __attribute__ ((noreturn));
+extern void AddVideoMode(const struct VideoMode *vmode);
+extern void makeRGBA(struct VideoMode *vmode, const char* opt);
diff --git a/TVout/fbset/modeline2fb b/TVout/fbset/modeline2fb
new file mode 100755
index 0000000000..3a227f558c
--- /dev/null
+++ b/TVout/fbset/modeline2fb
@@ -0,0 +1,150 @@
+#!/usr/bin/perl
+
+# Simple modeline-to-fb.modes translator
+# (c) 1998 by Patrick Reynolds
+# distributed under the GNU General Public License
+
+# mapping of modeline options to fb.modes options
+%options_map = (
+ "-hsync" => "hsync low",
+ "-vsync" => "vsync low",
+ "+hsync" => "hsync high",
+ "+vsync" => "vsync high",
+ "interlace" => "laced true",
+ "doublescan" => "double true"
+);
+
+@possible_vxres = ( 640, 800, 1024, 1152, 1280, 1600, 1920, 2048 );
+
+# default settings (override with -d and -r)
+$depth = 8;
+$rounding = 128;
+
+# parse options
+while ($ARGV[0] =~ /^-/) {
+ $arg = shift;
+ if ($arg eq "-d" || $arg eq "--depth") {
+ if (!($arg = shift @ARGV)) {
+ usage("-d requires an argument");
+ }
+ $depth = $arg;
+ }
+ elsif ($arg eq "-r" || $arg eq "--rounding") {
+ if (!($arg = shift @ARGV)) {
+ usage("-r requires an argument");
+ }
+ $rounding = $arg;
+ }
+ elsif ($arg eq "-x" || $arg eq "--vxres") {
+ if (!($arg = shift @ARGV)) {
+ usage("-x requires an argument");
+ }
+ push @possible_vxres, (split/,/,$arg);
+ @possible_vxres = sort { $a <=> $b } @possible_vxres;
+ print "new vxres: " . (join ",", @possible_vxres) . "\n";
+ }
+ elsif ($arg eq "-h" || $arg eq "--help") {
+ usage();
+ }
+ else {
+ usage("unknown option: $arg");
+ }
+}
+
+# find out how much video memory is available
+open(FBSET, "fbset -i|") || die "could not detect available video memory";
+while (<FBSET>) {
+ if (/Size\s*:\s*(\d+)/) {
+ $size = $1;
+ last;
+ }
+}
+if (!$size) { die "could not detect available video memory"; }
+
+# huge kludge (hey, that rhymes!) ...
+# subtract 16384 from the available memory $size
+# why? the default 640x480 mode uses all but 16384, and when I set it
+# to use more than that, it oopses (!). So... for safety's sake, and
+# because you probably don't use those 15-25 lines anyway...
+$size -= 16384;
+
+print "# modes.fb - video mode descriptions for fbset
+#
+# See fbset(8) and fb.modes(5) for more information
+
+";
+
+$flag = 0;
+# read all XF86Config files
+while(<>) {
+ chomp;
+ next if !(($name, $clock, $xres, $xsyncstart, $xsyncend, $xfres,
+ $yres, $ysyncstart, $ysyncend, $yfres, $extra) =
+ /^\s*modeline\s+"([^"]+)"\s+([0-9.]+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s*(.*)$/i);
+ $flag = 1;
+
+ # timing transformations, as described in the fb HOWTO
+ $pixtime = int(1000000/$clock);
+ $left = $xfres - $xsyncend;
+ $right = $xsyncstart - $xres;
+ $hsynclen = $xsyncend - $xsyncstart;
+ $top = $yfres - $ysyncend;
+ $bottom = $ysyncstart - $yres;
+ $vsynclen = $ysyncend - $ysyncstart;
+
+ # pick a virtual X and Y resolution
+ $vxres = get_vxres($xres);
+ if ($vxres < 0) {
+ print STDERR "Could not guess a good virtual resolution for mode $name.\n";
+ print STDERR "Use the advanced options --rounding and --vxres.\n";
+ next;
+ }
+ $vyres = int($size/$vxres);
+
+ # print out our entry
+ print "mode \"$name\"\n";
+ print " geometry $xres $yres $vxres $vyres $depth\n";
+ print " timings $pixtime $left $right $top $bottom $hsynclen $vsynclen\n";
+
+ # handle extra options at the end of the modeline
+ $extra =~ tr/A-Z/a-z/;
+ @options = split/\s+/,$extra;
+ foreach (@options) {
+ if ($options_map{$_}) {
+ print " $options_map{$_}\n";
+ }
+ else {
+ print " # unknown option: $_\n";
+ }
+ }
+ print "endmode\n\n";
+}
+
+if (!$flag) {
+ print STDERR "No modelines found.\n";
+ print STDERR "Make sure the file you specified was an XF86Config file and\n";
+ print STDERR "used the single-line Modeline format.\n\n";
+ print STDERR "Use \"$0 --help\" for help.\n";
+}
+
+sub get_vxres {
+ foreach (@possible_vxres) {
+ return $_ if ($_ >= $_[0] && ($_ % $rounding) == 0);
+ }
+ return -1;
+}
+
+sub usage {
+ print STDERR "$_[0]\n" if ($_[0]);
+ print STDERR "$0 [OPTION] [FILES]\n\n";
+ print STDERR " -d,--depth depth use a certain display depth (default is 8)\n";
+ print STDERR " -h,--help what you see here\n\n";
+ print STDERR "Advanced options:\n";
+ print STDERR " -r,--rounding div vxres divisor (default is 128)\n";
+ print STDERR " -x,--vxres X,X,X,... extra possible vxres values\n\n";
+ print STDERR "[FILES] refers to one or more XF86Config files. Note that\n";
+ print STDERR "all modelines must be in single-line format.\n\n";
+ print STDERR "Example:\n";
+ print STDERR " $0 -d 16 /etc/X11/XF86Config\n";
+ exit 0;
+}
diff --git a/TVout/fbset/modes.l b/TVout/fbset/modes.l
new file mode 100644
index 0000000000..426eb5c1be
--- /dev/null
+++ b/TVout/fbset/modes.l
@@ -0,0 +1,136 @@
+
+/*
+ * Linux Frame Buffer Device Configuration
+ *
+ * © Copyright 1995-1998 by Geert Uytterhoeven
+ * (Geert.Uytterhoeven@cs.kuleuven.ac.be)
+ *
+ * --------------------------------------------------------------------------
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details.
+ */
+
+
+%{
+
+#define YYSTYPE long
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "fbset.h"
+#include "modes.tab.h"
+
+struct keyword {
+ const char *name;
+ int token;
+ int value;
+};
+
+static struct keyword keywords[] = {
+ { "mode", MODE, 0 },
+ { "geometry", GEOMETRY, 0 },
+ { "timings", TIMINGS, 0 },
+ { "hsync", HSYNC, 0 },
+ { "vsync", VSYNC, 0 },
+ { "csync", CSYNC, 0 },
+ { "gsync", GSYNC, 0 },
+ { "extsync", EXTSYNC, 0 },
+ { "bcast", BCAST, 0 },
+ { "laced", LACED, 0 },
+ { "double", DOUBLE, 0 },
+ { "rgba", RGBA, 0 },
+ { "nonstd", NONSTD, 0 },
+ { "accel", ACCEL, 0 },
+ { "grayscale", GRAYSCALE, 0 },
+ { "endmode", ENDMODE, 0 },
+ { "low", POLARITY, LOW },
+ { "high", POLARITY, HIGH },
+ { "false", BOOLEAN, FALSE },
+ { "true", BOOLEAN, TRUE },
+ { "", -1, 0 }
+};
+
+int line = 1;
+
+
+void yyerror(const char *s)
+{
+ Die("%s:%d: %s\n", Opt_modedb, line, s);
+}
+
+
+int yywrap(void)
+{
+ return 1;
+}
+
+
+static int FindToken(const char *s)
+{
+ int i;
+
+ for (i = 0; keywords[i].token > 0; i++)
+ if (!strcasecmp(s, keywords[i].name)) {
+ yylval = keywords[i].value;
+ return keywords[i].token;
+ }
+ Die("%s:%d: Unknown keyword `%s'\n", Opt_modedb, line, s);
+}
+
+
+static const char *CopyString(const char *s)
+{
+ int len;
+ char *s2;
+
+ len = strlen(s)-2;
+ if (!(s2 = malloc(len+1)))
+ Die("No memory\n");
+ strncpy(s2, s+1, len);
+ s2[len] = '\0';
+ return s2;
+}
+
+
+%}
+
+keyword [a-zA-Z][a-zA-Z0-9]*
+number [0-9]*
+string \"[^\"\n]*\"
+comment \#([^\n]*)
+space [ \t]+
+junk .
+
+%%
+
+{keyword} {
+ return FindToken(yytext);
+ }
+
+{number} {
+ yylval = strtoul(yytext, NULL, 0);
+ return NUMBER;
+ }
+
+{string} {
+ yylval = (unsigned long)CopyString(yytext);
+ return STRING;
+ }
+
+{comment}$ break;
+
+{space} break;
+
+\n {
+ line++;
+ break;
+ }
+
+{junk} {
+ Die("%s:%d: Invalid token `%s'\n", Opt_modedb, line, yytext);
+ }
+
+%%
diff --git a/TVout/fbset/modes.y b/TVout/fbset/modes.y
new file mode 100644
index 0000000000..27b497a00b
--- /dev/null
+++ b/TVout/fbset/modes.y
@@ -0,0 +1,175 @@
+/*
+ * Linux Frame Buffer Device Configuration
+ *
+ * © Copyright 1995-1998 by Geert Uytterhoeven
+ * (Geert.Uytterhoeven@cs.kuleuven.ac.be)
+ *
+ * --------------------------------------------------------------------------
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details.
+ */
+
+
+%{
+
+#define YYSTYPE long
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "fb.h"
+#include "fbset.h"
+
+extern int yylex(void);
+extern void yyerror(const char *s);
+extern int line;
+
+
+static struct VideoMode VideoMode;
+
+static void ClearVideoMode(void)
+{
+ memset(&VideoMode, 0, sizeof(VideoMode));
+ VideoMode.accel_flags = FB_ACCELF_TEXT;
+}
+
+%}
+
+%start file
+
+%token MODE GEOMETRY TIMINGS HSYNC VSYNC CSYNC GSYNC EXTSYNC BCAST LACED DOUBLE
+ RGBA NONSTD ACCEL GRAYSCALE
+ ENDMODE POLARITY BOOLEAN STRING NUMBER
+
+%%
+
+file : vmodes
+ ;
+
+
+vmodes : /* empty */
+ | vmodes vmode
+ ;
+
+vmode : MODE STRING geometry timings options ENDMODE
+ {
+ VideoMode.name = (const char *)$2;
+ AddVideoMode(&VideoMode);
+ ClearVideoMode();
+ }
+ ;
+
+geometry : GEOMETRY NUMBER NUMBER NUMBER NUMBER NUMBER
+ {
+ ClearVideoMode();
+ VideoMode.xres = $2;
+ VideoMode.yres = $3;
+ VideoMode.vxres = $4;
+ VideoMode.vyres = $5;
+ VideoMode.depth = $6;
+ }
+ ;
+
+timings : TIMINGS NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER
+ {
+ VideoMode.pixclock = $2;
+ VideoMode.left = $3;
+ VideoMode.right = $4;
+ VideoMode.upper = $5;
+ VideoMode.lower = $6;
+ VideoMode.hslen = $7;
+ VideoMode.vslen = $8;
+ }
+ ;
+
+options : /* empty */
+ | options hsync
+ | options vsync
+ | options csync
+ | options gsync
+ | options extsync
+ | options bcast
+ | options laced
+ | options double
+ | options rgba
+ | options nonstd
+ | options accel
+ | options grayscale
+ ;
+
+hsync : HSYNC POLARITY
+ {
+ VideoMode.hsync = $2;
+ }
+ ;
+
+vsync : VSYNC POLARITY
+ {
+ VideoMode.vsync = $2;
+ }
+ ;
+
+csync : CSYNC POLARITY
+ {
+ VideoMode.csync = $2;
+ }
+ ;
+
+gsync : GSYNC POLARITY
+ {
+ VideoMode.gsync = $2;
+ }
+ ;
+
+extsync : EXTSYNC BOOLEAN
+ {
+ VideoMode.extsync = $2;
+ }
+ ;
+
+bcast : BCAST BOOLEAN
+ {
+ VideoMode.bcast = $2;
+ }
+ ;
+
+laced : LACED BOOLEAN
+ {
+ VideoMode.laced = $2;
+ }
+ ;
+
+double : DOUBLE BOOLEAN
+ {
+ VideoMode.dblscan = $2;
+ }
+ ;
+
+rgba : RGBA STRING
+ {
+ makeRGBA(&VideoMode, (const char*)$2);
+ }
+ ;
+
+nonstd : NONSTD NUMBER
+ {
+ VideoMode.nonstd = $2;
+ }
+ ;
+
+accel : ACCEL BOOLEAN
+ {
+ VideoMode.accel_flags = $2;
+ }
+ ;
+
+grayscale : GRAYSCALE BOOLEAN
+ {
+ VideoMode.grayscale = $2;
+ }
+ ;
+
+%%
diff --git a/TVout/independ b/TVout/independ
new file mode 100755
index 0000000000..f9c78a1335
--- /dev/null
+++ b/TVout/independ
@@ -0,0 +1,16 @@
+
+# SETUP TVout
+# Independent picture on TV and Monitor
+
+# CRTC1 -> TVout
+matroxset/matroxset -f /dev/fb0 -m 2
+
+# CRTC2 -> Monitor
+matroxset/matroxset -f /dev/fb1 -m 1
+
+# Enable TV
+matroxset/matroxset 1
+
+# move tty1-2 to CRTC2
+con2fb/con2fb /dev/fb1 /dev/tty1
+con2fb/con2fb /dev/fb1 /dev/tty2
diff --git a/TVout/matroxset/Makefile b/TVout/matroxset/Makefile
new file mode 100644
index 0000000000..364b8a9e05
--- /dev/null
+++ b/TVout/matroxset/Makefile
@@ -0,0 +1,10 @@
+CFLAGS = -O2 -W -Wall
+
+all: matroxset
+
+matrox: matroxset.o
+
+matroxset.o: matroxset.c
+
+clean:
+ -rm *.o matroxset
diff --git a/TVout/matroxset/fb.h b/TVout/matroxset/fb.h
new file mode 100644
index 0000000000..7e4fbe20a3
--- /dev/null
+++ b/TVout/matroxset/fb.h
@@ -0,0 +1,502 @@
+#ifndef _LINUX_FB_H
+#define _LINUX_FB_H
+
+#include <linux/tty.h>
+#include <asm/types.h>
+
+/* Definitions of frame buffers */
+
+#define FB_MAJOR 29
+#define FB_MAX 32 /* sufficient for now */
+
+/* ioctls
+ 0x46 is 'F' */
+#define FBIOGET_VSCREENINFO 0x4600
+#define FBIOPUT_VSCREENINFO 0x4601
+#define FBIOGET_FSCREENINFO 0x4602
+#define FBIOGETCMAP 0x4604
+#define FBIOPUTCMAP 0x4605
+#define FBIOPAN_DISPLAY 0x4606
+/* 0x4607-0x460B are defined below */
+/* #define FBIOGET_MONITORSPEC 0x460C */
+/* #define FBIOPUT_MONITORSPEC 0x460D */
+/* #define FBIOSWITCH_MONIBIT 0x460E */
+#define FBIOGET_CON2FBMAP 0x460F
+#define FBIOPUT_CON2FBMAP 0x4610
+#define FBIOBLANK 0x4611 /* arg: 0 or vesa level + 1 */
+#define FBIOGET_VBLANK _IOR('F', 0x12, struct fb_vblank)
+
+/* next 2 lines are temporary solution, support in 2.5 will be different */
+#define FBIOGET_VT_VSCREENINFO 0x4680
+#define FBIOPUT_VT_VSCREENINFO 0x4681
+
+
+#define FB_TYPE_PACKED_PIXELS 0 /* Packed Pixels */
+#define FB_TYPE_PLANES 1 /* Non interleaved planes */
+#define FB_TYPE_INTERLEAVED_PLANES 2 /* Interleaved planes */
+#define FB_TYPE_TEXT 3 /* Text/attributes */
+#define FB_TYPE_VGA_PLANES 4 /* EGA/VGA planes */
+
+#define FB_AUX_TEXT_MDA 0 /* Monochrome text */
+#define FB_AUX_TEXT_CGA 1 /* CGA/EGA/VGA Color text */
+#define FB_AUX_TEXT_S3_MMIO 2 /* S3 MMIO fasttext */
+#define FB_AUX_TEXT_MGA_STEP16 3 /* MGA Millenium I: text, attr, 14 reserved bytes */
+#define FB_AUX_TEXT_MGA_STEP8 4 /* other MGAs: text, attr, 6 reserved bytes */
+
+#define FB_AUX_VGA_PLANES_VGA4 0 /* 16 color planes (EGA/VGA) */
+#define FB_AUX_VGA_PLANES_CFB4 1 /* CFB4 in planes (VGA) */
+#define FB_AUX_VGA_PLANES_CFB8 2 /* CFB8 in planes (VGA) */
+
+#define FB_VISUAL_MONO01 0 /* Monochr. 1=Black 0=White */
+#define FB_VISUAL_MONO10 1 /* Monochr. 1=White 0=Black */
+#define FB_VISUAL_TRUECOLOR 2 /* True color */
+#define FB_VISUAL_PSEUDOCOLOR 3 /* Pseudo color (like atari) */
+#define FB_VISUAL_DIRECTCOLOR 4 /* Direct color */
+#define FB_VISUAL_STATIC_PSEUDOCOLOR 5 /* Pseudo color readonly */
+
+#define FB_ACCEL_NONE 0 /* no hardware accelerator */
+#define FB_ACCEL_ATARIBLITT 1 /* Atari Blitter */
+#define FB_ACCEL_AMIGABLITT 2 /* Amiga Blitter */
+#define FB_ACCEL_S3_TRIO64 3 /* Cybervision64 (S3 Trio64) */
+#define FB_ACCEL_NCR_77C32BLT 4 /* RetinaZ3 (NCR 77C32BLT) */
+#define FB_ACCEL_S3_VIRGE 5 /* Cybervision64/3D (S3 ViRGE) */
+#define FB_ACCEL_ATI_MACH64GX 6 /* ATI Mach 64GX family */
+#define FB_ACCEL_DEC_TGA 7 /* DEC 21030 TGA */
+#define FB_ACCEL_ATI_MACH64CT 8 /* ATI Mach 64CT family */
+#define FB_ACCEL_ATI_MACH64VT 9 /* ATI Mach 64CT family VT class */
+#define FB_ACCEL_ATI_MACH64GT 10 /* ATI Mach 64CT family GT class */
+#define FB_ACCEL_SUN_CREATOR 11 /* Sun Creator/Creator3D */
+#define FB_ACCEL_SUN_CGSIX 12 /* Sun cg6 */
+#define FB_ACCEL_SUN_LEO 13 /* Sun leo/zx */
+#define FB_ACCEL_IMS_TWINTURBO 14 /* IMS Twin Turbo */
+#define FB_ACCEL_3DLABS_PERMEDIA2 15 /* 3Dlabs Permedia 2 */
+#define FB_ACCEL_MATROX_MGA2064W 16 /* Matrox MGA2064W (Millenium) */
+#define FB_ACCEL_MATROX_MGA1064SG 17 /* Matrox MGA1064SG (Mystique) */
+#define FB_ACCEL_MATROX_MGA2164W 18 /* Matrox MGA2164W (Millenium II) */
+#define FB_ACCEL_MATROX_MGA2164W_AGP 19 /* Matrox MGA2164W (Millenium II) */
+#define FB_ACCEL_MATROX_MGAG100 20 /* Matrox G100 (Productiva G100) */
+#define FB_ACCEL_MATROX_MGAG200 21 /* Matrox G200 (Myst, Mill, ...) */
+#define FB_ACCEL_SUN_CG14 22 /* Sun cgfourteen */
+#define FB_ACCEL_SUN_BWTWO 23 /* Sun bwtwo */
+#define FB_ACCEL_SUN_CGTHREE 24 /* Sun cgthree */
+#define FB_ACCEL_SUN_TCX 25 /* Sun tcx */
+#define FB_ACCEL_MATROX_MGAG400 26 /* Matrox G400 */
+#define FB_ACCEL_NV3 27 /* nVidia RIVA 128 */
+#define FB_ACCEL_NV4 28 /* nVidia RIVA TNT */
+#define FB_ACCEL_NV5 29 /* nVidia RIVA TNT2 */
+#define FB_ACCEL_CT_6555x 30 /* C&T 6555x */
+#define FB_ACCEL_3DFX_BANSHEE 31 /* 3Dfx Banshee */
+#define FB_ACCEL_ATI_RAGE128 32 /* ATI Rage128 family */
+
+struct fb_fix_screeninfo {
+ char id[16]; /* identification string eg "TT Builtin" */
+ unsigned long smem_start; /* Start of frame buffer mem */
+ /* (physical address) */
+ __u32 smem_len; /* Length of frame buffer mem */
+ __u32 type; /* see FB_TYPE_* */
+ __u32 type_aux; /* Interleave for interleaved Planes */
+ __u32 visual; /* see FB_VISUAL_* */
+ __u16 xpanstep; /* zero if no hardware panning */
+ __u16 ypanstep; /* zero if no hardware panning */
+ __u16 ywrapstep; /* zero if no hardware ywrap */
+ __u32 line_length; /* length of a line in bytes */
+ unsigned long mmio_start; /* Start of Memory Mapped I/O */
+ /* (physical address) */
+ __u32 mmio_len; /* Length of Memory Mapped I/O */
+ __u32 accel; /* Type of acceleration available */
+ __u16 reserved[3]; /* Reserved for future compatibility */
+};
+
+/* Interpretation of offset for color fields: All offsets are from the right,
+ * inside a "pixel" value, which is exactly 'bits_per_pixel' wide (means: you
+ * can use the offset as right argument to <<). A pixel afterwards is a bit
+ * stream and is written to video memory as that unmodified. This implies
+ * big-endian byte order if bits_per_pixel is greater than 8.
+ */
+struct fb_bitfield {
+ __u32 offset; /* beginning of bitfield */
+ __u32 length; /* length of bitfield */
+ __u32 msb_right; /* != 0 : Most significant bit is */
+ /* right */
+};
+
+#define FB_NONSTD_HAM 1 /* Hold-And-Modify (HAM) */
+
+#define FB_ACTIVATE_NOW 0 /* set values immediately (or vbl)*/
+#define FB_ACTIVATE_NXTOPEN 1 /* activate on next open */
+#define FB_ACTIVATE_TEST 2 /* don't set, round up impossible */
+#define FB_ACTIVATE_MASK 15
+ /* values */
+#define FB_ACTIVATE_VBL 16 /* activate values on next vbl */
+#define FB_CHANGE_CMAP_VBL 32 /* change colormap on vbl */
+#define FB_ACTIVATE_ALL 64 /* change all VCs on this fb */
+
+#define FB_ACCELF_TEXT 1 /* text mode acceleration */
+
+#define FB_SYNC_HOR_HIGH_ACT 1 /* horizontal sync high active */
+#define FB_SYNC_VERT_HIGH_ACT 2 /* vertical sync high active */
+#define FB_SYNC_EXT 4 /* external sync */
+#define FB_SYNC_COMP_HIGH_ACT 8 /* composite sync high active */
+#define FB_SYNC_BROADCAST 16 /* broadcast video timings */
+ /* vtotal = 144d/288n/576i => PAL */
+ /* vtotal = 121d/242n/484i => NTSC */
+#define FB_SYNC_ON_GREEN 32 /* sync on green */
+
+#define FB_VMODE_NONINTERLACED 0 /* non interlaced */
+#define FB_VMODE_INTERLACED 1 /* interlaced */
+#define FB_VMODE_DOUBLE 2 /* double scan */
+#define FB_VMODE_MASK 255
+
+#define FB_VMODE_YWRAP 256 /* ywrap instead of panning */
+#define FB_VMODE_SMOOTH_XPAN 512 /* smooth xpan possible (internally used) */
+#define FB_VMODE_CONUPDATE 512 /* don't update x/yoffset */
+
+struct fb_var_screeninfo {
+ __u32 xres; /* visible resolution */
+ __u32 yres;
+ __u32 xres_virtual; /* virtual resolution */
+ __u32 yres_virtual;
+ __u32 xoffset; /* offset from virtual to visible */
+ __u32 yoffset; /* resolution */
+
+ __u32 bits_per_pixel; /* guess what */
+ __u32 grayscale; /* != 0 Graylevels instead of colors */
+
+ struct fb_bitfield red; /* bitfield in fb mem if true color, */
+ struct fb_bitfield green; /* else only length is significant */
+ struct fb_bitfield blue;
+ struct fb_bitfield transp; /* transparency */
+
+ __u32 nonstd; /* != 0 Non standard pixel format */
+
+ __u32 activate; /* see FB_ACTIVATE_* */
+
+ __u32 height; /* height of picture in mm */
+ __u32 width; /* width of picture in mm */
+
+ __u32 accel_flags; /* acceleration flags (hints) */
+
+ /* Timing: All values in pixclocks, except pixclock (of course) */
+ __u32 pixclock; /* pixel clock in ps (pico seconds) */
+ __u32 left_margin; /* time from sync to picture */
+ __u32 right_margin; /* time from picture to sync */
+ __u32 upper_margin; /* time from sync to picture */
+ __u32 lower_margin;
+ __u32 hsync_len; /* length of horizontal sync */
+ __u32 vsync_len; /* length of vertical sync */
+ __u32 sync; /* see FB_SYNC_* */
+ __u32 vmode; /* see FB_VMODE_* */
+ __u32 reserved[6]; /* Reserved for future compatibility */
+};
+
+struct fb_cmap {
+ __u32 start; /* First entry */
+ __u32 len; /* Number of entries */
+ __u16 *red; /* Red values */
+ __u16 *green;
+ __u16 *blue;
+ __u16 *transp; /* transparency, can be NULL */
+};
+
+struct fb_con2fbmap {
+ __u32 console;
+ __u32 framebuffer;
+};
+
+/* VESA Blanking Levels */
+#define VESA_NO_BLANKING 0
+#define VESA_VSYNC_SUSPEND 1
+#define VESA_HSYNC_SUSPEND 2
+#define VESA_POWERDOWN 3
+
+struct fb_monspecs {
+ __u32 hfmin; /* hfreq lower limit (Hz) */
+ __u32 hfmax; /* hfreq upper limit (Hz) */
+ __u16 vfmin; /* vfreq lower limit (Hz) */
+ __u16 vfmax; /* vfreq upper limit (Hz) */
+ unsigned dpms : 1; /* supports DPMS */
+};
+
+/* next structure is only 2.2 temporary hack, 2.3 solution will be different */
+struct fb_vt_info {
+ __u32 console;
+ struct fb_var_screeninfo *info;
+};
+
+#define FB_VBLANK_VBLANKING 1 /* currently in a vertical blank */
+#define FB_VBLANK_HBLANKING 2 /* currently in a horizontal blank */
+#define FB_VBLANK_HAVE_VBLANK 4 /* vertical blanks can be detected */
+#define FB_VBLANK_HAVE_HBLANK 8 /* horizontal blanks can be detected */
+#define FB_VBLANK_HAVE_COUNT 16 /* global retrace counter is available */
+#define FB_VBLANK_HAVE_VCOUNT 32 /* the vcount field is valid */
+#define FB_VBLANK_HAVE_HCOUNT 64 /* the hcount field is valid */
+
+struct fb_vblank {
+ __u32 flags; /* FB_VBLANK flags */
+ __u32 count; /* counter of retraces since boot */
+ __s32 vcount; /* current scanline position */
+ __s32 hcount; /* current scandot position */
+ __u32 reserved[4]; /* reserved for future compatibility */
+};
+
+#ifdef __KERNEL__
+
+#if 1 /* to go away in 2.4.0 */
+extern int GET_FB_IDX(kdev_t rdev);
+#else
+#define GET_FB_IDX(node) (MINOR(node))
+#endif
+
+#include <linux/fs.h>
+#include <linux/init.h>
+
+
+struct fb_info;
+struct fb_info_gen;
+struct vm_area_struct;
+struct file;
+
+ /*
+ * Frame buffer operations
+ */
+
+struct fb_ops {
+ /* open/release and usage marking */
+ int (*fb_open)(struct fb_info *info, int user);
+ int (*fb_release)(struct fb_info *info, int user);
+ /* get non settable parameters */
+ int (*fb_get_fix)(struct fb_fix_screeninfo *fix, int con,
+ struct fb_info *info);
+ /* get settable parameters */
+ int (*fb_get_var)(struct fb_var_screeninfo *var, int con,
+ struct fb_info *info);
+ /* set settable parameters */
+ int (*fb_set_var)(struct fb_var_screeninfo *var, int con,
+ struct fb_info *info);
+ /* get colormap */
+ int (*fb_get_cmap)(struct fb_cmap *cmap, int kspc, int con,
+ struct fb_info *info);
+ /* set colormap */
+ int (*fb_set_cmap)(struct fb_cmap *cmap, int kspc, int con,
+ struct fb_info *info);
+ /* pan display */
+ int (*fb_pan_display)(struct fb_var_screeninfo *var, int con,
+ struct fb_info *info);
+ /* perform fb specific ioctl */
+ int (*fb_ioctl)(struct inode *inode, struct file *file, unsigned int cmd,
+ unsigned long arg, int con, struct fb_info *info);
+ /* perform fb specific mmap */
+ int (*fb_mmap)(struct fb_info *info, struct file *file, struct vm_area_struct *vma);
+ /* switch to/from raster image mode */
+ int (*fb_rasterimg)(struct fb_info *info, int start);
+};
+
+struct fb_info {
+ char modename[40]; /* default video mode */
+ kdev_t node;
+ int flags;
+ int open; /* Has this been open already ? */
+#define FBINFO_FLAG_MODULE 1 /* Low-level driver is a module */
+ struct fb_fix_screeninfo fix; /* Current fix */
+ struct fb_monspecs monspecs; /* Current Monitor specs */
+ struct fb_ops *fbops;
+ char *screen_base; /* Virtual address */
+ struct display *disp; /* initial display variable */
+ struct display *currcon;
+ struct vc_data *display_fg; /* Console visible on this display */
+ char fontname[40]; /* default font name */
+ int (*changevar)(int); /* tell console var has changed */
+ int (*switch_con)(int, struct fb_info*);
+ /* tell fb to switch consoles */
+ int (*updatevar)(int, struct fb_info*);
+ /* tell fb to update the vars */
+ void (*blank)(int, struct fb_info*); /* tell fb to (un)blank the screen */
+ /* arg = 0: unblank */
+ /* arg > 0: VESA level (arg-1) */
+ void *pseudo_palette; /* Fake palette of 16 colors and
+ the cursor's color for non
+ palette mode */
+ /* From here on everything is device dependent */
+ void *par;
+};
+
+#ifdef MODULE
+#define FBINFO_FLAG_DEFAULT FBINFO_FLAG_MODULE
+#else
+#define FBINFO_FLAG_DEFAULT 0
+#endif
+
+ /*
+ * This structure abstracts from the underlying hardware. It is not
+ * mandatory but used by the `generic' frame buffer operations.
+ * Read drivers/video/skeletonfb.c for more information.
+ */
+
+struct fbgen_hwswitch {
+ void (*detect)(void);
+ int (*encode_fix)(struct fb_fix_screeninfo *fix, const void *par,
+ struct fb_info_gen *info);
+ int (*decode_var)(const struct fb_var_screeninfo *var, void *par,
+ struct fb_info_gen *info);
+ int (*encode_var)(struct fb_var_screeninfo *var, const void *par,
+ struct fb_info_gen *info);
+ void (*get_par)(void *par, struct fb_info_gen *info);
+ void (*set_par)(const void *par, struct fb_info_gen *info);
+ int (*getcolreg)(unsigned regno, unsigned *red, unsigned *green,
+ unsigned *blue, unsigned *transp, struct fb_info *info);
+ int (*setcolreg)(unsigned regno, unsigned red, unsigned green,
+ unsigned blue, unsigned transp, struct fb_info *info);
+ int (*pan_display)(const struct fb_var_screeninfo *var,
+ struct fb_info_gen *info);
+ int (*blank)(int blank_mode, struct fb_info_gen *info);
+ void (*set_disp)(const void *par, struct display *disp,
+ struct fb_info_gen *info);
+};
+
+struct fb_info_gen {
+ struct fb_info info;
+
+ /* Entries for a generic frame buffer device */
+ /* Yes, this starts looking like C++ */
+ u_int parsize;
+ struct fbgen_hwswitch *fbhw;
+
+ /* From here on everything is device dependent */
+};
+
+ /*
+ * `Generic' versions of the frame buffer device operations
+ */
+
+extern int fbgen_get_fix(struct fb_fix_screeninfo *fix, int con,
+ struct fb_info *info);
+extern int fbgen_get_var(struct fb_var_screeninfo *var, int con,
+ struct fb_info *info);
+extern int fbgen_set_var(struct fb_var_screeninfo *var, int con,
+ struct fb_info *info);
+extern int fbgen_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+ struct fb_info *info);
+extern int fbgen_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+ struct fb_info *info);
+extern int fbgen_pan_display(struct fb_var_screeninfo *var, int con,
+ struct fb_info *info);
+extern int fbgen_ioctl(struct inode *inode, struct file *file,
+ unsigned int cmd, unsigned long arg, int con,
+ struct fb_info *info);
+
+ /*
+ * Helper functions
+ */
+
+extern int fbgen_do_set_var(struct fb_var_screeninfo *var, int isactive,
+ struct fb_info_gen *info);
+extern void fbgen_set_disp(int con, struct fb_info_gen *info);
+extern void fbgen_install_cmap(int con, struct fb_info_gen *info);
+extern int fbgen_update_var(int con, struct fb_info *info);
+extern int fbgen_switch(int con, struct fb_info *info);
+extern void fbgen_blank(int blank, struct fb_info *info);
+
+
+/* drivers/video/fbmem.c */
+extern int register_framebuffer(struct fb_info *fb_info);
+extern int unregister_framebuffer(const struct fb_info *fb_info);
+
+extern int num_registered_fb;
+extern struct fb_info *registered_fb[FB_MAX];
+
+/* drivers/video/fbmon.c */
+extern int fbmon_valid_timings(u_int pixclock, u_int htotal, u_int vtotal,
+ const struct fb_info *fb_info);
+extern int fbmon_dpms(const struct fb_info *fb_info);
+
+/* drivers/video/fbcmap.c */
+extern int fb_alloc_cmap(struct fb_cmap *cmap, int len, int transp);
+extern void fb_copy_cmap(struct fb_cmap *from, struct fb_cmap *to,
+ int fsfromto);
+extern int fb_get_cmap(struct fb_cmap *cmap, int kspc,
+ int (*getcolreg)(u_int, u_int *, u_int *, u_int *,
+ u_int *, struct fb_info *),
+ struct fb_info *fb_info);
+extern int fb_set_cmap(struct fb_cmap *cmap, int kspc,
+ int (*setcolreg)(u_int, u_int, u_int, u_int, u_int,
+ struct fb_info *),
+ struct fb_info *fb_info);
+extern struct fb_cmap *fb_default_cmap(int len);
+extern void fb_invert_cmaps(void);
+
+struct fb_videomode {
+ const char *name; /* optional */
+ u32 refresh; /* optional */
+ u32 xres;
+ u32 yres;
+ u32 pixclock;
+ u32 left_margin;
+ u32 right_margin;
+ u32 upper_margin;
+ u32 lower_margin;
+ u32 hsync_len;
+ u32 vsync_len;
+ u32 sync;
+ u32 vmode;
+};
+
+extern int __init fb_find_mode(struct fb_var_screeninfo *var,
+ struct fb_info *info, const char *mode_option,
+ const struct fb_videomode *db,
+ unsigned int dbsize,
+ const struct fb_videomode *default_mode,
+ unsigned int default_bpp);
+
+#endif /* __KERNEL__ */
+
+#if 1
+
+#define FBCMD_GET_CURRENTPAR 0xDEAD0005
+#define FBCMD_SET_CURRENTPAR 0xDEAD8005
+
+#endif
+
+
+#if 1 /* Preliminary */
+
+ /*
+ * Hardware Cursor
+ */
+
+#define FBIOGET_FCURSORINFO 0x4607
+#define FBIOGET_VCURSORINFO 0x4608
+#define FBIOPUT_VCURSORINFO 0x4609
+#define FBIOGET_CURSORSTATE 0x460A
+#define FBIOPUT_CURSORSTATE 0x460B
+
+
+struct fb_fix_cursorinfo {
+ __u16 crsr_width; /* width and height of the cursor in */
+ __u16 crsr_height; /* pixels (zero if no cursor) */
+ __u16 crsr_xsize; /* cursor size in display pixels */
+ __u16 crsr_ysize;
+ __u16 crsr_color1; /* colormap entry for cursor color1 */
+ __u16 crsr_color2; /* colormap entry for cursor color2 */
+};
+
+struct fb_var_cursorinfo {
+ __u16 width;
+ __u16 height;
+ __u16 xspot;
+ __u16 yspot;
+ __u8 data[1]; /* field with [height][width] */
+};
+
+struct fb_cursorstate {
+ __s16 xoffset;
+ __s16 yoffset;
+ __u16 mode;
+};
+
+#define FB_CURSOR_OFF 0
+#define FB_CURSOR_ON 1
+#define FB_CURSOR_FLASH 2
+
+#endif /* Preliminary */
+
+#endif /* _LINUX_FB_H */
diff --git a/TVout/matroxset/matroxfb.h b/TVout/matroxset/matroxfb.h
new file mode 100644
index 0000000000..182d76b25a
--- /dev/null
+++ b/TVout/matroxset/matroxfb.h
@@ -0,0 +1,32 @@
+#ifndef __LINUX_MATROXFB_H__
+#define __LINUX_MATROXFB_H__
+
+#include <asm/ioctl.h>
+#include <asm/types.h>
+
+struct matroxioc_output_mode {
+ __u32 output; /* which output */
+#define MATROXFB_OUTPUT_PRIMARY 0x0000
+#define MATROXFB_OUTPUT_SECONDARY 0x0001
+ __u32 mode; /* which mode */
+#define MATROXFB_OUTPUT_MODE_PAL 0x0001
+#define MATROXFB_OUTPUT_MODE_NTSC 0x0002
+#define MATROXFB_OUTPUT_MODE_MONITOR 0x0080
+};
+#define MATROXFB_SET_OUTPUT_MODE _IOW('n',0xFA,sizeof(struct matroxioc_output_mode))
+#define MATROXFB_GET_OUTPUT_MODE _IOWR('n',0xFA,sizeof(struct matroxioc_output_mode))
+
+/* bitfield */
+#define MATROXFB_OUTPUT_CONN_PRIMARY (1 << MATROXFB_OUTPUT_PRIMARY)
+#define MATROXFB_OUTPUT_CONN_SECONDARY (1 << MATROXFB_OUTPUT_SECONDARY)
+/* connect these outputs to this framebuffer */
+#define MATROXFB_SET_OUTPUT_CONNECTION _IOW('n',0xF8,sizeof(__u32))
+/* which outputs are connected to this framebuffer */
+#define MATROXFB_GET_OUTPUT_CONNECTION _IOR('n',0xF8,sizeof(__u32))
+/* which outputs are available for this framebuffer */
+#define MATROXFB_GET_AVAILABLE_OUTPUTS _IOR('n',0xF9,sizeof(__u32))
+/* which outputs exist on this framebuffer */
+#define MATROXFB_GET_ALL_OUTPUTS _IOR('n',0xFB,sizeof(__u32))
+
+#endif
+
diff --git a/TVout/matroxset/matroxset.c b/TVout/matroxset/matroxset.c
new file mode 100644
index 0000000000..af989156f9
--- /dev/null
+++ b/TVout/matroxset/matroxset.c
@@ -0,0 +1,162 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include "fb.h"
+#include "matroxfb.h"
+
+static int help(void) {
+ fprintf(stderr, "usage: matroxset [-f fbdev] [-o output] [-m] [value]\n"
+ "\n"
+ "where -f fbdev is fbdev device (default /dev/fb1)\n"
+ " -o output is output number to investigate (0=primary, 1=secondary=default)\n"
+ " -m says that CRTC->output mapping should be changed/retrieved\n"
+ " -p print information about blanking\n"
+ " value if present, value is set, if missing, value is retrieved\n"
+ "\n"
+ "For output mode, 128 means monitor, 1 = PAL TV, 2 = NTSC TV\n");
+ return 98;
+}
+
+int main(int argc, char* argv[]) {
+ char* fb = "/dev/fb1";
+ int fd;
+ struct matroxioc_output_mode mom;
+ struct fb_vblank vbl;
+ int rtn;
+ int output = MATROXFB_OUTPUT_SECONDARY;
+ int o_present = 0;
+ int m_present = 0;
+ int p_present = 0;
+ int act;
+ u_int32_t conns;
+
+ while ((rtn = getopt(argc, argv, "o:f:mhp")) != -1) {
+ switch (rtn) {
+ case 'o':
+ output = strtoul(optarg, NULL, 0);
+ o_present = 1;
+ break;
+ case 'm':
+ m_present = 1;
+ break;
+ case 'f':
+ fb = optarg;
+ break;
+ case 'p':
+ p_present = 1;
+ break;
+ case 'h':
+ return help();
+ default:
+ fprintf(stderr, "Bad commandline\n");
+ return 99;
+ }
+ }
+ act = 0;
+ if (p_present) {
+ if (m_present || o_present) {
+ fprintf(stderr, "You cannot use -p together with -m or -o\n");
+ return 95;
+ }
+ act = 4;
+ } else if (optind >= argc) {
+ if (m_present) {
+ if (o_present) {
+ fprintf(stderr, "You cannot use -m and -o together\n");
+ return 96;
+ }
+ act = 2;
+ } else {
+ mom.output = output;
+ mom.mode = 0;
+ }
+ } else {
+ if (m_present) {
+ conns = strtoul(argv[optind], NULL, 0);
+ act = 3;
+ } else {
+ mom.output = output;
+ mom.mode = strtoul(argv[optind], NULL, 0);
+ act = 1;
+ }
+ }
+ fd = open(fb, O_RDWR);
+ if (fd == -1) {
+ fprintf(stderr, "Cannot open %s: %s\n", fb, strerror(errno));
+ return 122;
+ }
+ switch (act) {
+ case 0:
+ rtn = ioctl(fd, MATROXFB_GET_OUTPUT_MODE, &mom);
+ if (rtn)
+ break;
+ printf("Output mode is %u\n", mom.mode);
+ break;
+ case 1:
+ rtn = ioctl(fd, MATROXFB_SET_OUTPUT_MODE, &mom);
+ break;
+ case 2:
+ rtn = ioctl(fd, MATROXFB_GET_OUTPUT_CONNECTION, &conns);
+ if (rtn)
+ break;
+ printf("This framebuffer is connected to outputs %08X\n", conns);
+ break;
+ case 3:
+ rtn = ioctl(fd, MATROXFB_SET_OUTPUT_CONNECTION, &conns);
+ break;
+ case 4:
+#if 0
+ { int i; for (i = 0; i < 1000000; i++) {
+ rtn = ioctl(fd, FBIOGET_VBLANK, &vbl);
+ if (rtn)
+ break;
+ }}
+#else
+ rtn = ioctl(fd, FBIOGET_VBLANK, &vbl);
+ if (rtn)
+ break;
+#endif
+ printf("VBlank flags: %08X\n", vbl.flags);
+ printf(" Symbolic: ");
+ {
+ static const struct { u_int32_t mask; const char* msg; } *ptr, vals[] = {
+ { FB_VBLANK_HAVE_VBLANK, "vblank" },
+ { FB_VBLANK_HAVE_HBLANK, "hblank" },
+ { FB_VBLANK_HAVE_COUNT, "field no." },
+ { FB_VBLANK_HAVE_VCOUNT, "line no." },
+ { FB_VBLANK_HAVE_HCOUNT, "column no." },
+ { FB_VBLANK_VBLANKING, "vblanking" },
+ { FB_VBLANK_HBLANKING, "hblanking" },
+ { 0, NULL }};
+ int ap = 0;
+ for (ptr = vals; ptr->msg; ptr++) {
+ if (vbl.flags & ptr->mask) {
+ if (ap) printf(", ");
+ printf(ptr->msg);
+ ap = 1;
+ }
+ }
+ if (!ap)
+ printf("none");
+ printf("\n");
+ }
+ printf("Field count: %12u\n", vbl.count);
+ printf("Vertical line: %12u\n", vbl.vcount);
+ printf("Horizontal column: %12u\n", vbl.hcount);
+ break;
+ default:
+ rtn = -1; errno = EINVAL;
+ break;
+ }
+ if (rtn) {
+ fprintf(stderr, "ioctl failed: %s\n", strerror(errno));
+ }
+ close(fd);
+ return 0;
+}
+
diff --git a/TVout/matroxset/normal b/TVout/matroxset/normal
new file mode 100755
index 0000000000..f17caf5351
--- /dev/null
+++ b/TVout/matroxset/normal
@@ -0,0 +1,12 @@
+#! /bin/sh
+
+if [ -c /dev/fb0 ]; then
+ HEAD0=/dev/fb0
+ HEAD1=/dev/fb1
+else
+ HEAD0=/dev/fb/0
+ HEAD1=/dev/fb/1
+fi
+matroxset -f ${HEAD1} -m 0
+matroxset -f ${HEAD0} -m 1
+matroxset -f ${HEAD1} -m 2
diff --git a/TVout/matroxset/swapit b/TVout/matroxset/swapit
new file mode 100755
index 0000000000..918f54618c
--- /dev/null
+++ b/TVout/matroxset/swapit
@@ -0,0 +1,5 @@
+#! /bin/sh
+~/mga/con2fb /dev/fb0 /dev/tty4
+rmmod matroxfb_maven
+modprobe matroxfb_maven
+~/mga/con2fb /dev/fb1 /dev/tty4
diff --git a/TVout/matroxset/swapped b/TVout/matroxset/swapped
new file mode 100755
index 0000000000..c6dc7cf016
--- /dev/null
+++ b/TVout/matroxset/swapped
@@ -0,0 +1,12 @@
+#! /bin/sh
+
+if [ -c /dev/fb0 ]; then
+ HEAD0=/dev/fb0
+ HEAD1=/dev/fb1
+else
+ HEAD0=/dev/fb/0
+ HEAD1=/dev/fb/1
+fi
+matroxset -f ${HEAD1} -m 0
+matroxset -f ${HEAD0} -m 2
+matroxset -f ${HEAD1} -m 1
diff --git a/TVout/modules b/TVout/modules
new file mode 100755
index 0000000000..2c210e97f3
--- /dev/null
+++ b/TVout/modules
@@ -0,0 +1,8 @@
+
+# Load kernel modules...
+# (you must have 2.3/2.4 kernel with matroxfb enabled!)
+
+modprobe i2c-matroxfb
+modprobe matroxfb_Ti3026
+modprobe matroxfb_crtc2
+modprobe matroxfb_maven