Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 14 Dec 1997 12:06:58 +0100
From:      Poul-Henning Kamp <phk@critter.freebsd.dk>
To:        mobile@freebsd.org
Subject:   800x600 on laptops (answer to Deng Hongwei)
Message-ID:  <12343.882097618@critter.freebsd.dk>

next in thread | raw e-mail | index | archive | help

(Deng, email to you bounces, see the headers at the bottom of this
email!)

In message <349308CC.FD11DC6D@sz.cei.go.cn>, Deng Hongwei writes:

>So, Would you please tell me howto get the patch and howto set VESA
>videomode 0x102 (800x600x16) before loading kernel.

the patch is included below.  it's still being reviewed and mangled
by Soren Schmidt, but eventually it will be included I think.

You need to compile a font into your kernel as well, add this to your

config file:
	options         "STD8X16FONT"
	makeoptions     "STD8X16FONT"="iso-thin"


You give the option "-b" to the kernel when you boot.  You can do this
automatically by
	cat > /boot.config
	-b
	^D

Please ask if you have questions...

Poul-Henning

Index: i386/include/console.h
===================================================================
RCS file: /home/ncvs/src/sys/i386/include/console.h,v
retrieving revision 1.33
diff -u -r1.33 console.h
- --- console.h	1997/12/07 08:08:49	1.33
+++ console.h	1997/12/07 21:42:35
@@ -150,6 +150,7 @@
 #define KD_EGA		4		/* enhanced graphics adapter 	*/
 #define KD_VGA		5		/* video graphics adapter    	*/
 #define KD_PC98		6		/* PC-98 display            	*/
+#define KD_PIXEL	7		/* pixel/graphics adapter/mode	*/
 
 #define KD_TEXT		0		/* set text mode restore fonts  */
 #define KD_TEXT0	0		/* ditto			*/
Index: i386/isa/syscons.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/isa/syscons.c,v
retrieving revision 1.242
diff -u -r1.242 syscons.c
- --- syscons.c	1997/12/07 08:09:19	1.242
+++ syscons.c	1997/12/07 21:42:46
@@ -56,6 +56,7 @@
 #include <machine/pc/display.h>
 #include <machine/apm_bios.h>
 #include <machine/random.h>
+#include <machine/bootinfo.h>
 
 #include <vm/vm.h>
 #include <vm/vm_param.h>
@@ -92,7 +93,7 @@
 #define MODE_PARAM_SIZE		64
 
 /* XXX use sc_bcopy where video memory is concerned */
