public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Paul Gortmaker <p_gortmaker@yahoo.com>
To: Andries.Brouwer@cwi.nl
Cc: linux-kernel@vger.kernel.org
Subject: Re: [PATCH] omission in video driver
Date: Wed, 03 Apr 2002 08:27:09 -0500	[thread overview]
Message-ID: <3CAB032D.1E648BA0@yahoo.com> (raw)
In-Reply-To: <UTC200204011841.SAA486178.aeb@cwi.nl>

Andries.Brouwer@cwi.nl wrote:
> 
> Documenting the video ioctls, I noticed to my dismay
> that the ioctl to set the border color of the console
> screen is lacking.
> 
> Here part of the fix for 2.4.19:
... 
> [this is the nontrivial part; the rest is left as an exercise]

Heh, you mean "here is the hardware information, please make a patch".
But your choice of red makes it truly a "bleeding edge" kernel  :)

The fact that we have been using linux for ~ 10 yrs and nobody has
complained about the lack of this function yet says something...

Anyway, have a look at this and see if it is what you had in mind.
I figured it would be sensible to have a per VC colour, which is the 
way I've done it. At end of 2.4.19pre5 patch is a $0.02 test program.

Paul.

diff -ur ../linux/include/linux/console.h include/linux/console.h
--- ../linux/include/linux/console.h	Thu Nov 22 11:46:19 2001
+++ include/linux/console.h	Wed Apr  3 07:18:43 2002
@@ -41,6 +41,7 @@
 	int	(*con_blank)(struct vc_data *, int);
 	int	(*con_font_op)(struct vc_data *, struct console_font_op *);
 	int	(*con_set_palette)(struct vc_data *, unsigned char *);
+	void	(*con_border)(struct vc_data *);
 	int	(*con_scrolldelta)(struct vc_data *, int);
 	int	(*con_set_origin)(struct vc_data *);
 	void	(*con_save_screen)(struct vc_data *);
diff -ur ../linux/include/linux/console_struct.h include/linux/console_struct.h
--- ../linux/include/linux/console_struct.h	Thu Oct 11 11:17:22 2001
+++ include/linux/console_struct.h	Wed Apr  3 07:18:43 2002
@@ -23,6 +23,7 @@
 	unsigned char	vc_def_color;		/* Default colors */
 	unsigned char	vc_color;		/* Foreground & background */
 	unsigned char	vc_s_color;		/* Saved foreground & background */
+	unsigned char	vc_border;		/* Border color */
 	unsigned char	vc_ulcolor;		/* Color for underline mode */
 	unsigned char	vc_halfcolor;		/* Color for half intensity mode */
 	unsigned short	vc_complement_mask;	/* [#] Xor mask for mouse pointer */
diff -ur ../linux/include/linux/kd.h include/linux/kd.h
--- ../linux/include/linux/kd.h	Tue Aug  4 10:52:57 1998
+++ include/linux/kd.h	Wed Apr  3 07:18:43 2002
@@ -155,6 +155,9 @@
 
 #define KDFONTOP	0x4B72	/* font operations */
 
