diff options
author | diego <diego@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2004-08-03 00:45:55 +0000 |
---|---|---|
committer | diego <diego@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2004-08-03 00:45:55 +0000 |
commit | c1f0f03b5780a1dd233b118cbb71af8dd32e4446 (patch) | |
tree | 20a6fb8b7a4f783b7714affbc9be13b4c9a48b2d /TVout/fbset/fbset.c | |
parent | b3179e503f740651ae16cced2f6cfe8e83d2c8a0 (diff) | |
download | mpv-c1f0f03b5780a1dd233b118cbb71af8dd32e4446.tar.bz2 mpv-c1f0f03b5780a1dd233b118cbb71af8dd32e4446.tar.xz |
Moved to the TOOLS directory.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@12941 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'TVout/fbset/fbset.c')
-rw-r--r-- | TVout/fbset/fbset.c | 1054 |
1 files changed, 0 insertions, 1054 deletions
diff --git a/TVout/fbset/fbset.c b/TVout/fbset/fbset.c deleted file mode 100644 index a9da078ede..0000000000 --- a/TVout/fbset/fbset.c +++ /dev/null @@ -1,1054 +0,0 @@ -/* - * 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); -} |