- -#define sc_bcopy generic_bcopy
+
 extern void generic_bcopy(const void *, void *, size_t);
 
 static default_attr user_default = {
@@ -136,6 +137,7 @@
 	u_char      	scr_map[256];
 	u_char      	scr_rmap[256];
 	char        	*video_mode_ptr = NULL;
+static	int		vesa_mode;
 	int     	fonts_loaded = 0
 #ifdef STD8X16FONT
 	| FONT_16
@@ -222,13 +224,14 @@
 static scr_stat *get_scr_stat(dev_t dev);
 static scr_stat *alloc_scp(void);
 static void init_scp(scr_stat *scp);
+static void sc_bcopy(u_short *p, int from, int to, int mark);
 static int get_scr_num(void);
 static timeout_t scrn_timer;
 static void stop_scrn_saver(void (*saver)(int));
 static void clear_screen(scr_stat *scp);
 static int switch_scr(scr_stat *scp, u_int next_scr);
 static void exchange_scr(void);
- -static inline void move_crsr(scr_stat *scp, int x, int y);
+static void move_crsr(scr_stat *scp, int x, int y);
 static void scan_esc(scr_stat *scp, u_char c);
 static void draw_cursor_image(scr_stat *scp); 
 static void remove_cursor_image(scr_stat *scp); 
@@ -293,12 +296,18 @@
 /*
  * These functions need to be before calls to them so they can be inlined.
  */
- -static inline void
+static void
 draw_cursor_image(scr_stat *scp)
 {
     u_short cursor_image, *ptr = Crtat + (scp->cursor_pos - scp->scr_buf);
     u_short prev_image;
 
+    if (vesa_mode) {
+	sc_bcopy(scp->scr_buf, scp->cursor_pos - scp->scr_buf, 
+	  scp->cursor_pos - scp->scr_buf, 1);
+	return;
+    }
+
     /* do we have a destructive cursor ? */
     if (flags & CHAR_CURSOR) {
 	prev_image = scp->cursor_saveunder;
@@ -324,8 +333,7 @@
 	    cursor_image &= 0xff00;
 	    cursor_image |= DEAD_CHAR;
 	}
- -    }
- -    else {
+    } else {
 	cursor_image = (*(ptr) & 0x00ff) | *(scp->cursor_pos) & 0xff00;
 	scp->cursor_saveunder = cursor_image;
 	if (!(flags & BLINK_CURSOR)||((flags & BLINK_CURSOR)&&(blinkrate & 4))){
@@ -343,13 +351,17 @@
     *ptr = cursor_image;
 }
 
- -static inline void
+static void
 remove_cursor_image(scr_stat *scp)
 {
- -    *(Crtat + (scp->cursor_oldpos - scp->scr_buf)) = scp->cursor_saveunder;
+    if (vesa_mode)
+	sc_bcopy(scp->scr_buf, scp->cursor_oldpos - scp->scr_buf, 
+	  scp->cursor_oldpos - scp->scr_buf, 0);
+    else
+	*(Crtat + (scp->cursor_oldpos - scp->scr_buf)) = scp->cursor_saveunder;
 }
 
- -static inline void
+static void
 move_crsr(scr_stat *scp, int x, int y)
 {
     if (x < 0)
@@ -409,7 +421,12 @@
     cp = (u_short *)CGA_BUF;
     was = *cp;
     *cp = (u_short) 0xA55A;
- -    if (*cp == 0xA55A) {
+    if (bootinfo.bi_vesa == 0x102) {
+	vesa_mode = bootinfo.bi_vesa;
+	Crtat  = (u_short *)pa_to_va(0xA0000);
+	crtc_type = KD_PIXEL;
+        bzero(Crtat, 800*600/8);
+    } else if (*cp == 0xA55A) {
 	Crtat = (u_short *)CGA_BUF;
 	crtc_addr = COLOR_BASE;
 	crtc_type = KD_CGA;
@@ -425,45 +442,43 @@
     }
     *cp = was;
 
- -    /* 
- -     * Check rtc and BIOS date area.
- -     * XXX: don't use BIOSDATA_EQUIPMENT, it is not a dead copy
- -     * of RTC_EQUIPMENT. The bit 4 and 5 of the ETC_EQUIPMENT are
- -     * zeros for EGA and VGA. However, the EGA/VGA BIOS will set 
- -     * these bits in BIOSDATA_EQUIPMENT according to the monitor
- -     * type detected.
- -     */
- -    switch ((rtcin(RTC_EQUIPMENT) >> 4) & 3) {	/* bit 4 and 5 */
- -    case 0: /* EGA/VGA, or nothing */
- -	crtc_type = KD_EGA;
- -	/* the color adapter may be in the 40x25 mode... XXX */
- -	break;
- -    case 1: /* CGA 40x25 */
- -	/* switch to the 80x25 mode? XXX */
- -	/* FALL THROUGH */
- -    case 2: /* CGA 80x25 */
- -	/* `crtc_type' has already been set... */
- -	/* crtc_type = KD_CGA; */
- -	break;
- -    case 3: /* MDA */
- -	/* `crtc_type' has already been set... */
- -	/* crtc_type = KD_MONO; */
- -	break;
- -    }
+    if (crtc_type != KD_PIXEL) {
+	/* 
+	 * Check rtc and BIOS date area.
+	 * XXX: don't use BIOSDATA_EQUIPMENT, it is not a dead copy
+	 * of RTC_EQUIPMENT. The bit 4 and 5 of the ETC_EQUIPMENT are
+	 * zeros for EGA and VGA. However, the EGA/VGA BIOS will set 
+	 * these bits in BIOSDATA_EQUIPMENT according to the monitor
+	 * type detected.
+	 */
+	switch ((rtcin(RTC_EQUIPMENT) >> 4) & 3) {	/* bit 4 and 5 */
+	case 0: /* EGA/VGA, or nothing */
+	    crtc_type = KD_EGA;
+	    /* the color adapter may be in the 40x25 mode... XXX */
+	    break;
+	case 1: /* CGA 40x25 */
+	    /* switch to the 80x25 mode? XXX */
+	    /* FALL THROUGH */
+	case 2: /* CGA 80x25 */
+	    /* `crtc_type' has already been set... */
+	    /* crtc_type = KD_CGA; */
+	    break;
+	case 3: /* MDA */
+	    /* `crtc_type' has already been set... */
+	    /* crtc_type = KD_MONO; */
+	    break;
+	}
 
- -    /* is this a VGA or higher ? */
- -    outb(crtc_addr, 7);
- -    if (inb(crtc_addr) == 7) {
- -
- -        crtc_type = KD_VGA;
- -	crtc_vga = TRUE;
- -	read_vgaregs(vgaregs);
- -
- -	/* Get the BIOS video mode pointer */
- -	segoff = *(u_long *)pa_to_va(0x4a8);
- -	pa = (((segoff & 0xffff0000) >> 12) + (segoff & 0xffff));
- -	if (ISMAPPED(pa, sizeof(u_long))) {
- -	    segoff = *(u_long *)pa_to_va(pa);
+	/* is this a VGA or higher ? */
+	outb(crtc_addr, 7);
+	if (inb(crtc_addr) == 7) {
+
+	    crtc_type = KD_VGA;
+	    crtc_vga = TRUE;
+	    read_vgaregs(vgaregs);
+
+	    /* Get the BIOS video mode pointer */
+	    segoff = *(u_long *)pa_to_va(0x4a8);
 	    pa = (((segoff & 0xffff0000) >> 12) + (segoff & 0xffff));
 	    if (ISMAPPED(pa, MODE_PARAM_SIZE))
 		video_mode_ptr = (char *)pa_to_va(pa);
@@ -728,6 +743,9 @@
     case KD_CGA:
 	printf("CGA");
 	break;
+    case KD_PIXEL:
+	printf("Graphics display (VESA mode = 0x%x)", vesa_mode);
+	break;
     case KD_MONO:
     case KD_HERCULES:
     default:
@@ -1915,11 +1933,11 @@
 	    return ENXIO;
 
     case PIO_FONT8x16:  	/* set 8x16 dot font */
- -	if (!crtc_vga)
+	if (!crtc_vga && crtc_type != KD_PIXEL)
 	    return ENXIO;
 	bcopy(data, font_16, 16*256);
 	fonts_loaded |= FONT_16;
- -	if (!(cur_console->status & UNKNOWN_MODE)) {
+	if (crtc_vga && !(cur_console->status & UNKNOWN_MODE)) {
 	    copy_font(LOAD, FONT_16, font_16);
 	    if (flags & CHAR_CURSOR)
 	        set_destructive_cursor(cur_console);
@@ -1927,7 +1945,7 @@
 	return 0;
 
     case GIO_FONT8x16:  	/* get 8x16 dot font */
- -	if (!crtc_vga)
+	if (!crtc_vga && crtc_type != KD_PIXEL)
 	    return ENXIO;
 	if (fonts_loaded & FONT_16) {
 	    bcopy(font_16, data, 16*256);
@@ -2046,8 +2064,7 @@
     s = splclock();
     if (scp == cur_console && !(scp->status & UNKNOWN_MODE)) {
 	if (/* timer not running && */ (scp->start <= scp->end)) {
- -	    sc_bcopy(scp->scr_buf + scp->start, Crtat + scp->start,
- -		   (1 + scp->end - scp->start) * sizeof(u_short));
+	    sc_bcopy(scp->scr_buf, scp->start, scp->end, 0);
 	    scp->start = scp->xsize * scp->ysize;
 	    scp->end = 0;
 	}
@@ -2159,8 +2176,7 @@
     if (scrn_blanked <= 0) {
 	/* update screen image */
 	if (scp->start <= scp->end) {
- -	    sc_bcopy(scp->scr_buf + scp->start, Crtat + scp->start,
- -		   (1 + scp->end - scp->start) * sizeof(u_short));
+	    sc_bcopy(scp->scr_buf, scp->start, scp->end, 0);
 	}
 
 	/* update "pseudo" mouse pointer image */
@@ -2354,6 +2370,9 @@
     update_leds(new_scp->status);
     delayed_next_scr = FALSE;
     mark_all(new_scp);
+    if (vesa_mode == 0x102) {
+	bzero(Crtat, 800*600/8);
+    }
 }
 
 static void
@@ -3104,8 +3123,9 @@
     }
 
     /* copy screen to temporary buffer */
- -    sc_bcopy(Crtat, sc_buffer,
- -	   console[0]->xsize * console[0]->ysize * sizeof(u_short));
+    if (crtc_type != KD_PIXEL)
+	    generic_bcopy(Crtat, sc_buffer,
+		   console[0]->xsize * console[0]->ysize * sizeof(u_short));
 
     console[0]->scr_buf = console[0]->mouse_pos = sc_buffer;
     console[0]->cursor_pos = console[0]->cursor_oldpos = sc_buffer + hw_cursor;
@@ -4322,7 +4342,7 @@
     while (!(inb(crtc_addr+6) & 0x08)) /* wait for vertical retrace */ ;
 #endif
     set_font_mode(buf);
- -    sc_bcopy(cursor, (char *)pa_to_va(address) + DEAD_CHAR * 32, 32);
+    generic_bcopy(cursor, (char *)pa_to_va(address) + DEAD_CHAR * 32, 32);
     set_normal_mode(buf);
 }
 
@@ -4623,7 +4643,7 @@
     while (!(inb(crtc_addr+6) & 0x08)) /* idle */ ;
 #endif
     set_font_mode(buf);
- -    sc_bcopy(scp->mouse_cursor, (char *)pa_to_va(address) + 0xd0 * 32, 128);
+    generic_bcopy(scp->mouse_cursor, (char *)pa_to_va(address) + 0xd0 * 32, 128);
     set_normal_mode(buf);
     *(crt_pos) = (*(scp->mouse_pos)&0xff00)|0xd0;
     *(crt_pos+scp->xsize) = (*(scp->mouse_pos+scp->xsize)&0xff00)|0xd2;
@@ -4750,6 +4770,33 @@
 		  Crtat, scp->xsize * scp->ysize);
 	blink_in_progress--;
 	timeout(blink_screen, scp, hz / 10);
+    }
+}
+
+void 
+sc_bcopy(u_short *p, int from, int to, int mark)
+{
+    if (!vesa_mode) {
+	generic_bcopy(p+from, Crtat+from, (to-from+1)*sizeof (u_short));
+    } else if (vesa_mode == 0x102) {
+	u_char *d, *e;
+	int i,j;
+
+	d = (u_char *)Crtat;
+	d += 10 + 6*16*100 + (from%80) + 16*100*(from/80);
+	for (i = from ; i <= to ; i++) {
+	    e = d;
+	    for (j = 0 ; j < 16; j++) {
+		if (mark)
+		    *e = 255^font_16[(p[i]&0xff)*16+j];
+		else
+		    *e = font_16[(p[i]&0xff)*16+j];
+		e+=100;
+	    }
+	    d++;
+	    if ((i % 80) == 79)
+		d += 20 + 15*100;
+	}
     }
 }
 
Index: i386/isa/syscons.h
===================================================================
RCS file: /home/ncvs/src/sys/i386/isa/syscons.h,v
retrieving revision 1.36
diff -u -r1.36 syscons.h
- --- syscons.h	1997/11/21 11:37:07	1.36
+++ syscons.h	1997/11/22 15:11:23
@@ -48,7 +48,7 @@
 				}
 #define mark_all(scp)		{\
 				    scp->start = 0;\
- -				    scp->end = scp->xsize * scp->ysize;\
+				    scp->end = scp->xsize * scp->ysize - 1;\
 				}
 
 /* status flags */

------- Forwarded Message

Return-Path: MAILER-DAEMON
Received: from sz.cei.gov.cn ([203.207.179.2])
	by critter.freebsd.dk (8.8.7/8.8.7) with ESMTP id LAA12195
	for <phk@critter.freebsd.dk>; Sun, 14 Dec 1997 11:35:38 +0100 (CET)
	(envelope-from )
Received: from localhost (localhost) by sz.cei.gov.cn (8.7.5+2.6Wbeta6/3.4W CEI-LN 96090315) with internal id SAA08604; Sun, 14 Dec 1997 18:43:07 +0800 (CST)
Date: Sun, 14 Dec 1997 18:43:07 +0800 (CST)
From: Mail Delivery Subsystem <MAILER-DAEMON@sz.cei.gov.cn>
Subject: Returned mail: Local configuration error
Message-Id: <199712141043.SAA08604@sz.cei.gov.cn>
To: postmaster@sz.cei.gov.cn
To: <phk@critter.freebsd.dk>
Auto-Submitted: auto-generated (failure)

The original message was received at Sun, 14 Dec 1997 18:42:52 +0800 (CST)
from critter.freebsd.dk [195.8.129.26]

   ----- The following addresses have delivery notifications -----
<dhongwei@sz.cei.go.cn>  (unrecoverable error)

   ----- Transcript of session follows -----
553 szup2.sz.cei.go.cn. config error: mail loops back to me (MX problem?)
554 <dhongwei@sz.cei.go.cn>... Local configuration error

   ----- Original message follows -----

Return-Path: phk@critter.freebsd.dk
Received: from critter.freebsd.dk (critter.freebsd.dk [195.8.129.26]) by sz.cei.gov.cn (8.7.5+2.6Wbeta6/3.4W CEI-LN 96090315) with ESMTP id SAA08602 for <dhongwei@sz.cei.go.cn>; Sun, 14 Dec 1997 18:42:52 +0800 (CST)
Received: from critter.freebsd.dk (localhost.cybercity.dk [127.0.0.1])
	by critter.freebsd.dk (8.8.7/8.8.7) with ESMTP id LAA12175
	for <dhongwei@sz.cei.go.cn>; Sun, 14 Dec 1997 11:33:40 +0100 (CET)
	(envelope-from phk@critter.freebsd.dk)
To: Deng Hongwei <dhongwei@sz.cei.go.cn>
Subject: Re: Help the patch for 800x600x16 boot -current 
In-reply-to: Your message of "Sun, 14 Dec 1997 06:14:36 +0800."
             <349308CC.FD11DC6D@sz.cei.go.cn> 
Date: Sun, 14 Dec 1997 11:33:39 +0100
Message-ID: <12173.882095619@critter.freebsd.dk>
From: Poul-Henning Kamp <phk@critter.freebsd.dk>

--
Poul-Henning Kamp             FreeBSD coreteam member
phk@FreeBSD.ORG               "Real hackers run -current on their laptop."



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?12343.882097618>