+#define PIO_BORDER	0x4B73	/* Border color */
+#define GIO_BORDER	0x4B74
+
 struct console_font_op {
 	unsigned int op;	/* operation code KD_FONT_OP_* */
 	unsigned int flags;	/* KD_FONT_FLAG_* */
@@ -175,6 +178,6 @@
 
 /* note: 0x4B00-0x4B4E all have had a value at some time;
    don't reuse for the time being */
-/* note: 0x4B60-0x4B6D, 0x4B70-0x4B72 used above */
+/* note: 0x4B60-0x4B6D, 0x4B70-0x4B74 used above */
 
 #endif /* _LINUX_KD_H */
diff -ur ../linux/include/linux/vt_kern.h include/linux/vt_kern.h
--- ../linux/include/linux/vt_kern.h	Sun Sep 23 10:31:02 2001
+++ include/linux/vt_kern.h	Wed Apr  3 07:18:43 2002
@@ -47,12 +47,15 @@
 void vc_disallocate(unsigned int console);
 void reset_palette(int currcons);
 void set_palette(int currcons);
+void set_border(int currcons);
 void do_blank_screen(int gfx_mode);
 void unblank_screen(void);
 void poke_blanked_console(void);
 int con_font_op(int currcons, struct console_font_op *op);
 int con_set_cmap(unsigned char *cmap);
 int con_get_cmap(unsigned char *cmap);
+int con_set_border(int currcons, unsigned char *arg);
+int con_get_border(int currcons, unsigned char *arg);
 void scrollback(int);
 void scrollfront(int);
 void update_region(int currcons, unsigned long start, int count);
--- ../linux/drivers/char/console.c	Fri Dec 21 16:40:32 2001
+++ drivers/char/console.c	Wed Apr  3 07:18:43 2002
@@ -608,6 +608,7 @@
 		set_origin(currcons);
 		update = sw->con_switch(vc_cons[currcons].d);
 		set_palette(currcons);
+		set_border(currcons);
 		if (update && vcmode != KD_GRAPHICS)
 			do_update_region(currcons, origin, screenbuf_size/2);
 	}
@@ -2425,6 +2426,7 @@
 	def_color       = 0x07;   /* white */
 	ulcolor		= 0x0f;   /* bold white */
 	halfcolor       = 0x08;   /* grey */
+	border		= 0x00;	  /* black */
 	init_waitqueue_head(&vt_cons[currcons]->paste_wait);
 	reset_terminal(currcons, do_clear);
 }
@@ -2749,6 +2751,7 @@
 	if (console_blank_hook)
 		console_blank_hook(0);
 	set_palette(currcons);
+	set_border(currcons);
 	if (sw->con_blank(vc_cons[currcons].d, 0))
 		/* Low-level driver cannot restore -> do it ourselves */
 		update_screen(fg_console);
@@ -2838,6 +2841,31 @@
 		palette[k++] = default_blu[j];
 	}
 	set_palette(currcons);
+}
+
+/*
+ *	Borders
+ */
+
+int con_set_border(int currcons, unsigned char *arg)
+{
+	if (get_user(border, arg))
+		return -EFAULT;
+	set_border(currcons);
+	return 0;
+}
+
+int con_get_border(int currcons, unsigned char *arg)
+{
+	if (put_user(border, arg))
+		return -EFAULT;
+	return 0;
+}
+
+void set_border(int currcons)
+{
+	if (vcmode != KD_GRAPHICS && sw->con_border != NULL)
+		sw->con_border(vc_cons[currcons].d);
 }
 
 /*
--- ../linux/drivers/char/vt.c	Fri Nov 16 10:08:28 2001
+++ drivers/char/vt.c	Wed Apr  3 08:16:23 2002
@@ -8,6 +8,7 @@
  *  Restrict VT switching via ioctl() - grif@cs.ucr.edu - Dec 1995
  *  Some code moved for less code duplication - Andi Kleen - Mar 1997
  *  Check put/get_user, cleanups - acme@conectiva.com.br - Jun 2001
+ *  Get/set VT border color - Paul Gortmaker/aeb - Apr 2002
  */
 
 #include <linux/config.h>
@@ -967,6 +968,14 @@
 
 	case GIO_CMAP:
                 return con_get_cmap((char *)arg);
+
+	case PIO_BORDER:
+                if (!perm)
+			return -EPERM;
+                return con_set_border(fg_console, (unsigned char *)arg);
+
+	case GIO_BORDER:
+                return con_get_border(fg_console, (unsigned char *)arg);
 
 	case PIO_FONTX:
 	case GIO_FONTX:
