231 lines
7.1 KiB
Diff
231 lines
7.1 KiB
Diff
>From cb00e6fade39afdb2adb0727647e9c97ce0fd02c Mon Sep 17 00:00:00 2001
|
|
From: David Kozub <zub@linux.fjfi.cvut.cz>
|
|
Date: Thu, 7 Jun 2012 15:46:16 +0200
|
|
Subject: [PATCH] add support for custom sync flags
|
|
|
|
---
|
|
fb.modes.5 | 3 +++
|
|
fbset.8 | 4 ++++
|
|
fbset.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
|
|
fbset.h | 3 +++
|
|
modes.l | 3 ++-
|
|
modes.y | 10 +++++++++-
|
|
6 files changed, 66 insertions(+), 2 deletions(-)
|
|
|
|
--- a/fb.modes.5
|
|
+++ b/fb.modes.5
|
|
@@ -120,6 +120,9 @@ generated by the frame buffer device and
|
|
instead. Note that this option may not be supported by every frame buffer
|
|
device
|
|
.TP
|
|
+.IR \fBsync "\ <" number >
|
|
+custom sync flags (frame buffer driver dependent)
|
|
+.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
|
|
--- a/fbset.8
|
|
+++ b/fbset.8
|
|
@@ -191,6 +191,10 @@ generated by the frame buffer device and
|
|
instead. Note that this option may not be supported by every frame buffer
|
|
device
|
|
.TP
|
|
+.IR \fB\-sync "\ <" \fIvalue >
|
|
+set custom sync flags. If specified, this value is bitwise or-ed to the
|
|
+other sync flags. This is useful for drivers that use custom sync flags
|
|
+.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
|
|
--- a/fbset.c
|
|
+++ b/fbset.c
|
|
@@ -16,6 +16,9 @@
|
|
* Brad Midgley <brad@exodus.pht.com>:
|
|
* -match
|
|
*
|
|
+ * David Kozub <zub@linux.fjfi.cvut.cz>:
|
|
+ * -sync
|
|
+ *
|
|
*/
|
|
|
|
|
|
@@ -52,6 +55,12 @@ struct inode;
|
|
|
|
|
|
/*
|
|
+ * Mask to zero-out all known sync flags
|
|
+ */
|
|
+#define FB_CUSTOM_SYNC_MASK ~(FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT| \
|
|
+ FB_SYNC_COMP_HIGH_ACT|FB_SYNC_ON_GREEN|FB_SYNC_EXT|FB_SYNC_BROADCAST)
|
|
+
|
|
+ /*
|
|
* Command Line Options
|
|
*/
|
|
|
|
@@ -86,6 +95,7 @@ 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_sync = NULL;
|
|
static const char *Opt_bcast = NULL;
|
|
static const char *Opt_laced = NULL;
|
|
static const char *Opt_double = NULL;
|
|
@@ -123,6 +133,7 @@ static struct {
|
|
{ "-csync", &Opt_csync, 1 },
|
|
{ "-gsync", &Opt_gsync, 1 },
|
|
{ "-extsync", &Opt_extsync, 1 },
|
|
+ { "-sync", &Opt_sync, 1 },
|
|
{ "-bcast", &Opt_bcast, 1 },
|
|
{ "-laced", &Opt_laced, 1 },
|
|
{ "-double", &Opt_double, 1 },
|
|
@@ -402,6 +413,7 @@ static void ConvertFromVideoMode(const s
|
|
var->sync |= FB_SYNC_EXT;
|
|
if (vmode->bcast == TRUE)
|
|
var->sync |= FB_SYNC_BROADCAST;
|
|
+ var->sync |= vmode->sync;
|
|
if (vmode->laced == TRUE)
|
|
var->vmode = FB_VMODE_INTERLACED;
|
|
else if (vmode->dblscan == TRUE)
|
|
@@ -445,6 +457,7 @@ static void ConvertToVideoMode(const str
|
|
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->sync = var->sync & FB_CUSTOM_SYNC_MASK;
|
|
vmode->grayscale = var->grayscale;
|
|
vmode->laced = FALSE;
|
|
vmode->dblscan = FALSE;
|
|
@@ -554,6 +567,27 @@ void makeRGBA(struct VideoMode *vmode, c
|
|
}
|
|
|
|
/*
|
|
+ * Take known bits from sync and set appropriate flags instead
|
|
+ */
|
|
+
|
|
+void fixCustomSync(struct VideoMode *vmode)
|
|
+{
|
|
+ if (vmode->sync & FB_SYNC_HOR_HIGH_ACT)
|
|
+ vmode->hsync = 1;
|
|
+ if (vmode->sync & FB_SYNC_VERT_HIGH_ACT)
|
|
+ vmode->vsync = 1;
|
|
+ if (vmode->sync & FB_SYNC_COMP_HIGH_ACT)
|
|
+ vmode->csync = 1;
|
|
+ if (vmode->sync & FB_SYNC_ON_GREEN)
|
|
+ vmode->gsync = 1;
|
|
+ if (vmode->sync & FB_SYNC_EXT)
|
|
+ vmode->extsync =1;
|
|
+ if (vmode->sync & FB_SYNC_BROADCAST)
|
|
+ vmode->bcast = 1;
|
|
+ vmode->sync &= FB_CUSTOM_SYNC_MASK;
|
|
+}
|
|
+
|
|
+ /*
|
|
* Find a Video Mode
|
|
*/
|
|
|
|
@@ -617,6 +651,12 @@ static void ModifyVideoMode(struct Video
|
|
vmode->extsync = atoboolean(Opt_extsync);
|
|
if (Opt_bcast)
|
|
vmode->bcast = atoboolean(Opt_bcast);
|
|
+ if (Opt_sync)
|
|
+ {
|
|
+ vmode->sync = strtoul(Opt_sync, NULL, 0);
|
|
+ // call this only once all the other sync fields are determined!
|
|
+ fixCustomSync(vmode);
|
|
+ }
|
|
if (Opt_laced)
|
|
vmode->laced = atoboolean(Opt_laced);
|
|
if (Opt_double)
|
|
@@ -693,6 +733,8 @@ static void DisplayVModeInfo(struct Vide
|
|
puts(" extsync true");
|
|
if (vmode->bcast)
|
|
puts(" bcast true");
|
|
+ if (vmode->sync)
|
|
+ printf(" sync 0x%x\n", vmode->sync);
|
|
if (vmode->laced)
|
|
puts(" laced true");
|
|
if (vmode->dblscan)
|
|
@@ -745,6 +787,8 @@ static void DisplayVModeInfo(struct Vide
|
|
puts(" # Warning: XFree86 doesn't support extsync\n");
|
|
if (vmode->bcast)
|
|
printf(" \"bcast\"");
|
|
+ if (vmode->sync)
|
|
+ puts(" # Warning: XFree86 doesn't support custom sync values\n");
|
|
if (vmode->accel_flags)
|
|
puts(" # Warning: XFree86 doesn't support accel\n");
|
|
if (vmode->grayscale)
|
|
@@ -931,6 +975,7 @@ static void Usage(void)
|
|
" -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"
|
|
+ " -sync <value> : custom (driver specific) sync value\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"
|
|
--- a/fbset.h
|
|
+++ b/fbset.h
|
|
@@ -64,6 +64,8 @@ struct VideoMode {
|
|
unsigned laced : 1;
|
|
unsigned dblscan : 1;
|
|
unsigned grayscale : 1;
|
|
+ /* extra (fb driver specific) sync bits */
|
|
+ __u32 sync;
|
|
/* scanrates */
|
|
double drate;
|
|
double hrate;
|
|
@@ -80,3 +82,4 @@ 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);
|
|
+extern void fixCustomSync(struct VideoMode *vmode);
|
|
--- a/modes.l
|
|
+++ b/modes.l
|
|
@@ -38,6 +38,7 @@ static struct keyword keywords[] = {
|
|
{ "csync", CSYNC, 0 },
|
|
{ "gsync", GSYNC, 0 },
|
|
{ "extsync", EXTSYNC, 0 },
|
|
+ { "sync", SYNC, 0 },
|
|
{ "bcast", BCAST, 0 },
|
|
{ "laced", LACED, 0 },
|
|
{ "double", DOUBLE, 0 },
|
|
@@ -98,7 +99,7 @@ static const char *CopyString(const char
|
|
%}
|
|
|
|
keyword [a-zA-Z][a-zA-Z0-9]*
|
|
-number [0-9]*
|
|
+number (0x)?[0-9]*
|
|
colors [0-9/,]*
|
|
string \"[^\"\n]*\"
|
|
comment \#([^\n]*)
|
|
--- a/modes.y
|
|
+++ b/modes.y
|
|
@@ -40,7 +40,7 @@ static void ClearVideoMode(void)
|
|
|
|
%start file
|
|
|
|
-%token MODE GEOMETRY TIMINGS HSYNC VSYNC CSYNC GSYNC EXTSYNC BCAST LACED DOUBLE
|
|
+%token MODE GEOMETRY TIMINGS HSYNC VSYNC CSYNC GSYNC EXTSYNC SYNC BCAST LACED DOUBLE
|
|
RGBA NONSTD ACCEL GRAYSCALE
|
|
ENDMODE POLARITY BOOLEAN STRING NUMBER COLORS
|
|
|
|
@@ -91,6 +91,7 @@ options : /* empty */
|
|
| options csync
|
|
| options gsync
|
|
| options extsync
|
|
+ | options sync
|
|
| options bcast
|
|
| options laced
|
|
| options double
|
|
@@ -130,6 +131,13 @@ extsync : EXTSYNC BOOLEAN
|
|
}
|
|
;
|
|
|
|
+sync: SYNC NUMBER
|
|
+ {
|
|
+ VideoMode.sync = $2;
|
|
+ fixCustomSync(&VideoMode);
|
|
+ }
|
|
+ ;
|
|
+
|
|
bcast : BCAST BOOLEAN
|
|
{
|
|
VideoMode.bcast = $2;
|