--- ../linux/drivers/video/vgacon.c	Thu Feb 28 13:57:29 2002
+++ drivers/video/vgacon.c	Wed Apr  3 08:13:44 2002
@@ -86,6 +86,7 @@
 static void vgacon_deinit(struct vc_data *c);
 static void vgacon_cursor(struct vc_data *c, int mode);
 static int vgacon_switch(struct vc_data *c);
+static void vgacon_border(struct vc_data *c);
 static int vgacon_blank(struct vc_data *c, int blank);
 static int vgacon_font_op(struct vc_data *c, struct console_font_op *op);
 static int vgacon_set_palette(struct vc_data *c, unsigned char *table);
@@ -470,6 +471,22 @@
     }
 }
 
+static void vgacon_border(struct vc_data *c)
+{
+	unsigned long flags;
+	unsigned char color = c->vc_border & 0x0f;
+
+	if (c->vc_can_do_color == 0)
+		return;
+
+	spin_lock_irqsave(&vga_lock, flags);
+	inb_p(0x3da);		/* clear flipflop */
+	outb_p(0x11, 0x3c0);	/* index overscan color reg */
+	outb_p(color, 0x3c0);	/* load color value */ 
+	outb_p(0x20, 0x3c0);	/* allow display memory */
+	spin_unlock_irqrestore(&vga_lock, flags);
+}
+
 static int vgacon_switch(struct vc_data *c)
 {
 	/*
@@ -1042,6 +1059,7 @@
 	con_scroll:		vgacon_scroll,
 	con_bmove:		DUMMY,
 	con_switch:		vgacon_switch,
+	con_border:		vgacon_border,
 	con_blank:		vgacon_blank,
 	con_font_op:		vgacon_font_op,
 	con_set_palette:	vgacon_set_palette,
--- ../linux/drivers/char/console_macros.h	Thu Sep 17 09:35:03 1998
+++ drivers/char/console_macros.h	Wed Apr  3 07:18:43 2002
@@ -41,6 +41,7 @@
 #define color		(vc_cons[currcons].d->vc_color)
 #define s_color		(vc_cons[currcons].d->vc_s_color)
 #define def_color	(vc_cons[currcons].d->vc_def_color)
+#define border		(vc_cons[currcons].d->vc_border)
 #define foreground	(color & 0x0f)
 #define background	(color & 0xf0)
 #define charset		(vc_cons[currcons].d->vc_charset)

-----------------8<---------------8<-----------8<-------------------
/*
 * set VGA border colour.
 *
 * 0 -> 7 are blk, blu, grn, cyn, red, mag, yel, wht.
 * 8 -> 15 are brighter versions (bright version of blk = grey).
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <asm/io.h>

/* #include <linux/kd.h> */
#define PIO_BORDER     0x4B73
#define GIO_BORDER     0x4B74

int main(int argc, char** argv)
{
	unsigned char colour, oldcolour;
	int i;

	if (argc != 2) {
		fprintf(stderr,"Usage %s <colour_number>\n", argv[0]);
		exit(EINVAL);
	}

	colour = atoi(argv[1]) & 0xf;
	
	i = ioctl(0, GIO_BORDER, &oldcolour);
	if (i != 0) {
		perror("ioctl(GIO_BORDER)");
		exit(errno);
	}
	printf("Old colour was %d\n", oldcolour);

	i = ioctl(0, PIO_BORDER, &colour);
	if (i != 0) {
		perror("ioctl(PIO_BORDER)");
		exit(errno);
	}

	return 0;
}


  reply	other threads:[~2002-04-03 13:43 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-04-01 18:41 [PATCH] omission in video driver Andries.Brouwer
2002-04-03 13:27 ` Paul Gortmaker [this message]
  -- strict thread matches above, loose matches on Subject: below --
2002-04-03 22:51 Andries.Brouwer
2002-04-04 13:13 Andries.Brouwer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3CAB032D.1E648BA0@yahoo.com \
    --to=p_gortmaker@yahoo.com \
    --cc=Andries.Brouwer@cwi.nl \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox