The second phase of syscons reorganization.

- Split syscons source code into manageable chunks and reorganize
  some of complicated functions.

- Many static variables are moved to the softc structure.

- Added a new key function, PREV.  When this key is pressed, the vty
  immediately before the current vty will become foreground.  Analogue
  to PREV, which is usually assigned to the PrntScrn key.
  PR: kern/10113
  Submitted by: Christian Weisgerber <naddy@mips.rhein-neckar.de>

- Modified the kernel console input function sccngetc() so that it
  handles function keys properly.

- Reorganized the screen update routine.

- VT switching code is reorganized.  It now should be slightly more
  robust than before.

- Added the DEVICE_RESUME function so that syscons no longer hooks the
  APM resume event directly.

- New kernel configuration options: SC_NO_CUTPASTE, SC_NO_FONT_LOADING,
  SC_NO_HISTORY and SC_NO_SYSMOUSE.
  Various parts of syscons can be omitted so that the kernel size is
  reduced.

  SC_PIXEL_MODE
  Made the VESA 800x600 mode an option, rather than a standard part of
  syscons.

  SC_DISABLE_DDBKEY
  Disables the `debug' key combination.

  SC_ALT_MOUSE_IMAGE
  Inverse the character cell at the mouse cursor position in the text
  console, rather than drawing an arrow on the screen.
  Submitted by: Nick Hibma (n_hibma@FreeBSD.ORG)

  SC_DFLT_FONT
  makeoptions "SC_DFLT_FONT=_font_name_"
  Include the named font as the default font of syscons.  16-line,
  14-line and 8-line font data will be compiled in.  This option replaces
  the existing STD8X16FONT option, which loads 16-line font data only.

- The VGA driver is split into /sys/dev/fb/vga.c and /sys/isa/vga_isa.c.

- The video driver provides a set of ioctl commands to manipulate the
  frame buffer.

- New kernel configuration option: VGA_WIDTH90
  Enables 90 column modes: 90x25, 90x30, 90x43, 90x50, 90x60.  These
  modes are mot always supported by the video card.
  PR: i386/7510
  Submitted by: kbyanc@freedomnet.com and alexv@sui.gda.itesm.mx.

- The header file machine/console.h is reorganized; its contents is now
  split into sys/fbio.h, sys/kbio.h (a new file) and sys/consio.h
  (another new file).  machine/console.h is still maintained for
  compatibility reasons.

- Kernel console selection/installation routines are fixed and
  slightly rebumped so that it should now be possible to switch between
  the interanl kernel console (sc or vt) and a remote kernel console
  (sio) again, as it was in 2.x, 3.0 and 3.1.

- Screen savers and splash screen decoders
  Because of the header file reorganization described above, screen
  savers and splash screen decoders are slightly modified.  After this
  update, /sys/modules/syscons/saver.h is no longer necessary and is
  removed.
This commit is contained in:
Kazutaka YOKOTA 1999-06-22 14:14:06 +00:00
parent 6ca65df0a7
commit 6e8394b8ba
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=48104
68 changed files with 11771 additions and 6690 deletions

View File

@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* from: @(#)cons.c 7.2 (Berkeley) 5/9/91
* $Id: cons.c,v 1.9 1999/05/31 11:23:35 phk Exp $
* $Id: cons.c,v 1.10 1999/06/01 20:26:04 dt Exp $
*/
#include "opt_devfs.h"
@ -57,25 +57,6 @@
#include <machine/cpu.h>
#include <machine/cons.h>
/* XXX this should be config(8)ed. */
#if 0
#include "sc.h"
#include "vt.h"
#include "sio.h"
#endif
static struct consdev constab[] = {
#if NSC > 0
{ sccnprobe, sccninit, sccngetc, sccncheckc, sccnputc },
#endif
#if NVT > 0
{ pccnprobe, pccninit, pccngetc, pccncheckc, pccnputc },
#endif
#if NSIO > 0
{ siocnprobe, siocninit, siocngetc, siocncheckc, siocnputc },
#endif
{ 0 },
};
static d_open_t cnopen;
static d_close_t cnclose;
static d_read_t cnread;
@ -129,16 +110,22 @@ static struct tty *cn_tp; /* physical console tty struct */
static void *cn_devfs_token; /* represents the devfs entry */
#endif /* DEVFS */
CONS_DRIVER(cons, NULL, NULL, NULL, NULL, NULL, NULL);
void
cninit()
{
struct consdev *best_cp, *cp;
struct consdev **list;
/*
* Find the first console with the highest priority.
*/
best_cp = NULL;
for (cp = constab; cp->cn_probe; cp++) {
list = (struct consdev **)cons_set.ls_items;
while ((cp = *list++) != NULL) {
if (cp->cn_probe == NULL)
continue;
(*cp->cn_probe)(cp);
if (cp->cn_pri > CN_DEAD &&
(best_cp == NULL || cp->cn_pri > best_cp->cn_pri))
@ -161,6 +148,8 @@ cninit()
* If no console, give up.
*/
if (best_cp == NULL) {
if (cn_tab != NULL && cn_tab->cn_term != NULL)
(*cn_tab->cn_term)(cn_tab);
cn_tab = best_cp;
return;
}
@ -168,10 +157,13 @@ cninit()
/*
* Initialize console, then attach to it. This ordering allows
* debugging using the previous console, if any.
* XXX if there was a previous console, then its driver should
* be informed when we forget about it.
*/
(*best_cp->cn_init)(best_cp);
if (cn_tab != NULL && cn_tab != best_cp) {
/* Turn off the previous console. */
if (cn_tab->cn_term != NULL)
(*cn_tab->cn_term)(cn_tab);
}
cn_tab = best_cp;
}

View File

@ -1,7 +1,7 @@
# This file tells config what files go into building a kernel,
# files marked standard are always included.
#
# $Id: files.alpha,v 1.20 1999/06/05 13:29:57 dfr Exp $
# $Id: files.alpha,v 1.21 1999/06/19 13:12:51 dfr Exp $
#
# The long compile-with and dependency lines are required because of
# limitations in config: backslash-newline doesn't work in strings, and
@ -152,6 +152,7 @@ libkern/alpha/ntohs.S standard
isa/sio.c optional sio device-driver
dev/fb/fb.c optional fb device-driver
dev/fb/fb.c optional vga device-driver
dev/fb/vga.c optional vga device-driver
isa/vga_isa.c optional vga device-driver
dev/fb/splash.c optional splash
dev/kbd/atkbd.c optional atkbd device-driver
@ -162,7 +163,11 @@ dev/kbd/kbd.c optional atkbd device-driver
dev/kbd/kbd.c optional kbd device-driver
dev/kbd/kbd.c optional ukbd device-driver
dev/syscons/syscons.c optional sc device-driver
dev/syscons/schistory.c optional sc device-driver
dev/syscons/scmouse.c optional sc device-driver
dev/syscons/scvgarndr.c optional sc device-driver
dev/syscons/scvidctl.c optional sc device-driver
dev/syscons/scvtb.c optional sc device-driver
isa/syscons_isa.c optional sc device-driver
isa/psm.c optional psm device-driver
isa/fd.c optional fd device-driver

View File

@ -1,4 +1,4 @@
# $Id: options.alpha,v 1.10 1999/03/10 10:36:50 yokota Exp $
# $Id: options.alpha,v 1.11 1999/05/27 22:03:31 gallatin Exp $
EV5 opt_global.h
EV4 opt_global.h
@ -21,25 +21,35 @@ CMD640 opt_wd.h
SHOW_BUSYBUFS
PANIC_REBOOT_WAIT_TIME opt_panic.h
SC_SPLASH_SCREEN opt_syscons.h
MAXCONS opt_syscons.h
SLOW_VGA opt_syscons.h
STD8X16FONT opt_syscons.h
SC_HISTORY_SIZE opt_syscons.h
SC_ALT_MOUSE_IMAGE opt_syscons.h
SC_DEBUG_LEVEL opt_syscons.h
SC_DFLT_FONT opt_syscons.h
SC_DISABLE_DDB opt_syscons.h
SC_DISABLE_REBOOT opt_syscons.h
SC_HISTORY_SIZE opt_syscons.h
SC_MOUSE_CHAR opt_syscons.h
SC_NO_CUTPASTE opt_syscons.h
SC_NO_FONT_LOADING opt_syscons.h
SC_NO_HISTORY opt_syscons.h
SC_NO_SYSMOUSE opt_syscons.h
SC_PIXEL_MODE opt_syscons.h
SC_RENDER_DEBUG opt_syscons.h
SC_VIDEO_DEBUG opt_syscons.h
VGA_ALT_SEQACCESS opt_vga.h
VGA_DEBUG opt_vga.h
VGA_NO_FONT_LOADING opt_vga.h
VGA_NO_MODE_CHANGE opt_vga.h
VGA_SLOW_IOACCESS opt_vga.h
VGA_WIDTH90 opt_vga.h
PSM_HOOKAPM opt_psm.h
PSM_RESETAFTERSUSPEND opt_psm.h
PSM_DEBUG opt_psm.h
# Fb options
FB_DEBUG opt_fb.h
FB_INSTALL_CDEV opt_fb.h
# Atkbd options

View File

@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* from: @(#)cons.h 7.2 (Berkeley) 5/9/91
* $Id: cons.h,v 1.1 1998/06/10 10:54:42 dfr Exp $
* $Id: cons.h,v 1.2 1999/01/23 16:53:27 dfr Exp $
*/
#ifndef _MACHINE_CONS_H_
@ -45,6 +45,7 @@
struct consdev;
typedef void cn_probe_t __P((struct consdev *));
typedef void cn_init_t __P((struct consdev *));
typedef void cn_term_t __P((struct consdev *));
typedef int cn_getc_t __P((dev_t));
typedef int cn_checkc_t __P((dev_t));
typedef void cn_putc_t __P((dev_t, int));
@ -66,6 +67,8 @@ struct consdev {
/* probe hardware and fill in consdev info */
cn_init_t *cn_init;
/* turn on as console */
cn_term_t *cn_term;
/* turn off as console */
cn_getc_t *cn_getc;
/* kernel getchar interface */
cn_checkc_t *cn_checkc;
@ -84,8 +87,15 @@ struct consdev {
#define CN_REMOTE 3 /* serial interface with remote bit set */
#ifdef KERNEL
extern struct linker_set cons_set;
extern int cons_unavail;
#define CONS_DRIVER(name, probe, init, term, getc, checkc, putc) \
static struct consdev name##_consdev = { \
probe, init, term, getc, checkc, putc \
}; \
DATA_SET(cons_set, name##_consdev)
/* Other kernel entry points. */
int cncheckc __P((void));
int cngetc __P((void));

View File

@ -1,636 +1,8 @@
/*-
* Copyright (c) 1991-1996 Søren Schmidt
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer
* in this position and unchanged.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: console.h,v 1.43 1999/02/05 11:51:56 yokota Exp $
* from: i386/include console.h,v 1.43
*/
#ifndef _MACHINE_CONSOLE_H_
#define _MACHINE_CONSOLE_H_
#ifndef _MACHINE_CONSOLE_H_
#define _MACHINE_CONSOLE_H_
#ifndef KERNEL
#include <sys/types.h>
#endif
#include <sys/ioccom.h>
#define KDGKBMODE _IOR('K', 6, int)
#define KDSKBMODE _IO('K', 7 /*, int */)
#define KDMKTONE _IO('K', 8 /*, int */)
#define KDGETMODE _IOR('K', 9, int)
#define KDSETMODE _IO('K', 10 /*, int */)
#define KDSBORDER _IO('K', 13 /*, int */)
#define KDGKBSTATE _IOR('K', 19, int)
#define KDSKBSTATE _IO('K', 20 /*, int */)
#define KDENABIO _IO('K', 60)
#define KDDISABIO _IO('K', 61)
#define KIOCSOUND _IO('K', 63 /*, int */)
#define KDGKBTYPE _IOR('K', 64, int)
#define KDGETLED _IOR('K', 65, int)
#define KDSETLED _IO('K', 66 /*, int */)
#define KDSETRAD _IO('K', 67 /*, int */) /* obsolete */
#define KDRASTER _IOW('K', 100, scr_size_t)
#define KDGKBINFO _IOR('K', 101, keyboard_info_t)
#define KDSETREPEAT _IOW('K', 102, keyboard_delay_t)
#define GETFKEY _IOWR('k', 0, fkeyarg_t)
#define SETFKEY _IOWR('k', 1, fkeyarg_t)
#define GIO_SCRNMAP _IOR('k', 2, scrmap_t)
#define PIO_SCRNMAP _IOW('k', 3, scrmap_t)
#define GIO_KEYMAP _IOR('k', 6, keymap_t)
#define PIO_KEYMAP _IOW('k', 7, keymap_t)
#define GIO_DEADKEYMAP _IOR('k', 8, accentmap_t)
#define PIO_DEADKEYMAP _IOW('k', 9, accentmap_t)
#define GIO_KEYMAPENT _IOWR('k', 10, keyarg_t)
#define PIO_KEYMAPENT _IOW('k', 11, keyarg_t)
#define GIO_ATTR _IOR('a', 0, int)
#define GIO_COLOR _IOR('c', 0, int)
#define CONS_CURRENT _IOR('c', 1, int)
#define CONS_GET _IOR('c', 2, int)
#define CONS_IO _IO('c', 3)
#define CONS_BLANKTIME _IOW('c', 4, int)
#define CONS_SSAVER _IOW('c', 5, ssaver_t)
#define CONS_GSAVER _IOWR('c', 6, ssaver_t)
#define CONS_CURSORTYPE _IOW('c', 7, int)
#define CONS_BELLTYPE _IOW('c', 8, int)
#define CONS_HISTORY _IOW('c', 9, int)
#define CONS_MOUSECTL _IOWR('c', 10, mouse_info_t)
#define CONS_IDLE _IOR('c', 11, int)
#define CONS_SAVERMODE _IOW('c', 12, int)
#define CONS_SAVERSTART _IOW('c', 13, int)
#define PIO_FONT8x8 _IOW('c', 64, fnt8_t)
#define GIO_FONT8x8 _IOR('c', 65, fnt8_t)
#define PIO_FONT8x14 _IOW('c', 66, fnt14_t)
#define GIO_FONT8x14 _IOR('c', 67, fnt14_t)
#define PIO_FONT8x16 _IOW('c', 68, fnt16_t)
#define GIO_FONT8x16 _IOR('c', 69, fnt16_t)
#define CONS_GETINFO _IOWR('c', 73, vid_info_t)
#define CONS_GETVERS _IOR('c', 74, int)
#define CONS_CURRENTADP _IOR('c', 100, int)
#define CONS_ADPINFO _IOWR('c', 101, video_adapter_info_t)
#define CONS_MODEINFO _IOWR('c', 102, video_info_t)
#define CONS_FINDMODE _IOWR('c', 103, video_info_t)
#define CONS_SETWINORG _IO('c', 104 /* u_int */)
#define CONS_SETKBD _IO('c', 110 /* int */)
#define CONS_RELKBD _IO('c', 111)
/* CONS_SAVERMODE */
#define CONS_LKM_SAVER 0
#define CONS_USR_SAVER 1
#ifdef PC98
#define ADJUST_CLOCK _IO('t',100) /* for 98note resume */
#endif
#define VT_OPENQRY _IOR('v', 1, int)
#define VT_SETMODE _IOW('v', 2, vtmode_t)
#define VT_GETMODE _IOR('v', 3, vtmode_t)
#define VT_RELDISP _IO('v', 4 /*, int */)
#define VT_ACTIVATE _IO('v', 5 /*, int */)
#define VT_WAITACTIVE _IO('v', 6 /*, int */)
#define VT_GETACTIVE _IOR('v', 7, int)
#define VT_FALSE 0
#define VT_TRUE 1
#define VT_ACKACQ 2
#define VT_AUTO 0 /* switching is automatic */
#define VT_PROCESS 1 /* switching controlled by prog */
#define VT_KERNEL 255 /* switching controlled in kernel */
#ifndef _VT_MODE_DECLARED
#define _VT_MODE_DECLARED
struct vt_mode {
char mode;
char waitv; /* not implemented yet SOS */
short relsig;
short acqsig;
short frsig; /* not implemented yet SOS */
};
typedef struct vt_mode vtmode_t;
#endif /* !_VT_MODE_DECLARED */
struct mouse_data {
int x;
int y;
int z;
int buttons;
};
struct mouse_mode {
int mode;
int signal;
};
struct mouse_event {
int id; /* one based */
int value;
};
#define MOUSE_SHOW 0x01
#define MOUSE_HIDE 0x02
#define MOUSE_MOVEABS 0x03
#define MOUSE_MOVEREL 0x04
#define MOUSE_GETINFO 0x05
#define MOUSE_MODE 0x06
#define MOUSE_ACTION 0x07
#define MOUSE_MOTION_EVENT 0x08
#define MOUSE_BUTTON_EVENT 0x09
struct mouse_info {
int operation;
union {
struct mouse_data data;
struct mouse_mode mode;
struct mouse_event event;
}u;
};
#define KD_MONO 1 /* monochrome adapter */
#define KD_HERCULES 2 /* hercules adapter */
#define KD_CGA 3 /* color graphics adapter */
#define KD_EGA 4 /* enhanced graphics adapter */
#define KD_VGA 5 /* video graphics adapter */
#define KD_PC98 6 /* PC-98 display */
#define KD_TEXT 0 /* set text mode restore fonts */
#define KD_TEXT0 0 /* ditto */
#define KD_TEXT1 2 /* set text mode !restore fonts */
#define KD_GRAPHICS 1 /* set graphics mode */
#define KD_PIXEL 3 /* set pixel mode */
#define K_RAW 0 /* keyboard returns scancodes */
#define K_XLATE 1 /* keyboard returns ascii */
#define K_CODE 2 /* keyboard returns keycodes */
#define KB_84 1 /* 'old' 84 key AT-keyboard */
#define KB_101 2 /* MF-101 or MF-102 keyboard */
#define KB_OTHER 3 /* keyboard not known */
#define CLKED 1 /* Caps locked */
#define NLKED 2 /* Num locked */
#define SLKED 4 /* Scroll locked */
#define ALKED 8 /* AltGr locked */
#define LOCK_MASK (CLKED | NLKED | SLKED | ALKED)
#define LED_CAP 1 /* Caps lock LED */
#define LED_NUM 2 /* Num lock LED */
#define LED_SCR 4 /* Scroll lock LED */
#define LED_MASK (LED_CAP | LED_NUM | LED_SCR)
/* possible flag values */
#define FLAG_LOCK_O 0
#define FLAG_LOCK_C 1
#define FLAG_LOCK_N 2
#define NUM_KEYS 256 /* number of keys in table */
#define NUM_STATES 8 /* states per key */
#define ALTGR_OFFSET 128 /* offset for altlock keys */
#ifndef _KEYMAP_DECLARED
#define _KEYMAP_DECLARED
struct keyent_t {
u_char map[NUM_STATES];
u_char spcl;
u_char flgs;
};
struct keymap {
u_short n_keys;
struct keyent_t key[NUM_KEYS];
};
typedef struct keymap keymap_t;
struct keyarg {
u_short keynum;
struct keyent_t key;
};
typedef struct keyarg keyarg_t;
#endif /* !_KEYMAP_DECLARED */
#define NUM_DEADKEYS 15 /* number of accent keys */
#define NUM_ACCENTCHARS 52 /* max number of accent chars */
struct acc_t {
u_char accchar;
u_char map[NUM_ACCENTCHARS][2];
};
struct accentmap {
u_short n_accs;
struct acc_t acc[NUM_DEADKEYS];
};
#define MAXFK 16
#define NUM_FKEYS 96
struct fkeytab {
u_char str[MAXFK];
u_char len;
};
struct fkeyarg {
u_short keynum;
char keydef[MAXFK];
char flen;
};
struct colors {
char fore;
char back;
};
struct vid_info {
short size;
short m_num;
u_short mv_row, mv_col;
u_short mv_rsz, mv_csz;
struct colors mv_norm,
mv_rev,
mv_grfc;
u_char mv_ovscan;
u_char mk_keylock;
};
#define MAXSSAVER 16
struct ssaver {
char name[MAXSSAVER];
int num;
long time;
};
/* video mode information block */
struct video_info {
int vi_mode;
int vi_flags;
#define V_INFO_COLOR (1<<0)
#define V_INFO_GRAPHICS (1<<1)
#define V_INFO_LINEAR (1<<2)
#define V_INFO_VESA (1<<3)
int vi_width;
int vi_height;
int vi_cwidth;
int vi_cheight;
int vi_depth;
int vi_planes;
u_int vi_window; /* physical address */
size_t vi_window_size;
size_t vi_window_gran;
u_int vi_buffer; /* physical address */
size_t vi_buffer_size;
/* XXX pixel format, memory model,... */
};
/* adapter infromation block */
struct video_adapter {
int va_index;
int va_type;
char *va_name;
int va_unit;
int va_minor;
int va_flags;
#define V_ADP_COLOR (1<<0)
#define V_ADP_MODECHANGE (1<<1)
#define V_ADP_STATESAVE (1<<2)
#define V_ADP_STATELOAD (1<<3)
#define V_ADP_FONT (1<<4)
#define V_ADP_PALETTE (1<<5)
#define V_ADP_BORDER (1<<6)
#define V_ADP_VESA (1<<7)
#define V_ADP_PROBED (1<<16)
#define V_ADP_INITIALIZED (1<<17)
#define V_ADP_REGISTERED (1<<18)
int va_io_base;
int va_io_size;
int va_crtc_addr;
int va_mem_base;
int va_mem_size;
u_int va_window; /* virtual address */
size_t va_window_size;
size_t va_window_gran;
u_int va_buffer; /* virtual address */
size_t va_buffer_size;
int va_initial_mode;
int va_initial_bios_mode;
int va_mode;
struct video_info va_info;
int va_line_width;
void *va_token;
};
struct video_adapter_info {
int va_index;
int va_type;
char va_name[16];
int va_unit;
int va_flags;
int va_io_base;
int va_io_size;
int va_crtc_addr;
int va_mem_base;
int va_mem_size;
u_int va_window; /* virtual address */
size_t va_window_size;
size_t va_window_gran;
u_int va_buffer; /* virtual address */
size_t va_buffer_size;
int va_initial_mode;
int va_initial_bios_mode;
int va_mode;
int va_line_width;
};
#define V_ADP_PRIMARY 0
#define V_ADP_SECONDARY 1
struct keyboard_info {
int kb_index; /* kbdio index# */
char kb_name[16]; /* driver name */
int kb_unit; /* unit# */
int kb_type; /* KB_84, KB_101, KB_OTHER,... */
int kb_config; /* device configuration flags */
int kb_flags; /* internal flags */
};
typedef struct accentmap accentmap_t;
typedef struct fkeytab fkeytab_t;
typedef struct fkeyarg fkeyarg_t;
typedef struct vid_info vid_info_t;
typedef struct mouse_info mouse_info_t;
typedef struct {char scrmap[256];} scrmap_t;
typedef struct {char fnt8x8[8*256];} fnt8_t;
typedef struct {char fnt8x14[14*256];} fnt14_t;
typedef struct {char fnt8x16[16*256];} fnt16_t;
typedef struct ssaver ssaver_t;
typedef struct video_adapter video_adapter_t;
typedef struct video_adapter_info video_adapter_info_t;
typedef struct video_info video_info_t;
typedef struct keyboard_info keyboard_info_t;
typedef struct {int scr_size[3];} scr_size_t;
typedef struct {int kbd_delay[2];} keyboard_delay_t;
/* defines for "special" keys (spcl bit set in keymap) */
#define NOP 0x00 /* nothing (dead key) */
#define LSH 0x02 /* left shift key */
#define RSH 0x03 /* right shift key */
#define CLK 0x04 /* caps lock key */
#define NLK 0x05 /* num lock key */
#define SLK 0x06 /* scroll lock key */
#define LALT 0x07 /* left alt key */
#define BTAB 0x08 /* backwards tab */
#define LCTR 0x09 /* left control key */
#define NEXT 0x0a /* switch to next screen */
#define F_SCR 0x0b /* switch to first screen */
#define L_SCR 0x1a /* switch to last screen */
#define F_FN 0x1b /* first function key */
#define L_FN 0x7a /* last function key */
/* 0x7b-0x7f reserved do not use ! */
#define RCTR 0x80 /* right control key */
#define RALT 0x81 /* right alt (altgr) key */
#define ALK 0x82 /* alt lock key */
#define ASH 0x83 /* alt shift key */
#define META 0x84 /* meta key */
#define RBT 0x85 /* boot machine */
#define DBG 0x86 /* call debugger */
#define SUSP 0x87 /* suspend power (APM) */
#define SPSC 0x88 /* toggle splash/text screen */
#define F_ACC DGRA /* first accent key */
#define DGRA 0x89 /* grave */
#define DACU 0x8a /* acute */
#define DCIR 0x8b /* circumflex */
#define DTIL 0x8c /* tilde */
#define DMAC 0x8d /* macron */
#define DBRE 0x8e /* breve */
#define DDOT 0x8f /* dot */
#define DUML 0x90 /* umlaut/diaresis */
#define DDIA 0x90 /* diaresis */
#define DSLA 0x91 /* slash */
#define DRIN 0x92 /* ring */
#define DCED 0x93 /* cedilla */
#define DAPO 0x94 /* apostrophe */
#define DDAC 0x95 /* double acute */
#define DOGO 0x96 /* ogonek */
#define DCAR 0x97 /* caron */
#define L_ACC DCAR /* last accent key */
#define STBY 0x98 /* Go into standby mode (apm) */
#define F(x) ((x)+F_FN-1)
#define S(x) ((x)+F_SCR-1)
#define ACC(x) ((x)+F_ACC)
#define NOKEY 0x100 /* no key pressed marker */
#define FKEY 0x200 /* function key marker */
#define MKEY 0x400 /* meta key marker (prepend ESC)*/
#define BKEY 0x800 /* backtab (ESC [ Z) */
#define SPCLKEY 0x8000 /* special key */
#define RELKEY 0x4000 /* key released */
#define ERRKEY 0x2000 /* error */
#define KEYCHAR(c) ((c) & 0x00ff)
#define KEYFLAGS(c) ((c) & ~0x00ff)
/* video mode definitions */
#define M_B40x25 0 /* black & white 40 columns */
#define M_C40x25 1 /* color 40 columns */
#define M_B80x25 2 /* black & white 80 columns */
#define M_C80x25 3 /* color 80 columns */
#define M_BG320 4 /* black & white graphics 320x200 */
#define M_CG320 5 /* color graphics 320x200 */
#define M_BG640 6 /* black & white graphics 640x200 hi-res */
#define M_EGAMONO80x25 7 /* ega-mono 80x25 */
#define M_CG320_D 13 /* ega mode D */
#define M_CG640_E 14 /* ega mode E */
#define M_EGAMONOAPA 15 /* ega mode F */
#define M_CG640x350 16 /* ega mode 10 */
#define M_ENHMONOAPA2 17 /* ega mode F with extended memory */
#define M_ENH_CG640 18 /* ega mode 10* */
#define M_ENH_B40x25 19 /* ega enhanced black & white 40 columns */
#define M_ENH_C40x25 20 /* ega enhanced color 40 columns */
#define M_ENH_B80x25 21 /* ega enhanced black & white 80 columns */
#define M_ENH_C80x25 22 /* ega enhanced color 80 columns */
#define M_VGA_C40x25 23 /* vga 8x16 font on color */
#define M_VGA_C80x25 24 /* vga 8x16 font on color */
#define M_VGA_M80x25 25 /* vga 8x16 font on mono */
#define M_VGA11 26 /* vga 640x480 2 colors */
#define M_BG640x480 26
#define M_VGA12 27 /* vga 640x480 16 colors */
#define M_CG640x480 27
#define M_VGA13 28 /* vga 640x200 256 colors */
#define M_VGA_CG320 28
#define M_VGA_C80x50 30 /* vga 8x8 font on color */
#define M_VGA_M80x50 31 /* vga 8x8 font on color */
#define M_VGA_C80x30 32 /* vga 8x16 font on color */
#define M_VGA_M80x30 33 /* vga 8x16 font on color */
#define M_VGA_C80x60 34 /* vga 8x8 font on color */
#define M_VGA_M80x60 35 /* vga 8x8 font on color */
#define M_VGA_CG640 36 /* vga 640x400 256 color */
#define M_VGA_MODEX 37 /* vga 320x240 256 color */
#define M_ENH_B80x43 0x70 /* ega black & white 80x43 */
#define M_ENH_C80x43 0x71 /* ega color 80x43 */
#define M_PC98_80x25 98 /* PC98 80x25 */
#define M_PC98_80x30 99 /* PC98 80x30 */
#define M_HGC_P0 0xe0 /* hercules graphics - page 0 @ B0000 */
#define M_HGC_P1 0xe1 /* hercules graphics - page 1 @ B8000 */
#define M_MCA_MODE 0xff /* monochrome adapter mode */
#define M_TEXT_80x25 200 /* generic text modes */
#define M_TEXT_80x30 201
#define M_TEXT_80x43 202
#define M_TEXT_80x50 203
#define M_TEXT_80x60 204
#define M_TEXT_132x25 205
#define M_TEXT_132x30 206
#define M_TEXT_132x43 207
#define M_TEXT_132x50 208
#define M_TEXT_132x60 209
#define SW_PC98_80x25 _IO('S', M_PC98_80x25)
#define SW_PC98_80x30 _IO('S', M_PC98_80x30)
#define SW_B40x25 _IO('S', M_B40x25)
#define SW_C40x25 _IO('S', M_C40x25)
#define SW_B80x25 _IO('S', M_B80x25)
#define SW_C80x25 _IO('S', M_C80x25)
#define SW_BG320 _IO('S', M_BG320)
#define SW_CG320 _IO('S', M_CG320)
#define SW_BG640 _IO('S', M_BG640)
#define SW_EGAMONO80x25 _IO('S', M_EGAMONO80x25)
#define SW_CG320_D _IO('S', M_CG320_D)
#define SW_CG640_E _IO('S', M_CG640_E)
#define SW_EGAMONOAPA _IO('S', M_EGAMONOAPA)
#define SW_CG640x350 _IO('S', M_CG640x350)
#define SW_ENH_MONOAPA2 _IO('S', M_ENHMONOAPA2)
#define SW_ENH_CG640 _IO('S', M_ENH_CG640)
#define SW_ENH_B40x25 _IO('S', M_ENH_B40x25)
#define SW_ENH_C40x25 _IO('S', M_ENH_C40x25)
#define SW_ENH_B80x25 _IO('S', M_ENH_B80x25)
#define SW_ENH_C80x25 _IO('S', M_ENH_C80x25)
#define SW_ENH_B80x43 _IO('S', M_ENH_B80x43)
#define SW_ENH_C80x43 _IO('S', M_ENH_C80x43)
#define SW_MCAMODE _IO('S', M_MCA_MODE)
#define SW_VGA_C40x25 _IO('S', M_VGA_C40x25)
#define SW_VGA_C80x25 _IO('S', M_VGA_C80x25)
#define SW_VGA_C80x30 _IO('S', M_VGA_C80x30)
#define SW_VGA_C80x50 _IO('S', M_VGA_C80x50)
#define SW_VGA_C80x60 _IO('S', M_VGA_C80x60)
#define SW_VGA_M80x25 _IO('S', M_VGA_M80x25)
#define SW_VGA_M80x30 _IO('S', M_VGA_M80x30)
#define SW_VGA_M80x50 _IO('S', M_VGA_M80x50)
#define SW_VGA_M80x60 _IO('S', M_VGA_M80x60)
#define SW_VGA11 _IO('S', M_VGA11)
#define SW_BG640x480 _IO('S', M_VGA11)
#define SW_VGA12 _IO('S', M_VGA12)
#define SW_CG640x480 _IO('S', M_VGA12)
#define SW_VGA13 _IO('S', M_VGA13)
#define SW_VGA_CG320 _IO('S', M_VGA13)
#define SW_VGA_CG640 _IO('S', M_VGA_CG640)
#define SW_VGA_MODEX _IO('S', M_VGA_MODEX)
#define SW_TEXT_80x25 _IO('S', M_TEXT_80x25)
#define SW_TEXT_80x30 _IO('S', M_TEXT_80x30)
#define SW_TEXT_80x43 _IO('S', M_TEXT_80x43)
#define SW_TEXT_80x50 _IO('S', M_TEXT_80x50)
#define SW_TEXT_80x60 _IO('S', M_TEXT_80x60)
#define SW_TEXT_132x25 _IO('S', M_TEXT_132x25)
#define SW_TEXT_132x30 _IO('S', M_TEXT_132x30)
#define SW_TEXT_132x43 _IO('S', M_TEXT_132x43)
#define SW_TEXT_132x50 _IO('S', M_TEXT_132x50)
#define SW_TEXT_132x60 _IO('S', M_TEXT_132x60)
#define M_VESA_BASE 0x100 /* VESA mode number base */
#define M_VESA_CG640x400 0x100 /* 640x400, 256 color */
#define M_VESA_CG640x480 0x101 /* 640x480, 256 color */
#define M_VESA_800x600 0x102 /* 800x600, 16 color */
#define M_VESA_CG800x600 0x103 /* 800x600, 256 color */
#define M_VESA_1024x768 0x104 /* 1024x768, 16 color */
#define M_VESA_CG1024x768 0x105 /* 1024x768, 256 color */
#define M_VESA_1280x1024 0x106 /* 1280x1024, 16 color */
#define M_VESA_CG1280x1024 0x107 /* 1280x1024, 256 color */
#define M_VESA_C80x60 0x108 /* 8x8 font */
#define M_VESA_C132x25 0x109 /* 8x16 font */
#define M_VESA_C132x43 0x10a /* 8x14 font */
#define M_VESA_C132x50 0x10b /* 8x8 font */
#define M_VESA_C132x60 0x10c /* 8x8 font */
#define M_VESA_32K_320 0x10d /* 320x200, 5:5:5 */
#define M_VESA_64K_320 0x10e /* 320x200, 5:6:5 */
#define M_VESA_FULL_320 0x10f /* 320x200, 8:8:8 */
#define M_VESA_32K_640 0x110 /* 640x480, 5:5:5 */
#define M_VESA_64K_640 0x111 /* 640x480, 5:6:5 */
#define M_VESA_FULL_640 0x112 /* 640x480, 8:8:8 */
#define M_VESA_32K_800 0x113 /* 800x600, 5:5:5 */
#define M_VESA_64K_800 0x114 /* 800x600, 5:6:5 */
#define M_VESA_FULL_800 0x115 /* 800x600, 8:8:8 */
#define M_VESA_32K_1024 0x116 /* 1024x768, 5:5:5 */
#define M_VESA_64K_1024 0x117 /* 1024x768, 5:6:5 */
#define M_VESA_FULL_1024 0x118 /* 1024x768, 8:8:8 */
#define M_VESA_32K_1280 0x119 /* 1280x1024, 5:5:5 */
#define M_VESA_64K_1280 0x11a /* 1280x1024, 5:6:5 */
#define M_VESA_FULL_1280 0x11b /* 1280x1024, 8:8:8 */
#define M_VESA_MODE_MAX 0x1ff
#define SW_VESA_CG640x400 _IO('V', M_VESA_CG640x400 - M_VESA_BASE)
#define SW_VESA_CG640x480 _IO('V', M_VESA_CG640x480 - M_VESA_BASE)
#define SW_VESA_800x600 _IO('V', M_VESA_800x600 - M_VESA_BASE)
#define SW_VESA_CG800x600 _IO('V', M_VESA_CG800x600 - M_VESA_BASE)
#define SW_VESA_1024x768 _IO('V', M_VESA_1024x768 - M_VESA_BASE)
#define SW_VESA_CG1024x768 _IO('V', M_VESA_CG1024x768 - M_VESA_BASE)
#define SW_VESA_1280x1024 _IO('V', M_VESA_1280x1024 - M_VESA_BASE)
#define SW_VESA_CG1280x1024 _IO('V', M_VESA_CG1280x1024 - M_VESA_BASE)
#define SW_VESA_C80x60 _IO('V', M_VESA_C80x60 - M_VESA_BASE)
#define SW_VESA_C132x25 _IO('V', M_VESA_C132x25 - M_VESA_BASE)
#define SW_VESA_C132x43 _IO('V', M_VESA_C132x43 - M_VESA_BASE)
#define SW_VESA_C132x50 _IO('V', M_VESA_C132x50 - M_VESA_BASE)
#define SW_VESA_C132x60 _IO('V', M_VESA_C132x60 - M_VESA_BASE)
#define SW_VESA_32K_320 _IO('V', M_VESA_32K_320 - M_VESA_BASE)
#define SW_VESA_64K_320 _IO('V', M_VESA_64K_320 - M_VESA_BASE)
#define SW_VESA_FULL_320 _IO('V', M_VESA_FULL_320 - M_VESA_BASE)
#define SW_VESA_32K_640 _IO('V', M_VESA_32K_640 - M_VESA_BASE)
#define SW_VESA_64K_640 _IO('V', M_VESA_64K_640 - M_VESA_BASE)
#define SW_VESA_FULL_640 _IO('V', M_VESA_FULL_640 - M_VESA_BASE)
#define SW_VESA_32K_800 _IO('V', M_VESA_32K_800 - M_VESA_BASE)
#define SW_VESA_64K_800 _IO('V', M_VESA_64K_800 - M_VESA_BASE)
#define SW_VESA_FULL_800 _IO('V', M_VESA_FULL_800 - M_VESA_BASE)
#define SW_VESA_32K_1024 _IO('V', M_VESA_32K_1024 - M_VESA_BASE)
#define SW_VESA_64K_1024 _IO('V', M_VESA_64K_1024 - M_VESA_BASE)
#define SW_VESA_FULL_1024 _IO('V', M_VESA_FULL_1024 - M_VESA_BASE)
#define SW_VESA_32K_1280 _IO('V', M_VESA_32K_1280 - M_VESA_BASE)
#define SW_VESA_64K_1280 _IO('V', M_VESA_64K_1280 - M_VESA_BASE)
#define SW_VESA_FULL_1280 _IO('V', M_VESA_FULL_1280 - M_VESA_BASE)
#include <sys/fbio.h>
#include <sys/kbio.h>
#include <sys/consio.h>
#endif /* !_MACHINE_CONSOLE_H_ */

View File

@ -2,7 +2,7 @@
# LINT -- config file for checking all the sources, tries to pull in
# as much of the source tree as it can.
#
# $Id: LINT,v 1.606 1999/06/15 13:14:40 des Exp $
# $Id: LINT,v 1.607 1999/06/19 20:20:52 rnordier Exp $
#
# NB: You probably don't want to try running a kernel built from this
# file. Instead, you should start from GENERIC, and add options from
@ -912,6 +912,9 @@ options VGA_NO_MODE_CHANGE # don't change video modes
# Older video cards may require this option for proper operation.
options VGA_SLOW_IOACCESS # do byte-wide i/o's to TS and GDC regs
# The following option probably won't work with the LCD displays.
options VGA_WIDTH90 # support 90 column modes
# To include support for VESA video modes
options VESA
@ -939,18 +942,20 @@ options PCVT_VT220KEYB
# The syscons console driver (sco color console compatible).
device sc0 at isa?
options MAXCONS=16 # number of virtual consoles
options STD8X16FONT # Compile font in
makeoptions STD8X16FONT=cp850
options SC_HISTORY_SIZE=200 # number of history buffer lines
options SC_ALT_MOUSE_IMAGE # simplified mouse cursor in text mode
options SC_DFLT_FONT # compile font in
makeoptions SC_DFLT_FONT="cp850"
options SC_DISABLE_DDBKEY # disable `debug' key
options SC_DISABLE_REBOOT # disable reboot key sequence
options SC_HISTORY_SIZE=200 # number of history buffer lines
options SC_MOUSE_CHAR=0x3 # char code for text mode mouse cursor
options SC_PIXEL_MODE # add support for the raster text mode
#
# `flags' for sc0:
# 0x01 Use a 'visual' bell
# 0x02 Use a 'blink' cursor
# 0x04 Use a 'underline' cursor
# 0x06 Use a 'blinking underline' (destructive) cursor
# 0x40 Make the bell quiet if it is rung in the background vty.
# You can selectively disable features in syscons.
options SC_NO_CUTPASTE
options SC_NO_FONT_LOADING
options SC_NO_HISTORY
options SC_NO_SYSMOUSE
#
# The Numeric Processing eXtension driver. This should be configured if
@ -2155,6 +2160,10 @@ options ULPT_DEBUG
options UMASS_DEBUG
options UMS_DEBUG
# options for ukbd:
options UKBD_DFLT_KEYMAP # specify the built-in keymap
makeoptions UKBD_DFLT_KEYMAP="it.iso"
#
# Embedded system options:
#

View File

@ -1,7 +1,7 @@
# This file tells config what files go into building a kernel,
# files marked standard are always included.
#
# $Id: files.alpha,v 1.20 1999/06/05 13:29:57 dfr Exp $
# $Id: files.alpha,v 1.21 1999/06/19 13:12:51 dfr Exp $
#
# The long compile-with and dependency lines are required because of
# limitations in config: backslash-newline doesn't work in strings, and
@ -152,6 +152,7 @@ libkern/alpha/ntohs.S standard
isa/sio.c optional sio device-driver
dev/fb/fb.c optional fb device-driver
dev/fb/fb.c optional vga device-driver
dev/fb/vga.c optional vga device-driver
isa/vga_isa.c optional vga device-driver
dev/fb/splash.c optional splash
dev/kbd/atkbd.c optional atkbd device-driver
@ -162,7 +163,11 @@ dev/kbd/kbd.c optional atkbd device-driver
dev/kbd/kbd.c optional kbd device-driver
dev/kbd/kbd.c optional ukbd device-driver
dev/syscons/syscons.c optional sc device-driver
dev/syscons/schistory.c optional sc device-driver
dev/syscons/scmouse.c optional sc device-driver
dev/syscons/scvgarndr.c optional sc device-driver
dev/syscons/scvidctl.c optional sc device-driver
dev/syscons/scvtb.c optional sc device-driver
isa/syscons_isa.c optional sc device-driver
isa/psm.c optional psm device-driver
isa/fd.c optional fd device-driver

View File

@ -1,7 +1,7 @@
# This file tells config what files go into building a kernel,
# files marked standard are always included.
#
# $Id: files.i386,v 1.246 1999/06/01 18:18:38 jlemon Exp $
# $Id: files.i386,v 1.247 1999/06/18 19:55:50 green Exp $
#
# The long compile-with and dependency lines are required because of
# limitations in config: backslash-newline doesn't work in strings, and
@ -19,10 +19,10 @@ linux_assym.h optional compat_linux \
no-obj no-implicit-rule before-depend \
clean "linux_assym.h"
#
font8x16.o optional std8x16font \
compile-with "uudecode < /usr/share/syscons/fonts/${STD8X16FONT}-8x16.fnt && file2c 'unsigned char font_16[16*256] = {' '};' < ${STD8X16FONT}-8x16 > font8x16.c && ${CC} -c ${CFLAGS} font8x16.c" \
no-implicit-rule before-depend \
clean "${STD8X16FONT}-8x16 font8x16.c"
font.h optional sc_dflt_font \
compile-with "uudecode < /usr/share/syscons/fonts/${SC_DFLT_FONT}-8x16.fnt && file2c 'static u_char dflt_font_16[16*256] = {' '};' < ${SC_DFLT_FONT}-8x16 > font.h && uudecode < /usr/share/syscons/fonts/${SC_DFLT_FONT}-8x14.fnt && file2c 'static u_char dflt_font_14[14*256] = {' '};' < ${SC_DFLT_FONT}-8x14 >> font.h && uudecode < /usr/share/syscons/fonts/${SC_DFLT_FONT}-8x8.fnt && file2c 'static u_char dflt_font_8[8*256] = {' '};' < ${SC_DFLT_FONT}-8x8 >> font.h" \
no-obj no-implicit-rule before-depend \
clean "font.h"
#
atkbdmap.h optional atkbd_dflt_keymap \
compile-with "kbdcontrol -L ${ATKBD_DFLT_KEYMAP} | sed -e 's/^static keymap_t.* = /static keymap_t key_map = /' -e 's/^static accentmap_t.* = /static accentmap_t accent_map = /' > atkbdmap.h" \
@ -44,14 +44,19 @@ dev/ata/atapi-tape.c optional atapist device-driver
dev/fb/fb.c optional fb device-driver
dev/fb/fb.c optional vga device-driver
dev/fb/splash.c optional splash
dev/fb/vga.c optional vga device-driver
dev/kbd/atkbd.c optional atkbd device-driver
dev/kbd/atkbdc.c optional atkbdc device-driver
dev/kbd/kbd.c optional atkbd device-driver
dev/kbd/kbd.c optional kbd device-driver
dev/kbd/kbd.c optional ukbd device-driver
dev/syscons/syscons.c optional sc device-driver
dev/syscons/schistory.c optional sc device-driver
dev/syscons/scmouse.c optional sc device-driver
dev/syscons/scvidctl.c optional sc device-driver
dev/syscons/scvesactl.c optional sc device-driver
dev/syscons/scvgarndr.c optional sc device-driver
dev/syscons/scvtb.c optional sc device-driver
i386/apm/apm.c optional apm device-driver
i386/apm/apm_setup.s optional apm
i386/eisa/dpt_eisa.c optional eisa dpt device-driver

View File

@ -1,4 +1,4 @@
# $Id: options.alpha,v 1.10 1999/03/10 10:36:50 yokota Exp $
# $Id: options.alpha,v 1.11 1999/05/27 22:03:31 gallatin Exp $
EV5 opt_global.h
EV4 opt_global.h
@ -21,25 +21,35 @@ CMD640 opt_wd.h
SHOW_BUSYBUFS
PANIC_REBOOT_WAIT_TIME opt_panic.h
SC_SPLASH_SCREEN opt_syscons.h
MAXCONS opt_syscons.h
SLOW_VGA opt_syscons.h
STD8X16FONT opt_syscons.h
SC_HISTORY_SIZE opt_syscons.h
SC_ALT_MOUSE_IMAGE opt_syscons.h
SC_DEBUG_LEVEL opt_syscons.h
SC_DFLT_FONT opt_syscons.h
SC_DISABLE_DDB opt_syscons.h
SC_DISABLE_REBOOT opt_syscons.h
SC_HISTORY_SIZE opt_syscons.h
SC_MOUSE_CHAR opt_syscons.h
SC_NO_CUTPASTE opt_syscons.h
SC_NO_FONT_LOADING opt_syscons.h
SC_NO_HISTORY opt_syscons.h
SC_NO_SYSMOUSE opt_syscons.h
SC_PIXEL_MODE opt_syscons.h
SC_RENDER_DEBUG opt_syscons.h
SC_VIDEO_DEBUG opt_syscons.h
VGA_ALT_SEQACCESS opt_vga.h
VGA_DEBUG opt_vga.h
VGA_NO_FONT_LOADING opt_vga.h
VGA_NO_MODE_CHANGE opt_vga.h
VGA_SLOW_IOACCESS opt_vga.h
VGA_WIDTH90 opt_vga.h
PSM_HOOKAPM opt_psm.h
PSM_RESETAFTERSUSPEND opt_psm.h
PSM_DEBUG opt_psm.h
# Fb options
FB_DEBUG opt_fb.h
FB_INSTALL_CDEV opt_fb.h
# Atkbd options

View File

@ -1,4 +1,4 @@
# $Id: options.i386,v 1.116 1999/06/06 22:45:04 steve Exp $
# $Id: options.i386,v 1.117 1999/06/15 13:14:43 des Exp $
DISABLE_PSE
IDE_DELAY
@ -65,17 +65,30 @@ I586_CPU opt_global.h
I686_CPU opt_global.h
MAXCONS opt_syscons.h
STD8X16FONT opt_syscons.h
SC_HISTORY_SIZE opt_syscons.h
SC_ALT_MOUSE_IMAGE opt_syscons.h
SC_DEBUG_LEVEL opt_syscons.h
SC_DFLT_FONT opt_syscons.h
SC_DISABLE_DDBKEY opt_syscons.h
SC_DISABLE_REBOOT opt_syscons.h
SC_HISTORY_SIZE opt_syscons.h
SC_MOUSE_CHAR opt_syscons.h
SC_NO_CUTPASTE opt_syscons.h
SC_NO_FONT_LOADING opt_syscons.h
SC_NO_HISTORY opt_syscons.h
SC_NO_SYSMOUSE opt_syscons.h
SC_PIXEL_MODE opt_syscons.h
SC_RENDER_DEBUG opt_syscons.h
SC_VIDEO_DEBUG opt_syscons.h
FB_DEBUG opt_fb.h
FB_INSTALL_CDEV opt_fb.h
VGA_ALT_SEQACCESS opt_vga.h
VGA_DEBUG opt_vga.h
VGA_NO_FONT_LOADING opt_vga.h
VGA_NO_MODE_CHANGE opt_vga.h
VGA_SLOW_IOACCESS opt_vga.h
VGA_WIDTH90 opt_vga.h
VESA opt_vesa.h
VESA_DEBUG opt_vesa.h

View File

@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: fb.c,v 1.4 1999/05/30 16:51:23 phk Exp $
* $Id: fb.c,v 1.5 1999/05/31 11:24:38 phk Exp $
*/
#include "fb.h"
@ -34,10 +34,14 @@
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/conf.h>
#include <sys/bus.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <sys/uio.h>
#include <sys/fbio.h>
#include <machine/console.h>
#include <vm/vm.h>
#include <vm/pmap.h>
#include <dev/fb/fbreg.h>
@ -49,6 +53,7 @@
* when necessary.
*/
static int vid_malloc;
static int adapters = 1;
static video_adapter_t *adp_ini;
static video_adapter_t **adapter = &adp_ini;
@ -56,48 +61,69 @@ static video_switch_t *vidsw_ini;
video_switch_t **vidsw = &vidsw_ini;
#ifdef FB_INSTALL_CDEV
static struct cdevsw *vidcdevsw_ini;
static struct cdevsw **vidcdevsw = &vidcdevsw_ini;
#endif
#define ARRAY_DELTA 4
static struct cdevsw *vidcdevsw_ini;
static struct cdevsw **vidcdevsw = &vidcdevsw_ini;
static void
static int
vid_realloc_array(void)
{
video_adapter_t **new_adp;
video_switch_t **new_vidsw;
#ifdef FB_INSTALL_CDEV
struct cdevsw **new_cdevsw;
#endif
int newsize;
int s;
if (!vid_malloc)
return ENOMEM;
s = spltty();
newsize = ((adapters + ARRAY_DELTA)/ARRAY_DELTA)*ARRAY_DELTA;
new_adp = malloc(sizeof(*new_adp)*newsize, M_DEVBUF, M_WAITOK);
new_vidsw = malloc(sizeof(*new_vidsw)*newsize, M_DEVBUF, M_WAITOK);
#ifdef FB_INSTALL_CDEV
new_cdevsw = malloc(sizeof(*new_cdevsw)*newsize, M_DEVBUF, M_WAITOK);
#endif
bzero(new_adp, sizeof(*new_adp)*newsize);
bzero(new_vidsw, sizeof(*new_vidsw)*newsize);
bzero(new_cdevsw, sizeof(*new_cdevsw)*newsize);
bcopy(adapter, new_adp, sizeof(*adapter)*adapters);
bcopy(vidsw, new_vidsw, sizeof(*vidsw)*adapters);
#ifdef FB_INSTALL_CDEV
bzero(new_cdevsw, sizeof(*new_cdevsw)*newsize);
bcopy(vidcdevsw, new_cdevsw, sizeof(*vidcdevsw)*adapters);
#endif
if (adapters > 1) {
free(adapter, M_DEVBUF);
free(vidsw, M_DEVBUF);
#ifdef FB_INSTALL_CDEV
free(vidcdevsw, M_DEVBUF);
#endif
}
adapter = new_adp;
vidsw = new_vidsw;
#ifdef FB_INSTALL_CDEV
vidcdevsw = new_cdevsw;
#endif
adapters = newsize;
splx(s);
if (bootverbose)
printf("fb: new array size %d\n", adapters);
return 0;
}
#endif /* FB_INSTALL_CDEV */
static void
vid_malloc_init(void *arg)
{
vid_malloc = TRUE;
}
SYSINIT(vid_mem, SI_SUB_KMEM, SI_ORDER_ANY, vid_malloc_init, NULL);
/*
* Low-level frame buffer driver functions
@ -120,20 +146,22 @@ vid_init_struct(video_adapter_t *adp, char *name, int type, int unit)
int
vid_register(video_adapter_t *adp)
{
video_driver_t **list;
video_driver_t *p;
const video_driver_t **list;
const video_driver_t *p;
int index;
for (index = 0; index < adapters; ++index) {
if (adapter[index] == NULL)
break;
}
if (index >= adapters)
return -1;
if (index >= adapters) {
if (vid_realloc_array())
return -1;
}
adp->va_index = index;
adp->va_token = NULL;
list = (video_driver_t **)videodriver_set.ls_items;
list = (const video_driver_t **)videodriver_set.ls_items;
while ((p = *list++) != NULL) {
if (strcmp(p->name, adp->va_name) == 0) {
adapter[index] = adp;
@ -162,10 +190,10 @@ vid_unregister(video_adapter_t *adp)
video_switch_t
*vid_get_switch(char *name)
{
video_driver_t **list;
video_driver_t *p;
const video_driver_t **list;
const video_driver_t *p;
list = (video_driver_t **)videodriver_set.ls_items;
list = (const video_driver_t **)videodriver_set.ls_items;
while ((p = *list++) != NULL) {
if (strcmp(p->name, name) == 0)
return p->vidsw;
@ -251,10 +279,10 @@ video_adapter_t
int
vid_configure(int flags)
{
video_driver_t **list;
video_driver_t *p;
const video_driver_t **list;
const video_driver_t *p;
list = (video_driver_t **)videodriver_set.ls_items;
list = (const video_driver_t **)videodriver_set.ls_items;
while ((p = *list++) != NULL) {
if (p->configure != NULL)
(*p->configure)(flags);
@ -269,27 +297,73 @@ vid_configure(int flags)
* appropriate subdrivers.
*/
#define DRIVER_NAME "fb"
#define FB_DRIVER_NAME "fb"
#ifdef FB_INSTALL_CDEV
#if experimental
static devclass_t fb_devclass;
static int fbprobe(device_t dev);
static int fbattach(device_t dev);
static device_method_t fb_methods[] = {
DEVMETHOD(device_probe, fbprobe),
DEVMETHOD(device_attach, fbattach),
DEVMETHOD(bus_print_child, bus_generic_print_child),
{ 0, 0 }
};
static driver_t fb_driver = {
FB_DRIVER_NAME,
fb_methods,
0,
};
static int
fbprobe(device_t dev)
{
int unit;
unit = device_get_unit(dev);
if (unit >= adapters)
return ENXIO;
if (adapter[unit] == NULL)
return ENXIO;
device_set_desc(dev, "generic frame buffer");
return 0;
}
static int
fbattach(device_t dev)
{
printf("fbattach: about to attach children\n");
bus_generic_attach(dev);
return 0;
}
#endif /* experimental */
#define FB_UNIT(dev) minor(dev)
#define FB_MKMINOR(unit) (u)
#if notyet
static d_open_t fbopen;
static d_close_t fbclose;
static d_read_t fbread;
static d_write_t fbwrite;
static d_ioctl_t fbioctl;
static d_mmap_t fbmmap;
#define CDEV_MAJOR 141 /* XXX */
#define CDEV_MAJOR 123 /* XXX */
static struct cdevsw fb_cdevsw = {
/* open */ fbopen,
/* close */ fbclose,
/* read */ noread,
/* write */ nowrite,
/* read */ fbread,
/* write */ fbwrite,
/* ioctl */ fbioctl,
/* stop */ nostop,
/* reset */ noreset,
@ -297,7 +371,7 @@ static struct cdevsw fb_cdevsw = {
/* poll */ nopoll,
/* mmap */ fbmmap,
/* strategy */ nostrategy,
/* name */ DRIVER_NAME,
/* name */ FB_DRIVER_NAME,
/* parms */ noparms,
/* maj */ CDEV_MAJOR,
/* dump */ nodump,
@ -320,10 +394,8 @@ vfbattach(void *arg)
PSEUDO_SET(vfbattach, fb);
#endif /* notyet */
int
fb_attach(dev_t dev, video_adapter *adp, struct cdevsw *cdevsw)
fb_attach(dev_t dev, video_adapter_t *adp, struct cdevsw *cdevsw)
{
int s;
@ -339,15 +411,12 @@ fb_attach(dev_t dev, video_adapter *adp, struct cdevsw *cdevsw)
/* XXX: DEVFS? */
if (adp->va_index + 1 >= adapters)
vid_realloc_array();
printf("fb%d at %s%d\n", adp->va_index, adp->va_name, adp->va_unit);
return 0;
}
int
fb_detach(dev_t dev, video_adapter *adp, struct cdevsw *cdevsw)
fb_detach(dev_t dev, video_adapter_t *adp, struct cdevsw *cdevsw)
{
int s;
@ -364,6 +433,165 @@ fb_detach(dev_t dev, video_adapter *adp, struct cdevsw *cdevsw)
return 0;
}
static int
fbopen(dev_t dev, int flag, int mode, struct proc *p)
{
int unit;
unit = FB_UNIT(dev);
if (unit >= adapters)
return ENXIO;
if (vidcdevsw[unit] == NULL)
return ENXIO;
return (*vidcdevsw[unit]->d_open)(makedev(0, adapter[unit]->va_minor),
flag, mode, p);
}
static int
fbclose(dev_t dev, int flag, int mode, struct proc *p)
{
int unit;
unit = FB_UNIT(dev);
if (vidcdevsw[unit] == NULL)
return ENXIO;
return (*vidcdevsw[unit]->d_close)(makedev(0, adapter[unit]->va_minor),
flag, mode, p);
}
static int
fbread(dev_t dev, struct uio *uio, int flag)
{
int unit;
unit = FB_UNIT(dev);
if (vidcdevsw[unit] == NULL)
return ENXIO;
return (*vidcdevsw[unit]->d_read)(makedev(0, adapter[unit]->va_minor),
uio, flag);
}
static int
fbwrite(dev_t dev, struct uio *uio, int flag)
{
int unit;
unit = FB_UNIT(dev);
if (vidcdevsw[unit] == NULL)
return ENXIO;
return (*vidcdevsw[unit]->d_write)(makedev(0, adapter[unit]->va_minor),
uio, flag);
}
static int
fbioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct proc *p)
{
int unit;
unit = FB_UNIT(dev);
if (vidcdevsw[unit] == NULL)
return ENXIO;
return (*vidcdevsw[unit]->d_ioctl)(makedev(0, adapter[unit]->va_minor),
cmd, arg, flag, p);
}
static int
fbmmap(dev_t dev, vm_offset_t offset, int nprot)
{
int unit;
unit = FB_UNIT(dev);
if (vidcdevsw[unit] == NULL)
return ENXIO;
return (*vidcdevsw[unit]->d_mmap)(makedev(0, adapter[unit]->va_minor),
offset, nprot);
}
#if experimental
DEV_DRIVER_MODULE(fb, ???, fb_driver, fb_devclass,
CDEV_MAJOR, NOMAJ, fb_cdevsw, 0, 0);
#endif
/*
* Generic frame buffer cdev driver functions
* Frame buffer subdrivers may call these functions to implement common
* driver functions.
*/
int genfbopen(genfb_softc_t *sc, video_adapter_t *adp, int flag, int mode,
struct proc *p)
{
int s;
s = spltty();
if (!(sc->gfb_flags & FB_OPEN))
sc->gfb_flags |= FB_OPEN;
splx(s);
return 0;
}
int genfbclose(genfb_softc_t *sc, video_adapter_t *adp, int flag, int mode,
struct proc *p)
{
int s;
s = spltty();
sc->gfb_flags &= ~FB_OPEN;
splx(s);
return 0;
}
int genfbread(genfb_softc_t *sc, video_adapter_t *adp, struct uio *uio,
int flag)
{
int size;
int offset;
int error;
int len;
error = 0;
size = adp->va_buffer_size/adp->va_info.vi_planes;
while (uio->uio_resid > 0) {
if (uio->uio_offset >= size)
break;
offset = uio->uio_offset%adp->va_window_size;
len = imin(uio->uio_resid, size - uio->uio_offset);
len = imin(len, adp->va_window_size - offset);
if (len <= 0)
break;
(*vidsw[adp->va_index]->set_win_org)(adp, uio->uio_offset);
error = uiomove((caddr_t)(adp->va_window + offset), len, uio);
if (error)
break;
}
return error;
}
int genfbwrite(genfb_softc_t *sc, video_adapter_t *adp, struct uio *uio,
int flag)
{
return ENODEV;
}
int genfbioctl(genfb_softc_t *sc, video_adapter_t *adp, u_long cmd,
caddr_t arg, int flag, struct proc *p)
{
int error;
if (adp == NULL) /* XXX */
return ENXIO;
error = (*vidsw[adp->va_index]->ioctl)(adp, cmd, arg);
if (error == ENOIOCTL)
error = ENODEV;
return error;
}
int genfbmmap(genfb_softc_t *sc, video_adapter_t *adp, vm_offset_t offset,
int prot)
{
return (*vidsw[adp->va_index]->mmap)(adp, offset, prot);
}
#endif /* FB_INSTALL_CDEV */
static char
@ -379,6 +607,7 @@ static char
{ KD_EGA, "EGA" },
{ KD_VGA, "VGA" },
{ KD_PC98, "PC-98x1" },
{ KD_TGA, "TGA" },
{ -1, "Unknown" },
};
int i;
@ -389,6 +618,12 @@ static char
return names[i].name;
}
/*
* Generic low-level frame buffer functions
* The low-level functions in the frame buffer subdriver may use these
* functions.
*/
void
fb_dump_adp_info(char *driver, video_adapter_t *adp, int level)
{
@ -396,19 +631,19 @@ fb_dump_adp_info(char *driver, video_adapter_t *adp, int level)
return;
printf("%s%d: %s%d, %s, type:%s (%d), flags:0x%x\n",
DRIVER_NAME, adp->va_index, driver, adp->va_unit, adp->va_name,
FB_DRIVER_NAME, adp->va_index, driver, adp->va_unit, adp->va_name,
adapter_name(adp->va_type), adp->va_type, adp->va_flags);
printf("%s%d: port:0x%x-0x%x, crtc:0x%x, mem:0x%x 0x%x\n",
DRIVER_NAME, adp->va_index,
FB_DRIVER_NAME, adp->va_index,
adp->va_io_base, adp->va_io_base + adp->va_io_size - 1,
adp->va_crtc_addr, adp->va_mem_base, adp->va_mem_size);
printf("%s%d: init mode:%d, bios mode:%d, current mode:%d\n",
DRIVER_NAME, adp->va_index,
FB_DRIVER_NAME, adp->va_index,
adp->va_initial_mode, adp->va_initial_bios_mode, adp->va_mode);
printf("%s%d: window:0x%x size:%dk gran:%dk, buf:0x%x size:%dk\n",
DRIVER_NAME, adp->va_index,
adp->va_window, (int)adp->va_window_size/1024,
(int)adp->va_window_gran/1024, adp->va_buffer,
printf("%s%d: window:%p size:%dk gran:%dk, buf:%p size:%dk\n",
FB_DRIVER_NAME, adp->va_index,
(void *)adp->va_window, (int)adp->va_window_size/1024,
(int)adp->va_window_gran/1024, (void *)adp->va_buffer,
(int)adp->va_buffer_size/1024);
}
@ -432,3 +667,161 @@ fb_dump_mode_info(char *driver, video_adapter_t *adp, video_info_t *info,
info->vi_cwidth, info->vi_cheight);
printf("win:0x%x\n", info->vi_window);
}
int
fb_type(int adp_type)
{
static struct {
int fb_type;
int va_type;
} types[] = {
{ FBTYPE_MDA, KD_MONO },
{ FBTYPE_HERCULES, KD_HERCULES },
{ FBTYPE_CGA, KD_CGA },
{ FBTYPE_EGA, KD_EGA },
{ FBTYPE_VGA, KD_VGA },
{ FBTYPE_PC98, KD_PC98 },
{ FBTYPE_TGA, KD_TGA },
};
int i;
for (i = 0; i < sizeof(types)/sizeof(types[0]); ++i) {
if (types[i].va_type == adp_type)
return types[i].fb_type;
}
return -1;
}
int
fb_commonioctl(video_adapter_t *adp, u_long cmd, caddr_t arg)
{
int error;
int s;
/* assert(adp != NULL) */
error = 0;
s = spltty();
switch (cmd) {
case FBIO_ADAPTER: /* get video adapter index */
*(int *)arg = adp->va_index;
break;
case FBIO_ADPTYPE: /* get video adapter type */
*(int *)arg = adp->va_type;
break;
case FBIO_ADPINFO: /* get video adapter info */
((video_adapter_info_t *)arg)->va_index = adp->va_index;
((video_adapter_info_t *)arg)->va_type = adp->va_type;
bcopy(adp->va_name, ((video_adapter_info_t *)arg)->va_name,
imin(strlen(adp->va_name) + 1,
sizeof(((video_adapter_info_t *)arg)->va_name)));
((video_adapter_info_t *)arg)->va_unit = adp->va_unit;
((video_adapter_info_t *)arg)->va_flags = adp->va_flags;
((video_adapter_info_t *)arg)->va_io_base = adp->va_io_base;
((video_adapter_info_t *)arg)->va_io_size = adp->va_io_size;
((video_adapter_info_t *)arg)->va_crtc_addr = adp->va_crtc_addr;
((video_adapter_info_t *)arg)->va_mem_base = adp->va_mem_base;
((video_adapter_info_t *)arg)->va_mem_size = adp->va_mem_size;
((video_adapter_info_t *)arg)->va_window
= vtophys(adp->va_window);
((video_adapter_info_t *)arg)->va_window_size
= adp->va_window_size;
((video_adapter_info_t *)arg)->va_window_gran
= adp->va_window_gran;
((video_adapter_info_t *)arg)->va_window_orig
= adp->va_window_orig;
((video_adapter_info_t *)arg)->va_unused0
= (adp->va_buffer) ? vtophys(adp->va_buffer) : 0;
((video_adapter_info_t *)arg)->va_buffer_size
= adp->va_buffer_size;
((video_adapter_info_t *)arg)->va_mode = adp->va_mode;
((video_adapter_info_t *)arg)->va_initial_mode
= adp->va_initial_mode;
((video_adapter_info_t *)arg)->va_initial_bios_mode
= adp->va_initial_bios_mode;
((video_adapter_info_t *)arg)->va_line_width
= adp->va_line_width;
((video_adapter_info_t *)arg)->va_disp_start.x
= adp->va_disp_start.x;
((video_adapter_info_t *)arg)->va_disp_start.y
= adp->va_disp_start.y;
break;
case FBIO_MODEINFO: /* get mode information */
error = (*vidsw[adp->va_index]->get_info)(adp,
((video_info_t *)arg)->vi_mode,
(video_info_t *)arg);
if (error)
error = ENODEV;
break;
case FBIO_FINDMODE: /* find a matching video mode */
error = (*vidsw[adp->va_index]->query_mode)(adp,
(video_info_t *)arg);
if (error < 0) {
error = EINVAL;
} else {
error = (*vidsw[adp->va_index]->get_info)(adp,
error, (video_info_t *)arg);
if (error)
error = ENODEV; /* shouldn't happen */
}
break;
case FBIO_GETMODE: /* get video mode */
*(int *)arg = adp->va_mode;
break;
case FBIO_SETMODE: /* set video mode */
error = (*vidsw[adp->va_index]->set_mode)(adp, *(int *)arg);
if (error)
error = ENODEV; /* EINVAL? */
break;
case FBIO_GETWINORG: /* get frame buffer window origin */
*(u_int *)arg = adp->va_window_orig;
break;
case FBIO_GETDISPSTART: /* get display start address */
((video_display_start_t *)arg)->x = adp->va_disp_start.x;
((video_display_start_t *)arg)->y = adp->va_disp_start.y;
break;
case FBIO_GETLINEWIDTH: /* get scan line width in bytes */
*(u_int *)arg = adp->va_line_width;
break;
case FBIO_GETPALETTE: /* get color palette */
case FBIO_SETPALETTE: /* set color palette */
/* XXX */
case FBIOPUTCMAP:
case FBIOGETCMAP:
/* XXX */
case FBIO_SETWINORG: /* set frame buffer window origin */
case FBIO_SETDISPSTART: /* set display start address */
case FBIO_SETLINEWIDTH: /* set scan line width in pixel */
case FBIOGTYPE:
case FBIOGATTR:
case FBIOSVIDEO:
case FBIOGVIDEO:
case FBIOSCURSOR:
case FBIOGCURSOR:
case FBIOSCURPOS:
case FBIOGCURPOS:
case FBIOGCURMAX:
default:
error = ENODEV;
break;
}
splx(s);
return error;
}

View File

@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: fbreg.h,v 1.2 1999/01/19 11:31:11 yokota Exp $
* $Id: fbreg.h,v 1.3 1999/04/12 13:34:56 des Exp $
*/
#ifndef _DEV_FB_FBREG_H_
@ -35,15 +35,22 @@
/* some macros */
#ifdef __i386__
#define bcopy_toio(s, d, c) generic_bcopy((void *)(s), (void *)(d), c)
#define bcopy_fromio(s, d, c) generic_bcopy((void *)(s), (void *)(d), c)
#define bzero_io(d, c) generic_bzero((void *)(d), c)
#define bcopy_io(s, d, c) generic_bcopy((void *)(s), (void *)(d), (c))
#define bcopy_toio(s, d, c) generic_bcopy((void *)(s), (void *)(d), (c))
#define bcopy_fromio(s, d, c) generic_bcopy((void *)(s), (void *)(d), (c))
#define bzero_io(d, c) generic_bzero((void *)(d), (c))
#define fill_io(p, d, c) fill((p), (void *)(d), (c))
#define fillw_io(p, d, c) fillw((p), (void *)(d), (c))
void generic_bcopy(const void *s, void *d, size_t c);
void generic_bzero(void *d, size_t c);
#else /* !__i386__ */
#define bcopy_toio(s, d, c) memcpy_toio(d, s, c)
#define bcopy_fromio(s, d, c) memcpy_fromio(d, s, c)
#define bzero_io(d, c) memset_io(d, 0, c)
#define bcopy_io(s, d, c) memcpy_io((d), (s), (c))
#define bcopy_toio(s, d, c) memcpy_toio((d), (void *)(s), (c))
#define bcopy_fromio(s, d, c) memcpy_fromio((void *)(d), (s), (c))
#define bzero_io(d, c) memset_io((d), 0, (c))
#define fill_io(p, d, c) memset_io((d), (p), (c))
#define fillw(p, d, c) memsetw((d), (p), (c))
#define fillw_io(p, d, c) memsetw_io((d), (p), (c))
#endif /* !__i386__ */
/* video function table */
@ -68,12 +75,16 @@ typedef int vi_set_hw_cursor_t(video_adapter_t *adp, int col, int row);
typedef int vi_set_hw_cursor_shape_t(video_adapter_t *adp, int base,
int height, int celsize, int blink);
typedef int vi_blank_display_t(video_adapter_t *adp, int mode);
#define V_DISPLAY_POWER_ON 0
#define V_DISPLAY_SUSPEND 1
#define V_DISPLAY_SUSPEND1 1
#define V_DISPLAY_SUSPEND2 2
#define V_DISPLAY_POWER_OFF 3
typedef int vi_mmap_t(video_adapter_t *adp, vm_offset_t offset);
#define V_DISPLAY_ON 0
#define V_DISPLAY_BLANK 1
#define V_DISPLAY_STAND_BY 2
#define V_DISPLAY_SUSPEND 3
typedef int vi_mmap_t(video_adapter_t *adp, vm_offset_t offset, int prot);
typedef int vi_ioctl_t(video_adapter_t *adp, u_long cmd, caddr_t data);
typedef int vi_clear_t(video_adapter_t *adp);
typedef int vi_fill_rect_t(video_adapter_t *adp, int val, int x, int y,
int cx, int cy);
typedef int vi_bitblt_t(video_adapter_t *adp,...);
typedef int vi_diag_t(video_adapter_t *adp, int level);
typedef struct video_switch {
@ -96,6 +107,12 @@ typedef struct video_switch {
vi_set_hw_cursor_shape_t *set_hw_cursor_shape;
vi_blank_display_t *blank_display;
vi_mmap_t *mmap;
vi_ioctl_t *ioctl;
vi_clear_t *clear;
vi_fill_rect_t *fill_rect;
vi_bitblt_t *bitblt;
int (*reserved1)(void);
int (*reserved2)(void);
vi_diag_t *diag;
} video_switch_t;
@ -158,6 +175,26 @@ int fb_attach(dev_t dev, video_adapter_t *adp,
int fb_detach(dev_t dev, video_adapter_t *adp,
struct cdevsw *cdevsw);
/* generic frame buffer cdev driver functions */
typedef struct genfb_softc {
int gfb_flags; /* flag/status bits */
#define FB_OPEN (1 << 0)
} genfb_softc_t;
int genfbopen(genfb_softc_t *sc, video_adapter_t *adp,
int flag, int mode, struct proc *p);
int genfbclose(genfb_softc_t *sc, video_adapter_t *adp,
int flag, int mode, struct proc *p);
int genfbread(genfb_softc_t *sc, video_adapter_t *adp,
struct uio *uio, int flag);
int genfbwrite(genfb_softc_t *sc, video_adapter_t *adp,
struct uio *uio, int flag);
int genfbioctl(genfb_softc_t *sc, video_adapter_t *adp,
u_long cmd, caddr_t arg, int flag, struct proc *p);
int genfbmmap(genfb_softc_t *sc, video_adapter_t *adp,
vm_offset_t offset, int prot);
#endif /* FB_INSTALL_CDEV */
/* generic low-level driver functions */
@ -165,6 +202,8 @@ int fb_detach(dev_t dev, video_adapter_t *adp,
void fb_dump_adp_info(char *driver, video_adapter_t *adp, int level);
void fb_dump_mode_info(char *driver, video_adapter_t *adp,
video_info_t *info, int level);
int fb_type(int adp_type);
int fb_commonioctl(video_adapter_t *adp, u_long cmd, caddr_t arg);
#endif /* KERNEL */

View File

@ -35,8 +35,7 @@
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <sys/linker.h>
#include <machine/console.h>
#include <sys/fbio.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>
@ -51,7 +50,8 @@ static splash_decoder_t **decoder_set;
#define DECODER_ARRAY_DELTA 4
/* console driver callback */
static int (*splash_callback)(int);
static int (*splash_callback)(int, void *);
static void *splash_arg;
static int
splash_find_data(splash_decoder_t *decoder)
@ -98,7 +98,7 @@ splash_new(splash_decoder_t *decoder)
{
splash_decoder = decoder;
if (splash_callback != NULL)
(*splash_callback)(SPLASH_INIT);
(*splash_callback)(SPLASH_INIT, splash_arg);
}
int
@ -159,12 +159,13 @@ splash_unregister(splash_decoder_t *decoder)
}
int
splash_init(video_adapter_t *adp, int (*callback)(int))
splash_init(video_adapter_t *adp, int (*callback)(int, void *), void *arg)
{
int i;
splash_adp = adp;
splash_callback = callback;
splash_arg = arg;
splash_decoder = NULL;
for (i = 0; i < decoders; ++i) {
@ -187,9 +188,11 @@ splash_term(video_adapter_t *adp)
{
int error = 0;
if (splash_adp != adp)
return EINVAL;
if (splash_decoder != NULL) {
if (splash_callback != NULL)
error = (*splash_callback)(SPLASH_TERM);
error = (*splash_callback)(SPLASH_TERM, splash_arg);
if (error == 0)
error = (*splash_decoder->term)(adp);
if (error == 0)

View File

@ -24,15 +24,14 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: splash_bmp.c,v 1.7 1999/03/29 15:13:53 yokota Exp $
* $Id: splash_bmp.c,v 1.8 1999/06/16 14:04:45 yokota Exp $
*/
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/linker.h>
#include <machine/console.h>
#include <sys/fbio.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>

View File

@ -27,15 +27,14 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id$
* $Id: splash_pcx.c,v 1.1 1999/04/12 13:39:11 des Exp $
*/
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/linker.h>
#include <machine/console.h>
#include <sys/fbio.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>

View File

@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: splashreg.h,v 1.1 1999/01/09 02:44:49 yokota Exp $
* $Id: splashreg.h,v 1.2 1999/01/11 03:06:28 yokota Exp $
*/
#ifndef _DEV_FB_SPLASHREG_H_
@ -91,7 +91,8 @@ int splash_register(splash_decoder_t *decoder);
int splash_unregister(splash_decoder_t *decoder);
/* entry points for the console driver */
int splash_init(video_adapter_t *adp, int (*callback)(int));
int splash_init(video_adapter_t *adp, int (*callback)(int, void *),
void *arg);
int splash_term(video_adapter_t *adp);
int splash(video_adapter_t *adp, int on);

3041
sys/dev/fb/vga.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id:$
* $Id: vgareg.h,v 1.1 1999/01/09 02:44:49 yokota Exp $
*/
#ifndef _DEV_FB_VGAREG_H_
@ -60,8 +60,38 @@
#define GDCIDX (IO_VGA + 0x0E) /* graph data controller idx */
#define GDCREG (IO_VGA + 0x0F) /* graph data controller data */
#define VGA_DRIVER_NAME "vga"
#define VGA_UNIT(dev) minor(dev)
#define VGA_MKMINOR(unit) (unit)
#ifdef KERNEL
extern int (*vga_sub_configure)(int flags);
struct video_adapter;
typedef struct vga_softc {
struct video_adapter *adp;
#ifdef FB_INSTALL_CDEV
genfb_softc_t gensc;
#endif
} vga_softc_t;
int vga_probe_unit(int unit, struct video_adapter *adp, int flags);
int vga_attach_unit(int unit, vga_softc_t *sc, int flags);
#ifdef FB_INSTALL_CDEV
int vga_open(dev_t dev, vga_softc_t *sc, int flag, int mode,
struct proc *p);
int vga_close(dev_t dev, vga_softc_t *sc, int flag, int mode,
struct proc *p);
int vga_read(dev_t dev, vga_softc_t *sc, struct uio *uio, int flag);
int vga_write(dev_t dev, vga_softc_t *sc, struct uio *uio, int flag);
int vga_ioctl(dev_t dev, vga_softc_t *sc, u_long cmd, caddr_t arg,
int flag, struct proc *p);
int vga_mmap(dev_t dev, vga_softc_t *sc, vm_offset_t offset,
int prot);
#endif
extern int (*vga_sub_configure)(int flags);
#endif /* KERNEL */
#endif /* _DEV_FB_VGAREG_H_ */

View File

@ -30,7 +30,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: sio.c,v 1.248 1999/06/19 08:14:56 grog Exp $
* $Id: sio.c,v 1.249 1999/06/20 13:10:09 peter Exp $
* from: @(#)com.c 7.5 (Berkeley) 5/16/91
* from: i386/isa sio.c,v 1.234
*/
@ -2656,7 +2656,7 @@ static cn_checkc_t siocncheckc;
static cn_getc_t siocngetc;
static cn_putc_t siocnputc;
CONS_DRIVER(sio, siocnprobe, siocninit, siocngetc, siocncheckc, siocnputc);
CONS_DRIVER(sio, siocnprobe, siocninit, NULL, siocngetc, siocncheckc, siocnputc);
/* To get the GDB related variables */
#if DDB > 0
@ -2855,7 +2855,6 @@ siocnprobe(cp)
cp->cn_pri = COM_FORCECONSOLE(flags)
|| boothowto & RB_SERIAL
? CN_REMOTE : CN_NORMAL;
printf("sio%d: system console\n", unit);
siocniobase = iobase;
siocnunit = unit;
}
@ -2897,10 +2896,7 @@ siocnprobe(cp)
#ifdef __alpha__
struct consdev siocons = {
NULL, NULL, siocngetc, siocncheckc, siocnputc,
NULL, 0, CN_NORMAL,
};
CONS_DRIVER(sio, NULL, NULL, NULL, siocngetc, siocncheckc, siocnputc);
extern struct consdev *cn_tab;
@ -2915,6 +2911,8 @@ siocnattach(port, speed)
siocniobase = port;
comdefaultrate = speed;
sio_consdev.cn_pri = CN_NORMAL;
sio_consdev.cn_dev = makedev(CDEV_MAJOR, 0);
s = spltty();
@ -2938,8 +2936,7 @@ siocnattach(port, speed)
siocnopen(&sp, siocniobase, comdefaultrate);
splx(s);
siocons.cn_dev = makedev(CDEV_MAJOR, 0);
cn_tab = &siocons;
cn_tab = &sio_consdev;
return 0;
}

View File

@ -25,82 +25,35 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: blank_saver.c,v 1.14 1998/11/04 03:49:38 peter Exp $
* $Id: blank_saver.c,v 1.15 1999/01/11 03:18:44 yokota Exp $
*/
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/consio.h>
#include <sys/fbio.h>
#include <dev/fb/vgareg.h>
#include <i386/isa/isa.h>
#include <saver.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>
#include <dev/syscons/syscons.h>
static int
blank_saver(video_adapter_t *adp, int blank)
{
u_char val;
if (blank) {
switch (adp->va_type) {
case KD_VGA:
outb(TSIDX, 0x01); val = inb(TSREG);
outb(TSIDX, 0x01); outb(TSREG, val | 0x20);
break;
case KD_EGA:
/* not yet done XXX */
break;
case KD_CGA:
outb(adp->va_crtc_addr + 4, 0x25);
break;
case KD_MONO:
case KD_HERCULES:
outb(adp->va_crtc_addr + 4, 0x21);
break;
default:
break;
}
}
else {
switch (adp->va_type) {
case KD_VGA:
outb(TSIDX, 0x01); val = inb(TSREG);
outb(TSIDX, 0x01); outb(TSREG, val & 0xDF);
break;
case KD_EGA:
/* not yet done XXX */
break;
case KD_CGA:
outb(adp->va_crtc_addr + 4, 0x2d);
break;
case KD_MONO:
case KD_HERCULES:
outb(adp->va_crtc_addr + 4, 0x29);
break;
default:
break;
}
}
(*vidsw[adp->va_index]->blank_display)(adp,
(blank) ? V_DISPLAY_BLANK
: V_DISPLAY_ON);
return 0;
}
static int
blank_init(video_adapter_t *adp)
{
switch (adp->va_type) {
case KD_MONO:
case KD_HERCULES:
case KD_CGA:
case KD_VGA:
break;
case KD_EGA:
/* EGA is yet to be supported */
default:
return ENODEV;
}
return 0;
if ((*vidsw[adp->va_index]->blank_display)(adp, V_DISPLAY_ON) == 0)
return 0;
return ENODEV;
}
static int

View File

@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: daemon_saver.c,v 1.14 1999/01/17 14:25:08 yokota Exp $
* $Id: daemon_saver.c,v 1.15 1999/02/05 12:40:15 des Exp $
*/
#include <sys/param.h>
@ -34,21 +34,20 @@
#include <sys/malloc.h>
#include <sys/kernel.h>
#include <sys/sysctl.h>
#include <sys/consio.h>
#include <sys/fbio.h>
#include <machine/md_var.h>
#include <machine/pc/display.h>
#include <saver.h>
#define CONSOLE_VECT(x, y) \
(window + (y)*cur_console->xsize + (x))
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>
#include <dev/syscons/syscons.h>
#define DAEMON_MAX_WIDTH 32
#define DAEMON_MAX_HEIGHT 19
static char *message;
static int messagelen;
static u_short *window;
static int blanked;
/* Who is the author of this ASCII pic? */
@ -119,20 +118,23 @@ xflip_symbol(char symbol)
}
static void
clear_daemon(int xpos, int ypos, int dxdir, int xoff, int yoff,
clear_daemon(sc_softc_t *sc, int xpos, int ypos, int dxdir, int xoff, int yoff,
int xlen, int ylen)
{
int y;
if (xlen <= 0)
return;
for (y = yoff; y < ylen; y++)
fillw(((FG_LIGHTGREY|BG_BLACK) << 8) | scr_map[0x20],
CONSOLE_VECT(xpos + xoff, ypos + y), xlen - xoff);
for (y = yoff; y < ylen; y++) {
sc_vtb_erase(&sc->cur_scp->scr,
(ypos + y)*sc->cur_scp->xsize + xpos + xoff,
xlen - xoff,
sc->scr_map[0x20], (FG_LIGHTGREY | BG_BLACK) << 8);
}
}
static void
draw_daemon(int xpos, int ypos, int dxdir, int xoff, int yoff,
draw_daemon(sc_softc_t *sc, int xpos, int ypos, int dxdir, int xoff, int yoff,
int xlen, int ylen)
{
int x, y;
@ -148,41 +150,60 @@ draw_daemon(int xpos, int ypos, int dxdir, int xoff, int yoff,
continue;
for (x = xoff; (x < xlen) && (daemon_pic[y][px] != '\0'); x++, px++) {
switch (daemon_attr[y][px]) {
#ifndef PC98
case 'R': attr = (FG_LIGHTRED|BG_BLACK)<<8; break;
case 'Y': attr = (FG_YELLOW|BG_BLACK)<<8; break;
case 'B': attr = (FG_LIGHTBLUE|BG_BLACK)<<8; break;
case 'W': attr = (FG_LIGHTGREY|BG_BLACK)<<8; break;
case 'C': attr = (FG_CYAN|BG_BLACK)<<8; break;
default: attr = (FG_WHITE|BG_BLACK)<<8; break;
#else /* PC98 */
case 'R': attr = (FG_RED|BG_BLACK)<<8; break;
case 'Y': attr = (FG_BROWN|BG_BLACK)<<8; break;
case 'B': attr = (FG_BLUE|BG_BLACK)<<8; break;
case 'W': attr = (FG_LIGHTGREY|BG_BLACK)<<8; break;
case 'C': attr = (FG_CYAN|BG_BLACK)<<8; break;
default: attr = (FG_LIGHTGREY|BG_BLACK)<<8; break;
#endif /* PC98 */
}
if (dxdir < 0) { /* Moving left */
*CONSOLE_VECT(xpos + x, ypos + y) =
scr_map[daemon_pic[y][px]]|attr;
sc_vtb_putc(&sc->cur_scp->scr,
(ypos + y)*sc->cur_scp->xsize
+ xpos + x,
sc->scr_map[daemon_pic[y][px]],
attr);
} else { /* Moving right */
*CONSOLE_VECT(xpos + DAEMON_MAX_WIDTH - px - 1, ypos + y) =
scr_map[xflip_symbol(daemon_pic[y][px])]|attr;
sc_vtb_putc(&sc->cur_scp->scr,
(ypos + y)*sc->cur_scp->xsize
+ xpos + DAEMON_MAX_WIDTH
- px - 1,
sc->scr_map[xflip_symbol(daemon_pic[y][px])],
attr);
}
}
}
}
static void
clear_string(int xpos, int ypos, int xoff, char *s, int len)
clear_string(sc_softc_t *sc, int xpos, int ypos, int xoff, char *s, int len)
{
if (len <= 0)
return;
fillw(((FG_LIGHTGREY|BG_BLACK) << 8) | scr_map[0x20],
CONSOLE_VECT(xpos + xoff, ypos), len - xoff);
sc_vtb_erase(&sc->cur_scp->scr,
ypos*sc->cur_scp->xsize + xpos + xoff, len - xoff,
sc->scr_map[0x20], (FG_LIGHTGREY | BG_BLACK) << 8);
}
static void
draw_string(int xpos, int ypos, int xoff, char *s, int len)
draw_string(sc_softc_t *sc, int xpos, int ypos, int xoff, char *s, int len)
{
int x;
for (x = xoff; x < len; x++)
*CONSOLE_VECT(xpos + x, ypos) =
scr_map[s[x]]|(FG_LIGHTGREEN|BG_BLACK)<<8;
for (x = xoff; x < len; x++) {
sc_vtb_putc(&sc->cur_scp->scr,
ypos*sc->cur_scp->xsize + xpos + x,
sc->scr_map[s[x]], (FG_LIGHTGREEN | BG_BLACK) << 8);
}
}
static int
@ -195,17 +216,30 @@ daemon_saver(video_adapter_t *adp, int blank)
static int moved_daemon = 0;
static int xoff, yoff, toff;
static int xlen, ylen, tlen;
scr_stat *scp = cur_console;
sc_softc_t *sc;
scr_stat *scp;
int min, max;
sc = sc_find_softc(adp, NULL);
if (sc == NULL)
return EAGAIN;
scp = sc->cur_scp;
if (blank) {
if (adp->va_info.vi_flags & V_INFO_GRAPHICS)
return EAGAIN;
if (blanked == 0) {
window = (u_short *)adp->va_window;
#ifdef PC98
if (epson_machine_id == 0x20) {
outb(0x43f, 0x42);
outb(0x0c17, inb(0xc17) & ~0x08);
outb(0x43f, 0x40);
}
#endif /* PC98 */
/* clear the screen and set the border color */
fillw(((FG_LIGHTGREY|BG_BLACK) << 8) | scr_map[0x20],
window, scp->xsize * scp->ysize);
sc_vtb_clear(&scp->scr, sc->scr_map[0x20],
(FG_LIGHTGREY | BG_BLACK) << 8);
(*vidsw[adp->va_index]->set_hw_cursor)(adp, -1, -1);
set_border(scp, 0);
xlen = ylen = tlen = 0;
}
@ -213,8 +247,8 @@ daemon_saver(video_adapter_t *adp, int blank)
return 0;
blanked = 1;
clear_daemon(dxpos, dypos, dxdir, xoff, yoff, xlen, ylen);
clear_string(txpos, typos, toff, (char *)message, tlen);
clear_daemon(sc, dxpos, dypos, dxdir, xoff, yoff, xlen, ylen);
clear_string(sc, txpos, typos, toff, (char *)message, tlen);
if (++moved_daemon) {
/*
@ -319,9 +353,16 @@ daemon_saver(video_adapter_t *adp, int blank)
else if (txpos + tlen > scp->xsize)
tlen = scp->xsize - txpos;
draw_daemon(dxpos, dypos, dxdir, xoff, yoff, xlen, ylen);
draw_string(txpos, typos, toff, (char *)message, tlen);
draw_daemon(sc, dxpos, dypos, dxdir, xoff, yoff, xlen, ylen);
draw_string(sc, txpos, typos, toff, (char *)message, tlen);
} else {
#ifdef PC98
if (epson_machine_id == 0x20) {
outb(0x43f, 0x42);
outb(0x0c17, inb(0xc17) | 0x08);
outb(0x43f, 0x40);
}
#endif /* PC98 */
blanked = 0;
}
return 0;

View File

@ -25,17 +25,19 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: fade_saver.c,v 1.15 1998/11/04 03:49:38 peter Exp $
* $Id: fade_saver.c,v 1.16 1999/01/11 03:18:46 yokota Exp $
*/
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/consio.h>
#include <sys/fbio.h>
#include <i386/isa/isa.h>
#include <saver.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>
#include <dev/syscons/syscons.h>
static u_char palette[256*3];
static int blanked;
@ -49,11 +51,10 @@ fade_saver(video_adapter_t *adp, int blank)
if (blank) {
blanked = TRUE;
switch (adp->va_type) {
case KD_VGA:
if (ISPALAVAIL(adp->va_flags)) {
if (count <= 0)
save_palette(adp, palette);
if (count < 64) {
if (count < 256) {
pal[0] = pal[1] = pal[2] = 0;
for (i = 3; i < 256*3; i++) {
if (palette[i] - count > 60)
@ -64,39 +65,17 @@ fade_saver(video_adapter_t *adp, int blank)
load_palette(adp, pal);
count++;
}
break;
case KD_EGA:
/* not yet done XXX */
break;
case KD_CGA:
outb(adp->va_crtc_addr + 4, 0x25);
break;
case KD_MONO:
case KD_HERCULES:
outb(adp->va_crtc_addr + 4, 0x21);
break;
default:
break;
} else {
(*vidsw[adp->va_index]->blank_display)(adp,
V_DISPLAY_BLANK);
}
}
else {
switch (adp->va_type) {
case KD_VGA:
} else {
if (ISPALAVAIL(adp->va_flags)) {
load_palette(adp, palette);
count = 0;
break;
case KD_EGA:
/* not yet done XXX */
break;
case KD_CGA:
outb(adp->va_crtc_addr + 4, 0x2d);
break;
case KD_MONO:
case KD_HERCULES:
outb(adp->va_crtc_addr + 4, 0x29);
break;
default:
break;
} else {
(*vidsw[adp->va_index]->blank_display)(adp,
V_DISPLAY_ON);
}
blanked = FALSE;
}
@ -106,21 +85,9 @@ fade_saver(video_adapter_t *adp, int blank)
static int
fade_init(video_adapter_t *adp)
{
switch (adp->va_type) {
case KD_MONO:
case KD_HERCULES:
case KD_CGA:
/*
* `fade' saver is not fully implemented for MDA and CGA.
* It simply blanks the display instead.
*/
case KD_VGA:
break;
case KD_EGA:
/* EGA is yet to be supported */
default:
if (!ISPALAVAIL(adp->va_flags)
&& (*vidsw[adp->va_index]->blank_display)(adp, V_DISPLAY_ON) != 0)
return ENODEV;
}
blanked = FALSE;
return 0;
}

View File

@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: fire_saver.c,v 1.2.2.1 1999/05/10 15:20:30 des Exp $
* $Id: fire_saver.c,v 1.4 1999/05/10 15:25:50 des Exp $
*/
/*
@ -38,11 +38,14 @@
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/syslog.h>
#include <sys/consio.h>
#include <sys/fbio.h>
#include <machine/md_var.h>
#include <machine/random.h>
#include <saver.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>
#include <dev/syscons/syscons.h>
#define X_SIZE 320
#define Y_SIZE 200

View File

@ -25,93 +25,35 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: green_saver.c,v 1.14 1998/11/04 03:49:38 peter Exp $
* $Id: green_saver.c,v 1.15 1999/01/11 03:18:48 yokota Exp $
*/
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/consio.h>
#include <sys/fbio.h>
#include <dev/fb/vgareg.h>
#include <i386/isa/isa.h>
#include <saver.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>
#include <dev/syscons/syscons.h>
static int
green_saver(video_adapter_t *adp, int blank)
{
int crtc_addr;
u_char val;
crtc_addr = adp->va_crtc_addr;
if (blank) {
switch (adp->va_type) {
case KD_VGA:
outb(TSIDX, 0x01); val = inb(TSREG);
outb(TSIDX, 0x01); outb(TSREG, val | 0x20);
outb(crtc_addr, 0x17); val = inb(crtc_addr + 1);
outb(crtc_addr + 1, val & ~0x80);
break;
case KD_EGA:
/* not yet done XXX */
break;
case KD_CGA:
outb(crtc_addr + 4, 0x25);
break;
case KD_MONO:
case KD_HERCULES:
outb(crtc_addr + 4, 0x21);
break;
default:
break;
}
}
else {
switch (adp->va_type) {
case KD_VGA:
outb(TSIDX, 0x01); val = inb(TSREG);
outb(TSIDX, 0x01); outb(TSREG, val & 0xDF);
outb(crtc_addr, 0x17); val = inb(crtc_addr + 1);
outb(crtc_addr + 1, val | 0x80);
break;
case KD_EGA:
/* not yet done XXX */
break;
case KD_CGA:
outb(crtc_addr + 4, 0x2d);
break;
case KD_MONO:
case KD_HERCULES:
outb(crtc_addr + 4, 0x29);
break;
default:
break;
}
}
(*vidsw[adp->va_index]->blank_display)(adp,
(blank) ? V_DISPLAY_STAND_BY
: V_DISPLAY_ON);
return 0;
}
static int
green_init(video_adapter_t *adp)
{
switch (adp->va_type) {
case KD_MONO:
case KD_HERCULES:
case KD_CGA:
/*
* `green' saver is not fully implemented for MDA and CGA.
* It simply blanks the display instead.
*/
case KD_VGA:
break;
case KD_EGA:
/* EGA is yet to be supported */
default:
return ENODEV;
}
return 0;
if ((*vidsw[adp->va_index]->blank_display)(adp, V_DISPLAY_ON) == 0)
return 0;
return ENODEV;
}
static int

View File

@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: logo_saver.c,v 1.5 1999/02/05 12:40:15 des Exp $
* $Id: logo_saver.c,v 1.6 1999/04/12 13:34:57 des Exp $
*/
#include <sys/param.h>
@ -33,8 +33,12 @@
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/syslog.h>
#include <sys/consio.h>
#include <sys/fbio.h>
#include <saver.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>
#include <dev/syscons/syscons.h>
static u_char *vid;
static int banksize, scrmode, bpsl, scrw, scrh;
@ -104,6 +108,7 @@ logo_saver(video_adapter_t *adp, int blank)
#endif
blanked++;
vid = (u_char *)adp->va_window;
banksize = adp->va_window_size;
bpsl = adp->va_line_width;
splx(pl);
for (i = 0; i < bpsl*scrh; i += banksize) {
@ -132,7 +137,6 @@ logo_init(video_adapter_t *adp)
return ENODEV;
}
banksize = info.vi_window_size;
scrw = info.vi_width;
scrh = info.vi_height;
blanked = 0;

View File

@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: rain_saver.c,v 1.2 1999/01/11 03:18:50 yokota Exp $
* $Id: rain_saver.c,v 1.3 1999/04/12 13:34:57 des Exp $
*/
#include <sys/param.h>
@ -33,10 +33,14 @@
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/syslog.h>
#include <sys/consio.h>
#include <sys/fbio.h>
#include <machine/random.h>
#include <saver.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>
#include <dev/syscons/syscons.h>
static u_char *vid;

829
sys/dev/syscons/scgfbrndr.c Normal file
View File

@ -0,0 +1,829 @@
/*-
* Copyright (c) 1999 Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer as
* the first lines of this file unmodified.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id:$
*/
#include "sc.h"
#include "vga.h"
#include "opt_syscons.h"
#include "opt_vga.h"
#if NSC > 0 && NVGA > 0
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <machine/console.h>
#include <machine/md_var.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/vgareg.h>
#include <dev/syscons/syscons.h>
#include <isa/isareg.h>
#ifndef SC_MOUSE_CHAR
#define SC_MOUSE_CHAR (0xd0)
#endif
#ifndef SC_RENDER_DEBUG
#define SC_RENDER_DEBUG 0
#endif
static vr_clear_t vga_txtclear;
static vr_draw_border_t vga_txtborder;
static vr_draw_t vga_txtdraw;
static vr_set_cursor_t vga_txtcursor_shape;
static vr_draw_cursor_t vga_txtcursor;
static vr_blink_cursor_t vga_txtblink;
#ifndef SC_NO_CUTPASTE
static vr_draw_mouse_t vga_txtmouse;
#else
#define vga_txtmouse (vr_draw_mouse_t *)vga_nop
#endif
#ifdef SC_PIXEL_MODE
static vr_clear_t vga_pxlclear;
static vr_draw_border_t vga_pxlborder;
static vr_draw_t vga_egadraw;
static vr_draw_t vga_vgadraw;
static vr_set_cursor_t vga_pxlcursor_shape;
static vr_draw_cursor_t vga_pxlcursor;
static vr_blink_cursor_t vga_pxlblink;
#ifndef SC_NO_CUTPASTE
static vr_draw_mouse_t vga_pxlmouse;
#else
#define vga_pxlmouse (vr_draw_mouse_t *)vga_nop
#endif
#endif /* SC_PIXEL_MODE */
#ifndef SC_NO_MODE_CHANGE
static vr_draw_border_t vga_grborder;
#endif
static void vga_nop(scr_stat *scp, ...);
static sc_rndr_sw_t txtrndrsw = {
vga_txtclear,
vga_txtborder,
vga_txtdraw,
vga_txtcursor_shape,
vga_txtcursor,
vga_txtblink,
(vr_set_mouse_t *)vga_nop,
vga_txtmouse,
};
RENDERER(mda, 0, txtrndrsw);
RENDERER(cga, 0, txtrndrsw);
RENDERER(ega, 0, txtrndrsw);
RENDERER(vga, 0, txtrndrsw);
#ifdef SC_PIXEL_MODE
static sc_rndr_sw_t egarndrsw = {
vga_pxlclear,
vga_pxlborder,
vga_egadraw,
vga_pxlcursor_shape,
vga_pxlcursor,
vga_pxlblink,
(vr_set_mouse_t *)vga_nop,
vga_pxlmouse,
};
RENDERER(ega, PIXEL_MODE, egarndrsw);
static sc_rndr_sw_t vgarndrsw = {
vga_pxlclear,
vga_pxlborder,
vga_vgadraw,
vga_pxlcursor_shape,
vga_pxlcursor,
vga_pxlblink,
(vr_set_mouse_t *)vga_nop,
vga_pxlmouse,
};
RENDERER(vga, PIXEL_MODE, vgarndrsw);
#endif /* SC_PIXEL_MODE */
#ifndef SC_NO_MODE_CHANGE
static sc_rndr_sw_t grrndrsw = {
(vr_clear_t *)vga_nop,
vga_grborder,
(vr_draw_t *)vga_nop,
(vr_set_cursor_t *)vga_nop,
(vr_draw_cursor_t *)vga_nop,
(vr_blink_cursor_t *)vga_nop,
(vr_set_mouse_t *)vga_nop,
(vr_draw_mouse_t *)vga_nop,
};
RENDERER(cga, GRAPHICS_MODE, grrndrsw);
RENDERER(ega, GRAPHICS_MODE, grrndrsw);
RENDERER(vga, GRAPHICS_MODE, grrndrsw);
#endif /* SC_NO_MODE_CHANGE */
#ifndef SC_NO_CUTPASTE
static u_short mouse_and_mask[16] = {
0xc000, 0xe000, 0xf000, 0xf800, 0xfc00, 0xfe00, 0xff00, 0xff80,
0xfe00, 0x1e00, 0x1f00, 0x0f00, 0x0f00, 0x0000, 0x0000, 0x0000
};
static u_short mouse_or_mask[16] = {
0x0000, 0x4000, 0x6000, 0x7000, 0x7800, 0x7c00, 0x7e00, 0x6800,
0x0c00, 0x0c00, 0x0600, 0x0600, 0x0000, 0x0000, 0x0000, 0x0000
};
#endif
static void
vga_nop(scr_stat *scp, ...)
{
}
/* text mode renderer */
static void
vga_txtclear(scr_stat *scp, int c, int attr)
{
sc_vtb_clear(&scp->scr, c, attr);
}
static void
vga_txtborder(scr_stat *scp, int color)
{
(*vidsw[scp->sc->adapter]->set_border)(scp->sc->adp, color);
}
static void
vga_txtdraw(scr_stat *scp, int from, int count, int flip)
{
vm_offset_t p;
int c;
int a;
if (from + count > scp->xsize*scp->ysize)
count = scp->xsize*scp->ysize - from;
if (flip) {
for (p = sc_vtb_pointer(&scp->scr, from); count-- > 0; ++from) {
c = sc_vtb_getc(&scp->vtb, from);
a = sc_vtb_geta(&scp->vtb, from);
a = (a & 0x8800) | ((a & 0x7000) >> 4)
| ((a & 0x0700) << 4);
p = sc_vtb_putchar(&scp->scr, p, c, a);
}
} else {
sc_vtb_copy(&scp->vtb, from, &scp->scr, from, count);
}
}
static void
vga_txtcursor_shape(scr_stat *scp, int base, int height, int blink)
{
if (base < 0 || base >= scp->font_size)
return;
/* the caller may set height <= 0 in order to disable the cursor */
#if 0
scp->cursor_base = base;
scp->cursor_height = height;
#endif
(*vidsw[scp->sc->adapter]->set_hw_cursor_shape)(scp->sc->adp,
base, height,
scp->font_size, blink);
}
static void
vga_txtcursor(scr_stat *scp, int at, int blink, int on, int flip)
{
video_adapter_t *adp;
int cursor_attr;
if (scp->cursor_height <= 0) /* the text cursor is disabled */
return;
adp = scp->sc->adp;
if (blink) {
scp->status |= VR_CURSOR_BLINK;
if (on) {
scp->status |= VR_CURSOR_ON;
(*vidsw[adp->va_index]->set_hw_cursor)(adp,
at%scp->xsize,
at/scp->xsize);
} else {
if (scp->status & VR_CURSOR_ON)
(*vidsw[adp->va_index]->set_hw_cursor)(adp,
-1, -1);
scp->status &= ~VR_CURSOR_ON;
}
} else {
scp->status &= ~VR_CURSOR_BLINK;
if (on) {
scp->status |= VR_CURSOR_ON;
cursor_attr = sc_vtb_geta(&scp->vtb, at);
scp->cursor_saveunder_char = sc_vtb_getc(&scp->scr, at);
scp->cursor_saveunder_attr = cursor_attr;
if ((cursor_attr & 0x7000) == 0x7000) {
cursor_attr &= 0x8f00;
if ((cursor_attr & 0x0700) == 0)
cursor_attr |= 0x0700;
} else {
cursor_attr |= 0x7000;
if ((cursor_attr & 0x0700) == 0x0700)
cursor_attr &= 0xf000;
}
if (flip)
cursor_attr = (cursor_attr & 0x8800)
| ((cursor_attr & 0x7000) >> 4)
| ((cursor_attr & 0x0700) << 4);
sc_vtb_putc(&scp->scr, at,
sc_vtb_getc(&scp->scr, at),
cursor_attr);
} else {
cursor_attr = scp->cursor_saveunder_attr;
if (flip)
cursor_attr = (cursor_attr & 0x8800)
| ((cursor_attr & 0x7000) >> 4)
| ((cursor_attr & 0x0700) << 4);
if (scp->status & VR_CURSOR_ON)
sc_vtb_putc(&scp->scr, at,
scp->cursor_saveunder_char,
cursor_attr);
scp->status &= ~VR_CURSOR_ON;
}
}
}
static void
vga_txtblink(scr_stat *scp, int at, int flip)
{
}
#ifndef SC_NO_CUTPASTE
static void
draw_txtmouse(scr_stat *scp, int x, int y)
{
#ifndef SC_ALT_MOUSE_IMAGE
u_char font_buf[128];
u_short cursor[32];
int pos;
int xoffset, yoffset;
int crtc_addr;
int i;
/* prepare mousepointer char's bitmaps */
pos = (y/scp->font_size - scp->yoff)*scp->xsize + x/8 - scp->xoff;
bcopy(scp->font + sc_vtb_getc(&scp->vtb, pos)*scp->font_size,
&font_buf[0], scp->font_size);
bcopy(scp->font + sc_vtb_getc(&scp->vtb, pos + 1)*scp->font_size,
&font_buf[32], scp->font_size);
bcopy(scp->font
+ sc_vtb_getc(&scp->vtb, pos + scp->xsize)*scp->font_size,
&font_buf[64], scp->font_size);
bcopy(scp->font
+ sc_vtb_getc(&scp->vtb, pos + scp->xsize + 1)*scp->font_size,
&font_buf[96], scp->font_size);
for (i = 0; i < scp->font_size; ++i) {
cursor[i] = font_buf[i]<<8 | font_buf[i+32];
cursor[i + scp->font_size] = font_buf[i+64]<<8 | font_buf[i+96];
}
/* now and-or in the mousepointer image */
xoffset = x%8;
yoffset = y%scp->font_size;
for (i = 0; i < 16; ++i) {
cursor[i + yoffset] =
(cursor[i + yoffset] & ~(mouse_and_mask[i] >> xoffset))
| (mouse_or_mask[i] >> xoffset);
}
for (i = 0; i < scp->font_size; ++i) {
font_buf[i] = (cursor[i] & 0xff00) >> 8;
font_buf[i + 32] = cursor[i] & 0xff;
font_buf[i + 64] = (cursor[i + scp->font_size] & 0xff00) >> 8;
font_buf[i + 96] = cursor[i + scp->font_size] & 0xff;
}
#if 1
/* wait for vertical retrace to avoid jitter on some videocards */
crtc_addr = scp->sc->adp->va_crtc_addr;
while (!(inb(crtc_addr + 6) & 0x08)) /* idle */ ;
#endif
(*vidsw[scp->sc->adapter]->load_font)(scp->sc->adp, 0, 32, font_buf,
SC_MOUSE_CHAR, 4);
sc_vtb_putc(&scp->scr, pos, SC_MOUSE_CHAR, sc_vtb_geta(&scp->scr, pos));
/* FIXME: may be out of range! */
sc_vtb_putc(&scp->scr, pos + scp->xsize, SC_MOUSE_CHAR + 2,
sc_vtb_geta(&scp->scr, pos + scp->xsize));
if (x < (scp->xsize - 1)*8) {
sc_vtb_putc(&scp->scr, pos + 1, SC_MOUSE_CHAR + 1,
sc_vtb_geta(&scp->scr, pos + 1));
sc_vtb_putc(&scp->scr, pos + scp->xsize + 1, SC_MOUSE_CHAR + 3,
sc_vtb_geta(&scp->scr, pos + scp->xsize + 1));
}
#else /* SC_ALT_MOUSE_IMAGE */
/* Red, magenta and brown are mapped to green to to keep it readable */
static const int col_conv[16] = {
6, 6, 6, 6, 2, 2, 2, 6, 14, 14, 14, 14, 10, 10, 10, 14
};
int pos;
int color;
int a;
pos = (y/scp->font_size - scp->yoff)*scp->xsize + x/8 - scp->xoff;
a = sc_vtb_geta(&scp->scr, pos);
if (scp->sc->adp->va_flags & V_ADP_COLOR)
color = (col_conv[(a & 0xf000) >> 12] << 12)
| ((a & 0x0f00) | 0x0800);
else
color = ((a & 0xf000) >> 4) | ((a & 0x0f00) << 4);
sc_vtb_putc(&scp->scr, pos, sc_vtb_getc(&scp->scr, pos), color);
#endif /* SC_ALT_MOUSE_IMAGE */
}
static void
remove_txtmouse(scr_stat *scp, int x, int y)
{
}
static void
vga_txtmouse(scr_stat *scp, int x, int y, int on)
{
if (on)
draw_txtmouse(scp, x, y);
else
remove_txtmouse(scp, x, y);
}
#endif /* SC_NO_CUTPASTE */
#ifdef SC_PIXEL_MODE
/* pixel (raster text) mode renderer */
static void
vga_pxlclear(scr_stat *scp, int c, int attr)
{
vm_offset_t p;
int line_width;
int lines;
int i;
/* XXX: we are just filling the screen with the background color... */
outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
outw(GDCIDX, 0x0003); /* data rotate/function select */
outw(GDCIDX, 0x0f01); /* set/reset enable */
outw(GDCIDX, 0xff08); /* bit mask */
outw(GDCIDX, ((attr & 0xf000) >> 4) | 0x00); /* set/reset */
line_width = scp->sc->adp->va_line_width;
lines = scp->ysize*scp->font_size;
p = scp->sc->adp->va_window + line_width*scp->yoff*scp->font_size
+ scp->xoff;
for (i = 0; i < lines; ++i) {
bzero_io((void *)p, scp->xsize);
p += line_width;
}
outw(GDCIDX, 0x0000); /* set/reset */
outw(GDCIDX, 0x0001); /* set/reset enable */
}
static void
vga_pxlborder(scr_stat *scp, int color)
{
vm_offset_t p;
int line_width;
int i;
(*vidsw[scp->sc->adapter]->set_border)(scp->sc->adp, color);
outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
outw(GDCIDX, 0x0003); /* data rotate/function select */
outw(GDCIDX, 0x0f01); /* set/reset enable */
outw(GDCIDX, 0xff08); /* bit mask */
outw(GDCIDX, (color << 8) | 0x00); /* set/reset */
line_width = scp->sc->adp->va_line_width;
p = scp->sc->adp->va_window;
if (scp->yoff > 0) {
bzero_io((void *)p, line_width*scp->yoff*scp->font_size);
bzero_io((void *)(p + line_width*(scp->yoff + scp->ysize)
*scp->font_size),
line_width*(scp->ypixel
- (scp->yoff + scp->ysize)*scp->font_size));
}
if (scp->xoff > 0) {
for (i = 0; i < scp->ysize*scp->font_size; ++i) {
bzero_io((void *)(p + line_width
*(scp->yoff*scp->font_size + i)),
scp->xoff);
bzero_io((void *)(p + line_width
*(scp->yoff*scp->font_size + i)
+ scp->xoff + scp->xsize),
scp->xpixel/8 - scp->xoff - scp->xsize);
}
}
outw(GDCIDX, 0x0000); /* set/reset */
outw(GDCIDX, 0x0001); /* set/reset enable */
}
static void
vga_egadraw(scr_stat *scp, int from, int count, int flip)
{
vm_offset_t d;
vm_offset_t e;
u_char *f;
u_short bg;
u_short col1, col2;
int line_width;
int i, j;
int a;
u_char c;
line_width = scp->sc->adp->va_line_width;
d = scp->sc->adp->va_window
+ scp->xoff
+ scp->yoff*scp->font_size*line_width
+ (from%scp->xsize)
+ scp->font_size*line_width*(from/scp->xsize);
outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
outw(GDCIDX, 0x0003); /* data rotate/function select */
outw(GDCIDX, 0x0f01); /* set/reset enable */
bg = -1;
if (from + count > scp->xsize*scp->ysize)
count = scp->xsize*scp->ysize - from;
for (i = from; count-- > 0; ++i) {
a = sc_vtb_geta(&scp->vtb, i);
if (flip) {
col1 = ((a & 0x7000) >> 4) | (a & 0x0800);
col2 = ((a & 0x8000) >> 4) | (a & 0x0700);
} else {
col1 = (a & 0x0f00);
col2 = (a & 0xf000) >> 4;
}
/* set background color in EGA/VGA latch */
if (bg != col2) {
bg = col2;
outw(GDCIDX, bg | 0x00); /* set/reset */
outw(GDCIDX, 0xff08); /* bit mask */
writeb(d, 0);
c = readb(d); /* set bg color in the latch */
}
/* foreground color */
outw(GDCIDX, col1 | 0x00); /* set/reset */
e = d;
f = &(scp->font[sc_vtb_getc(&scp->vtb, i)*scp->font_size]);
for (j = 0; j < scp->font_size; ++j, ++f) {
outw(GDCIDX, (*f << 8) | 0x08); /* bit mask */
writeb(e, 0);
e += line_width;
}
++d;
if ((i % scp->xsize) == scp->xsize - 1)
d += scp->xoff*2
+ (scp->font_size - 1)*line_width;
}
outw(GDCIDX, 0x0000); /* set/reset */
outw(GDCIDX, 0x0001); /* set/reset enable */
outw(GDCIDX, 0xff08); /* bit mask */
}
static void
vga_vgadraw(scr_stat *scp, int from, int count, int flip)
{
vm_offset_t d;
vm_offset_t e;
u_char *f;
u_short bg;
u_short col1, col2;
int line_width;
int i, j;
int a;
u_char c;
line_width = scp->sc->adp->va_line_width;
d = scp->sc->adp->va_window
+ scp->xoff
+ scp->yoff*scp->font_size*line_width
+ (from%scp->xsize)
+ scp->font_size*line_width*(from/scp->xsize);
outw(GDCIDX, 0x0305); /* read mode 0, write mode 3 */
outw(GDCIDX, 0x0003); /* data rotate/function select */
outw(GDCIDX, 0x0f01); /* set/reset enable */
outw(GDCIDX, 0xff08); /* bit mask */
bg = -1;
if (from + count > scp->xsize*scp->ysize)
count = scp->xsize*scp->ysize - from;
for (i = from; count-- > 0; ++i) {
a = sc_vtb_geta(&scp->vtb, i);
if (flip) {
col1 = ((a & 0x7000) >> 4) | (a & 0x0800);
col2 = ((a & 0x8000) >> 4) | (a & 0x0700);
} else {
col1 = (a & 0x0f00);
col2 = (a & 0xf000) >> 4;
}
/* set background color in EGA/VGA latch */
if (bg != col2) {
bg = col2;
outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
outw(GDCIDX, bg | 0x00); /* set/reset */
writeb(d, 0);
c = readb(d); /* set bg color in the latch */
outw(GDCIDX, 0x0305); /* read mode 0, write mode 3 */
}
/* foreground color */
outw(GDCIDX, col1 | 0x00); /* set/reset */
e = d;
f = &(scp->font[sc_vtb_getc(&scp->vtb, i)*scp->font_size]);
for (j = 0; j < scp->font_size; ++j, ++f) {
writeb(e, *f);
e += line_width;
}
++d;
if ((i % scp->xsize) == scp->xsize - 1)
d += scp->xoff*2
+ (scp->font_size - 1)*line_width;
}
outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
outw(GDCIDX, 0x0000); /* set/reset */
outw(GDCIDX, 0x0001); /* set/reset enable */
}
static void
vga_pxlcursor_shape(scr_stat *scp, int base, int height, int blink)
{
if (base < 0 || base >= scp->font_size)
return;
/* the caller may set height <= 0 in order to disable the cursor */
#if 0
scp->cursor_base = base;
scp->cursor_height = height;
#endif
}
static void
draw_pxlcursor(scr_stat *scp, int at, int on, int flip)
{
vm_offset_t d;
u_char *f;
int line_width;
int height;
int col;
int a;
int i;
u_char c;
line_width = scp->sc->adp->va_line_width;
d = scp->sc->adp->va_window
+ scp->xoff
+ scp->yoff*scp->font_size*line_width
+ (at%scp->xsize)
+ scp->font_size*line_width*(at/scp->xsize)
+ (scp->font_size - scp->cursor_base - 1)*line_width;
outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
outw(GDCIDX, 0x0003); /* data rotate/function select */
outw(GDCIDX, 0x0f01); /* set/reset enable */
/* set background color in EGA/VGA latch */
a = sc_vtb_geta(&scp->vtb, at);
if (flip)
col = (on) ? ((a & 0xf000) >> 4) : (a & 0x0f00);
else
col = (on) ? (a & 0x0f00) : ((a & 0xf000) >> 4);
outw(GDCIDX, col | 0x00); /* set/reset */
outw(GDCIDX, 0xff08); /* bit mask */
writeb(d, 0);
c = readb(d); /* set bg color in the latch */
/* foreground color */
if (flip)
col = (on) ? (a & 0x0f00) : ((a & 0xf000) >> 4);
else
col = (on) ? ((a & 0xf000) >> 4) : (a & 0x0f00);
outw(GDCIDX, col | 0x00); /* set/reset */
f = &(scp->font[sc_vtb_getc(&scp->vtb, at)*scp->font_size
+ scp->font_size - scp->cursor_base - 1]);
height = imin(scp->cursor_height, scp->font_size);
for (i = 0; i < height; ++i, --f) {
outw(GDCIDX, (*f << 8) | 0x08); /* bit mask */
writeb(d, 0);
d -= line_width;
}
outw(GDCIDX, 0x0000); /* set/reset */
outw(GDCIDX, 0x0001); /* set/reset enable */
outw(GDCIDX, 0xff08); /* bit mask */
}
static void
vga_pxlcursor(scr_stat *scp, int at, int blink, int on, int flip)
{
if (scp->cursor_height <= 0) /* the text cursor is disabled */
return;
if (on) {
scp->status |= VR_CURSOR_ON;
draw_pxlcursor(scp, at, on, flip);
} else {
if (scp->status & VR_CURSOR_ON)
draw_pxlcursor(scp, at, on, flip);
scp->status &= ~VR_CURSOR_ON;
}
if (blink)
scp->status |= VR_CURSOR_BLINK;
else
scp->status &= ~VR_CURSOR_BLINK;
}
static void
vga_pxlblink(scr_stat *scp, int at, int flip)
{
static int blinkrate = 0;
if (!(scp->status & VR_CURSOR_BLINK))
return;
if (!(++blinkrate & 4))
return;
blinkrate = 0;
scp->status ^= VR_CURSOR_ON;
draw_pxlcursor(scp, at, scp->status & VR_CURSOR_ON, flip);
}
#ifndef SC_NO_CUTPASTE
static void
draw_pxlmouse(scr_stat *scp, int x, int y)
{
vm_offset_t p;
int line_width;
int xoff, yoff;
int ymax;
u_short m;
int i, j;
line_width = scp->sc->adp->va_line_width;
xoff = (x - scp->xoff*8)%8;
yoff = y - (y/line_width)*line_width;
ymax = imin(y + 16, scp->ypixel);
outw(GDCIDX, 0x0805); /* read mode 1, write mode 0 */
outw(GDCIDX, 0x0001); /* set/reset enable */
outw(GDCIDX, 0x0002); /* color compare */
outw(GDCIDX, 0x0007); /* color don't care */
outw(GDCIDX, 0xff08); /* bit mask */
outw(GDCIDX, 0x0803); /* data rotate/function select (and) */
p = scp->sc->adp->va_window + line_width*y + x/8;
if (x < scp->xpixel - 16) {
for (i = y, j = 0; i < ymax; ++i, ++j) {
m = ~(mouse_and_mask[j] >> xoff);
#ifdef __i386__
*(u_char *)p &= m >> 8;
*(u_char *)(p + 1) &= m;
#elif defined(__alpha__)
writeb(p, readb(p) & (m >> 8));
writeb(p + 1, readb(p + 1) & (m >> 8));
#endif
p += line_width;
}
} else {
xoff += 8;
for (i = y, j = 0; i < ymax; ++i, ++j) {
m = ~(mouse_and_mask[j] >> xoff);
#ifdef __i386__
*(u_char *)p &= m;
#elif defined(__alpha__)
writeb(p, readb(p) & (m >> 8));
#endif
p += line_width;
}
}
outw(GDCIDX, 0x1003); /* data rotate/function select (or) */
p = scp->sc->adp->va_window + line_width*y + x/8;
if (x < scp->xpixel - 16) {
for (i = y, j = 0; i < ymax; ++i, ++j) {
m = mouse_or_mask[j] >> xoff;
#ifdef __i386__
*(u_char *)p &= m >> 8;
*(u_char *)(p + 1) &= m;
#elif defined(__alpha__)
writeb(p, readb(p) & (m >> 8));
writeb(p + 1, readb(p + 1) & (m >> 8));
#endif
p += line_width;
}
} else {
for (i = y, j = 0; i < ymax; ++i, ++j) {
m = mouse_or_mask[j] >> xoff;
#ifdef __i386__
*(u_char *)p &= m;
#elif defined(__alpha__)
writeb(p, readb(p) & (m >> 8));
#endif
p += line_width;
}
}
outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
outw(GDCIDX, 0x0003); /* data rotate/function select */
}
static void
remove_pxlmouse(scr_stat *scp, int x, int y)
{
vm_offset_t p;
int col, row;
int pos;
int line_width;
int ymax;
int i;
/* erase the mouse cursor image */
col = x/8 - scp->xoff;
row = y/scp->font_size - scp->yoff;
pos = row*scp->xsize + col;
i = (col < scp->xsize - 1) ? 2 : 1;
(*scp->rndr->draw)(scp, pos, i, FALSE);
if (row < scp->ysize - 1)
(*scp->rndr->draw)(scp, pos + scp->xsize, i, FALSE);
/* paint border if necessary */
line_width = scp->sc->adp->va_line_width;
outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
outw(GDCIDX, 0x0003); /* data rotate/function select */
outw(GDCIDX, 0x0f01); /* set/reset enable */
outw(GDCIDX, 0xff08); /* bit mask */
outw(GDCIDX, (scp->border << 8) | 0x00); /* set/reset */
if (row == scp->ysize - 1) {
i = (scp->ysize + scp->yoff)*scp->font_size;
ymax = imin(i + scp->font_size, scp->ypixel);
p = scp->sc->adp->va_window + i*line_width + scp->xoff + col;
if (col < scp->xsize - 1) {
for (; i < ymax; ++i) {
writeb(p, 0);
writeb(p + 1, 0);
p += line_width;
}
} else {
for (; i < ymax; ++i) {
writeb(p, 0);
p += line_width;
}
}
}
if ((col == scp->xsize - 1) && (scp->xoff > 0)) {
i = (row + scp->yoff)*scp->font_size;
ymax = imin(i + scp->font_size*2, scp->ypixel);
p = scp->sc->adp->va_window + i*line_width
+ scp->xoff + scp->xsize;
for (; i < ymax; ++i) {
writeb(p, 0);
p += line_width;
}
}
outw(GDCIDX, 0x0000); /* set/reset */
outw(GDCIDX, 0x0001); /* set/reset enable */
}
static void
vga_pxlmouse(scr_stat *scp, int x, int y, int on)
{
if (on)
draw_pxlmouse(scp, x, y);
else
remove_pxlmouse(scp, x, y);
}
#endif /* SC_NO_CUTPASTE */
#endif /* SC_PIXEL_MODE */
#ifndef SC_NO_MODE_CHANGE
/* graphics mode renderer */
static void
vga_grborder(scr_stat *scp, int color)
{
(*vidsw[scp->sc->adapter]->set_border)(scp->sc->adp, color);
}
#endif
#endif /* NSC > 0 && NVGA > 0 */

222
sys/dev/syscons/schistory.c Normal file
View File

@ -0,0 +1,222 @@
/*-
* Copyright (c) 1999 Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp>
* Copyright (c) 1992-1998 Søren Schmidt
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer,
* without modification, immediately at the beginning of the file.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id:$
*/
#include "sc.h"
#include "opt_syscons.h"
#if NSC > 0
#ifndef SC_NO_HISTORY
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/tty.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <machine/console.h>
#include <dev/syscons/syscons.h>
#if !defined(SC_MAX_HISTORY_SIZE)
#define SC_MAX_HISTORY_SIZE (1000 * MAXCONS * NSC)
#endif
#if !defined(SC_HISTORY_SIZE)
#define SC_HISTORY_SIZE (ROW * 4)
#endif
#if (SC_HISTORY_SIZE * MAXCONS * NSC) > SC_MAX_HISTORY_SIZE
#undef SC_MAX_HISTORY_SIZE
#define SC_MAX_HISTORY_SIZE (SC_HISTORY_SIZE * MAXCONS * NSC)
#endif
/* local variables */
static int extra_history_size
= SC_MAX_HISTORY_SIZE - SC_HISTORY_SIZE*MAXCONS;
/* local functions */
static void history_to_screen(scr_stat *scp);
/* allocate a history buffer */
int
sc_alloc_history_buffer(scr_stat *scp, int lines, int wait)
{
/*
* syscons unconditionally allocates buffers upto
* SC_HISTORY_SIZE lines or scp->ysize lines, whichever
* is larger. A value greater than that is allowed,
* subject to extra_history_size.
*/
sc_vtb_t *history;
int cur_lines; /* current buffer size */
int min_lines; /* guaranteed buffer size */
if (lines <= 0)
lines = SC_HISTORY_SIZE; /* use the default value */
lines = imax(lines, scp->ysize);
min_lines = imax(SC_HISTORY_SIZE, scp->ysize);
history = scp->history;
scp->history = NULL;
if (history == NULL) {
cur_lines = 0;
} else {
cur_lines = sc_vtb_rows(history);
if (cur_lines > min_lines)
extra_history_size += cur_lines - min_lines;
sc_vtb_destroy(history);
}
if (lines > min_lines)
extra_history_size -= lines - min_lines;
history = (sc_vtb_t *)malloc(sizeof(*history),
M_DEVBUF, (wait) ? M_WAITOK : M_NOWAIT);
if (history != NULL)
sc_vtb_init(history, VTB_RINGBUFFER, scp->xsize, lines,
NULL, wait);
scp->history_pos = 0;
scp->history = history;
return 0;
}
/* copy entire screen into the top of the history buffer */
void
sc_hist_save(scr_stat *scp)
{
sc_vtb_append(&scp->vtb, 0, scp->history, scp->xsize*scp->ysize);
scp->history_pos = sc_vtb_tail(scp->history);
}
/* restore the screen by copying from the history buffer */
int
sc_hist_restore(scr_stat *scp)
{
int ret;
if (scp->history_pos != sc_vtb_tail(scp->history)) {
scp->history_pos = sc_vtb_tail(scp->history);
history_to_screen(scp);
ret = 0;
} else {
ret = 1;
}
sc_vtb_seek(scp->history, sc_vtb_pos(scp->history,
sc_vtb_tail(scp->history),
-scp->xsize*scp->ysize));
return ret;
}
/* copy screen-full of saved lines */
static void
history_to_screen(scr_stat *scp)
{
int pos;
int i;
pos = scp->history_pos;
for (i = 1; i <= scp->ysize; ++i) {
pos = sc_vtb_pos(scp->history, pos, -scp->xsize);
sc_vtb_copy(scp->history, pos,
&scp->vtb, scp->xsize*(scp->ysize - i),
scp->xsize);
}
mark_all(scp);
}
/* go to the tail of the history buffer */
void
sc_hist_home(scr_stat *scp)
{
scp->history_pos = sc_vtb_tail(scp->history);
history_to_screen(scp);
}
/* go to the top of the history buffer */
void
sc_hist_end(scr_stat *scp)
{
scp->history_pos = sc_vtb_pos(scp->history, sc_vtb_tail(scp->history),
scp->xsize*scp->ysize);
history_to_screen(scp);
}
/* move one line up */
int
sc_hist_up_line(scr_stat *scp)
{
if (sc_vtb_pos(scp->history, scp->history_pos, -(scp->xsize*scp->ysize))
== sc_vtb_tail(scp->history))
return -1;
scp->history_pos = sc_vtb_pos(scp->history, scp->history_pos,
-scp->xsize);
history_to_screen(scp);
return 0;
}
/* move one line down */
int
sc_hist_down_line(scr_stat *scp)
{
if (scp->history_pos == sc_vtb_tail(scp->history))
return -1;
scp->history_pos = sc_vtb_pos(scp->history, scp->history_pos,
scp->xsize);
history_to_screen(scp);
return 0;
}
int
sc_hist_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag,
struct proc *p)
{
scr_stat *scp;
switch (cmd) {
case CONS_HISTORY: /* set history size */
scp = sc_get_scr_stat(tp->t_dev);
if (*(int *)data <= 0)
return EINVAL;
if (scp->status & BUFFER_SAVED)
return EBUSY;
return sc_alloc_history_buffer(scp,
imax(*(int *)data, scp->ysize),
TRUE);
}
return ENOIOCTL;
}
#endif /* SC_NO_HISTORY */
#endif /* NSC */

1083
sys/dev/syscons/scmouse.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: scvesactl.c,v 1.9 1999/01/11 03:18:26 yokota Exp $
* $Id: scvesactl.c,v 1.10 1999/06/01 18:17:31 jlemon Exp $
*/
#include "sc.h"
@ -44,7 +44,6 @@
#include <sys/tty.h>
#include <sys/kernel.h>
#include <machine/apm_bios.h>
#include <machine/console.h>
#include <machine/pc/vesa.h>
@ -71,7 +70,7 @@ vesa_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
case SW_TEXT_132x25: case SW_TEXT_132x30:
case SW_TEXT_132x43: case SW_TEXT_132x50:
case SW_TEXT_132x60:
if (!(scp->adp->va_flags & V_ADP_MODECHANGE))
if (!(scp->sc->adp->va_flags & V_ADP_MODECHANGE))
return ENODEV;
return sc_set_text_mode(scp, tp, cmd & 0xff, 0, 0, 0);
@ -81,7 +80,7 @@ vesa_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
case SW_VESA_C132x43:
case SW_VESA_C132x50:
case SW_VESA_C132x60:
if (!(scp->adp->va_flags & V_ADP_MODECHANGE))
if (!(scp->sc->adp->va_flags & V_ADP_MODECHANGE))
return ENODEV;
mode = (cmd & 0xff) + M_VESA_BASE;
return sc_set_text_mode(scp, tp, mode, 0, 0, 0);
@ -107,7 +106,7 @@ vesa_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
case SW_VESA_1280x1024: case SW_VESA_CG1280x1024:
case SW_VESA_32K_1280: case SW_VESA_64K_1280:
case SW_VESA_FULL_1280:
if (!(scp->adp->va_flags & V_ADP_MODECHANGE))
if (!(scp->sc->adp->va_flags & V_ADP_MODECHANGE))
return ENODEV;
mode = (cmd & 0xff) + M_VESA_BASE;
return sc_set_graphics_mode(scp, tp, mode);

829
sys/dev/syscons/scvgarndr.c Normal file
View File

@ -0,0 +1,829 @@
/*-
* Copyright (c) 1999 Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer as
* the first lines of this file unmodified.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id:$
*/
#include "sc.h"
#include "vga.h"
#include "opt_syscons.h"
#include "opt_vga.h"
#if NSC > 0 && NVGA > 0
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <machine/console.h>
#include <machine/md_var.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/vgareg.h>
#include <dev/syscons/syscons.h>
#include <isa/isareg.h>
#ifndef SC_MOUSE_CHAR
#define SC_MOUSE_CHAR (0xd0)
#endif
#ifndef SC_RENDER_DEBUG
#define SC_RENDER_DEBUG 0
#endif
static vr_clear_t vga_txtclear;
static vr_draw_border_t vga_txtborder;
static vr_draw_t vga_txtdraw;
static vr_set_cursor_t vga_txtcursor_shape;
static vr_draw_cursor_t vga_txtcursor;
static vr_blink_cursor_t vga_txtblink;
#ifndef SC_NO_CUTPASTE
static vr_draw_mouse_t vga_txtmouse;
#else
#define vga_txtmouse (vr_draw_mouse_t *)vga_nop
#endif
#ifdef SC_PIXEL_MODE
static vr_clear_t vga_pxlclear;
static vr_draw_border_t vga_pxlborder;
static vr_draw_t vga_egadraw;
static vr_draw_t vga_vgadraw;
static vr_set_cursor_t vga_pxlcursor_shape;
static vr_draw_cursor_t vga_pxlcursor;
static vr_blink_cursor_t vga_pxlblink;
#ifndef SC_NO_CUTPASTE
static vr_draw_mouse_t vga_pxlmouse;
#else
#define vga_pxlmouse (vr_draw_mouse_t *)vga_nop
#endif
#endif /* SC_PIXEL_MODE */
#ifndef SC_NO_MODE_CHANGE
static vr_draw_border_t vga_grborder;
#endif
static void vga_nop(scr_stat *scp, ...);
static sc_rndr_sw_t txtrndrsw = {
vga_txtclear,
vga_txtborder,
vga_txtdraw,
vga_txtcursor_shape,
vga_txtcursor,
vga_txtblink,
(vr_set_mouse_t *)vga_nop,
vga_txtmouse,
};
RENDERER(mda, 0, txtrndrsw);
RENDERER(cga, 0, txtrndrsw);
RENDERER(ega, 0, txtrndrsw);
RENDERER(vga, 0, txtrndrsw);
#ifdef SC_PIXEL_MODE
static sc_rndr_sw_t egarndrsw = {
vga_pxlclear,
vga_pxlborder,
vga_egadraw,
vga_pxlcursor_shape,
vga_pxlcursor,
vga_pxlblink,
(vr_set_mouse_t *)vga_nop,
vga_pxlmouse,
};
RENDERER(ega, PIXEL_MODE, egarndrsw);
static sc_rndr_sw_t vgarndrsw = {
vga_pxlclear,
vga_pxlborder,
vga_vgadraw,
vga_pxlcursor_shape,
vga_pxlcursor,
vga_pxlblink,
(vr_set_mouse_t *)vga_nop,
vga_pxlmouse,
};
RENDERER(vga, PIXEL_MODE, vgarndrsw);
#endif /* SC_PIXEL_MODE */
#ifndef SC_NO_MODE_CHANGE
static sc_rndr_sw_t grrndrsw = {
(vr_clear_t *)vga_nop,
vga_grborder,
(vr_draw_t *)vga_nop,
(vr_set_cursor_t *)vga_nop,
(vr_draw_cursor_t *)vga_nop,
(vr_blink_cursor_t *)vga_nop,
(vr_set_mouse_t *)vga_nop,
(vr_draw_mouse_t *)vga_nop,
};
RENDERER(cga, GRAPHICS_MODE, grrndrsw);
RENDERER(ega, GRAPHICS_MODE, grrndrsw);
RENDERER(vga, GRAPHICS_MODE, grrndrsw);
#endif /* SC_NO_MODE_CHANGE */
#ifndef SC_NO_CUTPASTE
static u_short mouse_and_mask[16] = {
0xc000, 0xe000, 0xf000, 0xf800, 0xfc00, 0xfe00, 0xff00, 0xff80,
0xfe00, 0x1e00, 0x1f00, 0x0f00, 0x0f00, 0x0000, 0x0000, 0x0000
};
static u_short mouse_or_mask[16] = {
0x0000, 0x4000, 0x6000, 0x7000, 0x7800, 0x7c00, 0x7e00, 0x6800,
0x0c00, 0x0c00, 0x0600, 0x0600, 0x0000, 0x0000, 0x0000, 0x0000
};
#endif
static void
vga_nop(scr_stat *scp, ...)
{
}
/* text mode renderer */
static void
vga_txtclear(scr_stat *scp, int c, int attr)
{
sc_vtb_clear(&scp->scr, c, attr);
}
static void
vga_txtborder(scr_stat *scp, int color)
{
(*vidsw[scp->sc->adapter]->set_border)(scp->sc->adp, color);
}
static void
vga_txtdraw(scr_stat *scp, int from, int count, int flip)
{
vm_offset_t p;
int c;
int a;
if (from + count > scp->xsize*scp->ysize)
count = scp->xsize*scp->ysize - from;
if (flip) {
for (p = sc_vtb_pointer(&scp->scr, from); count-- > 0; ++from) {
c = sc_vtb_getc(&scp->vtb, from);
a = sc_vtb_geta(&scp->vtb, from);
a = (a & 0x8800) | ((a & 0x7000) >> 4)
| ((a & 0x0700) << 4);
p = sc_vtb_putchar(&scp->scr, p, c, a);
}
} else {
sc_vtb_copy(&scp->vtb, from, &scp->scr, from, count);
}
}
static void
vga_txtcursor_shape(scr_stat *scp, int base, int height, int blink)
{
if (base < 0 || base >= scp->font_size)
return;
/* the caller may set height <= 0 in order to disable the cursor */
#if 0
scp->cursor_base = base;
scp->cursor_height = height;
#endif
(*vidsw[scp->sc->adapter]->set_hw_cursor_shape)(scp->sc->adp,
base, height,
scp->font_size, blink);
}
static void
vga_txtcursor(scr_stat *scp, int at, int blink, int on, int flip)
{
video_adapter_t *adp;
int cursor_attr;
if (scp->cursor_height <= 0) /* the text cursor is disabled */
return;
adp = scp->sc->adp;
if (blink) {
scp->status |= VR_CURSOR_BLINK;
if (on) {
scp->status |= VR_CURSOR_ON;
(*vidsw[adp->va_index]->set_hw_cursor)(adp,
at%scp->xsize,
at/scp->xsize);
} else {
if (scp->status & VR_CURSOR_ON)
(*vidsw[adp->va_index]->set_hw_cursor)(adp,
-1, -1);
scp->status &= ~VR_CURSOR_ON;
}
} else {
scp->status &= ~VR_CURSOR_BLINK;
if (on) {
scp->status |= VR_CURSOR_ON;
cursor_attr = sc_vtb_geta(&scp->vtb, at);
scp->cursor_saveunder_char = sc_vtb_getc(&scp->scr, at);
scp->cursor_saveunder_attr = cursor_attr;
if ((cursor_attr & 0x7000) == 0x7000) {
cursor_attr &= 0x8f00;
if ((cursor_attr & 0x0700) == 0)
cursor_attr |= 0x0700;
} else {
cursor_attr |= 0x7000;
if ((cursor_attr & 0x0700) == 0x0700)
cursor_attr &= 0xf000;
}
if (flip)
cursor_attr = (cursor_attr & 0x8800)
| ((cursor_attr & 0x7000) >> 4)
| ((cursor_attr & 0x0700) << 4);
sc_vtb_putc(&scp->scr, at,
sc_vtb_getc(&scp->scr, at),
cursor_attr);
} else {
cursor_attr = scp->cursor_saveunder_attr;
if (flip)
cursor_attr = (cursor_attr & 0x8800)
| ((cursor_attr & 0x7000) >> 4)
| ((cursor_attr & 0x0700) << 4);
if (scp->status & VR_CURSOR_ON)
sc_vtb_putc(&scp->scr, at,
scp->cursor_saveunder_char,
cursor_attr);
scp->status &= ~VR_CURSOR_ON;
}
}
}
static void
vga_txtblink(scr_stat *scp, int at, int flip)
{
}
#ifndef SC_NO_CUTPASTE
static void
draw_txtmouse(scr_stat *scp, int x, int y)
{
#ifndef SC_ALT_MOUSE_IMAGE
u_char font_buf[128];
u_short cursor[32];
int pos;
int xoffset, yoffset;
int crtc_addr;
int i;
/* prepare mousepointer char's bitmaps */
pos = (y/scp->font_size - scp->yoff)*scp->xsize + x/8 - scp->xoff;
bcopy(scp->font + sc_vtb_getc(&scp->vtb, pos)*scp->font_size,
&font_buf[0], scp->font_size);
bcopy(scp->font + sc_vtb_getc(&scp->vtb, pos + 1)*scp->font_size,
&font_buf[32], scp->font_size);
bcopy(scp->font
+ sc_vtb_getc(&scp->vtb, pos + scp->xsize)*scp->font_size,
&font_buf[64], scp->font_size);
bcopy(scp->font
+ sc_vtb_getc(&scp->vtb, pos + scp->xsize + 1)*scp->font_size,
&font_buf[96], scp->font_size);
for (i = 0; i < scp->font_size; ++i) {
cursor[i] = font_buf[i]<<8 | font_buf[i+32];
cursor[i + scp->font_size] = font_buf[i+64]<<8 | font_buf[i+96];
}
/* now and-or in the mousepointer image */
xoffset = x%8;
yoffset = y%scp->font_size;
for (i = 0; i < 16; ++i) {
cursor[i + yoffset] =
(cursor[i + yoffset] & ~(mouse_and_mask[i] >> xoffset))
| (mouse_or_mask[i] >> xoffset);
}
for (i = 0; i < scp->font_size; ++i) {
font_buf[i] = (cursor[i] & 0xff00) >> 8;
font_buf[i + 32] = cursor[i] & 0xff;
font_buf[i + 64] = (cursor[i + scp->font_size] & 0xff00) >> 8;
font_buf[i + 96] = cursor[i + scp->font_size] & 0xff;
}
#if 1
/* wait for vertical retrace to avoid jitter on some videocards */
crtc_addr = scp->sc->adp->va_crtc_addr;
while (!(inb(crtc_addr + 6) & 0x08)) /* idle */ ;
#endif
(*vidsw[scp->sc->adapter]->load_font)(scp->sc->adp, 0, 32, font_buf,
SC_MOUSE_CHAR, 4);
sc_vtb_putc(&scp->scr, pos, SC_MOUSE_CHAR, sc_vtb_geta(&scp->scr, pos));
/* FIXME: may be out of range! */
sc_vtb_putc(&scp->scr, pos + scp->xsize, SC_MOUSE_CHAR + 2,
sc_vtb_geta(&scp->scr, pos + scp->xsize));
if (x < (scp->xsize - 1)*8) {
sc_vtb_putc(&scp->scr, pos + 1, SC_MOUSE_CHAR + 1,
sc_vtb_geta(&scp->scr, pos + 1));
sc_vtb_putc(&scp->scr, pos + scp->xsize + 1, SC_MOUSE_CHAR + 3,
sc_vtb_geta(&scp->scr, pos + scp->xsize + 1));
}
#else /* SC_ALT_MOUSE_IMAGE */
/* Red, magenta and brown are mapped to green to to keep it readable */
static const int col_conv[16] = {
6, 6, 6, 6, 2, 2, 2, 6, 14, 14, 14, 14, 10, 10, 10, 14
};
int pos;
int color;
int a;
pos = (y/scp->font_size - scp->yoff)*scp->xsize + x/8 - scp->xoff;
a = sc_vtb_geta(&scp->scr, pos);
if (scp->sc->adp->va_flags & V_ADP_COLOR)
color = (col_conv[(a & 0xf000) >> 12] << 12)
| ((a & 0x0f00) | 0x0800);
else
color = ((a & 0xf000) >> 4) | ((a & 0x0f00) << 4);
sc_vtb_putc(&scp->scr, pos, sc_vtb_getc(&scp->scr, pos), color);
#endif /* SC_ALT_MOUSE_IMAGE */
}
static void
remove_txtmouse(scr_stat *scp, int x, int y)
{
}
static void
vga_txtmouse(scr_stat *scp, int x, int y, int on)
{
if (on)
draw_txtmouse(scp, x, y);
else
remove_txtmouse(scp, x, y);
}
#endif /* SC_NO_CUTPASTE */
#ifdef SC_PIXEL_MODE
/* pixel (raster text) mode renderer */
static void
vga_pxlclear(scr_stat *scp, int c, int attr)
{
vm_offset_t p;
int line_width;
int lines;
int i;
/* XXX: we are just filling the screen with the background color... */
outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
outw(GDCIDX, 0x0003); /* data rotate/function select */
outw(GDCIDX, 0x0f01); /* set/reset enable */
outw(GDCIDX, 0xff08); /* bit mask */
outw(GDCIDX, ((attr & 0xf000) >> 4) | 0x00); /* set/reset */
line_width = scp->sc->adp->va_line_width;
lines = scp->ysize*scp->font_size;
p = scp->sc->adp->va_window + line_width*scp->yoff*scp->font_size
+ scp->xoff;
for (i = 0; i < lines; ++i) {
bzero_io((void *)p, scp->xsize);
p += line_width;
}
outw(GDCIDX, 0x0000); /* set/reset */
outw(GDCIDX, 0x0001); /* set/reset enable */
}
static void
vga_pxlborder(scr_stat *scp, int color)
{
vm_offset_t p;
int line_width;
int i;
(*vidsw[scp->sc->adapter]->set_border)(scp->sc->adp, color);
outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
outw(GDCIDX, 0x0003); /* data rotate/function select */
outw(GDCIDX, 0x0f01); /* set/reset enable */
outw(GDCIDX, 0xff08); /* bit mask */
outw(GDCIDX, (color << 8) | 0x00); /* set/reset */
line_width = scp->sc->adp->va_line_width;
p = scp->sc->adp->va_window;
if (scp->yoff > 0) {
bzero_io((void *)p, line_width*scp->yoff*scp->font_size);
bzero_io((void *)(p + line_width*(scp->yoff + scp->ysize)
*scp->font_size),
line_width*(scp->ypixel
- (scp->yoff + scp->ysize)*scp->font_size));
}
if (scp->xoff > 0) {
for (i = 0; i < scp->ysize*scp->font_size; ++i) {
bzero_io((void *)(p + line_width
*(scp->yoff*scp->font_size + i)),
scp->xoff);
bzero_io((void *)(p + line_width
*(scp->yoff*scp->font_size + i)
+ scp->xoff + scp->xsize),
scp->xpixel/8 - scp->xoff - scp->xsize);
}
}
outw(GDCIDX, 0x0000); /* set/reset */
outw(GDCIDX, 0x0001); /* set/reset enable */
}
static void
vga_egadraw(scr_stat *scp, int from, int count, int flip)
{
vm_offset_t d;
vm_offset_t e;
u_char *f;
u_short bg;
u_short col1, col2;
int line_width;
int i, j;
int a;
u_char c;
line_width = scp->sc->adp->va_line_width;
d = scp->sc->adp->va_window
+ scp->xoff
+ scp->yoff*scp->font_size*line_width
+ (from%scp->xsize)
+ scp->font_size*line_width*(from/scp->xsize);
outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
outw(GDCIDX, 0x0003); /* data rotate/function select */
outw(GDCIDX, 0x0f01); /* set/reset enable */
bg = -1;
if (from + count > scp->xsize*scp->ysize)
count = scp->xsize*scp->ysize - from;
for (i = from; count-- > 0; ++i) {
a = sc_vtb_geta(&scp->vtb, i);
if (flip) {
col1 = ((a & 0x7000) >> 4) | (a & 0x0800);
col2 = ((a & 0x8000) >> 4) | (a & 0x0700);
} else {
col1 = (a & 0x0f00);
col2 = (a & 0xf000) >> 4;
}
/* set background color in EGA/VGA latch */
if (bg != col2) {
bg = col2;
outw(GDCIDX, bg | 0x00); /* set/reset */
outw(GDCIDX, 0xff08); /* bit mask */
writeb(d, 0);
c = readb(d); /* set bg color in the latch */
}
/* foreground color */
outw(GDCIDX, col1 | 0x00); /* set/reset */
e = d;
f = &(scp->font[sc_vtb_getc(&scp->vtb, i)*scp->font_size]);
for (j = 0; j < scp->font_size; ++j, ++f) {
outw(GDCIDX, (*f << 8) | 0x08); /* bit mask */
writeb(e, 0);
e += line_width;
}
++d;
if ((i % scp->xsize) == scp->xsize - 1)
d += scp->xoff*2
+ (scp->font_size - 1)*line_width;
}
outw(GDCIDX, 0x0000); /* set/reset */
outw(GDCIDX, 0x0001); /* set/reset enable */
outw(GDCIDX, 0xff08); /* bit mask */
}
static void
vga_vgadraw(scr_stat *scp, int from, int count, int flip)
{
vm_offset_t d;
vm_offset_t e;
u_char *f;
u_short bg;
u_short col1, col2;
int line_width;
int i, j;
int a;
u_char c;
line_width = scp->sc->adp->va_line_width;
d = scp->sc->adp->va_window
+ scp->xoff
+ scp->yoff*scp->font_size*line_width
+ (from%scp->xsize)
+ scp->font_size*line_width*(from/scp->xsize);
outw(GDCIDX, 0x0305); /* read mode 0, write mode 3 */
outw(GDCIDX, 0x0003); /* data rotate/function select */
outw(GDCIDX, 0x0f01); /* set/reset enable */
outw(GDCIDX, 0xff08); /* bit mask */
bg = -1;
if (from + count > scp->xsize*scp->ysize)
count = scp->xsize*scp->ysize - from;
for (i = from; count-- > 0; ++i) {
a = sc_vtb_geta(&scp->vtb, i);
if (flip) {
col1 = ((a & 0x7000) >> 4) | (a & 0x0800);
col2 = ((a & 0x8000) >> 4) | (a & 0x0700);
} else {
col1 = (a & 0x0f00);
col2 = (a & 0xf000) >> 4;
}
/* set background color in EGA/VGA latch */
if (bg != col2) {
bg = col2;
outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
outw(GDCIDX, bg | 0x00); /* set/reset */
writeb(d, 0);
c = readb(d); /* set bg color in the latch */
outw(GDCIDX, 0x0305); /* read mode 0, write mode 3 */
}
/* foreground color */
outw(GDCIDX, col1 | 0x00); /* set/reset */
e = d;
f = &(scp->font[sc_vtb_getc(&scp->vtb, i)*scp->font_size]);
for (j = 0; j < scp->font_size; ++j, ++f) {
writeb(e, *f);
e += line_width;
}
++d;
if ((i % scp->xsize) == scp->xsize - 1)
d += scp->xoff*2
+ (scp->font_size - 1)*line_width;
}
outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
outw(GDCIDX, 0x0000); /* set/reset */
outw(GDCIDX, 0x0001); /* set/reset enable */
}
static void
vga_pxlcursor_shape(scr_stat *scp, int base, int height, int blink)
{
if (base < 0 || base >= scp->font_size)
return;
/* the caller may set height <= 0 in order to disable the cursor */
#if 0
scp->cursor_base = base;
scp->cursor_height = height;
#endif
}
static void
draw_pxlcursor(scr_stat *scp, int at, int on, int flip)
{
vm_offset_t d;
u_char *f;
int line_width;
int height;
int col;
int a;
int i;
u_char c;
line_width = scp->sc->adp->va_line_width;
d = scp->sc->adp->va_window
+ scp->xoff
+ scp->yoff*scp->font_size*line_width
+ (at%scp->xsize)
+ scp->font_size*line_width*(at/scp->xsize)
+ (scp->font_size - scp->cursor_base - 1)*line_width;
outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
outw(GDCIDX, 0x0003); /* data rotate/function select */
outw(GDCIDX, 0x0f01); /* set/reset enable */
/* set background color in EGA/VGA latch */
a = sc_vtb_geta(&scp->vtb, at);
if (flip)
col = (on) ? ((a & 0xf000) >> 4) : (a & 0x0f00);
else
col = (on) ? (a & 0x0f00) : ((a & 0xf000) >> 4);
outw(GDCIDX, col | 0x00); /* set/reset */
outw(GDCIDX, 0xff08); /* bit mask */
writeb(d, 0);
c = readb(d); /* set bg color in the latch */
/* foreground color */
if (flip)
col = (on) ? (a & 0x0f00) : ((a & 0xf000) >> 4);
else
col = (on) ? ((a & 0xf000) >> 4) : (a & 0x0f00);
outw(GDCIDX, col | 0x00); /* set/reset */
f = &(scp->font[sc_vtb_getc(&scp->vtb, at)*scp->font_size
+ scp->font_size - scp->cursor_base - 1]);
height = imin(scp->cursor_height, scp->font_size);
for (i = 0; i < height; ++i, --f) {
outw(GDCIDX, (*f << 8) | 0x08); /* bit mask */
writeb(d, 0);
d -= line_width;
}
outw(GDCIDX, 0x0000); /* set/reset */
outw(GDCIDX, 0x0001); /* set/reset enable */
outw(GDCIDX, 0xff08); /* bit mask */
}
static void
vga_pxlcursor(scr_stat *scp, int at, int blink, int on, int flip)
{
if (scp->cursor_height <= 0) /* the text cursor is disabled */
return;
if (on) {
scp->status |= VR_CURSOR_ON;
draw_pxlcursor(scp, at, on, flip);
} else {
if (scp->status & VR_CURSOR_ON)
draw_pxlcursor(scp, at, on, flip);
scp->status &= ~VR_CURSOR_ON;
}
if (blink)
scp->status |= VR_CURSOR_BLINK;
else
scp->status &= ~VR_CURSOR_BLINK;
}
static void
vga_pxlblink(scr_stat *scp, int at, int flip)
{
static int blinkrate = 0;
if (!(scp->status & VR_CURSOR_BLINK))
return;
if (!(++blinkrate & 4))
return;
blinkrate = 0;
scp->status ^= VR_CURSOR_ON;
draw_pxlcursor(scp, at, scp->status & VR_CURSOR_ON, flip);
}
#ifndef SC_NO_CUTPASTE
static void
draw_pxlmouse(scr_stat *scp, int x, int y)
{
vm_offset_t p;
int line_width;
int xoff, yoff;
int ymax;
u_short m;
int i, j;
line_width = scp->sc->adp->va_line_width;
xoff = (x - scp->xoff*8)%8;
yoff = y - (y/line_width)*line_width;
ymax = imin(y + 16, scp->ypixel);
outw(GDCIDX, 0x0805); /* read mode 1, write mode 0 */
outw(GDCIDX, 0x0001); /* set/reset enable */
outw(GDCIDX, 0x0002); /* color compare */
outw(GDCIDX, 0x0007); /* color don't care */
outw(GDCIDX, 0xff08); /* bit mask */
outw(GDCIDX, 0x0803); /* data rotate/function select (and) */
p = scp->sc->adp->va_window + line_width*y + x/8;
if (x < scp->xpixel - 16) {
for (i = y, j = 0; i < ymax; ++i, ++j) {
m = ~(mouse_and_mask[j] >> xoff);
#ifdef __i386__
*(u_char *)p &= m >> 8;
*(u_char *)(p + 1) &= m;
#elif defined(__alpha__)
writeb(p, readb(p) & (m >> 8));
writeb(p + 1, readb(p + 1) & (m >> 8));
#endif
p += line_width;
}
} else {
xoff += 8;
for (i = y, j = 0; i < ymax; ++i, ++j) {
m = ~(mouse_and_mask[j] >> xoff);
#ifdef __i386__
*(u_char *)p &= m;
#elif defined(__alpha__)
writeb(p, readb(p) & (m >> 8));
#endif
p += line_width;
}
}
outw(GDCIDX, 0x1003); /* data rotate/function select (or) */
p = scp->sc->adp->va_window + line_width*y + x/8;
if (x < scp->xpixel - 16) {
for (i = y, j = 0; i < ymax; ++i, ++j) {
m = mouse_or_mask[j] >> xoff;
#ifdef __i386__
*(u_char *)p &= m >> 8;
*(u_char *)(p + 1) &= m;
#elif defined(__alpha__)
writeb(p, readb(p) & (m >> 8));
writeb(p + 1, readb(p + 1) & (m >> 8));
#endif
p += line_width;
}
} else {
for (i = y, j = 0; i < ymax; ++i, ++j) {
m = mouse_or_mask[j] >> xoff;
#ifdef __i386__
*(u_char *)p &= m;
#elif defined(__alpha__)
writeb(p, readb(p) & (m >> 8));
#endif
p += line_width;
}
}
outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
outw(GDCIDX, 0x0003); /* data rotate/function select */
}
static void
remove_pxlmouse(scr_stat *scp, int x, int y)
{
vm_offset_t p;
int col, row;
int pos;
int line_width;
int ymax;
int i;
/* erase the mouse cursor image */
col = x/8 - scp->xoff;
row = y/scp->font_size - scp->yoff;
pos = row*scp->xsize + col;
i = (col < scp->xsize - 1) ? 2 : 1;
(*scp->rndr->draw)(scp, pos, i, FALSE);
if (row < scp->ysize - 1)
(*scp->rndr->draw)(scp, pos + scp->xsize, i, FALSE);
/* paint border if necessary */
line_width = scp->sc->adp->va_line_width;
outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
outw(GDCIDX, 0x0003); /* data rotate/function select */
outw(GDCIDX, 0x0f01); /* set/reset enable */
outw(GDCIDX, 0xff08); /* bit mask */
outw(GDCIDX, (scp->border << 8) | 0x00); /* set/reset */
if (row == scp->ysize - 1) {
i = (scp->ysize + scp->yoff)*scp->font_size;
ymax = imin(i + scp->font_size, scp->ypixel);
p = scp->sc->adp->va_window + i*line_width + scp->xoff + col;
if (col < scp->xsize - 1) {
for (; i < ymax; ++i) {
writeb(p, 0);
writeb(p + 1, 0);
p += line_width;
}
} else {
for (; i < ymax; ++i) {
writeb(p, 0);
p += line_width;
}
}
}
if ((col == scp->xsize - 1) && (scp->xoff > 0)) {
i = (row + scp->yoff)*scp->font_size;
ymax = imin(i + scp->font_size*2, scp->ypixel);
p = scp->sc->adp->va_window + i*line_width
+ scp->xoff + scp->xsize;
for (; i < ymax; ++i) {
writeb(p, 0);
p += line_width;
}
}
outw(GDCIDX, 0x0000); /* set/reset */
outw(GDCIDX, 0x0001); /* set/reset enable */
}
static void
vga_pxlmouse(scr_stat *scp, int x, int y, int on)
{
if (on)
draw_pxlmouse(scp, x, y);
else
remove_pxlmouse(scp, x, y);
}
#endif /* SC_NO_CUTPASTE */
#endif /* SC_PIXEL_MODE */
#ifndef SC_NO_MODE_CHANGE
/* graphics mode renderer */
static void
vga_grborder(scr_stat *scp, int color)
{
(*vidsw[scp->sc->adapter]->set_border)(scp->sc->adp, color);
}
#endif
#endif /* NSC > 0 && NVGA > 0 */

View File

@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: scvidctl.c,v 1.7 1999/01/19 11:31:16 yokota Exp $
* $Id: $
*/
#include "sc.h"
@ -37,19 +37,21 @@
#include <sys/tty.h>
#include <sys/kernel.h>
#ifdef __i386__
#include <machine/apm_bios.h>
#endif
#include <vm/vm.h>
#include <vm/pmap.h>
#include <machine/console.h>
#include <dev/fb/fbreg.h>
#include <dev/syscons/syscons.h>
/* for compatibility with previous versions */
/* 3.0-RELEASE used the following structure */
typedef struct old_video_adapter {
int va_index;
int va_type;
int va_flags;
/* flag bits are the same as the -CURRENT
#define V_ADP_COLOR (1<<0)
#define V_ADP_MODECHANGE (1<<1)
#define V_ADP_STATESAVE (1<<2)
@ -58,6 +60,7 @@ typedef struct old_video_adapter {
#define V_ADP_PALETTE (1<<5)
#define V_ADP_BORDER (1<<6)
#define V_ADP_VESA (1<<7)
*/
int va_crtc_addr;
u_int va_window; /* virtual address */
size_t va_window_size;
@ -71,39 +74,100 @@ typedef struct old_video_adapter {
#define OLD_CONS_ADPINFO _IOWR('c', 101, old_video_adapter_t)
/* variables */
extern scr_stat *cur_console;
extern int fonts_loaded;
extern int sc_history_size;
extern u_char palette[];
/* 3.1-RELEASE used the following structure */
typedef struct old_video_adapter_info {
int va_index;
int va_type;
char va_name[16];
int va_unit;
int va_flags;
int va_io_base;
int va_io_size;
int va_crtc_addr;
int va_mem_base;
int va_mem_size;
u_int va_window; /* virtual address */
size_t va_window_size;
size_t va_window_gran;
u_int va_buffer;;
size_t va_buffer_size;
int va_initial_mode;
int va_initial_bios_mode;
int va_mode;
int va_line_width;
} old_video_adapter_info_t;
#define OLD_CONS_ADPINFO2 _IOWR('c', 101, old_video_adapter_info_t)
/* 3.0-RELEASE and 3.1-RELEASE used the following structure */
typedef struct old_video_info {
int vi_mode;
int vi_flags;
/* flag bits are the same as the -CURRENT
#define V_INFO_COLOR (1<<0)
#define V_INFO_GRAPHICS (1<<1)
#define V_INFO_LINEAR (1<<2)
#define V_INFO_VESA (1<<3)
*/
int vi_width;
int vi_height;
int vi_cwidth;
int vi_cheight;
int vi_depth;
int vi_planes;
u_int vi_window; /* physical address */
size_t vi_window_size;
size_t vi_window_gran;
u_int vi_buffer; /* physical address */
size_t vi_buffer_size;
} old_video_info_t;
#define OLD_CONS_MODEINFO _IOWR('c', 102, old_video_info_t)
#define OLD_CONS_FINDMODE _IOWR('c', 103, old_video_info_t)
int
sc_set_text_mode(scr_stat *scp, struct tty *tp, int mode, int xsize, int ysize,
int fontsize)
{
video_info_t info;
sc_rndr_sw_t *rndr;
u_char *font;
int error;
int s;
int i;
if ((*vidsw[scp->ad]->get_info)(scp->adp, mode, &info))
if ((*vidsw[scp->sc->adapter]->get_info)(scp->sc->adp, mode, &info))
return ENODEV;
/* adjust argument values */
if (fontsize <= 0)
fontsize = info.vi_cheight;
if (fontsize < 14) {
fontsize = 8;
if (!(fonts_loaded & FONT_8))
#ifndef SC_NO_FONT_LOADING
if (!(scp->sc->fonts_loaded & FONT_8))
return EINVAL;
font = scp->sc->font_8;
#else
font = NULL;
#endif
} else if (fontsize >= 16) {
fontsize = 16;
if (!(fonts_loaded & FONT_16))
#ifndef SC_NO_FONT_LOADING
if (!(scp->sc->fonts_loaded & FONT_16))
return EINVAL;
font = scp->sc->font_16;
#else
font = NULL;
#endif
} else {
fontsize = 14;
if (!(fonts_loaded & FONT_14))
#ifndef SC_NO_FONT_LOADING
if (!(scp->sc->fonts_loaded & FONT_14))
return EINVAL;
font = scp->sc->font_14;
#else
font = NULL;
#endif
}
if ((xsize <= 0) || (xsize > info.vi_width))
xsize = info.vi_width;
@ -117,12 +181,13 @@ sc_set_text_mode(scr_stat *scp, struct tty *tp, int mode, int xsize, int ysize,
return error;
}
rndr = sc_render_match(scp, scp->sc->adp, 0);
if (rndr == NULL) {
splx(s);
return ENODEV;
}
/* set up scp */
if (scp->history != NULL)
i = imax(scp->history_size / scp->xsize
- imax(sc_history_size, scp->ysize), 0);
else
i = 0;
/*
* This is a kludge to fend off scrn_update() while we
* muck around with scp. XXX
@ -130,22 +195,27 @@ sc_set_text_mode(scr_stat *scp, struct tty *tp, int mode, int xsize, int ysize,
scp->status |= UNKNOWN_MODE;
scp->status &= ~(GRAPHICS_MODE | PIXEL_MODE);
scp->mode = mode;
scp->font_size = fontsize;
scp->xsize = xsize;
scp->ysize = ysize;
scp->xoff = 0;
scp->yoff = 0;
scp->xpixel = scp->xsize*8;
scp->ypixel = scp->ysize*fontsize;
scp->font = font;
scp->font_size = fontsize;
/* allocate buffers */
sc_alloc_scr_buffer(scp, TRUE, TRUE);
if (ISMOUSEAVAIL(scp->adp->va_flags))
sc_alloc_cut_buffer(scp, FALSE);
sc_alloc_history_buffer(scp, sc_history_size, i, FALSE);
#ifndef SC_NO_CUTPASTE
sc_alloc_cut_buffer(scp, FALSE);
#endif
#ifndef SC_NO_HISTORY
sc_alloc_history_buffer(scp, 0, FALSE);
#endif
scp->rndr = rndr;
splx(s);
if (scp == cur_console)
if (scp == scp->sc->cur_scp)
set_mode(scp);
scp->status &= ~UNKNOWN_MODE;
@ -164,11 +234,15 @@ sc_set_text_mode(scr_stat *scp, struct tty *tp, int mode, int xsize, int ysize,
int
sc_set_graphics_mode(scr_stat *scp, struct tty *tp, int mode)
{
#ifdef SC_NO_MODE_CHANGE
return ENODEV;
#else
video_info_t info;
sc_rndr_sw_t *rndr;
int error;
int s;
if ((*vidsw[scp->ad]->get_info)(scp->adp, mode, &info))
if ((*vidsw[scp->sc->adapter]->get_info)(scp->sc->adp, mode, &info))
return ENODEV;
/* stop screen saver, etc */
@ -178,22 +252,32 @@ sc_set_graphics_mode(scr_stat *scp, struct tty *tp, int mode)
return error;
}
rndr = sc_render_match(scp, scp->sc->adp, GRAPHICS_MODE);
if (rndr == NULL) {
splx(s);
return ENODEV;
}
/* set up scp */
scp->status |= (UNKNOWN_MODE | GRAPHICS_MODE);
scp->status &= ~PIXEL_MODE;
scp->mode = mode;
scp->xsize = info.vi_width/8;
scp->ysize = info.vi_height/info.vi_cheight;
scp->xoff = 0;
scp->yoff = 0;
scp->xpixel = info.vi_width;
scp->ypixel = info.vi_height;
scp->xsize = info.vi_width/8;
scp->ysize = info.vi_height/info.vi_cheight;
scp->font = NULL;
scp->font_size = FONT_NONE;
#ifndef SC_NO_SYSMOUSE
/* move the mouse cursor at the center of the screen */
sc_move_mouse(scp, scp->xpixel / 2, scp->ypixel / 2);
sc_mouse_move(scp, scp->xpixel / 2, scp->ypixel / 2);
#endif
scp->rndr = rndr;
splx(s);
if (scp == cur_console)
if (scp == scp->sc->cur_scp)
set_mode(scp);
/* clear_graphics();*/
scp->status &= ~UNKNOWN_MODE;
@ -208,18 +292,23 @@ sc_set_graphics_mode(scr_stat *scp, struct tty *tp, int mode)
}
return 0;
#endif /* SC_NO_MODE_CHANGE */
}
int
sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize,
int fontsize)
{
#ifndef SC_PIXEL_MODE
return ENODEV;
#else
video_info_t info;
sc_rndr_sw_t *rndr;
u_char *font;
int error;
int s;
int i;
if ((*vidsw[scp->ad]->get_info)(scp->adp, scp->mode, &info))
if ((*vidsw[scp->sc->adapter]->get_info)(scp->sc->adp, scp->mode, &info))
return ENODEV; /* this shouldn't happen */
#ifdef SC_VIDEO_DEBUG
@ -234,16 +323,31 @@ sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize,
fontsize = info.vi_cheight;
if (fontsize < 14) {
fontsize = 8;
if (!(fonts_loaded & FONT_8))
#ifndef SC_NO_FONT_LOADING
if (!(scp->sc->fonts_loaded & FONT_8))
return EINVAL;
font = scp->sc->font_8;
#else
font = NULL;
#endif
} else if (fontsize >= 16) {
fontsize = 16;
if (!(fonts_loaded & FONT_16))
#ifndef SC_NO_FONT_LOADING
if (!(scp->sc->fonts_loaded & FONT_16))
return EINVAL;
font = scp->sc->font_16;
#else
font = NULL;
#endif
} else {
fontsize = 14;
if (!(fonts_loaded & FONT_14))
#ifndef SC_NO_FONT_LOADING
if (!(scp->sc->fonts_loaded & FONT_14))
return EINVAL;
font = scp->sc->font_14;
#else
font = NULL;
#endif
}
if (xsize <= 0)
xsize = info.vi_width/8;
@ -254,8 +358,8 @@ sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize,
if (scp->scr_buf != NULL) {
printf("set_pixel_mode(): mode:%x, col:%d, row:%d, font:%d\n",
scp->mode, xsize, ysize, fontsize);
printf("set_pixel_mode(): window:%x, %dx%d, xoff:%d, yoff:%d\n",
scp->adp->va_window, info.vi_width, info.vi_height,
printf("set_pixel_mode(): window:%p, %dx%d, xoff:%d, yoff:%d\n",
(void *)scp->sc->adp->va_window, info.vi_width, info.vi_height,
(info.vi_width/8 - xsize)/2,
(info.vi_height/fontsize - ysize)/2);
}
@ -283,29 +387,37 @@ sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize,
return error;
}
rndr = sc_render_match(scp, scp->sc->adp, PIXEL_MODE);
if (rndr == NULL) {
splx(s);
return ENODEV;
}
/* set up scp */
if (scp->history != NULL)
i = imax(scp->history_size / scp->xsize
- imax(sc_history_size, scp->ysize), 0);
else
i = 0;
scp->status |= (UNKNOWN_MODE | PIXEL_MODE);
scp->status &= ~(GRAPHICS_MODE | MOUSE_ENABLED);
scp->status &= ~GRAPHICS_MODE;
scp->xsize = xsize;
scp->ysize = ysize;
scp->font_size = fontsize;
scp->xoff = (scp->xpixel/8 - xsize)/2;
scp->yoff = (scp->ypixel/fontsize - ysize)/2;
scp->font = font;
scp->font_size = fontsize;
/* allocate buffers */
sc_alloc_scr_buffer(scp, TRUE, TRUE);
if (ISMOUSEAVAIL(scp->adp->va_flags))
sc_alloc_cut_buffer(scp, FALSE);
sc_alloc_history_buffer(scp, sc_history_size, i, FALSE);
#ifndef SC_NO_CUTPASTE
sc_alloc_cut_buffer(scp, FALSE);
#endif
#ifndef SC_NO_HISTORY
sc_alloc_history_buffer(scp, 0, FALSE);
#endif
scp->rndr = rndr;
splx(s);
if (scp == cur_console)
if (scp == scp->sc->cur_scp) {
set_border(scp, scp->border);
sc_set_cursor_image(scp);
}
scp->status &= ~UNKNOWN_MODE;
@ -323,99 +435,182 @@ sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize,
}
return 0;
#endif /* SC_PIXEL_MODE */
}
sc_rndr_sw_t
*sc_render_match(scr_stat *scp, video_adapter_t *adp, int mode)
{
const sc_renderer_t **list;
const sc_renderer_t *p;
list = (const sc_renderer_t **)scrndr_set.ls_items;
while ((p = *list++) != NULL) {
if ((strcmp(p->name, adp->va_name) == 0)
&& (mode == p->mode)) {
scp->status &= ~(VR_CURSOR_ON | VR_CURSOR_BLINK);
return p->rndrsw;
}
}
return NULL;
}
#define fb_ioctl(a, c, d) \
(((a) == NULL) ? ENODEV : \
(*vidsw[(a)->va_index]->ioctl)((a), (c), (caddr_t)(d)))
int
sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
{
scr_stat *scp;
video_adapter_t *adp;
video_info_t info;
video_adapter_info_t adp_info;
int error;
int s;
scp = sc_get_scr_stat(tp->t_dev);
if (scp == NULL) /* tp == SC_MOUSE */
return ENOIOCTL;
adp = scp->sc->adp;
if (adp == NULL) /* shouldn't happen??? */
return ENODEV;
switch (cmd) {
case CONS_CURRENT: /* get current adapter type */
if (scp->adp == NULL)
return ENODEV;
*(int *)data = scp->adp->va_type;
return 0;
case CONS_CURRENTADP: /* get current adapter index */
*(int *)data = scp->ad;
case FBIO_ADAPTER:
return fb_ioctl(adp, FBIO_ADAPTER, data);
case CONS_CURRENT: /* get current adapter type */
case FBIO_ADPTYPE:
return fb_ioctl(adp, FBIO_ADPTYPE, data);
case OLD_CONS_ADPINFO: /* adapter information (old interface) */
if (((old_video_adapter_t *)data)->va_index >= 0) {
adp = vid_get_adapter(((old_video_adapter_t *)data)->va_index);
if (adp == NULL)
return ENODEV;
}
((old_video_adapter_t *)data)->va_index = adp->va_index;
((old_video_adapter_t *)data)->va_type = adp->va_type;
((old_video_adapter_t *)data)->va_flags = adp->va_flags;
((old_video_adapter_t *)data)->va_crtc_addr = adp->va_crtc_addr;
((old_video_adapter_t *)data)->va_window = adp->va_window;
((old_video_adapter_t *)data)->va_window_size = adp->va_window_size;
((old_video_adapter_t *)data)->va_window_gran = adp->va_window_gran;
((old_video_adapter_t *)data)->va_buffer = adp->va_buffer;
((old_video_adapter_t *)data)->va_buffer_size = adp->va_buffer_size;
((old_video_adapter_t *)data)->va_mode = adp->va_mode;
((old_video_adapter_t *)data)->va_initial_mode = adp->va_initial_mode;
((old_video_adapter_t *)data)->va_initial_bios_mode
= adp->va_initial_bios_mode;
return 0;
case OLD_CONS_ADPINFO: /* adapter information */
if (scp->adp == NULL)
return ENODEV;
((old_video_adapter_t *)data)->va_index = scp->adp->va_index;
((old_video_adapter_t *)data)->va_type = scp->adp->va_type;
((old_video_adapter_t *)data)->va_flags = scp->adp->va_flags;
((old_video_adapter_t *)data)->va_crtc_addr = scp->adp->va_crtc_addr;
((old_video_adapter_t *)data)->va_window = scp->adp->va_window;
((old_video_adapter_t *)data)->va_window_size
= scp->adp->va_window_size;
((old_video_adapter_t *)data)->va_window_gran
= scp->adp->va_window_gran;
((old_video_adapter_t *)data)->va_buffer = scp->adp->va_buffer;
((old_video_adapter_t *)data)->va_buffer_size
= scp->adp->va_buffer_size;
((old_video_adapter_t *)data)->va_mode = scp->adp->va_mode;
((old_video_adapter_t *)data)->va_initial_mode
= scp->adp->va_initial_mode;
((old_video_adapter_t *)data)->va_initial_bios_mode
= scp->adp->va_initial_bios_mode;
return 0;
case OLD_CONS_ADPINFO2: /* adapter information (yet another old I/F) */
adp_info.va_index = ((old_video_adapter_info_t *)data)->va_index;
if (adp_info.va_index >= 0) {
adp = vid_get_adapter(adp_info.va_index);
if (adp == NULL)
return ENODEV;
}
error = fb_ioctl(adp, FBIO_ADPINFO, &adp_info);
if (error == 0)
bcopy(&adp_info, data, sizeof(old_video_adapter_info_t));
return error;
case CONS_ADPINFO: /* adapter information */
if (scp->adp == NULL)
return ENODEV;
((video_adapter_info_t *)data)->va_index = scp->adp->va_index;
((video_adapter_info_t *)data)->va_type = scp->adp->va_type;
bcopy(scp->adp->va_name, ((video_adapter_info_t *)data)->va_name,
imin(strlen(scp->adp->va_name) + 1,
sizeof(((video_adapter_info_t *)data)->va_name)));
((video_adapter_info_t *)data)->va_unit = scp->adp->va_unit;
((video_adapter_info_t *)data)->va_flags = scp->adp->va_flags;
((video_adapter_info_t *)data)->va_io_base = scp->adp->va_io_base;
((video_adapter_info_t *)data)->va_io_size = scp->adp->va_io_size;
((video_adapter_info_t *)data)->va_crtc_addr = scp->adp->va_crtc_addr;
((video_adapter_info_t *)data)->va_mem_base = scp->adp->va_mem_base;
((video_adapter_info_t *)data)->va_mem_size = scp->adp->va_mem_size;
((video_adapter_info_t *)data)->va_window = scp->adp->va_window;
((video_adapter_info_t *)data)->va_window_size
= scp->adp->va_window_size;
((video_adapter_info_t *)data)->va_window_gran
= scp->adp->va_window_gran;
((video_adapter_info_t *)data)->va_buffer = scp->adp->va_buffer;
((video_adapter_info_t *)data)->va_buffer_size
= scp->adp->va_buffer_size;
((video_adapter_info_t *)data)->va_mode = scp->adp->va_mode;
((video_adapter_info_t *)data)->va_initial_mode
= scp->adp->va_initial_mode;
((video_adapter_info_t *)data)->va_initial_bios_mode
= scp->adp->va_initial_bios_mode;
((video_adapter_info_t *)data)->va_line_width = scp->adp->va_line_width;
return 0;
case FBIO_ADPINFO:
if (((video_adapter_info_t *)data)->va_index >= 0) {
adp = vid_get_adapter(((video_adapter_info_t *)data)->va_index);
if (adp == NULL)
return ENODEV;
}
return fb_ioctl(adp, FBIO_ADPINFO, data);
case CONS_GET: /* get current video mode */
case FBIO_GETMODE:
*(int *)data = scp->mode;
return 0;
#ifndef SC_NO_MODE_CHANGE
case FBIO_SETMODE: /* set video mode */
if (!(adp->va_flags & V_ADP_MODECHANGE))
return ENODEV;
info.vi_mode = *(int *)data;
error = fb_ioctl(adp, FBIO_MODEINFO, &info);
if (error)
return error;
if (info.vi_flags & V_INFO_GRAPHICS)
return sc_set_graphics_mode(scp, tp, *(int *)data);
else
return sc_set_text_mode(scp, tp, *(int *)data, 0, 0, 0);
#endif /* SC_NO_MODE_CHANGE */
case OLD_CONS_MODEINFO: /* get mode information (old infterface) */
info.vi_mode = ((old_video_info_t *)data)->vi_mode;
error = fb_ioctl(adp, FBIO_MODEINFO, &info);
if (error == 0)
bcopy(&info, (old_video_info_t *)data, sizeof(old_video_info_t));
return error;
case CONS_MODEINFO: /* get mode information */
return ((*vidsw[scp->ad]->get_info)(scp->adp,
((video_info_t *)data)->vi_mode, (video_info_t *)data)
? ENODEV : 0);
case FBIO_MODEINFO:
return fb_ioctl(adp, FBIO_MODEINFO, data);
case OLD_CONS_FINDMODE: /* find a matching video mode (old interface) */
bzero(&info, sizeof(info));
bcopy((old_video_info_t *)data, &info, sizeof(old_video_info_t));
error = fb_ioctl(adp, FBIO_FINDMODE, &info);
if (error == 0)
bcopy(&info, (old_video_info_t *)data, sizeof(old_video_info_t));
return error;
case CONS_FINDMODE: /* find a matching video mode */
return ((*vidsw[scp->ad]->query_mode)(scp->adp, (video_info_t *)data)
? ENODEV : 0);
case FBIO_FINDMODE:
return fb_ioctl(adp, FBIO_FINDMODE, data);
case CONS_SETWINORG:
return ((*vidsw[scp->ad]->set_win_org)(scp->adp, *(u_int *)data)
? ENODEV : 0);
case CONS_SETWINORG: /* set frame buffer window origin */
case FBIO_SETWINORG:
if (scp != scp->sc->cur_scp)
return ENODEV; /* XXX */
return fb_ioctl(adp, FBIO_SETWINORG, data);
case FBIO_GETWINORG: /* get frame buffer window origin */
if (scp != scp->sc->cur_scp)
return ENODEV; /* XXX */
return fb_ioctl(adp, FBIO_GETWINORG, data);
case FBIO_GETDISPSTART:
case FBIO_SETDISPSTART:
case FBIO_GETLINEWIDTH:
case FBIO_SETLINEWIDTH:
if (scp != scp->sc->cur_scp)
return ENODEV; /* XXX */
return fb_ioctl(adp, cmd, data);
/* XXX */
case FBIO_GETPALETTE:
case FBIO_SETPALETTE:
case FBIOPUTCMAP:
case FBIOGETCMAP:
return ENODEV;
case FBIOGTYPE:
case FBIOGATTR:
case FBIOSVIDEO:
case FBIOGVIDEO:
case FBIOSCURSOR:
case FBIOGCURSOR:
case FBIOSCURPOS:
case FBIOGCURPOS:
case FBIOGCURMAX:
if (scp != scp->sc->cur_scp)
return ENODEV; /* XXX */
return fb_ioctl(adp, cmd, data);
#ifndef SC_NO_MODE_CHANGE
/* generic text modes */
case SW_TEXT_80x25: case SW_TEXT_80x30:
case SW_TEXT_80x43: case SW_TEXT_80x50:
@ -428,6 +623,11 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
case SW_VGA_C80x30: case SW_VGA_M80x30:
case SW_VGA_C80x50: case SW_VGA_M80x50:
case SW_VGA_C80x60: case SW_VGA_M80x60:
case SW_VGA_C90x25: case SW_VGA_M90x25:
case SW_VGA_C90x30: case SW_VGA_M90x30:
case SW_VGA_C90x43: case SW_VGA_M90x43:
case SW_VGA_C90x50: case SW_VGA_M90x50:
case SW_VGA_C90x60: case SW_VGA_M90x60:
case SW_B40x25: case SW_C40x25:
case SW_B80x25: case SW_C80x25:
case SW_ENH_B40x25: case SW_ENH_C40x25:
@ -440,7 +640,7 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
case SW_PC98_80x25:
case SW_PC98_80x30:
#endif
if (!(scp->adp->va_flags & V_ADP_MODECHANGE))
if (!(adp->va_flags & V_ADP_MODECHANGE))
return ENODEV;
return sc_set_text_mode(scp, tp, cmd & 0xff, 0, 0, 0);
@ -450,9 +650,10 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
case SW_CG640x350: case SW_ENH_CG640:
case SW_BG640x480: case SW_CG640x480: case SW_VGA_CG320:
case SW_VGA_MODEX:
if (!(scp->adp->va_flags & V_ADP_MODECHANGE))
if (!(adp->va_flags & V_ADP_MODECHANGE))
return ENODEV;
return sc_set_graphics_mode(scp, tp, cmd & 0xff);
#endif /* SC_NO_MODE_CHANGE */
case KDSETMODE: /* set current mode of this (virtual) console */
switch (*(int *)data) {
@ -465,24 +666,31 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
return EINVAL;
/* restore fonts & palette ! */
#if 0
if (ISFONTAVAIL(scp->adp->va_flags)
#ifndef SC_NO_FONT_LOADING
if (ISFONTAVAIL(adp->va_flags)
&& !(scp->status & (GRAPHICS_MODE | PIXEL_MODE)))
/*
* FONT KLUDGE
* Don't load fonts for now... XXX
*/
if (fonts_loaded & FONT_8)
copy_font(scp, LOAD, 8, font_8);
if (fonts_loaded & FONT_14)
copy_font(scp, LOAD, 14, font_14);
if (fonts_loaded & FONT_16)
copy_font(scp, LOAD, 16, font_16);
if (scp->sc->fonts_loaded & FONT_8)
copy_font(scp, LOAD, 8, scp->sc->font_8);
if (scp->sc->fonts_loaded & FONT_14)
copy_font(scp, LOAD, 14, scp->sc->font_14);
if (scp->sc->fonts_loaded & FONT_16)
copy_font(scp, LOAD, 16, scp->sc->font_16);
}
#endif /* SC_NO_FONT_LOADING */
#endif
load_palette(scp->adp, palette);
#ifndef SC_NO_PALETTE_LOADING
load_palette(adp, scp->sc->palette);
#endif
#ifndef PC98
/* move hardware cursor out of the way */
(*vidsw[scp->ad]->set_hw_cursor)(scp->adp, -1, -1);
(*vidsw[adp->va_index]->set_hw_cursor)(adp, -1, -1);
#endif
/* FALL THROUGH */
@ -502,20 +710,21 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
scp->status |= UNKNOWN_MODE;
splx(s);
/* no restore fonts & palette */
if (scp == cur_console)
if (scp == scp->sc->cur_scp)
set_mode(scp);
sc_clear_screen(scp);
scp->status &= ~UNKNOWN_MODE;
#else /* PC98 */
scp->status &= ~UNKNOWN_MODE;
/* no restore fonts & palette */
if (scp == cur_console)
if (scp == scp->sc->cur_scp)
set_mode(scp);
sc_clear_screen(scp);
splx(s);
#endif /* PC98 */
return 0;
#ifdef SC_PIXEL_MODE
case KD_PIXEL: /* pixel (raster) display */
if (!(scp->status & (GRAPHICS_MODE | PIXEL_MODE)))
return EINVAL;
@ -529,13 +738,16 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
}
scp->status |= (UNKNOWN_MODE | PIXEL_MODE);
splx(s);
if (scp == cur_console) {
if (scp == scp->sc->cur_scp) {
set_mode(scp);
load_palette(scp->adp, palette);
#ifndef SC_NO_PALETTE_LOADING
load_palette(adp, scp->sc->palette);
#endif
}
sc_clear_screen(scp);
scp->status &= ~UNKNOWN_MODE;
return 0;
#endif /* SC_PIXEL_MODE */
case KD_GRAPHICS: /* switch to GRAPHICS (unknown) mode */
s = spltty();
@ -546,7 +758,7 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
scp->status |= UNKNOWN_MODE;
splx(s);
#ifdef PC98
if (scp == cur_console)
if (scp == scp->sc->cur_scp)
set_mode(scp);
#endif
return 0;
@ -556,11 +768,13 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
}
/* NOT REACHED */
#ifdef SC_PIXEL_MODE
case KDRASTER: /* set pixel (raster) display mode */
if (ISUNKNOWNSC(scp) || ISTEXTSC(scp))
return ENODEV;
return sc_set_pixel_mode(scp, tp, ((int *)data)[0], ((int *)data)[1],
((int *)data)[2]);
#endif /* SC_PIXEL_MODE */
case KDGETMODE: /* get current mode of this (virtual) console */
/*
@ -572,7 +786,7 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
case KDSBORDER: /* set border color of this (virtual) console */
scp->border = *data;
if (scp == cur_console)
if (scp == scp->sc->cur_scp)
set_border(scp, scp->border);
return 0;
}

283
sys/dev/syscons/scvtb.c Normal file
View File

@ -0,0 +1,283 @@
/*-
* Copyright (c) 1999 Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer as
* the first lines of this file unmodified.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id:$
*/
#include "sc.h"
#include "opt_syscons.h"
#if NSC > 0
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <machine/console.h>
#include <machine/md_var.h>
#include <dev/fb/fbreg.h>
#include <dev/syscons/syscons.h>
#define vtb_wrap(vtb, at, offset) \
(((at) + (offset) + (vtb)->vtb_size)%(vtb)->vtb_size)
void
sc_vtb_init(sc_vtb_t *vtb, int type, int cols, int rows, void *buf, int wait)
{
vtb->vtb_flags = 0;
vtb->vtb_type = type;
vtb->vtb_cols = cols;
vtb->vtb_rows = rows;
vtb->vtb_size = cols*rows;
vtb->vtb_buffer = NULL;
vtb->vtb_tail = 0;
switch (type) {
case VTB_MEMORY:
case VTB_RINGBUFFER:
if ((buf == NULL) && (cols*rows != 0)) {
vtb->vtb_buffer =
(vm_offset_t)malloc(cols*rows*sizeof(u_int16_t),
M_DEVBUF,
(wait) ? M_WAITOK : M_NOWAIT);
if (vtb->vtb_buffer != NULL)
bzero((void *)sc_vtb_pointer(vtb, 0),
cols*rows*sizeof(u_int16_t));
} else {
vtb->vtb_buffer = (vm_offset_t)buf;
}
vtb->vtb_flags |= VTB_VALID;
break;
case VTB_FRAMEBUFFER:
vtb->vtb_buffer = (vm_offset_t)buf;
vtb->vtb_flags |= VTB_VALID;
break;
default:
break;
}
}
void
sc_vtb_destroy(sc_vtb_t *vtb)
{
vm_offset_t p;
vtb->vtb_flags = 0;
vtb->vtb_cols = 0;
vtb->vtb_rows = 0;
vtb->vtb_size = 0;
vtb->vtb_tail = 0;
p = vtb->vtb_buffer;
vtb->vtb_buffer = NULL;
switch (vtb->vtb_type) {
case VTB_MEMORY:
case VTB_RINGBUFFER:
if (p != NULL)
free((void *)p, M_DEVBUF);
break;
default:
break;
}
vtb->vtb_type = VTB_INVALID;
}
size_t
sc_vtb_size(int cols, int rows)
{
return (size_t)(cols*rows*sizeof(u_int16_t));
}
int
sc_vtb_getc(sc_vtb_t *vtb, int at)
{
if (vtb->vtb_type == VTB_FRAMEBUFFER)
return (readw(sc_vtb_pointer(vtb, at)) & 0x00ff);
else
return (*(u_int16_t *)sc_vtb_pointer(vtb, at) & 0x00ff);
}
int
sc_vtb_geta(sc_vtb_t *vtb, int at)
{
if (vtb->vtb_type == VTB_FRAMEBUFFER)
return (readw(sc_vtb_pointer(vtb, at)) & 0xff00);
else
return (*(u_int16_t *)sc_vtb_pointer(vtb, at) & 0xff00);
}
void
sc_vtb_putc(sc_vtb_t *vtb, int at, int c, int a)
{
if (vtb->vtb_type == VTB_FRAMEBUFFER)
writew(sc_vtb_pointer(vtb, at), a | c);
else
*(u_int16_t *)sc_vtb_pointer(vtb, at) = a | c;
}
vm_offset_t
sc_vtb_putchar(sc_vtb_t *vtb, vm_offset_t p, int c, int a)
{
if (vtb->vtb_type == VTB_FRAMEBUFFER)
writew(p, a | c);
else
*(u_int16_t *)p = a | c;
return (p + sizeof(u_int16_t));
}
vm_offset_t
sc_vtb_pointer(sc_vtb_t *vtb, int at)
{
return (vtb->vtb_buffer + sizeof(u_int16_t)*(at));
}
int
sc_vtb_pos(sc_vtb_t *vtb, int pos, int offset)
{
return ((pos + offset + vtb->vtb_size)%vtb->vtb_size);
}
void
sc_vtb_clear(sc_vtb_t *vtb, int c, int attr)
{
if (vtb->vtb_type == VTB_FRAMEBUFFER)
fillw_io(attr | c, sc_vtb_pointer(vtb, 0), vtb->vtb_size);
else
fillw(attr | c, (void *)sc_vtb_pointer(vtb, 0), vtb->vtb_size);
}
void
sc_vtb_copy(sc_vtb_t *vtb1, int from, sc_vtb_t *vtb2, int to, int count)
{
/* XXX if both are VTB_VRAMEBUFFER... */
if (vtb2->vtb_type == VTB_FRAMEBUFFER) {
bcopy_toio(sc_vtb_pointer(vtb1, from),
sc_vtb_pointer(vtb2, to),
count*sizeof(u_int16_t));
} else if (vtb1->vtb_type == VTB_FRAMEBUFFER) {
bcopy_fromio(sc_vtb_pointer(vtb1, from),
sc_vtb_pointer(vtb2, to),
count*sizeof(u_int16_t));
} else {
bcopy((void *)sc_vtb_pointer(vtb1, from),
(void *)sc_vtb_pointer(vtb2, to),
count*sizeof(u_int16_t));
}
}
void
sc_vtb_append(sc_vtb_t *vtb1, int from, sc_vtb_t *vtb2, int count)
{
int len;
if (vtb2->vtb_type != VTB_RINGBUFFER)
return;
while (count > 0) {
len = imin(count, vtb2->vtb_size - vtb2->vtb_tail);
if (vtb1->vtb_type == VTB_FRAMEBUFFER) {
bcopy_fromio(sc_vtb_pointer(vtb1, from),
sc_vtb_pointer(vtb2, vtb2->vtb_tail),
len*sizeof(u_int16_t));
} else {
bcopy((void *)sc_vtb_pointer(vtb1, from),
(void *)sc_vtb_pointer(vtb2, vtb2->vtb_tail),
len*sizeof(u_int16_t));
}
from += len;
count -= len;
vtb2->vtb_tail = vtb_wrap(vtb2, vtb2->vtb_tail, len);
}
}
void
sc_vtb_seek(sc_vtb_t *vtb, int pos)
{
vtb->vtb_tail = pos%vtb->vtb_size;
}
void
sc_vtb_erase(sc_vtb_t *vtb, int at, int count, int c, int attr)
{
if (at + count > vtb->vtb_size)
count = vtb->vtb_size - at;
if (vtb->vtb_type == VTB_FRAMEBUFFER)
fillw_io(attr | c, sc_vtb_pointer(vtb, at), count);
else
fillw(attr | c, (void *)sc_vtb_pointer(vtb, at), count);
}
void
sc_vtb_delete(sc_vtb_t *vtb, int at, int count, int c, int attr)
{
int len;
if (at + count > vtb->vtb_size)
count = vtb->vtb_size - at;
len = vtb->vtb_size - at - count;
if (len > 0) {
if (vtb->vtb_type == VTB_FRAMEBUFFER) {
bcopy_io(sc_vtb_pointer(vtb, at + count),
sc_vtb_pointer(vtb, at),
len*sizeof(u_int16_t));
} else {
bcopy((void *)sc_vtb_pointer(vtb, at + count),
(void *)sc_vtb_pointer(vtb, at),
len*sizeof(u_int16_t));
}
}
if (vtb->vtb_type == VTB_FRAMEBUFFER)
fillw_io(attr | c, sc_vtb_pointer(vtb, at + len),
vtb->vtb_size - at - len);
else
fillw(attr | c, (void *)sc_vtb_pointer(vtb, at + len),
vtb->vtb_size - at - len);
}
void
sc_vtb_ins(sc_vtb_t *vtb, int at, int count, int c, int attr)
{
if (at + count > vtb->vtb_size) {
count = vtb->vtb_size - at;
} else {
if (vtb->vtb_type == VTB_FRAMEBUFFER) {
bcopy_io(sc_vtb_pointer(vtb, at),
sc_vtb_pointer(vtb, at + count),
(vtb->vtb_size - at - count)*sizeof(u_int16_t));
} else {
bcopy((void *)sc_vtb_pointer(vtb, at),
(void *)sc_vtb_pointer(vtb, at + count),
(vtb->vtb_size - at - count)*sizeof(u_int16_t));
}
}
if (vtb->vtb_type == VTB_FRAMEBUFFER)
fillw_io(attr | c, sc_vtb_pointer(vtb, at), count);
else
fillw(attr | c, (void *)sc_vtb_pointer(vtb, at), count);
}
#endif /* NSC */

View File

@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: snake_saver.c,v 1.22 1999/01/17 14:25:19 yokota Exp $
* $Id: snake_saver.c,v 1.23 1999/02/05 12:40:15 des Exp $
*/
#include <sys/param.h>
@ -34,16 +34,18 @@
#include <sys/malloc.h>
#include <sys/kernel.h>
#include <sys/sysctl.h>
#include <sys/consio.h>
#include <sys/fbio.h>
#include <machine/md_var.h>
#include <machine/pc/display.h>
#include <saver.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>
#include <dev/syscons/syscons.h>
static char *message;
static u_char **messagep;
static int *messagep;
static int messagelen;
static u_short *window;
static int blanked;
static int
@ -51,36 +53,50 @@ snake_saver(video_adapter_t *adp, int blank)
{
static int dirx, diry;
int f;
scr_stat *scp = cur_console;
sc_softc_t *sc;
scr_stat *scp;
/* XXX hack for minimal changes. */
#define save message
#define savs messagep
sc = sc_find_softc(adp, NULL);
if (sc == NULL)
return EAGAIN;
scp = sc->cur_scp;
if (blank) {
if (adp->va_info.vi_flags & V_INFO_GRAPHICS)
return EAGAIN;
if (blanked <= 0) {
window = (u_short *)adp->va_window;
fillw(((FG_LIGHTGREY|BG_BLACK)<<8) | scr_map[0x20],
window, scp->xsize * scp->ysize);
#ifdef PC98
if (epson_machine_id == 0x20) {
outb(0x43f, 0x42);
outb(0x0c17, inb(0xc17) & ~0x08);
outb(0x43f, 0x40);
}
#endif /* PC98 */
sc_vtb_clear(&scp->scr, sc->scr_map[0x20],
(FG_LIGHTGREY | BG_BLACK) << 8);
(*vidsw[adp->va_index]->set_hw_cursor)(adp, -1, -1);
set_border(scp, 0);
dirx = (scp->xpos ? 1 : -1);
diry = (scp->ypos ?
scp->xsize : -scp->xsize);
for (f=0; f< messagelen; f++)
savs[f] = (u_char *)window + 2 *
(scp->xpos+scp->ypos*scp->xsize);
*(savs[0]) = scr_map[*save];
savs[f] = scp->xpos + scp->ypos*scp->xsize;
sc_vtb_putc(&scp->scr, savs[0], sc->scr_map[*save],
(FG_LIGHTGREY | BG_BLACK) << 8);
blanked = 1;
}
if (blanked++ < 4)
return 0;
blanked = 1;
*(savs[messagelen-1]) = scr_map[0x20];
sc_vtb_putc(&scp->scr, savs[messagelen - 1], sc->scr_map[0x20],
(FG_LIGHTGREY | BG_BLACK) << 8);
for (f=messagelen-1; f > 0; f--)
savs[f] = savs[f-1];
f = (savs[0] - (u_char *)window) / 2;
f = savs[0];
if ((f % scp->xsize) == 0 ||
(f % scp->xsize) == scp->xsize - 1 ||
(random() % 50) == 0)
@ -89,11 +105,19 @@ snake_saver(video_adapter_t *adp, int blank)
(f / scp->xsize) == scp->ysize - 1 ||
(random() % 20) == 0)
diry = -diry;
savs[0] += 2*dirx + 2*diry;
savs[0] += dirx + diry;
for (f=messagelen-1; f>=0; f--)
*(savs[f]) = scr_map[save[f]];
sc_vtb_putc(&scp->scr, savs[f], sc->scr_map[save[f]],
(FG_LIGHTGREY | BG_BLACK) << 8);
}
else {
#ifdef PC98
if (epson_machine_id == 0x20) {
outb(0x43f, 0x42);
outb(0x0c17, inb(0xc17) | 0x08);
outb(0x43f, 0x40);
}
#endif /* PC98 */
blanked = 0;
}
return 0;

View File

@ -25,22 +25,24 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: star_saver.c,v 1.19 1999/01/17 14:25:19 yokota Exp $
* $Id: star_saver.c,v 1.20 1999/02/05 12:40:16 des Exp $
*/
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/consio.h>
#include <sys/fbio.h>
#include <machine/md_var.h>
#include <machine/pc/display.h>
#include <saver.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>
#include <dev/syscons/syscons.h>
#define NUM_STARS 50
static u_short *window;
static int blanked;
/*
@ -50,21 +52,39 @@ static int blanked;
static int
star_saver(video_adapter_t *adp, int blank)
{
scr_stat *scp = cur_console;
sc_softc_t *sc;
scr_stat *scp;
int cell, i;
char pattern[] = {"...........++++*** "};
#ifndef PC98
char colors[] = {FG_DARKGREY, FG_LIGHTGREY,
FG_WHITE, FG_LIGHTCYAN};
#else
char colors[] = {FG_BLUE, FG_LIGHTGREY,
FG_LIGHTGREY, FG_CYAN};
#endif /* PC98 */
static u_short stars[NUM_STARS][2];
sc = sc_find_softc(adp, NULL);
if (sc == NULL)
return EAGAIN;
scp = sc->cur_scp;
if (blank) {
if (adp->va_info.vi_flags & V_INFO_GRAPHICS)
return EAGAIN;
if (!blanked) {
window = (u_short *)adp->va_window;
#ifdef PC98
if (epson_machine_id == 0x20) {
outb(0x43f, 0x42);
outb(0x0c17, inb(0xc17) & ~0x08);
outb(0x43f, 0x40);
}
#endif /* PC98 */
/* clear the screen and set the border color */
fillw(((FG_LIGHTGREY|BG_BLACK) << 8) | scr_map[0x20],
window, scp->xsize * scp->ysize);
sc_vtb_clear(&scp->scr, sc->scr_map[0x20],
(FG_LIGHTGREY | BG_BLACK) << 8);
(*vidsw[adp->va_index]->set_hw_cursor)(adp, -1, -1);
set_border(scp, 0);
blanked = TRUE;
for(i=0; i<NUM_STARS; i++) {
@ -74,15 +94,22 @@ star_saver(video_adapter_t *adp, int blank)
}
}
cell = random() % NUM_STARS;
*((u_short*)(window + stars[cell][0])) =
scr_map[pattern[stars[cell][1]]] |
colors[random()%sizeof(colors)] << 8;
sc_vtb_putc(&scp->scr, stars[cell][0],
sc->scr_map[pattern[stars[cell][1]]],
colors[random()%sizeof(colors)] << 8);
if ((stars[cell][1]+=(random()%4)) >= sizeof(pattern)-1) {
stars[cell][0] = random() % (scp->xsize*scp->ysize);
stars[cell][1] = 0;
}
}
else {
#ifdef PC98
if (epson_machine_id == 0x20) {
outb(0x43f, 0x42);
outb(0x0c17, inb(0xc17) | 0x08);
outb(0x43f, 0x40);
}
#endif /* PC98 */
blanked = FALSE;
}
return 0;

File diff suppressed because it is too large Load Diff

View File

@ -25,21 +25,51 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: syscons.h,v 1.46 1999/01/19 11:31:19 yokota Exp $
* $Id: syscons.h,v 1.47 1999/04/12 13:34:56 des Exp $
*/
#ifndef _DEV_SYSCONS_SYSCONS_H_
#define _DEV_SYSCONS_SYSCONS_H_
/* vm things */
#define ISMAPPED(pa, width) \
(((pa) <= (u_long)0x1000 - (width)) \
|| ((pa) >= 0xa0000 && (pa) <= 0x100000 - (width)))
#define pa_to_va(pa) (KERNBASE + (pa)) /* works if ISMAPPED(pa...) */
/* machine-dependent part of the header */
#ifdef PC98
#include <pc98/pc98/sc_machdep.h>
#elif defined(__i386__)
/* nothing for the moment */
#elif defined(__alpha__)
/* nothing for the moment */
#endif
/* default values for configuration options */
#ifndef MAXCONS
#define MAXCONS 16
#endif
#ifdef SC_NO_SYSMOUSE
#undef SC_NO_CUTPASTE
#define SC_NO_CUTPASTE 1
#endif
#ifdef SC_NO_MODE_CHANGE
#undef SC_PIXEL_MODE
#endif
#ifndef SC_DEBUG_LEVEL
#define SC_DEBUG_LEVEL 0
#endif
#define DPRINTF(l, p) if (SC_DEBUG_LEVEL >= (l)) printf p
#define SC_DRIVER_NAME "sc"
#define SC_VTY(dev) minor(dev)
/* printable chars */
#ifndef PRINTABLE
#define PRINTABLE(ch) ((ch) > 0x1b || ((ch) > 0x0d && (ch) < 0x1b) \
|| (ch) < 0x07)
#endif
/* macros for "intelligent" screen update */
#define mark_for_update(scp, x) {\
@ -51,33 +81,20 @@
scp->end = scp->xsize * scp->ysize - 1;\
}
/* status flags */
/* vty status flags (scp->status) */
#define UNKNOWN_MODE 0x00010
#define SWITCH_WAIT_REL 0x00080
#define SWITCH_WAIT_ACQ 0x00100
#define BUFFER_SAVED 0x00200
#define CURSOR_ENABLED 0x00400
#define MOUSE_ENABLED 0x00800
#define MOUSE_MOVED 0x01000
#define MOUSE_CUTTING 0x02000
#define MOUSE_VISIBLE 0x04000
#define GRAPHICS_MODE 0x08000
#define PIXEL_MODE 0x10000
#define SAVER_RUNNING 0x20000
/* configuration flags */
#define VISUAL_BELL 0x00001
#define BLINK_CURSOR 0x00002
#define CHAR_CURSOR 0x00004
/* these options are now obsolete; use corresponding options for kbd driver */
#if 0
#define DETECT_KBD 0x00008
#define XT_KEYBD 0x00010
#define KBD_NORESET 0x00020
#endif
#define QUIET_BELL 0x00040
#define VESA800X600 0x00080
#define AUTODETECT_KBD 0x00100
#define VR_CURSOR_BLINK 0x40000
#define VR_CURSOR_ON 0x80000
/* attribute flags */
#define NORMAL_ATTR 0x00
@ -96,8 +113,6 @@
#define SAVE 0
#define COL 80
#define ROW 25
#define BELL_DURATION 5
#define BELL_PITCH 800
#define CONSOLE_BUFSIZE 1024
#define PCBURST 128
#define FONT_NONE 1
@ -105,6 +120,11 @@
#define FONT_14 4
#define FONT_16 8
#ifndef BELL_DURATION
#define BELL_DURATION 5
#define BELL_PITCH 800
#endif
/* special characters */
#define cntlc 0x03
#define cntld 0x04
@ -115,6 +135,23 @@
#define DEAD_CHAR 0x07 /* char used for cursor */
/* virtual terminal buffer */
typedef struct sc_vtb {
int vtb_flags;
#define VTB_VALID (1 << 0)
int vtb_type;
#define VTB_INVALID 0
#define VTB_MEMORY 1
#define VTB_FRAMEBUFFER 2
#define VTB_RINGBUFFER 3
int vtb_cols;
int vtb_rows;
int vtb_size;
vm_offset_t vtb_buffer;
int vtb_tail; /* valid for VTB_RINGBUFFER only */
} sc_vtb_t;
/* terminal status */
typedef struct term_stat {
int esc; /* processing escape sequence */
int num_param; /* # of parameters to ESC */
@ -127,10 +164,89 @@ typedef struct term_stat {
int rev_color; /* reverse hardware color */
} term_stat;
/* softc */
struct keyboard;
struct video_adapter;
struct scr_stat;
struct tty;
typedef struct sc_softc {
int unit; /* unit # */
int config; /* configuration flags */
#define SC_VESA800X600 (1 << 7)
#define SC_AUTODETECT_KBD (1 << 8)
#define SC_KERNEL_CONSOLE (1 << 9)
int flags; /* status flags */
#define SC_VISUAL_BELL (1 << 0)
#define SC_QUIET_BELL (1 << 1)
#define SC_BLINK_CURSOR (1 << 2)
#define SC_CHAR_CURSOR (1 << 3)
#define SC_MOUSE_ENABLED (1 << 4)
#define SC_SCRN_IDLE (1 << 5)
#define SC_SCRN_BLANKED (1 << 6)
#define SC_SAVER_FAILED (1 << 7)
#define SC_INIT_DONE (1 << 16)
#define SC_SPLASH_SCRN (1 << 17)
int keyboard; /* -1 if unavailable */
struct keyboard *kbd;
int adapter;
struct video_adapter *adp;
int initial_mode; /* initial video mode */
int first_vty;
int vtys;
struct tty *tty;
struct scr_stat **console;
struct scr_stat *cur_scp;
struct scr_stat *new_scp;
struct scr_stat *old_scp;
int delayed_next_scr;
void **devfs_token;
char font_loading_in_progress;
char switch_in_progress;
char videoio_in_progress;
char write_in_progress;
char blink_in_progress;
long scrn_time_stamp;
char cursor_base;
char cursor_height;
u_char scr_map[256];
u_char scr_rmap[256];
#ifdef _SC_MD_SOFTC_DECLARED_
sc_md_softc_t md; /* machine dependent vars */
#endif
#ifndef SC_NO_PALETTE_LOADING
u_char palette[256*3];
#endif
#ifndef SC_NO_FONT_LOADING
int fonts_loaded;
u_char *font_8;
u_char *font_14;
u_char *font_16;
#endif
} sc_softc_t;
/* virtual screen */
typedef struct scr_stat {
int ad; /* video adapter index */
video_adapter_t *adp; /* video adapter structure */
u_short *scr_buf; /* buffer when off screen */
int index; /* index of this vty */
struct sc_softc *sc; /* pointer to softc */
struct sc_rndr_sw *rndr; /* renderer */
sc_vtb_t scr;
sc_vtb_t vtb;
int xpos; /* current X position */
int ypos; /* current Y position */
int saved_xpos; /* saved X position */
@ -141,25 +257,26 @@ typedef struct scr_stat {
int ypixel; /* Y graphics size */
int xoff; /* X offset in pixel mode */
int yoff; /* Y offset in pixel mode */
u_char *font; /* current font */
int font_size; /* fontsize in Y direction */
int start; /* modified area start */
int end; /* modified area end */
term_stat term; /* terminal emulation stuff */
int status; /* status (bitfield) */
int kbd_mode; /* keyboard I/O mode */
u_short *cursor_pos; /* cursor buffer position */
u_short *cursor_oldpos; /* cursor old buffer position */
u_short cursor_saveunder; /* saved chars under cursor */
char cursor_start; /* cursor start line # */
char cursor_end; /* cursor end line # */
u_short *mouse_pos; /* mouse buffer position */
u_short *mouse_oldpos; /* mouse old buffer position */
int cursor_pos; /* cursor buffer position */
int cursor_oldpos; /* cursor old buffer position */
u_short cursor_saveunder_char; /* saved char under cursor */
u_short cursor_saveunder_attr; /* saved attr under cursor */
char cursor_base; /* cursor base line # */
char cursor_height; /* cursor height */
int mouse_pos; /* mouse buffer position */
int mouse_oldpos; /* mouse old buffer position */
short mouse_xpos; /* mouse x coordinate */
short mouse_ypos; /* mouse y coordinate */
short mouse_buttons; /* mouse buttons */
u_char mouse_cursor[128]; /* mouse cursor bitmap store */
u_short *mouse_cut_start; /* mouse cut start pos */
u_short *mouse_cut_end; /* mouse cut end pos */
int mouse_cut_start; /* mouse cut start pos */
int mouse_cut_end; /* mouse cut end pos */
struct proc *mouse_proc; /* proc* of controlling proc */
pid_t mouse_pid; /* pid of controlling proc */
int mouse_signal; /* signal # to report with */
@ -170,16 +287,14 @@ typedef struct scr_stat {
pid_t pid; /* pid of controlling proc */
struct proc *proc; /* proc* of controlling proc */
struct vt_mode smode; /* switch mode */
u_short *history; /* circular history buffer */
u_short *history_head; /* current head position */
u_short *history_pos; /* position shown on screen */
u_short *history_save; /* save area index */
sc_vtb_t *history; /* circular history buffer */
int history_pos; /* position shown on screen */
int history_size; /* size of history buffer */
#ifdef __i386__
struct apmhook r_hook; /* reconfiguration support */
#endif
int splash_save_mode; /* saved mode for splash screen */
int splash_save_status; /* saved status for splash screen */
#ifdef _SCR_MD_STAT_DECLARED_
scr_md_stat_t md; /* machine dependent vars */
#endif
} scr_stat;
typedef struct default_attr {
@ -187,7 +302,63 @@ typedef struct default_attr {
int rev_color; /* reverse hardware color */
} default_attr;
#ifndef SC_NORM_ATTR
#define SC_NORM_ATTR (FG_LIGHTGREY | BG_BLACK)
#endif
#ifndef SC_NORM_REV_ATTR
#define SC_NORM_REV_ATTR (FG_BLACK | BG_LIGHTGREY)
#endif
#ifndef SC_KERNEL_CONS_ATTR
#define SC_KERNEL_CONS_ATTR (FG_WHITE | BG_BLACK)
#endif
#ifndef SC_KERNEL_CONS_REV_ATTR
#define SC_KERNEL_CONS_REV_ATTR (FG_BLACK | BG_LIGHTGREY)
#endif
/* renderer function table */
typedef void vr_clear_t(scr_stat *scp, int c, int attr);
typedef void vr_draw_border_t(scr_stat *scp, int color);
typedef void vr_draw_t(scr_stat *scp, int from, int count, int flip);
typedef void vr_set_cursor_t(scr_stat *scp, int base, int height, int blink);
typedef void vr_draw_cursor_t(scr_stat *scp, int at, int blink,
int on, int flip);
typedef void vr_blink_cursor_t(scr_stat *scp, int at, int flip);
typedef void vr_set_mouse_t(scr_stat *scp);
typedef void vr_draw_mouse_t(scr_stat *scp, int x, int y, int on);
typedef struct sc_rndr_sw {
vr_clear_t *clear;
vr_draw_border_t *draw_border;
vr_draw_t *draw;
vr_set_cursor_t *set_cursor;
vr_draw_cursor_t *draw_cursor;
vr_blink_cursor_t *blink_cursor;
vr_set_mouse_t *set_mouse;
vr_draw_mouse_t *draw_mouse;
} sc_rndr_sw_t;
typedef struct sc_renderer {
char *name;
int mode;
sc_rndr_sw_t *rndrsw;
} sc_renderer_t;
#define RENDERER(name, mode, sw) \
static struct sc_renderer name##_##mode##_renderer = { \
#name, mode, &sw \
}; \
DATA_SET(scrndr_set, name##_##mode##_renderer)
extern struct linker_set scrndr_set;
typedef struct {
int cursor_start;
int cursor_end;
int shift_state;
int bell_pitch;
} bios_values_t;
/* other macros */
#define ISTEXTSC(scp) (!((scp)->status \
& (UNKNOWN_MODE | GRAPHICS_MODE | PIXEL_MODE)))
#define ISGRAPHSC(scp) (((scp)->status \
@ -197,41 +368,143 @@ typedef struct default_attr {
== PIXEL_MODE)
#define ISUNKNOWNSC(scp) ((scp)->status & UNKNOWN_MODE)
#define ISFONTAVAIL(af) ((af) & V_ADP_FONT)
#ifndef ISMOUSEAVAIL
#ifdef SC_ALT_MOUSE_IMAGE
#define ISMOUSEAVAIL(af) (1)
#else
#define ISMOUSEAVAIL(af) ((af) & V_ADP_FONT)
#endif /* SC_ALT_MOUSE_IMAGE */
#define ISFONTAVAIL(af) ((af) & V_ADP_FONT)
#define ISPALAVAIL(af) ((af) & V_ADP_PALETTE)
#endif /* ISMOUSEAVAIL */
/* misc prototypes used by different syscons related LKM's */
#define ISSIGVALID(sig) ((sig) > 0 && (sig) < NSIG)
#define kbd_read_char(kbd, wait) \
(*kbdsw[(kbd)->kb_index]->read_char)((kbd), (wait))
#define kbd_check_char(kbd) \
(*kbdsw[(kbd)->kb_index]->check_char)((kbd))
#define kbd_enable(kbd) \
(*kbdsw[(kbd)->kb_index]->enable)((kbd))
#define kbd_disable(kbd) \
(*kbdsw[(kbd)->kb_index]->disable)((kbd))
#define kbd_lock(kbd, lockf) \
(*kbdsw[(kbd)->kb_index]->lock)((kbd), (lockf))
#define kbd_ioctl(kbd, cmd, arg) \
(((kbd) == NULL) ? \
ENODEV : (*kbdsw[(kbd)->kb_index]->ioctl)((kbd), (cmd), (arg)))
#define kbd_clear_state(kbd) \
(*kbdsw[(kbd)->kb_index]->clear_state)((kbd))
#define kbd_get_fkeystr(kbd, fkey, len) \
(*kbdsw[(kbd)->kb_index]->get_fkeystr)((kbd), (fkey), (len))
#define kbd_poll(kbd, on) \
(*kbdsw[(kbd)->kb_index]->poll)((kbd), (on))
/* syscons.c */
int sc_probe_unit(int unit, int flags);
int sc_attach_unit(int unit, int flags);
extern int (*sc_user_ioctl)(dev_t dev, u_long cmd, caddr_t data,
int flag, struct proc *p);
extern int (*sc_user_ioctl)(dev_t dev, u_long cmd, caddr_t data, int flag,
struct proc *p);
int sc_probe_unit(int unit, int flags);
int sc_attach_unit(int unit, int flags);
int sc_resume_unit(int unit);
int set_mode(scr_stat *scp);
scr_stat *sc_get_scr_stat(dev_t dev);
int set_mode(scr_stat *scp);
scr_stat *sc_get_scr_stat(dev_t dev);
void copy_font(scr_stat *scp, int operation, int font_size, u_char *font_image);
void set_border(scr_stat *scp, int color);
void copy_font(scr_stat *scp, int operation, int font_size,
u_char *font_image);
void set_border(scr_stat *scp, int color);
void sc_touch_scrn_saver(void);
void sc_clear_screen(scr_stat *scp);
void sc_move_mouse(scr_stat *scp, int x, int y);
int sc_clean_up(scr_stat *scp);
void sc_alloc_scr_buffer(scr_stat *scp, int wait, int clear);
void sc_alloc_cut_buffer(scr_stat *scp, int wait);
void sc_alloc_history_buffer(scr_stat *scp, int lines, int extra, int wait);
struct tty *scdevtotty(dev_t dev);
void sc_touch_scrn_saver(void);
void sc_clear_screen(scr_stat *scp);
void sc_set_cursor_image(scr_stat *scp);
int sc_clean_up(scr_stat *scp);
void sc_alloc_scr_buffer(scr_stat *scp, int wait, int discard);
struct tty *scdevtotty(dev_t dev);
#ifndef SC_NO_SYSMOUSE
struct tty *sc_get_mouse_tty(void);
#endif /* SC_NO_SYSMOUSE */
#ifndef SC_NO_CUTPASTE
void sc_paste(scr_stat *scp, u_char *p, int count);
#endif /* SC_NO_CUTPASTE */
/* schistory.c */
#ifndef SC_NO_HISTORY
int sc_alloc_history_buffer(scr_stat *scp, int lines, int wait);
void sc_hist_save(scr_stat *scp);
#define sc_hist_save_one_line(scp, from) \
sc_vtb_append(&(scp)->vtb, (from), (scp)->history, (scp)->xsize)
int sc_hist_restore(scr_stat *scp);
void sc_hist_home(scr_stat *scp);
void sc_hist_end(scr_stat *scp);
int sc_hist_up_line(scr_stat *scp);
int sc_hist_down_line(scr_stat *scp);
int sc_hist_ioctl(struct tty *tp, u_long cmd, caddr_t data,
int flag, struct proc *p);
#endif /* SC_NO_HISTORY */
/* scmouse.c */
#ifndef SC_NO_CUTPASTE
void sc_alloc_cut_buffer(scr_stat *scp, int wait);
void sc_draw_mouse_image(scr_stat *scp);
void sc_remove_mouse_image(scr_stat *scp);
int sc_inside_cutmark(scr_stat *scp, int pos);
void sc_remove_cutmarking(scr_stat *scp);
void sc_remove_all_cutmarkings(sc_softc_t *scp);
void sc_remove_all_mouse(sc_softc_t *scp);
#else
#define sc_inside_cutmark(scp, pos) FALSE
#define sc_remove_cutmarking(scp)
#endif /* SC_NO_CUTPASTE */
#ifndef SC_NO_SYSMOUSE
void sc_mouse_set_level(int level);
void sc_mouse_move(scr_stat *scp, int x, int y);
int sc_mouse_ioctl(struct tty *tp, u_long cmd, caddr_t data,
int flag, struct proc *p);
#endif /* SC_NO_SYSMOUSE */
/* scvidctl.c */
int sc_set_text_mode(scr_stat *scp, struct tty *tp, int mode,
int xsize, int ysize, int fontsize);
int sc_set_graphics_mode(scr_stat *scp, struct tty *tp, int mode);
int sc_set_pixel_mode(scr_stat *scp, struct tty *tp,
int xsize, int ysize, int fontsize);
int sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag,
struct proc *p);
int sc_set_text_mode(scr_stat *scp, struct tty *tp, int mode,
int xsize, int ysize, int fontsize);
int sc_set_graphics_mode(scr_stat *scp, struct tty *tp, int mode);
int sc_set_pixel_mode(scr_stat *scp, struct tty *tp,
int xsize, int ysize, int fontsize);
sc_rndr_sw_t *sc_render_match(scr_stat *scp, video_adapter_t *adp, int mode);
int sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag,
struct proc *p);
/* scvtb.c */
void sc_vtb_init(sc_vtb_t *vtb, int type, int cols, int rows,
void *buffer, int wait);
void sc_vtb_destroy(sc_vtb_t *vtb);
size_t sc_vtb_size(int cols, int rows);
void sc_vtb_clear(sc_vtb_t *vtb, int c, int attr);
int sc_vtb_getc(sc_vtb_t *vtb, int at);
int sc_vtb_geta(sc_vtb_t *vtb, int at);
void sc_vtb_putc(sc_vtb_t *vtb, int at, int c, int a);
vm_offset_t sc_vtb_putchar(sc_vtb_t *vtb, vm_offset_t p, int c, int a);
vm_offset_t sc_vtb_pointer(sc_vtb_t *vtb, int at);
int sc_vtb_pos(sc_vtb_t *vtb, int pos, int offset);
#define sc_vtb_tail(vtb) ((vtb)->vtb_tail)
#define sc_vtb_rows(vtb) ((vtb)->vtb_rows)
void sc_vtb_copy(sc_vtb_t *vtb1, int from, sc_vtb_t *vtb2, int to,
int count);
void sc_vtb_append(sc_vtb_t *vtb1, int from, sc_vtb_t *vtb2,
int count);
void sc_vtb_seek(sc_vtb_t *vtb, int pos);
void sc_vtb_erase(sc_vtb_t *vtb, int at, int count, int c, int attr);
void sc_vtb_delete(sc_vtb_t *vtb, int at, int count, int c, int attr);
void sc_vtb_ins(sc_vtb_t *vtb, int at, int count, int c, int attr);
/* machine dependent functions */
int sc_max_unit(void);
sc_softc_t *sc_get_softc(int unit, int flags);
sc_softc_t *sc_find_softc(struct video_adapter *adp, struct keyboard *kbd);
int sc_get_cons_priority(int *unit, int *flags);
void sc_get_bios_values(bios_values_t *values);
int sc_tone(int herz);
#endif /* !_DEV_SYSCONS_SYSCONS_H_ */

View File

@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: warp_saver.c,v 1.4 1999/01/11 03:18:55 yokota Exp $
* $Id: warp_saver.c,v 1.5 1999/04/12 13:34:58 des Exp $
*/
#include <sys/param.h>
@ -33,11 +33,14 @@
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/syslog.h>
#include <sys/consio.h>
#include <sys/fbio.h>
#include <machine/md_var.h>
#include <machine/random.h>
#include <saver.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>
#include <dev/syscons/syscons.h>
static u_char *vid;
static int blanked;

View File

@ -2,7 +2,7 @@
# LINT -- config file for checking all the sources, tries to pull in
# as much of the source tree as it can.
#
# $Id: LINT,v 1.606 1999/06/15 13:14:40 des Exp $
# $Id: LINT,v 1.607 1999/06/19 20:20:52 rnordier Exp $
#
# NB: You probably don't want to try running a kernel built from this
# file. Instead, you should start from GENERIC, and add options from
@ -912,6 +912,9 @@ options VGA_NO_MODE_CHANGE # don't change video modes
# Older video cards may require this option for proper operation.
options VGA_SLOW_IOACCESS # do byte-wide i/o's to TS and GDC regs
# The following option probably won't work with the LCD displays.
options VGA_WIDTH90 # support 90 column modes
# To include support for VESA video modes
options VESA
@ -939,18 +942,20 @@ options PCVT_VT220KEYB
# The syscons console driver (sco color console compatible).
device sc0 at isa?
options MAXCONS=16 # number of virtual consoles
options STD8X16FONT # Compile font in
makeoptions STD8X16FONT=cp850
options SC_HISTORY_SIZE=200 # number of history buffer lines
options SC_ALT_MOUSE_IMAGE # simplified mouse cursor in text mode
options SC_DFLT_FONT # compile font in
makeoptions SC_DFLT_FONT="cp850"
options SC_DISABLE_DDBKEY # disable `debug' key
options SC_DISABLE_REBOOT # disable reboot key sequence
options SC_HISTORY_SIZE=200 # number of history buffer lines
options SC_MOUSE_CHAR=0x3 # char code for text mode mouse cursor
options SC_PIXEL_MODE # add support for the raster text mode
#
# `flags' for sc0:
# 0x01 Use a 'visual' bell
# 0x02 Use a 'blink' cursor
# 0x04 Use a 'underline' cursor
# 0x06 Use a 'blinking underline' (destructive) cursor
# 0x40 Make the bell quiet if it is rung in the background vty.
# You can selectively disable features in syscons.
options SC_NO_CUTPASTE
options SC_NO_FONT_LOADING
options SC_NO_HISTORY
options SC_NO_SYSMOUSE
#
# The Numeric Processing eXtension driver. This should be configured if
@ -2155,6 +2160,10 @@ options ULPT_DEBUG
options UMASS_DEBUG
options UMS_DEBUG
# options for ukbd:
options UKBD_DFLT_KEYMAP # specify the built-in keymap
makeoptions UKBD_DFLT_KEYMAP="it.iso"
#
# Embedded system options:
#

View File

@ -2,7 +2,7 @@
# LINT -- config file for checking all the sources, tries to pull in
# as much of the source tree as it can.
#
# $Id: LINT,v 1.606 1999/06/15 13:14:40 des Exp $
# $Id: LINT,v 1.607 1999/06/19 20:20:52 rnordier Exp $
#
# NB: You probably don't want to try running a kernel built from this
# file. Instead, you should start from GENERIC, and add options from
@ -912,6 +912,9 @@ options VGA_NO_MODE_CHANGE # don't change video modes
# Older video cards may require this option for proper operation.
options VGA_SLOW_IOACCESS # do byte-wide i/o's to TS and GDC regs
# The following option probably won't work with the LCD displays.
options VGA_WIDTH90 # support 90 column modes
# To include support for VESA video modes
options VESA
@ -939,18 +942,20 @@ options PCVT_VT220KEYB
# The syscons console driver (sco color console compatible).
device sc0 at isa?
options MAXCONS=16 # number of virtual consoles
options STD8X16FONT # Compile font in
makeoptions STD8X16FONT=cp850
options SC_HISTORY_SIZE=200 # number of history buffer lines
options SC_ALT_MOUSE_IMAGE # simplified mouse cursor in text mode
options SC_DFLT_FONT # compile font in
makeoptions SC_DFLT_FONT="cp850"
options SC_DISABLE_DDBKEY # disable `debug' key
options SC_DISABLE_REBOOT # disable reboot key sequence
options SC_HISTORY_SIZE=200 # number of history buffer lines
options SC_MOUSE_CHAR=0x3 # char code for text mode mouse cursor
options SC_PIXEL_MODE # add support for the raster text mode
#
# `flags' for sc0:
# 0x01 Use a 'visual' bell
# 0x02 Use a 'blink' cursor
# 0x04 Use a 'underline' cursor
# 0x06 Use a 'blinking underline' (destructive) cursor
# 0x40 Make the bell quiet if it is rung in the background vty.
# You can selectively disable features in syscons.
options SC_NO_CUTPASTE
options SC_NO_FONT_LOADING
options SC_NO_HISTORY
options SC_NO_SYSMOUSE
#
# The Numeric Processing eXtension driver. This should be configured if
@ -2155,6 +2160,10 @@ options ULPT_DEBUG
options UMASS_DEBUG
options UMS_DEBUG
# options for ukbd:
options UKBD_DFLT_KEYMAP # specify the built-in keymap
makeoptions UKBD_DFLT_KEYMAP="it.iso"
#
# Embedded system options:
#

View File

@ -1,7 +1,7 @@
# This file tells config what files go into building a kernel,
# files marked standard are always included.
#
# $Id: files.i386,v 1.246 1999/06/01 18:18:38 jlemon Exp $
# $Id: files.i386,v 1.247 1999/06/18 19:55:50 green Exp $
#
# The long compile-with and dependency lines are required because of
# limitations in config: backslash-newline doesn't work in strings, and
@ -19,10 +19,10 @@ linux_assym.h optional compat_linux \
no-obj no-implicit-rule before-depend \
clean "linux_assym.h"
#
font8x16.o optional std8x16font \
compile-with "uudecode < /usr/share/syscons/fonts/${STD8X16FONT}-8x16.fnt && file2c 'unsigned char font_16[16*256] = {' '};' < ${STD8X16FONT}-8x16 > font8x16.c && ${CC} -c ${CFLAGS} font8x16.c" \
no-implicit-rule before-depend \
clean "${STD8X16FONT}-8x16 font8x16.c"
font.h optional sc_dflt_font \
compile-with "uudecode < /usr/share/syscons/fonts/${SC_DFLT_FONT}-8x16.fnt && file2c 'static u_char dflt_font_16[16*256] = {' '};' < ${SC_DFLT_FONT}-8x16 > font.h && uudecode < /usr/share/syscons/fonts/${SC_DFLT_FONT}-8x14.fnt && file2c 'static u_char dflt_font_14[14*256] = {' '};' < ${SC_DFLT_FONT}-8x14 >> font.h && uudecode < /usr/share/syscons/fonts/${SC_DFLT_FONT}-8x8.fnt && file2c 'static u_char dflt_font_8[8*256] = {' '};' < ${SC_DFLT_FONT}-8x8 >> font.h" \
no-obj no-implicit-rule before-depend \
clean "font.h"
#
atkbdmap.h optional atkbd_dflt_keymap \
compile-with "kbdcontrol -L ${ATKBD_DFLT_KEYMAP} | sed -e 's/^static keymap_t.* = /static keymap_t key_map = /' -e 's/^static accentmap_t.* = /static accentmap_t accent_map = /' > atkbdmap.h" \
@ -44,14 +44,19 @@ dev/ata/atapi-tape.c optional atapist device-driver
dev/fb/fb.c optional fb device-driver
dev/fb/fb.c optional vga device-driver
dev/fb/splash.c optional splash
dev/fb/vga.c optional vga device-driver
dev/kbd/atkbd.c optional atkbd device-driver
dev/kbd/atkbdc.c optional atkbdc device-driver
dev/kbd/kbd.c optional atkbd device-driver
dev/kbd/kbd.c optional kbd device-driver
dev/kbd/kbd.c optional ukbd device-driver
dev/syscons/syscons.c optional sc device-driver
dev/syscons/schistory.c optional sc device-driver
dev/syscons/scmouse.c optional sc device-driver
dev/syscons/scvidctl.c optional sc device-driver
dev/syscons/scvesactl.c optional sc device-driver
dev/syscons/scvgarndr.c optional sc device-driver
dev/syscons/scvtb.c optional sc device-driver
i386/apm/apm.c optional apm device-driver
i386/apm/apm_setup.s optional apm
i386/eisa/dpt_eisa.c optional eisa dpt device-driver

View File

@ -1,4 +1,4 @@
# $Id: options.i386,v 1.116 1999/06/06 22:45:04 steve Exp $
# $Id: options.i386,v 1.117 1999/06/15 13:14:43 des Exp $
DISABLE_PSE
IDE_DELAY
@ -65,17 +65,30 @@ I586_CPU opt_global.h
I686_CPU opt_global.h
MAXCONS opt_syscons.h
STD8X16FONT opt_syscons.h
SC_HISTORY_SIZE opt_syscons.h
SC_ALT_MOUSE_IMAGE opt_syscons.h
SC_DEBUG_LEVEL opt_syscons.h
SC_DFLT_FONT opt_syscons.h
SC_DISABLE_DDBKEY opt_syscons.h
SC_DISABLE_REBOOT opt_syscons.h
SC_HISTORY_SIZE opt_syscons.h
SC_MOUSE_CHAR opt_syscons.h
SC_NO_CUTPASTE opt_syscons.h
SC_NO_FONT_LOADING opt_syscons.h
SC_NO_HISTORY opt_syscons.h
SC_NO_SYSMOUSE opt_syscons.h
SC_PIXEL_MODE opt_syscons.h
SC_RENDER_DEBUG opt_syscons.h
SC_VIDEO_DEBUG opt_syscons.h
FB_DEBUG opt_fb.h
FB_INSTALL_CDEV opt_fb.h
VGA_ALT_SEQACCESS opt_vga.h
VGA_DEBUG opt_vga.h
VGA_NO_FONT_LOADING opt_vga.h
VGA_NO_MODE_CHANGE opt_vga.h
VGA_SLOW_IOACCESS opt_vga.h
VGA_WIDTH90 opt_vga.h
VESA opt_vesa.h
VESA_DEBUG opt_vesa.h

View File

@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* from: @(#)cons.c 7.2 (Berkeley) 5/9/91
* $Id: cons.c,v 1.66 1999/05/30 16:52:03 phk Exp $
* $Id: cons.c,v 1.67 1999/05/31 11:25:41 phk Exp $
*/
#include "opt_devfs.h"
@ -109,19 +109,19 @@ static struct tty *cn_tp; /* physical console tty struct */
static void *cn_devfs_token; /* represents the devfs entry */
#endif /* DEVFS */
CONS_DRIVER(cons, NULL, NULL, NULL, NULL, NULL);
CONS_DRIVER(cons, NULL, NULL, NULL, NULL, NULL, NULL);
void
cninit()
{
struct consdev *best_cp, *cp;
struct consdev **list;
const struct consdev **list;
/*
* Find the first console with the highest priority.
*/
best_cp = NULL;
list = (struct consdev **)cons_set.ls_items;
list = (const struct consdev **)cons_set.ls_items;
while ((cp = *list++) != NULL) {
if (cp->cn_probe == NULL)
continue;
@ -147,6 +147,8 @@ cninit()
* If no console, give up.
*/
if (best_cp == NULL) {
if (cn_tab != NULL && cn_tab->cn_term != NULL)
(*cn_tab->cn_term)(cn_tab);
cn_tab = best_cp;
return;
}
@ -154,10 +156,13 @@ cninit()
/*
* Initialize console, then attach to it. This ordering allows
* debugging using the previous console, if any.
* XXX if there was a previous console, then its driver should
* be informed when we forget about it.
*/
(*best_cp->cn_init)(best_cp);
if (cn_tab != NULL && cn_tab != best_cp) {
/* Turn off the previous console. */
if (cn_tab->cn_term != NULL)
(*cn_tab->cn_term)(cn_tab);
}
cn_tab = best_cp;
}

View File

@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* from: @(#)cons.h 7.2 (Berkeley) 5/9/91
* $Id: cons.h,v 1.18 1999/01/07 14:14:11 yokota Exp $
* $Id: cons.h,v 1.19 1999/01/09 14:07:37 bde Exp $
*/
#ifndef _MACHINE_CONS_H_
@ -45,6 +45,7 @@
struct consdev;
typedef void cn_probe_t __P((struct consdev *));
typedef void cn_init_t __P((struct consdev *));
typedef void cn_term_t __P((struct consdev *));
typedef int cn_getc_t __P((dev_t));
typedef int cn_checkc_t __P((dev_t));
typedef void cn_putc_t __P((dev_t, int));
@ -54,6 +55,8 @@ struct consdev {
/* probe hardware and fill in consdev info */
cn_init_t *cn_init;
/* turn on as console */
cn_term_t *cn_term;
/* turn off as console */
cn_getc_t *cn_getc;
/* kernel getchar interface */
cn_checkc_t *cn_checkc;
@ -75,10 +78,10 @@ struct consdev {
extern struct linker_set cons_set;
extern int cons_unavail;
#define CONS_DRIVER(name, probe, init, getc, checkc, putc) \
static struct consdev name##_consdev = { \
probe, init, getc, checkc, putc \
}; \
#define CONS_DRIVER(name, probe, init, term, getc, checkc, putc) \
static struct consdev name##_consdev = { \
probe, init, term, getc, checkc, putc \
}; \
DATA_SET(cons_set, name##_consdev)
/* Other kernel entry points. */

View File

@ -1,635 +1,8 @@
/*-
* Copyright (c) 1991-1996 Søren Schmidt
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer
* in this position and unchanged.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: console.h,v 1.44 1999/02/05 11:52:09 yokota Exp $
*/
#ifndef _MACHINE_CONSOLE_H_
#define _MACHINE_CONSOLE_H_
#ifndef _MACHINE_CONSOLE_H_
#define _MACHINE_CONSOLE_H_
#ifndef KERNEL
#include <sys/types.h>
#endif
#include <sys/ioccom.h>
#define KDGKBMODE _IOR('K', 6, int)
#define KDSKBMODE _IO('K', 7 /*, int */)
#define KDMKTONE _IO('K', 8 /*, int */)
#define KDGETMODE _IOR('K', 9, int)
#define KDSETMODE _IO('K', 10 /*, int */)
#define KDSBORDER _IO('K', 13 /*, int */)
#define KDGKBSTATE _IOR('K', 19, int)
#define KDSKBSTATE _IO('K', 20 /*, int */)
#define KDENABIO _IO('K', 60)
#define KDDISABIO _IO('K', 61)
#define KIOCSOUND _IO('K', 63 /*, int */)
#define KDGKBTYPE _IOR('K', 64, int)
#define KDGETLED _IOR('K', 65, int)
#define KDSETLED _IO('K', 66 /*, int */)
#define KDSETRAD _IO('K', 67 /*, int */) /* obsolete */
#define KDRASTER _IOW('K', 100, scr_size_t)
#define KDGKBINFO _IOR('K', 101, keyboard_info_t)
#define KDSETREPEAT _IOW('K', 102, keyboard_delay_t)
#define GETFKEY _IOWR('k', 0, fkeyarg_t)
#define SETFKEY _IOWR('k', 1, fkeyarg_t)
#define GIO_SCRNMAP _IOR('k', 2, scrmap_t)
#define PIO_SCRNMAP _IOW('k', 3, scrmap_t)
#define GIO_KEYMAP _IOR('k', 6, keymap_t)
#define PIO_KEYMAP _IOW('k', 7, keymap_t)
#define GIO_DEADKEYMAP _IOR('k', 8, accentmap_t)
#define PIO_DEADKEYMAP _IOW('k', 9, accentmap_t)
#define GIO_KEYMAPENT _IOWR('k', 10, keyarg_t)
#define PIO_KEYMAPENT _IOW('k', 11, keyarg_t)
#define GIO_ATTR _IOR('a', 0, int)
#define GIO_COLOR _IOR('c', 0, int)
#define CONS_CURRENT _IOR('c', 1, int)
#define CONS_GET _IOR('c', 2, int)
#define CONS_IO _IO('c', 3)
#define CONS_BLANKTIME _IOW('c', 4, int)
#define CONS_SSAVER _IOW('c', 5, ssaver_t)
#define CONS_GSAVER _IOWR('c', 6, ssaver_t)
#define CONS_CURSORTYPE _IOW('c', 7, int)
#define CONS_BELLTYPE _IOW('c', 8, int)
#define CONS_HISTORY _IOW('c', 9, int)
#define CONS_MOUSECTL _IOWR('c', 10, mouse_info_t)
#define CONS_IDLE _IOR('c', 11, int)
#define CONS_SAVERMODE _IOW('c', 12, int)
#define CONS_SAVERSTART _IOW('c', 13, int)
#define PIO_FONT8x8 _IOW('c', 64, fnt8_t)
#define GIO_FONT8x8 _IOR('c', 65, fnt8_t)
#define PIO_FONT8x14 _IOW('c', 66, fnt14_t)
#define GIO_FONT8x14 _IOR('c', 67, fnt14_t)
#define PIO_FONT8x16 _IOW('c', 68, fnt16_t)
#define GIO_FONT8x16 _IOR('c', 69, fnt16_t)
#define CONS_GETINFO _IOWR('c', 73, vid_info_t)
#define CONS_GETVERS _IOR('c', 74, int)
#define CONS_CURRENTADP _IOR('c', 100, int)
#define CONS_ADPINFO _IOWR('c', 101, video_adapter_info_t)
#define CONS_MODEINFO _IOWR('c', 102, video_info_t)
#define CONS_FINDMODE _IOWR('c', 103, video_info_t)
#define CONS_SETWINORG _IO('c', 104 /* u_int */)
#define CONS_SETKBD _IO('c', 110 /* int */)
#define CONS_RELKBD _IO('c', 111)
/* CONS_SAVERMODE */
#define CONS_LKM_SAVER 0
#define CONS_USR_SAVER 1
#ifdef PC98
#define ADJUST_CLOCK _IO('t',100) /* for 98note resume */
#endif
#define VT_OPENQRY _IOR('v', 1, int)
#define VT_SETMODE _IOW('v', 2, vtmode_t)
#define VT_GETMODE _IOR('v', 3, vtmode_t)
#define VT_RELDISP _IO('v', 4 /*, int */)
#define VT_ACTIVATE _IO('v', 5 /*, int */)
#define VT_WAITACTIVE _IO('v', 6 /*, int */)
#define VT_GETACTIVE _IOR('v', 7, int)
#define VT_FALSE 0
#define VT_TRUE 1
#define VT_ACKACQ 2
#define VT_AUTO 0 /* switching is automatic */
#define VT_PROCESS 1 /* switching controlled by prog */
#define VT_KERNEL 255 /* switching controlled in kernel */
#ifndef _VT_MODE_DECLARED
#define _VT_MODE_DECLARED
struct vt_mode {
char mode;
char waitv; /* not implemented yet SOS */
short relsig;
short acqsig;
short frsig; /* not implemented yet SOS */
};
typedef struct vt_mode vtmode_t;
#endif /* !_VT_MODE_DECLARED */
struct mouse_data {
int x;
int y;
int z;
int buttons;
};
struct mouse_mode {
int mode;
int signal;
};
struct mouse_event {
int id; /* one based */
int value;
};
#define MOUSE_SHOW 0x01
#define MOUSE_HIDE 0x02
#define MOUSE_MOVEABS 0x03
#define MOUSE_MOVEREL 0x04
#define MOUSE_GETINFO 0x05
#define MOUSE_MODE 0x06
#define MOUSE_ACTION 0x07
#define MOUSE_MOTION_EVENT 0x08
#define MOUSE_BUTTON_EVENT 0x09
struct mouse_info {
int operation;
union {
struct mouse_data data;
struct mouse_mode mode;
struct mouse_event event;
}u;
};
#define KD_MONO 1 /* monochrome adapter */
#define KD_HERCULES 2 /* hercules adapter */
#define KD_CGA 3 /* color graphics adapter */
#define KD_EGA 4 /* enhanced graphics adapter */
#define KD_VGA 5 /* video graphics adapter */
#define KD_PC98 6 /* PC-98 display */
#define KD_TEXT 0 /* set text mode restore fonts */
#define KD_TEXT0 0 /* ditto */
#define KD_TEXT1 2 /* set text mode !restore fonts */
#define KD_GRAPHICS 1 /* set graphics mode */
#define KD_PIXEL 3 /* set pixel mode */
#define K_RAW 0 /* keyboard returns scancodes */
#define K_XLATE 1 /* keyboard returns ascii */
#define K_CODE 2 /* keyboard returns keycodes */
#define KB_84 1 /* 'old' 84 key AT-keyboard */
#define KB_101 2 /* MF-101 or MF-102 keyboard */
#define KB_OTHER 3 /* keyboard not known */
#define CLKED 1 /* Caps locked */
#define NLKED 2 /* Num locked */
#define SLKED 4 /* Scroll locked */
#define ALKED 8 /* AltGr locked */
#define LOCK_MASK (CLKED | NLKED | SLKED | ALKED)
#define LED_CAP 1 /* Caps lock LED */
#define LED_NUM 2 /* Num lock LED */
#define LED_SCR 4 /* Scroll lock LED */
#define LED_MASK (LED_CAP | LED_NUM | LED_SCR)
/* possible flag values */
#define FLAG_LOCK_O 0
#define FLAG_LOCK_C 1
#define FLAG_LOCK_N 2
#define NUM_KEYS 256 /* number of keys in table */
#define NUM_STATES 8 /* states per key */
#define ALTGR_OFFSET 128 /* offset for altlock keys */
#ifndef _KEYMAP_DECLARED
#define _KEYMAP_DECLARED
struct keyent_t {
u_char map[NUM_STATES];
u_char spcl;
u_char flgs;
};
struct keymap {
u_short n_keys;
struct keyent_t key[NUM_KEYS];
};
typedef struct keymap keymap_t;
struct keyarg {
u_short keynum;
struct keyent_t key;
};
typedef struct keyarg keyarg_t;
#endif /* !_KEYMAP_DECLARED */
#define NUM_DEADKEYS 15 /* number of accent keys */
#define NUM_ACCENTCHARS 52 /* max number of accent chars */
struct acc_t {
u_char accchar;
u_char map[NUM_ACCENTCHARS][2];
};
struct accentmap {
u_short n_accs;
struct acc_t acc[NUM_DEADKEYS];
};
#define MAXFK 16
#define NUM_FKEYS 96
struct fkeytab {
u_char str[MAXFK];
u_char len;
};
struct fkeyarg {
u_short keynum;
char keydef[MAXFK];
char flen;
};
struct colors {
char fore;
char back;
};
struct vid_info {
short size;
short m_num;
u_short mv_row, mv_col;
u_short mv_rsz, mv_csz;
struct colors mv_norm,
mv_rev,
mv_grfc;
u_char mv_ovscan;
u_char mk_keylock;
};
#define MAXSSAVER 16
struct ssaver {
char name[MAXSSAVER];
int num;
long time;
};
/* video mode information block */
struct video_info {
int vi_mode;
int vi_flags;
#define V_INFO_COLOR (1<<0)
#define V_INFO_GRAPHICS (1<<1)
#define V_INFO_LINEAR (1<<2)
#define V_INFO_VESA (1<<3)
int vi_width;
int vi_height;
int vi_cwidth;
int vi_cheight;
int vi_depth;
int vi_planes;
u_int vi_window; /* physical address */
size_t vi_window_size;
size_t vi_window_gran;
u_int vi_buffer; /* physical address */
size_t vi_buffer_size;
/* XXX pixel format, memory model,... */
};
/* adapter infromation block */
struct video_adapter {
int va_index;
int va_type;
char *va_name;
int va_unit;
int va_minor;
int va_flags;
#define V_ADP_COLOR (1<<0)
#define V_ADP_MODECHANGE (1<<1)
#define V_ADP_STATESAVE (1<<2)
#define V_ADP_STATELOAD (1<<3)
#define V_ADP_FONT (1<<4)
#define V_ADP_PALETTE (1<<5)
#define V_ADP_BORDER (1<<6)
#define V_ADP_VESA (1<<7)
#define V_ADP_PROBED (1<<16)
#define V_ADP_INITIALIZED (1<<17)
#define V_ADP_REGISTERED (1<<18)
int va_io_base;
int va_io_size;
int va_crtc_addr;
int va_mem_base;
int va_mem_size;
u_int va_window; /* virtual address */
size_t va_window_size;
size_t va_window_gran;
u_int va_buffer; /* virtual address */
size_t va_buffer_size;
int va_initial_mode;
int va_initial_bios_mode;
int va_mode;
struct video_info va_info;
int va_line_width;
void *va_token;
};
struct video_adapter_info {
int va_index;
int va_type;
char va_name[16];
int va_unit;
int va_flags;
int va_io_base;
int va_io_size;
int va_crtc_addr;
int va_mem_base;
int va_mem_size;
u_int va_window; /* virtual address */
size_t va_window_size;
size_t va_window_gran;
u_int va_buffer; /* virtual address */
size_t va_buffer_size;
int va_initial_mode;
int va_initial_bios_mode;
int va_mode;
int va_line_width;
};
#define V_ADP_PRIMARY 0
#define V_ADP_SECONDARY 1
struct keyboard_info {
int kb_index; /* kbdio index# */
char kb_name[16]; /* driver name */
int kb_unit; /* unit# */
int kb_type; /* KB_84, KB_101, KB_OTHER,... */
int kb_config; /* device configuration flags */
int kb_flags; /* internal flags */
};
typedef struct accentmap accentmap_t;
typedef struct fkeytab fkeytab_t;
typedef struct fkeyarg fkeyarg_t;
typedef struct vid_info vid_info_t;
typedef struct mouse_info mouse_info_t;
typedef struct {char scrmap[256];} scrmap_t;
typedef struct {char fnt8x8[8*256];} fnt8_t;
typedef struct {char fnt8x14[14*256];} fnt14_t;
typedef struct {char fnt8x16[16*256];} fnt16_t;
typedef struct ssaver ssaver_t;
typedef struct video_adapter video_adapter_t;
typedef struct video_adapter_info video_adapter_info_t;
typedef struct video_info video_info_t;
typedef struct keyboard_info keyboard_info_t;
typedef struct {int scr_size[3];} scr_size_t;
typedef struct {int kbd_delay[2];} keyboard_delay_t;
/* defines for "special" keys (spcl bit set in keymap) */
#define NOP 0x00 /* nothing (dead key) */
#define LSH 0x02 /* left shift key */
#define RSH 0x03 /* right shift key */
#define CLK 0x04 /* caps lock key */
#define NLK 0x05 /* num lock key */
#define SLK 0x06 /* scroll lock key */
#define LALT 0x07 /* left alt key */
#define BTAB 0x08 /* backwards tab */
#define LCTR 0x09 /* left control key */
#define NEXT 0x0a /* switch to next screen */
#define F_SCR 0x0b /* switch to first screen */
#define L_SCR 0x1a /* switch to last screen */
#define F_FN 0x1b /* first function key */
#define L_FN 0x7a /* last function key */
/* 0x7b-0x7f reserved do not use ! */
#define RCTR 0x80 /* right control key */
#define RALT 0x81 /* right alt (altgr) key */
#define ALK 0x82 /* alt lock key */
#define ASH 0x83 /* alt shift key */
#define META 0x84 /* meta key */
#define RBT 0x85 /* boot machine */
#define DBG 0x86 /* call debugger */
#define SUSP 0x87 /* suspend power (APM) */
#define SPSC 0x88 /* toggle splash/text screen */
#define F_ACC DGRA /* first accent key */
#define DGRA 0x89 /* grave */
#define DACU 0x8a /* acute */
#define DCIR 0x8b /* circumflex */
#define DTIL 0x8c /* tilde */
#define DMAC 0x8d /* macron */
#define DBRE 0x8e /* breve */
#define DDOT 0x8f /* dot */
#define DUML 0x90 /* umlaut/diaresis */
#define DDIA 0x90 /* diaresis */
#define DSLA 0x91 /* slash */
#define DRIN 0x92 /* ring */
#define DCED 0x93 /* cedilla */
#define DAPO 0x94 /* apostrophe */
#define DDAC 0x95 /* double acute */
#define DOGO 0x96 /* ogonek */
#define DCAR 0x97 /* caron */
#define L_ACC DCAR /* last accent key */
#define STBY 0x98 /* Go into standby mode (apm) */
#define F(x) ((x)+F_FN-1)
#define S(x) ((x)+F_SCR-1)
#define ACC(x) ((x)+F_ACC)
#define NOKEY 0x100 /* no key pressed marker */
#define FKEY 0x200 /* function key marker */
#define MKEY 0x400 /* meta key marker (prepend ESC)*/
#define BKEY 0x800 /* backtab (ESC [ Z) */
#define SPCLKEY 0x8000 /* special key */
#define RELKEY 0x4000 /* key released */
#define ERRKEY 0x2000 /* error */
#define KEYCHAR(c) ((c) & 0x00ff)
#define KEYFLAGS(c) ((c) & ~0x00ff)
/* video mode definitions */
#define M_B40x25 0 /* black & white 40 columns */
#define M_C40x25 1 /* color 40 columns */
#define M_B80x25 2 /* black & white 80 columns */
#define M_C80x25 3 /* color 80 columns */
#define M_BG320 4 /* black & white graphics 320x200 */
#define M_CG320 5 /* color graphics 320x200 */
#define M_BG640 6 /* black & white graphics 640x200 hi-res */
#define M_EGAMONO80x25 7 /* ega-mono 80x25 */
#define M_CG320_D 13 /* ega mode D */
#define M_CG640_E 14 /* ega mode E */
#define M_EGAMONOAPA 15 /* ega mode F */
#define M_CG640x350 16 /* ega mode 10 */
#define M_ENHMONOAPA2 17 /* ega mode F with extended memory */
#define M_ENH_CG640 18 /* ega mode 10* */
#define M_ENH_B40x25 19 /* ega enhanced black & white 40 columns */
#define M_ENH_C40x25 20 /* ega enhanced color 40 columns */
#define M_ENH_B80x25 21 /* ega enhanced black & white 80 columns */
#define M_ENH_C80x25 22 /* ega enhanced color 80 columns */
#define M_VGA_C40x25 23 /* vga 8x16 font on color */
#define M_VGA_C80x25 24 /* vga 8x16 font on color */
#define M_VGA_M80x25 25 /* vga 8x16 font on mono */
#define M_VGA11 26 /* vga 640x480 2 colors */
#define M_BG640x480 26
#define M_VGA12 27 /* vga 640x480 16 colors */
#define M_CG640x480 27
#define M_VGA13 28 /* vga 640x200 256 colors */
#define M_VGA_CG320 28
#define M_VGA_C80x50 30 /* vga 8x8 font on color */
#define M_VGA_M80x50 31 /* vga 8x8 font on color */
#define M_VGA_C80x30 32 /* vga 8x16 font on color */
#define M_VGA_M80x30 33 /* vga 8x16 font on color */
#define M_VGA_C80x60 34 /* vga 8x8 font on color */
#define M_VGA_M80x60 35 /* vga 8x8 font on color */
#define M_VGA_CG640 36 /* vga 640x400 256 color */
#define M_VGA_MODEX 37 /* vga 320x240 256 color */
#define M_ENH_B80x43 0x70 /* ega black & white 80x43 */
#define M_ENH_C80x43 0x71 /* ega color 80x43 */
#define M_PC98_80x25 98 /* PC98 80x25 */
#define M_PC98_80x30 99 /* PC98 80x30 */
#define M_HGC_P0 0xe0 /* hercules graphics - page 0 @ B0000 */
#define M_HGC_P1 0xe1 /* hercules graphics - page 1 @ B8000 */
#define M_MCA_MODE 0xff /* monochrome adapter mode */
#define M_TEXT_80x25 200 /* generic text modes */
#define M_TEXT_80x30 201
#define M_TEXT_80x43 202
#define M_TEXT_80x50 203
#define M_TEXT_80x60 204
#define M_TEXT_132x25 205
#define M_TEXT_132x30 206
#define M_TEXT_132x43 207
#define M_TEXT_132x50 208
#define M_TEXT_132x60 209
#define SW_PC98_80x25 _IO('S', M_PC98_80x25)
#define SW_PC98_80x30 _IO('S', M_PC98_80x30)
#define SW_B40x25 _IO('S', M_B40x25)
#define SW_C40x25 _IO('S', M_C40x25)
#define SW_B80x25 _IO('S', M_B80x25)
#define SW_C80x25 _IO('S', M_C80x25)
#define SW_BG320 _IO('S', M_BG320)
#define SW_CG320 _IO('S', M_CG320)
#define SW_BG640 _IO('S', M_BG640)
#define SW_EGAMONO80x25 _IO('S', M_EGAMONO80x25)
#define SW_CG320_D _IO('S', M_CG320_D)
#define SW_CG640_E _IO('S', M_CG640_E)
#define SW_EGAMONOAPA _IO('S', M_EGAMONOAPA)
#define SW_CG640x350 _IO('S', M_CG640x350)
#define SW_ENH_MONOAPA2 _IO('S', M_ENHMONOAPA2)
#define SW_ENH_CG640 _IO('S', M_ENH_CG640)
#define SW_ENH_B40x25 _IO('S', M_ENH_B40x25)
#define SW_ENH_C40x25 _IO('S', M_ENH_C40x25)
#define SW_ENH_B80x25 _IO('S', M_ENH_B80x25)
#define SW_ENH_C80x25 _IO('S', M_ENH_C80x25)
#define SW_ENH_B80x43 _IO('S', M_ENH_B80x43)
#define SW_ENH_C80x43 _IO('S', M_ENH_C80x43)
#define SW_MCAMODE _IO('S', M_MCA_MODE)
#define SW_VGA_C40x25 _IO('S', M_VGA_C40x25)
#define SW_VGA_C80x25 _IO('S', M_VGA_C80x25)
#define SW_VGA_C80x30 _IO('S', M_VGA_C80x30)
#define SW_VGA_C80x50 _IO('S', M_VGA_C80x50)
#define SW_VGA_C80x60 _IO('S', M_VGA_C80x60)
#define SW_VGA_M80x25 _IO('S', M_VGA_M80x25)
#define SW_VGA_M80x30 _IO('S', M_VGA_M80x30)
#define SW_VGA_M80x50 _IO('S', M_VGA_M80x50)
#define SW_VGA_M80x60 _IO('S', M_VGA_M80x60)
#define SW_VGA11 _IO('S', M_VGA11)
#define SW_BG640x480 _IO('S', M_VGA11)
#define SW_VGA12 _IO('S', M_VGA12)
#define SW_CG640x480 _IO('S', M_VGA12)
#define SW_VGA13 _IO('S', M_VGA13)
#define SW_VGA_CG320 _IO('S', M_VGA13)
#define SW_VGA_CG640 _IO('S', M_VGA_CG640)
#define SW_VGA_MODEX _IO('S', M_VGA_MODEX)
#define SW_TEXT_80x25 _IO('S', M_TEXT_80x25)
#define SW_TEXT_80x30 _IO('S', M_TEXT_80x30)
#define SW_TEXT_80x43 _IO('S', M_TEXT_80x43)
#define SW_TEXT_80x50 _IO('S', M_TEXT_80x50)
#define SW_TEXT_80x60 _IO('S', M_TEXT_80x60)
#define SW_TEXT_132x25 _IO('S', M_TEXT_132x25)
#define SW_TEXT_132x30 _IO('S', M_TEXT_132x30)
#define SW_TEXT_132x43 _IO('S', M_TEXT_132x43)
#define SW_TEXT_132x50 _IO('S', M_TEXT_132x50)
#define SW_TEXT_132x60 _IO('S', M_TEXT_132x60)
#define M_VESA_BASE 0x100 /* VESA mode number base */
#define M_VESA_CG640x400 0x100 /* 640x400, 256 color */
#define M_VESA_CG640x480 0x101 /* 640x480, 256 color */
#define M_VESA_800x600 0x102 /* 800x600, 16 color */
#define M_VESA_CG800x600 0x103 /* 800x600, 256 color */
#define M_VESA_1024x768 0x104 /* 1024x768, 16 color */
#define M_VESA_CG1024x768 0x105 /* 1024x768, 256 color */
#define M_VESA_1280x1024 0x106 /* 1280x1024, 16 color */
#define M_VESA_CG1280x1024 0x107 /* 1280x1024, 256 color */
#define M_VESA_C80x60 0x108 /* 8x8 font */
#define M_VESA_C132x25 0x109 /* 8x16 font */
#define M_VESA_C132x43 0x10a /* 8x14 font */
#define M_VESA_C132x50 0x10b /* 8x8 font */
#define M_VESA_C132x60 0x10c /* 8x8 font */
#define M_VESA_32K_320 0x10d /* 320x200, 5:5:5 */
#define M_VESA_64K_320 0x10e /* 320x200, 5:6:5 */
#define M_VESA_FULL_320 0x10f /* 320x200, 8:8:8 */
#define M_VESA_32K_640 0x110 /* 640x480, 5:5:5 */
#define M_VESA_64K_640 0x111 /* 640x480, 5:6:5 */
#define M_VESA_FULL_640 0x112 /* 640x480, 8:8:8 */
#define M_VESA_32K_800 0x113 /* 800x600, 5:5:5 */
#define M_VESA_64K_800 0x114 /* 800x600, 5:6:5 */
#define M_VESA_FULL_800 0x115 /* 800x600, 8:8:8 */
#define M_VESA_32K_1024 0x116 /* 1024x768, 5:5:5 */
#define M_VESA_64K_1024 0x117 /* 1024x768, 5:6:5 */
#define M_VESA_FULL_1024 0x118 /* 1024x768, 8:8:8 */
#define M_VESA_32K_1280 0x119 /* 1280x1024, 5:5:5 */
#define M_VESA_64K_1280 0x11a /* 1280x1024, 5:6:5 */
#define M_VESA_FULL_1280 0x11b /* 1280x1024, 8:8:8 */
#define M_VESA_MODE_MAX 0x1ff
#define SW_VESA_CG640x400 _IO('V', M_VESA_CG640x400 - M_VESA_BASE)
#define SW_VESA_CG640x480 _IO('V', M_VESA_CG640x480 - M_VESA_BASE)
#define SW_VESA_800x600 _IO('V', M_VESA_800x600 - M_VESA_BASE)
#define SW_VESA_CG800x600 _IO('V', M_VESA_CG800x600 - M_VESA_BASE)
#define SW_VESA_1024x768 _IO('V', M_VESA_1024x768 - M_VESA_BASE)
#define SW_VESA_CG1024x768 _IO('V', M_VESA_CG1024x768 - M_VESA_BASE)
#define SW_VESA_1280x1024 _IO('V', M_VESA_1280x1024 - M_VESA_BASE)
#define SW_VESA_CG1280x1024 _IO('V', M_VESA_CG1280x1024 - M_VESA_BASE)
#define SW_VESA_C80x60 _IO('V', M_VESA_C80x60 - M_VESA_BASE)
#define SW_VESA_C132x25 _IO('V', M_VESA_C132x25 - M_VESA_BASE)
#define SW_VESA_C132x43 _IO('V', M_VESA_C132x43 - M_VESA_BASE)
#define SW_VESA_C132x50 _IO('V', M_VESA_C132x50 - M_VESA_BASE)
#define SW_VESA_C132x60 _IO('V', M_VESA_C132x60 - M_VESA_BASE)
#define SW_VESA_32K_320 _IO('V', M_VESA_32K_320 - M_VESA_BASE)
#define SW_VESA_64K_320 _IO('V', M_VESA_64K_320 - M_VESA_BASE)
#define SW_VESA_FULL_320 _IO('V', M_VESA_FULL_320 - M_VESA_BASE)
#define SW_VESA_32K_640 _IO('V', M_VESA_32K_640 - M_VESA_BASE)
#define SW_VESA_64K_640 _IO('V', M_VESA_64K_640 - M_VESA_BASE)
#define SW_VESA_FULL_640 _IO('V', M_VESA_FULL_640 - M_VESA_BASE)
#define SW_VESA_32K_800 _IO('V', M_VESA_32K_800 - M_VESA_BASE)
#define SW_VESA_64K_800 _IO('V', M_VESA_64K_800 - M_VESA_BASE)
#define SW_VESA_FULL_800 _IO('V', M_VESA_FULL_800 - M_VESA_BASE)
#define SW_VESA_32K_1024 _IO('V', M_VESA_32K_1024 - M_VESA_BASE)
#define SW_VESA_64K_1024 _IO('V', M_VESA_64K_1024 - M_VESA_BASE)
#define SW_VESA_FULL_1024 _IO('V', M_VESA_FULL_1024 - M_VESA_BASE)
#define SW_VESA_32K_1280 _IO('V', M_VESA_32K_1280 - M_VESA_BASE)
#define SW_VESA_64K_1280 _IO('V', M_VESA_64K_1280 - M_VESA_BASE)
#define SW_VESA_FULL_1280 _IO('V', M_VESA_FULL_1280 - M_VESA_BASE)
#include <sys/fbio.h>
#include <sys/kbio.h>
#include <sys/consio.h>
#endif /* !_MACHINE_CONSOLE_H_ */

View File

@ -93,6 +93,7 @@ static void *pcvt_devfs_token[MAXCONS];
#endif /*DEVFS*/
#if PCVT_FREEBSD >= 200
#include <sys/bus.h>
#include <machine/stdarg.h>
#else
#include "machine/stdarg.h"
@ -121,7 +122,7 @@ static cn_getc_t pccngetc;
static cn_checkc_t pccncheckc;
static cn_putc_t pccnputc;
CONS_DRIVER(pc, pccnprobe, pccninit, pccngetc, pccncheckc, pccnputc);
CONS_DRIVER(pc, pccnprobe, pccninit, NULL, pccngetc, pccncheckc, pccnputc);
static d_open_t pcopen;
static d_close_t pcclose;
@ -1178,6 +1179,12 @@ pccnprobe(struct consdev *cp)
static int uarg = 0;
int i;
/* See if this driver is disabled in probe hint. */
if (resource_int_value("vt", 0, "disabled", &i) == 0 && i) {
cp->cn_pri = CN_DEAD;
return;
}
#ifdef _DEV_KBD_KBDREG_H_
/*
* Don't reset the keyboard via `kbdio' just yet.

View File

@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: vesa.c,v 1.23 1999/05/09 15:57:52 peter Exp $
* $Id: vesa.c,v 1.24 1999/06/01 18:20:18 jlemon Exp $
*/
#include "vga.h"
@ -42,10 +42,13 @@
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/malloc.h>
#include <sys/fbio.h>
#include <vm/vm.h>
#include <vm/vm_extern.h>
#include <vm/vm_kern.h>
#include <vm/pmap.h>
#include <machine/console.h>
#include <machine/md_var.h>
#include <machine/vm86.h>
#include <machine/pc/bios.h>
@ -75,12 +78,10 @@ typedef struct adp_state adp_state_t;
/* VESA video adapter */
static video_adapter_t *vesa_adp = NULL;
static int vesa_state_buf_size = 0;
#if 0
static void *vesa_state_buf = NULL;
#endif
/* VESA functions */
static int vesa_nop(void);
static int vesa_error(void);
static vi_probe_t vesa_probe;
static vi_init_t vesa_init;
static vi_get_info_t vesa_get_info;
@ -98,8 +99,14 @@ static vi_set_win_org_t vesa_set_origin;
static vi_read_hw_cursor_t vesa_read_hw_cursor;
static vi_set_hw_cursor_t vesa_set_hw_cursor;
static vi_set_hw_cursor_shape_t vesa_set_hw_cursor_shape;
static vi_blank_display_t vesa_blank_display;
static vi_mmap_t vesa_mmap;
static vi_ioctl_t vesa_ioctl;
static vi_clear_t vesa_clear;
static vi_fill_rect_t vesa_fill_rect;
static vi_bitblt_t vesa_bitblt;
static vi_diag_t vesa_diag;
static int vesa_bios_info(int level);
static struct vm86context vesa_vmcontext;
static video_switch_t vesavidsw = {
@ -120,8 +127,14 @@ static video_switch_t vesavidsw = {
vesa_read_hw_cursor,
vesa_set_hw_cursor,
vesa_set_hw_cursor_shape,
(vi_blank_display_t *)vesa_nop,
vesa_blank_display,
vesa_mmap,
vesa_ioctl,
vesa_clear,
vesa_fill_rect,
vesa_bitblt,
vesa_error,
vesa_error,
vesa_diag,
};
@ -132,9 +145,11 @@ static video_switch_t *prevvidsw;
#define EOT (-1)
#define NA (-2)
static video_info_t vesa_vmode[VESA_MAXMODES + 1] = {
{ EOT, },
};
#define MODE_TABLE_DELTA 8
static int vesa_vmode_max = 0;
static video_info_t vesa_vmode_empty = { EOT };
static video_info_t *vesa_vmode = &vesa_vmode_empty;
static int vesa_init_done = FALSE;
static int has_vesa_bios = FALSE;
@ -155,8 +170,12 @@ static int vesa_bios_get_dac(void);
static int vesa_bios_set_dac(int bits);
static int vesa_bios_save_palette(int start, int colors, u_char *palette,
int bits);
static int vesa_bios_save_palette2(int start, int colors, u_char *r, u_char *g,
u_char *b, int bits);
static int vesa_bios_load_palette(int start, int colors, u_char *palette,
int bits);
static int vesa_bios_load_palette2(int start, int colors, u_char *r, u_char *g,
u_char *b, int bits);
#define STATE_SIZE 0
#define STATE_SAVE 1
#define STATE_LOAD 2
@ -169,12 +188,20 @@ static int vesa_bios_load_palette(int start, int colors, u_char *palette,
static int vesa_bios_state_buf_size(void);
static int vesa_bios_save_restore(int code, void *p, size_t size);
static int vesa_bios_get_line_length(void);
static int vesa_bios_set_line_length(int pixel);
static int vesa_bios_get_start(int *x, int *y);
static int vesa_bios_set_start(int x, int y);
static int vesa_map_gen_mode_num(int type, int color, int mode);
static int vesa_translate_flags(u_int16_t vflags);
static int vesa_translate_mmodel(u_int8_t vmodel);
static void *vesa_fix_ptr(u_int32_t p, u_int16_t seg, u_int16_t off,
u_char *buf);
static int vesa_bios_init(void);
static void vesa_clear_modes(video_info_t *info, int color);
static vm_offset_t vesa_map_buffer(u_int paddr, size_t size);
static void vesa_unmap_buffer(vm_offset_t vaddr, size_t size);
static int vesa_get_origin(video_adapter_t *adp, off_t *offset);
static void
dump_buffer(u_char *buf, size_t len)
@ -293,6 +320,36 @@ vesa_bios_save_palette(int start, int colors, u_char *palette, int bits)
return 0;
}
static int
vesa_bios_save_palette2(int start, int colors, u_char *r, u_char *g, u_char *b,
int bits)
{
struct vm86frame vmf;
u_char *p;
int err;
int i;
bzero(&vmf, sizeof(vmf));
vmf.vmf_eax = 0x4f09;
vmf.vmf_ebx = 1; /* get primary palette data */
vmf.vmf_ecx = colors;
vmf.vmf_edx = start;
p = (u_char *)vm86_getpage(&vesa_vmcontext, 1);
vm86_getptr(&vesa_vmcontext, (vm_offset_t)p, &vmf.vmf_es, &vmf.vmf_di);
err = vm86_datacall(0x10, &vmf, &vesa_vmcontext);
if ((err != 0) || (vmf.vmf_eax != 0x4f))
return 1;
bits = 8 - bits;
for (i = 0; i < colors; ++i) {
r[i] = p[i*4 + 2] << bits;
g[i] = p[i*4 + 1] << bits;
b[i] = p[i*4] << bits;
}
return 0;
}
static int
vesa_bios_load_palette(int start, int colors, u_char *palette, int bits)
{
@ -321,6 +378,35 @@ vesa_bios_load_palette(int start, int colors, u_char *palette, int bits)
return ((err != 0) || (vmf.vmf_eax != 0x4f));
}
static int
vesa_bios_load_palette2(int start, int colors, u_char *r, u_char *g, u_char *b,
int bits)
{
struct vm86frame vmf;
u_char *p;
int err;
int i;
p = (u_char *)vm86_getpage(&vesa_vmcontext, 1);
bits = 8 - bits;
for (i = 0; i < colors; ++i) {
p[i*4] = b[i] >> bits;
p[i*4 + 1] = g[i] >> bits;
p[i*4 + 2] = r[i] >> bits;
p[i*4 + 3] = 0;
}
bzero(&vmf, sizeof(vmf));
vmf.vmf_eax = 0x4f09;
vmf.vmf_ebx = 0; /* set primary palette data */
vmf.vmf_ecx = colors;
vmf.vmf_edx = start;
vm86_getptr(&vesa_vmcontext, (vm_offset_t)p, &vmf.vmf_es, &vmf.vmf_di);
err = vm86_datacall(0x10, &vmf, &vesa_vmcontext);
return ((err != 0) || (vmf.vmf_eax != 0x4f));
}
static int
vesa_bios_state_buf_size(void)
{
@ -371,6 +457,55 @@ vesa_bios_get_line_length(void)
return vmf.vmf_bx; /* line length in bytes */
}
static int
vesa_bios_set_line_length(int pixel)
{
struct vm86frame vmf;
int err;
bzero(&vmf, sizeof(vmf));
vmf.vmf_eax = 0x4f06;
vmf.vmf_ebx = 0; /* set scan line length in pixel */
vmf.vmf_ecx = pixel;
err = vm86_intcall(0x10, &vmf);
#if VESA_DEBUG > 1
printf("bx:%d, cx:%d, dx:%d\n", vmf.vmf_bx, vmf.vmf_cx, vmf.vmf_dx);
#endif
return ((err != 0) || (vmf.vmf_eax != 0x4f));
}
static int
vesa_bios_get_start(int *x, int *y)
{
struct vm86frame vmf;
int err;
bzero(&vmf, sizeof(vmf));
vmf.vmf_eax = 0x4f07;
vmf.vmf_ebx = 1; /* get display start */
err = vm86_intcall(0x10, &vmf);
if ((err != 0) || (vmf.vmf_eax != 0x4f))
return 1;
*x = vmf.vmf_cx;
*y = vmf.vmf_dx;
return 0;
}
static int
vesa_bios_set_start(int x, int y)
{
struct vm86frame vmf;
int err;
bzero(&vmf, sizeof(vmf));
vmf.vmf_eax = 0x4f07;
vmf.vmf_ebx = 0x80; /* set display start */
vmf.vmf_edx = y;
vmf.vmf_ecx = x;
err = vm86_intcall(0x10, &vmf);
return ((err != 0) || (vmf.vmf_eax != 0x4f));
}
/* map a generic video mode to a known mode */
static int
vesa_map_gen_mode_num(int type, int color, int mode)
@ -415,6 +550,29 @@ vesa_translate_flags(u_int16_t vflags)
return flags;
}
static int
vesa_translate_mmodel(u_int8_t vmodel)
{
static struct {
u_int8_t vmodel;
int mmodel;
} mtable[] = {
{ V_MMTEXT, V_INFO_MM_TEXT },
{ V_MMCGA, V_INFO_MM_CGA },
{ V_MMHGC, V_INFO_MM_HGC },
{ V_MMEGA, V_INFO_MM_PLANAR },
{ V_MMPACKED, V_INFO_MM_PACKED },
{ V_MMDIRCOLOR, V_INFO_MM_DIRECT },
};
int i;
for (i = 0; mtable[i].mmodel >= 0; ++i) {
if (mtable[i].vmodel == vmodel)
return mtable[i].mmodel;
}
return V_INFO_MM_OTHER;
}
static void
*vesa_fix_ptr(u_int32_t p, u_int16_t seg, u_int16_t off, u_char *buf)
{
@ -434,6 +592,7 @@ vesa_bios_init(void)
static u_char buf[512];
struct vm86frame vmf;
struct vesa_mode vmode;
video_info_t *p;
u_char *vmbuf;
int modes;
int err;
@ -444,6 +603,7 @@ vesa_bios_init(void)
has_vesa_bios = FALSE;
vesa_adp_info = NULL;
vesa_vmode_max = 0;
vesa_vmode[0].vi_mode = EOT;
vmbuf = (u_char *)vm86_addpage(&vesa_vmcontext, 1, 0);
@ -463,6 +623,15 @@ vesa_bios_init(void)
}
if (vesa_adp_info->v_flags & V_NONVGA)
return 1;
if (vesa_adp_info->v_version < 0x0102) {
printf("VESA: VBE version %d.%d is not supported; "
"version 1.2 or later is required.\n",
((vesa_adp_info->v_version & 0xf000) >> 12) * 10
+ ((vesa_adp_info->v_version & 0x0f00) >> 8),
((vesa_adp_info->v_version & 0x00f0) >> 4) * 10
+ (vesa_adp_info->v_version & 0x000f));
return 1;
}
/* fix string ptrs */
vesa_oemstr = (char *)vesa_fix_ptr(vesa_adp_info->v_oemstr,
@ -480,7 +649,6 @@ vesa_bios_init(void)
}
/* obtain video mode information */
vesa_vmode[0].vi_mode = EOT;
vesa_vmodetab = (u_int16_t *)vesa_fix_ptr(vesa_adp_info->v_modetable,
vmf.vmf_es, vmf.vmf_di, buf);
if (vesa_vmodetab == NULL)
@ -488,8 +656,6 @@ vesa_bios_init(void)
for (i = 0, modes = 0;
(i < (M_VESA_MODE_MAX - M_VESA_BASE + 1))
&& (vesa_vmodetab[i] != 0xffff); ++i) {
if (modes >= VESA_MAXMODES)
break;
if (vesa_bios_get_mode(vesa_vmodetab[i], &vmode))
continue;
@ -505,6 +671,22 @@ vesa_bios_init(void)
continue;
#endif
/* expand the array if necessary */
if (modes >= vesa_vmode_max) {
vesa_vmode_max += MODE_TABLE_DELTA;
p = malloc(sizeof(*vesa_vmode)*(vesa_vmode_max + 1),
M_DEVBUF, M_WAITOK);
#if VESA_DEBUG > 1
printf("vesa_bios_init(): modes:%d, vesa_mode_max:%d\n",
modes, vesa_mode_max);
#endif
if (modes > 0) {
bcopy(vesa_vmode, p, sizeof(*vesa_vmode)*modes);
free(vesa_vmode, M_DEVBUF);
}
vesa_vmode = p;
}
/* copy some fields */
bzero(&vesa_vmode[modes], sizeof(vesa_vmode[modes]));
vesa_vmode[modes].vi_mode = vesa_vmodetab[i];
@ -518,15 +700,56 @@ vesa_bios_init(void)
/* XXX window B */
vesa_vmode[modes].vi_window_size = vmode.v_wsize*1024;
vesa_vmode[modes].vi_window_gran = vmode.v_wgran*1024;
vesa_vmode[modes].vi_buffer = vmode.v_lfb;
if (vmode.v_modeattr & V_MODELFB)
vesa_vmode[modes].vi_buffer = vmode.v_lfb;
else
vesa_vmode[modes].vi_buffer = 0;
/* XXX */
vesa_vmode[modes].vi_buffer_size
= vesa_adp_info->v_memsize*64*1024;
#if 0
if (vmode.v_offscreen > vmode.v_lfb)
vesa_vmode[modes].vi_buffer_size
= vmode.v_offscreen - vmode.v_lfb;
= vmode.v_offscreen + vmode.v_offscreensize*1024
- vmode.v_lfb;
else
vesa_vmode[modes].vi_buffer_size = vmode.v_offscreen;
/* pixel format, memory model... */
vesa_vmode[modes].vi_buffer_size
= vmode.v_offscreen + vmode.v_offscreensize*1024
#endif
vesa_vmode[modes].vi_mem_model
= vesa_translate_mmodel(vmode.v_memmodel);
vesa_vmode[modes].vi_pixel_fields[0] = 0;
vesa_vmode[modes].vi_pixel_fields[1] = 0;
vesa_vmode[modes].vi_pixel_fields[2] = 0;
vesa_vmode[modes].vi_pixel_fields[3] = 0;
vesa_vmode[modes].vi_pixel_fsizes[0] = 0;
vesa_vmode[modes].vi_pixel_fsizes[1] = 0;
vesa_vmode[modes].vi_pixel_fsizes[2] = 0;
vesa_vmode[modes].vi_pixel_fsizes[3] = 0;
if (vesa_vmode[modes].vi_mem_model == V_INFO_MM_PACKED) {
vesa_vmode[modes].vi_pixel_size = (vmode.v_bpp + 7)/8;
} else if (vesa_vmode[modes].vi_mem_model == V_INFO_MM_DIRECT) {
vesa_vmode[modes].vi_pixel_size = (vmode.v_bpp + 7)/8;
vesa_vmode[modes].vi_pixel_fields[0]
= vmode.v_redfieldpos;
vesa_vmode[modes].vi_pixel_fields[1]
= vmode.v_greenfieldpos;
vesa_vmode[modes].vi_pixel_fields[2]
= vmode.v_bluefieldpos;
vesa_vmode[modes].vi_pixel_fields[3]
= vmode.v_resfieldpos;
vesa_vmode[modes].vi_pixel_fsizes[0]
= vmode.v_redmasksize;
vesa_vmode[modes].vi_pixel_fsizes[1]
= vmode.v_greenmasksize;
vesa_vmode[modes].vi_pixel_fsizes[2]
= vmode.v_bluemasksize;
vesa_vmode[modes].vi_pixel_fsizes[3]
= vmode.v_resmasksize;
} else {
vesa_vmode[modes].vi_pixel_size = 0;
}
vesa_vmode[modes].vi_flags
= vesa_translate_flags(vmode.v_modeattr) | V_INFO_VESA;
++modes;
@ -549,6 +772,30 @@ vesa_clear_modes(video_info_t *info, int color)
}
}
static vm_offset_t
vesa_map_buffer(u_int paddr, size_t size)
{
vm_offset_t vaddr;
u_int off;
off = paddr - trunc_page(paddr);
vaddr = (vm_offset_t)pmap_mapdev(paddr - off, size + off);
#if VESA_DEBUG > 1
printf("vesa_map_buffer: paddr:%x vaddr:%x size:%x off:%x\n",
paddr, vaddr, size, off);
#endif
return (vaddr + off);
}
static void
vesa_unmap_buffer(vm_offset_t vaddr, size_t size)
{
#if VESA_DEBUG > 1
printf("vesa_unmap_buffer: vaddr:%x size:%x\n", vaddr, size);
#endif
kmem_free(kernel_map, vaddr, size);
}
/* entry points */
static int
@ -623,6 +870,12 @@ vesa_nop(void)
return 0;
}
static int
vesa_error(void)
{
return 1;
}
static int
vesa_probe(int unit, video_adapter_t **adpp, void *arg, int flags)
{
@ -701,43 +954,36 @@ static int
vesa_set_mode(video_adapter_t *adp, int mode)
{
video_info_t info;
size_t len;
int len;
if (adp != vesa_adp)
return (*prevvidsw->set_mode)(adp, mode);
mode = vesa_map_gen_mode_num(vesa_adp->va_type,
vesa_adp->va_flags & V_ADP_COLOR, mode);
mode = vesa_map_gen_mode_num(adp->va_type,
adp->va_flags & V_ADP_COLOR, mode);
#if VESA_DEBUG > 0
printf("VESA: set_mode(): %d(%x) -> %d(%x)\n",
vesa_adp->va_mode, vesa_adp->va_mode, mode, mode);
adp->va_mode, adp->va_mode, mode, mode);
#endif
/*
* If the current mode is a VESA mode and the new mode is not,
* restore the state of the adapter first, so that non-standard,
* extended SVGA registers are set to the state compatible with
* the standard VGA modes. Otherwise (*prevvidsw->set_mode)()
* may not be able to set up the new mode correctly.
* restore the state of the adapter first by setting one of the
* standard VGA mode, so that non-standard, extended SVGA registers
* are set to the state compatible with the standard VGA modes.
* Otherwise (*prevvidsw->set_mode)() may not be able to set up
* the new mode correctly.
*/
if (VESA_MODE(vesa_adp->va_mode)) {
if (VESA_MODE(adp->va_mode)) {
if ((*prevvidsw->get_info)(adp, mode, &info) == 0) {
int10_set_mode(vesa_adp->va_initial_bios_mode);
#if 0
/* assert(vesa_state_buf != NULL); */
if ((vesa_state_buf == NULL)
|| vesa_load_state(adp, vesa_state_buf))
return 1;
free(vesa_state_buf, M_DEVBUF);
vesa_state_buf = NULL;
#if VESA_DEBUG > 0
printf("VESA: restored\n");
#endif
#endif /* 0 */
int10_set_mode(adp->va_initial_bios_mode);
if (adp->va_info.vi_flags & V_INFO_LINEAR)
vesa_unmap_buffer(adp->va_buffer,
vesa_adp_info->v_memsize*64*1024);
/*
* Once (*prevvidsw->get_info)() succeeded,
* (*prevvidsw->set_mode)() below won't fail...
*/
}
/*
* once (*prevvidsw->get_info)() succeeded,
* (*prevvidsw->set_mode)() below won't fail...
*/
}
/* we may not need to handle this mode after all... */
@ -752,33 +998,17 @@ vesa_set_mode(video_adapter_t *adp, int mode)
#if VESA_DEBUG > 0
printf("VESA: about to set a VESA mode...\n");
#endif
/*
* If the current mode is not a VESA mode, save the current state
* so that the adapter state can be restored later when a non-VESA
* mode is to be set up. See above.
*/
#if 0
if (!VESA_MODE(vesa_adp->va_mode) && (vesa_state_buf == NULL)) {
len = vesa_save_state(adp, NULL, 0);
vesa_state_buf = malloc(len, M_DEVBUF, M_WAITOK);
if (vesa_save_state(adp, vesa_state_buf, len)) {
#if VESA_DEBUG > 0
printf("VESA: state save failed! (len=%d)\n", len);
#endif
free(vesa_state_buf, M_DEVBUF);
vesa_state_buf = NULL;
return 1;
}
#if VESA_DEBUG > 0
printf("VESA: saved (len=%d)\n", len);
dump_buffer(vesa_state_buf, len);
#endif
}
#endif /* 0 */
/* don't use the linear frame buffer for text modes. XXX */
if (!(info.vi_flags & V_INFO_GRAPHICS))
info.vi_flags &= ~V_INFO_LINEAR;
if (vesa_bios_set_mode(mode))
if (vesa_bios_set_mode(mode | ((info.vi_flags & V_INFO_LINEAR) ? 0x4000 : 0)))
return 1;
if (adp->va_info.vi_flags & V_INFO_LINEAR)
vesa_unmap_buffer(adp->va_buffer,
vesa_adp_info->v_memsize*64*1024);
#if VESA_DEBUG > 0
printf("VESA: mode set!\n");
#endif
@ -788,16 +1018,25 @@ vesa_set_mode(video_adapter_t *adp, int mode)
(info.vi_flags & V_INFO_COLOR) ? V_ADP_COLOR : 0;
vesa_adp->va_crtc_addr =
(vesa_adp->va_flags & V_ADP_COLOR) ? COLOR_CRTC : MONO_CRTC;
vesa_adp->va_window = BIOS_PADDRTOVADDR(info.vi_window);
vesa_adp->va_window_size = info.vi_window_size;
vesa_adp->va_window_gran = info.vi_window_gran;
if (info.vi_buffer_size == 0) {
vesa_adp->va_buffer = 0;
vesa_adp->va_buffer_size = 0;
} else {
vesa_adp->va_buffer = BIOS_PADDRTOVADDR(info.vi_buffer);
if (info.vi_flags & V_INFO_LINEAR) {
#if VESA_DEBUG > 1
printf("VESA: setting up LFB\n");
#endif
vesa_adp->va_buffer =
vesa_map_buffer(info.vi_buffer,
vesa_adp_info->v_memsize*64*1024);
vesa_adp->va_buffer_size = info.vi_buffer_size;
vesa_adp->va_window = vesa_adp->va_buffer;
vesa_adp->va_window_size = info.vi_buffer_size/info.vi_planes;
vesa_adp->va_window_gran = info.vi_buffer_size/info.vi_planes;
} else {
vesa_adp->va_buffer = 0;
vesa_adp->va_buffer_size = info.vi_buffer_size;
vesa_adp->va_window = BIOS_PADDRTOVADDR(info.vi_window);
vesa_adp->va_window_size = info.vi_window_size;
vesa_adp->va_window_gran = info.vi_window_gran;
}
vesa_adp->va_window_orig = 0;
len = vesa_bios_get_line_length();
if (len > 0) {
vesa_adp->va_line_width = len;
@ -820,6 +1059,8 @@ vesa_set_mode(video_adapter_t *adp, int mode)
} else {
vesa_adp->va_line_width = info.vi_width;
}
vesa_adp->va_disp_start.x = 0;
vesa_adp->va_disp_start.y = 0;
#if VESA_DEBUG > 0
printf("vesa_set_mode(): vi_width:%d, len:%d, line_width:%d\n",
info.vi_width, len, vesa_adp->va_line_width);
@ -926,6 +1167,22 @@ vesa_load_state(video_adapter_t *adp, void *p)
vesa_state_buf_size);
}
static int
vesa_get_origin(video_adapter_t *adp, off_t *offset)
{
struct vm86frame vmf;
int err;
bzero(&vmf, sizeof(vmf));
vmf.vmf_eax = 0x4f05;
vmf.vmf_ebx = 0x10; /* WINDOW_A, XXX */
err = vm86_intcall(0x10, &vmf);
if ((err != 0) || (vmf.vmf_eax != 0x4f))
return 1;
*offset = vmf.vmf_dx*adp->va_window_gran;
return 0;
}
static int
vesa_set_origin(video_adapter_t *adp, off_t offset)
{
@ -941,20 +1198,26 @@ vesa_set_origin(video_adapter_t *adp, off_t offset)
if (adp != vesa_adp)
return (*prevvidsw->set_win_org)(adp, offset);
if (vesa_adp->va_window_gran == 0)
/* if this is a linear frame buffer, do nothing */
if (adp->va_info.vi_flags & V_INFO_LINEAR)
return 0;
/* XXX */
if (adp->va_window_gran == 0)
return 1;
bzero(&vmf, sizeof(vmf));
vmf.vmf_eax = 0x4f05;
vmf.vmf_ebx = 0; /* WINDOW_A, XXX */
vmf.vmf_edx = offset/vesa_adp->va_window_gran;
vmf.vmf_edx = offset/adp->va_window_gran;
err = vm86_intcall(0x10, &vmf);
if ((err != 0) || (vmf.vmf_eax != 0x4f))
return 1;
bzero(&vmf, sizeof(vmf));
vmf.vmf_eax = 0x4f05;
vmf.vmf_ebx = 1; /* WINDOW_B, XXX */
vmf.vmf_edx = offset/vesa_adp->va_window_gran;
vmf.vmf_edx = offset/adp->va_window_gran;
err = vm86_intcall(0x10, &vmf);
adp->va_window_orig = (offset/adp->va_window_gran)*adp->va_window_gran;
return 0; /* XXX */
}
@ -979,25 +1242,222 @@ vesa_set_hw_cursor_shape(video_adapter_t *adp, int base, int height,
}
static int
vesa_mmap(video_adapter_t *adp, vm_offset_t offset)
vesa_blank_display(video_adapter_t *adp, int mode)
{
return (*prevvidsw->mmap)(adp, offset);
/* XXX: use VESA DPMS */
return (*prevvidsw->blank_display)(adp, mode);
}
static int
vesa_mmap(video_adapter_t *adp, vm_offset_t offset, int prot)
{
#if VESA_DEBUG > 0
printf("vesa_mmap(): window:0x%x, buffer:0x%x, offset:0x%x\n",
adp->va_info.vi_window, adp->va_info.vi_buffer, offset);
#endif
if ((adp == vesa_adp) && (adp->va_info.vi_flags & V_INFO_LINEAR)) {
/* va_window_size == va_buffer_size/vi_planes */
/* XXX: is this correct? */
if (offset > adp->va_window_size - PAGE_SIZE)
return -1;
#ifdef __i386__
return i386_btop(adp->va_info.vi_buffer + offset);
#endif
#ifdef __alpha__ /* XXX */
return alpha_btop(adp->va_info.vi_buffer + offset);
#endif
} else {
return (*prevvidsw->mmap)(adp, offset, prot);
}
}
static int
vesa_clear(video_adapter_t *adp)
{
return (*prevvidsw->clear)(adp);
}
static int
vesa_fill_rect(video_adapter_t *adp, int val, int x, int y, int cx, int cy)
{
return (*prevvidsw->fill_rect)(adp, val, x, y, cx, cy);
}
static int
vesa_bitblt(video_adapter_t *adp,...)
{
/* FIXME */
return 1;
}
static int
get_palette(video_adapter_t *adp, int base, int count,
u_char *red, u_char *green, u_char *blue, u_char *trans)
{
u_char *r;
u_char *g;
u_char *b;
int bits;
int error;
if ((base < 0) || (base >= 256) || (base + count > 256))
return 1;
if (!(vesa_adp_info->v_flags & V_DAC8) || !VESA_MODE(adp->va_mode))
return 1;
bits = vesa_bios_get_dac();
if (bits <= 6)
return 1;
r = malloc(count*3, M_DEVBUF, M_WAITOK);
g = r + count;
b = g + count;
error = vesa_bios_save_palette2(base, count, r, g, b, bits);
if (error == 0) {
copyout(r, red, count);
copyout(g, green, count);
copyout(b, blue, count);
if (trans != NULL) {
bzero(r, count);
copyout(r, trans, count);
}
}
free(r, M_DEVBUF);
/* if error && bits != 6 at this point, we are in in trouble... XXX */
return error;
}
static int
set_palette(video_adapter_t *adp, int base, int count,
u_char *red, u_char *green, u_char *blue, u_char *trans)
{
return 1;
#if notyet
u_char *r;
u_char *g;
u_char *b;
int bits;
int error;
if ((base < 0) || (base >= 256) || (base + count > 256))
return 1;
if (!(vesa_adp_info->v_flags & V_DAC8) || !VESA_MODE(adp->va_mode)
|| ((bits = vesa_bios_set_dac(8)) <= 6))
return 1;
r = malloc(count*3, M_DEVBUF, M_WAITOK);
g = r + count;
b = g + count;
copyin(red, r, count);
copyin(green, g, count);
copyin(blue, b, count);
error = vesa_bios_load_palette2(base, count, r, g, b, bits);
free(r, M_DEVBUF);
if (error == 0)
return 0;
/* if the following call fails, we are in trouble... XXX */
vesa_bios_set_dac(6);
return 1;
#endif /* notyet */
}
static int
vesa_ioctl(video_adapter_t *adp, u_long cmd, caddr_t arg)
{
if (adp != vesa_adp)
return (*prevvidsw->ioctl)(adp, cmd, arg);
switch (cmd) {
case FBIO_SETWINORG: /* set frame buffer window origin */
return (vesa_set_origin(adp, *(off_t *)arg) ? ENODEV : 0);
case FBIO_SETDISPSTART: /* set display start address */
if (vesa_bios_set_start(((video_display_start_t *)arg)->x,
((video_display_start_t *)arg)->y))
return ENODEV;
adp->va_disp_start.x = ((video_display_start_t *)arg)->x;
adp->va_disp_start.y = ((video_display_start_t *)arg)->y;
return 0;
case FBIO_SETLINEWIDTH: /* set line length in pixel */
if (vesa_bios_set_line_length(*(u_int *)arg))
return ENODEV;
adp->va_line_width = (*(u_int *)arg + 7)/8;
return 0;
case FBIO_GETPALETTE: /* get color palette */
if (get_palette(adp, ((video_color_palette_t *)arg)->index,
((video_color_palette_t *)arg)->count,
((video_color_palette_t *)arg)->red,
((video_color_palette_t *)arg)->green,
((video_color_palette_t *)arg)->blue,
((video_color_palette_t *)arg)->transparent))
return (*prevvidsw->ioctl)(adp, cmd, arg);
return 0;
case FBIO_SETPALETTE: /* set color palette */
if (set_palette(adp, ((video_color_palette_t *)arg)->index,
((video_color_palette_t *)arg)->count,
((video_color_palette_t *)arg)->red,
((video_color_palette_t *)arg)->green,
((video_color_palette_t *)arg)->blue,
((video_color_palette_t *)arg)->transparent))
return (*prevvidsw->ioctl)(adp, cmd, arg);
return 0;
case FBIOGETCMAP: /* get color palette */
if (get_palette(adp, ((struct fbcmap *)arg)->index,
((struct fbcmap *)arg)->count,
((struct fbcmap *)arg)->red,
((struct fbcmap *)arg)->green,
((struct fbcmap *)arg)->blue, NULL))
return (*prevvidsw->ioctl)(adp, cmd, arg);
return 0;
case FBIOPUTCMAP: /* set color palette */
if (set_palette(adp, ((struct fbcmap *)arg)->index,
((struct fbcmap *)arg)->count,
((struct fbcmap *)arg)->red,
((struct fbcmap *)arg)->green,
((struct fbcmap *)arg)->blue, NULL))
return (*prevvidsw->ioctl)(adp, cmd, arg);
return 0;
default:
return (*prevvidsw->ioctl)(adp, cmd, arg);
}
}
static int
vesa_diag(video_adapter_t *adp, int level)
{
#if VESA_DEBUG > 1
struct vesa_mode vmode;
int i;
#endif
int error;
/* call the previous handler first */
error = (*prevvidsw->diag)(adp, level);
if (error)
return error;
if (adp != vesa_adp)
return 1;
#ifndef KLD_MODULE
/* call the previous handler first */
(*prevvidsw->diag)(adp, level);
if (level <= 0)
return 0;
return 0;
}
static int
vesa_bios_info(int level)
{
#if VESA_DEBUG > 1
struct vesa_mode vmode;
int i;
#endif
/* general adapter information */
@ -1016,15 +1476,11 @@ vesa_diag(video_adapter_t *adp, int level)
return 0;
if (vesa_adp_info->v_version >= 0x0200) {
/* vendor name */
if (vesa_venderstr != NULL)
printf("VESA: %s\n", vesa_venderstr);
/* product name */
if (vesa_prodstr != NULL)
printf("VESA: %s\n", vesa_prodstr);
/* product revision */
if (vesa_revstr != NULL)
printf("VESA: %s\n", vesa_revstr);
/* vender name, product name, product revision */
printf("VESA: %s %s %s\n",
(vesa_venderstr != NULL) ? vesa_venderstr : "unknown",
(vesa_prodstr != NULL) ? vesa_prodstr : "unknown",
(vesa_revstr != NULL) ? vesa_revstr : "?");
}
#if VESA_DEBUG > 1
@ -1047,13 +1503,15 @@ vesa_diag(video_adapter_t *adp, int level)
printf(", T %dx%d, ",
vmode.v_width, vmode.v_height);
}
printf("font:%dx%d",
printf("font:%dx%d, ",
vmode.v_cwidth, vmode.v_cheight);
printf("pages:%d, mem:%d",
vmode.v_ipages + 1, vmode.v_memmodel);
}
if (vmode.v_modeattr & V_MODELFB) {
printf(", mem:%d, LFB:0x%x, off:0x%x",
vmode.v_memmodel, vmode.v_lfb,
vmode.v_offscreen);
printf("\nVESA: LFB:0x%x, off:0x%x, off_size:0x%x",
vmode.v_lfb, vmode.v_offscreen,
vmode.v_offscreensize*1024);
}
printf("\n");
printf("VESA: window A:0x%x (%x), window B:0x%x (%x), ",
@ -1062,7 +1520,7 @@ vesa_diag(video_adapter_t *adp, int level)
printf("size:%dk, gran:%dk\n",
vmode.v_wsize, vmode.v_wgran);
}
#endif
#endif /* VESA_DEBUG > 1 */
return 0;
}
@ -1084,14 +1542,14 @@ vesa_load(void)
error = vesa_configure(0);
splx(s);
#ifdef KLD_MODULE
if (error == 0)
vesa_diag(vesa_adp, bootverbose);
#endif
vesa_bios_info(bootverbose);
return error;
}
#ifdef KLD_MODULE
static int
vesa_unload(void)
{
@ -1130,6 +1588,8 @@ vesa_unload(void)
return error;
}
#endif /* KLD_MODULE */
static int
vesa_mod_event(module_t mod, int type, void *data)
{
@ -1137,7 +1597,11 @@ vesa_mod_event(module_t mod, int type, void *data)
case MOD_LOAD:
return vesa_load();
case MOD_UNLOAD:
#ifdef KLD_MODULE
return vesa_unload();
#else
return EBUSY;
#endif
default:
break;
}

View File

@ -30,7 +30,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: sio.c,v 1.248 1999/06/19 08:14:56 grog Exp $
* $Id: sio.c,v 1.249 1999/06/20 13:10:09 peter Exp $
* from: @(#)com.c 7.5 (Berkeley) 5/16/91
* from: i386/isa sio.c,v 1.234
*/
@ -2656,7 +2656,7 @@ static cn_checkc_t siocncheckc;
static cn_getc_t siocngetc;
static cn_putc_t siocnputc;
CONS_DRIVER(sio, siocnprobe, siocninit, siocngetc, siocncheckc, siocnputc);
CONS_DRIVER(sio, siocnprobe, siocninit, NULL, siocngetc, siocncheckc, siocnputc);
/* To get the GDB related variables */
#if DDB > 0
@ -2855,7 +2855,6 @@ siocnprobe(cp)
cp->cn_pri = COM_FORCECONSOLE(flags)
|| boothowto & RB_SERIAL
? CN_REMOTE : CN_NORMAL;
printf("sio%d: system console\n", unit);
siocniobase = iobase;
siocnunit = unit;
}
@ -2897,10 +2896,7 @@ siocnprobe(cp)
#ifdef __alpha__
struct consdev siocons = {
NULL, NULL, siocngetc, siocncheckc, siocnputc,
NULL, 0, CN_NORMAL,
};
CONS_DRIVER(sio, NULL, NULL, NULL, siocngetc, siocncheckc, siocnputc);
extern struct consdev *cn_tab;
@ -2915,6 +2911,8 @@ siocnattach(port, speed)
siocniobase = port;
comdefaultrate = speed;
sio_consdev.cn_pri = CN_NORMAL;
sio_consdev.cn_dev = makedev(CDEV_MAJOR, 0);
s = spltty();
@ -2938,8 +2936,7 @@ siocnattach(port, speed)
siocnopen(&sp, siocniobase, comdefaultrate);
splx(s);
siocons.cn_dev = makedev(CDEV_MAJOR, 0);
cn_tab = &siocons;
cn_tab = &sio_consdev;
return 0;
}

View File

@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: syscons_isa.c,v 1.3 1999/05/08 21:59:31 dfr Exp $
* $Id: syscons_isa.c,v 1.4 1999/05/30 11:12:29 dfr Exp $
*/
#include "sc.h"
@ -37,33 +37,53 @@
#include <sys/module.h>
#include <sys/bus.h>
#include <machine/cons.h>
#include <machine/console.h>
#ifdef __i386__
#include <machine/apm_bios.h>
#endif
#include <machine/clock.h>
#include <machine/md_var.h>
#include <machine/pc/bios.h>
#include <vm/vm.h>
#include <vm/pmap.h>
#include <i386/isa/timerreg.h>
#define BIOS_CLKED (1 << 6)
#define BIOS_NLKED (1 << 5)
#define BIOS_SLKED (1 << 4)
#define BIOS_ALKED 0
#endif /* __i386__ */
#include <dev/syscons/syscons.h>
#include <isa/isareg.h>
#include <isa/isavar.h>
devclass_t sc_devclass;
static devclass_t sc_devclass;
static int scprobe(device_t dev);
static int scattach(device_t dev);
static int scresume(device_t dev);
static device_method_t sc_methods[] = {
DEVMETHOD(device_probe, scprobe),
DEVMETHOD(device_attach, scattach),
DEVMETHOD(device_resume, scresume),
{ 0, 0 }
};
static driver_t sc_driver = {
"sc",
SC_DRIVER_NAME,
sc_methods,
1, /* XXX */
};
static sc_softc_t main_softc = { 0, 0, 0, -1, NULL, -1, NULL, };
static int
scprobe(device_t dev)
{
@ -81,6 +101,146 @@ scattach(device_t dev)
return sc_attach_unit(device_get_unit(dev), isa_get_flags(dev));
}
static int
scresume(device_t dev)
{
return sc_resume_unit(device_get_unit(dev));
}
int
sc_max_unit(void)
{
return devclass_get_maxunit(sc_devclass);
}
sc_softc_t
*sc_get_softc(int unit, int flags)
{
sc_softc_t *sc;
if ((unit < 0) || (unit >= NSC))
return NULL;
if (flags & SC_KERNEL_CONSOLE) {
/* FIXME: clear if it is wired to another unit! */
main_softc.unit = unit;
return &main_softc;
} else {
sc = (sc_softc_t *)devclass_get_softc(sc_devclass, unit);
if (!(sc->flags & SC_INIT_DONE)) {
sc->unit = unit;
sc->keyboard = -1;
sc->adapter = -1;
}
return sc;
}
}
sc_softc_t
*sc_find_softc(struct video_adapter *adp, struct keyboard *kbd)
{
sc_softc_t *sc;
int units;
int i;
sc = &main_softc;
if (((adp == NULL) || (adp == sc->adp))
&& ((kbd == NULL) || (kbd == sc->kbd)))
return sc;
units = devclass_get_maxunit(sc_devclass);
for (i = 0; i < units; ++i) {
sc = (sc_softc_t *)devclass_get_softc(sc_devclass, i);
if (sc == NULL)
continue;
if (((adp == NULL) || (adp == sc->adp))
&& ((kbd == NULL) || (kbd == sc->kbd)))
return sc;
}
return NULL;
}
int
sc_get_cons_priority(int *unit, int *flags)
{
int disabled;
int u, f;
int i;
*unit = -1;
for (i = -1; (i = resource_locate(i, SC_DRIVER_NAME)) >= 0;) {
u = resource_query_unit(i);
if ((resource_int_value(SC_DRIVER_NAME, u, "disabled",
&disabled) == 0) && disabled)
continue;
if (resource_int_value(SC_DRIVER_NAME, u, "flags", &f) != 0)
f = 0;
if (f & SC_KERNEL_CONSOLE) {
/* the user designates this unit to be the console */
*unit = u;
*flags = f;
break;
}
if (*unit < 0) {
/* ...otherwise remember the first found unit */
*unit = u;
*flags = f;
}
}
if ((i < 0) && (*unit < 0))
return CN_DEAD;
#if 0
return ((*flags & SC_KERNEL_CONSOLE) ? CN_INTERNAL : CN_NORMAL);
#endif
return CN_INTERNAL;
}
void
sc_get_bios_values(bios_values_t *values)
{
#ifdef __i386__
u_int8_t shift;
values->cursor_start = *(u_int8_t *)BIOS_PADDRTOVADDR(0x461);
values->cursor_end = *(u_int8_t *)BIOS_PADDRTOVADDR(0x460);
shift = *(u_int8_t *)BIOS_PADDRTOVADDR(0x417);
values->shift_state = ((shift & BIOS_CLKED) ? CLKED : 0)
| ((shift & BIOS_NLKED) ? NLKED : 0)
| ((shift & BIOS_SLKED) ? SLKED : 0)
| ((shift & BIOS_ALKED) ? ALKED : 0);
values->bell_pitch = BELL_PITCH;
#else /* !__i386__ */
values->cursor_start = 0;
values->cursor_end = 32;
values->shift_state = 0;
values->bell_pitch = BELL_PITCH;
#endif /* __i386__ */
}
int
sc_tone(int herz)
{
#ifdef __i386__
int pitch;
if (herz) {
/* set command for counter 2, 2 byte write */
if (acquire_timer2(TIMER_16BIT | TIMER_SQWAVE))
return EBUSY;
/* set pitch */
pitch = timer_freq/herz;
outb(TIMER_CNTR2, pitch);
outb(TIMER_CNTR2, pitch >> 8);
/* enable counter 2 output to speaker */
outb(IO_PPI, inb(IO_PPI) | 3);
} else {
/* disable counter 2 output to speaker */
outb(IO_PPI, inb(IO_PPI) & 0xFC);
release_timer2();
}
#endif /* __i386__ */
return 0;
}
DRIVER_MODULE(sc, isa, sc_driver, sc_devclass, 0, 0);
#endif /* NSC > 0 */

File diff suppressed because it is too large Load Diff

View File

@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* from: @(#)cons.c 7.2 (Berkeley) 5/9/91
* $Id: cons.c,v 1.66 1999/05/30 16:52:03 phk Exp $
* $Id: cons.c,v 1.67 1999/05/31 11:25:41 phk Exp $
*/
#include "opt_devfs.h"
@ -109,19 +109,19 @@ static struct tty *cn_tp; /* physical console tty struct */
static void *cn_devfs_token; /* represents the devfs entry */
#endif /* DEVFS */
CONS_DRIVER(cons, NULL, NULL, NULL, NULL, NULL);
CONS_DRIVER(cons, NULL, NULL, NULL, NULL, NULL, NULL);
void
cninit()
{
struct consdev *best_cp, *cp;
struct consdev **list;
const struct consdev **list;
/*
* Find the first console with the highest priority.
*/
best_cp = NULL;
list = (struct consdev **)cons_set.ls_items;
list = (const struct consdev **)cons_set.ls_items;
while ((cp = *list++) != NULL) {
if (cp->cn_probe == NULL)
continue;
@ -147,6 +147,8 @@ cninit()
* If no console, give up.
*/
if (best_cp == NULL) {
if (cn_tab != NULL && cn_tab->cn_term != NULL)
(*cn_tab->cn_term)(cn_tab);
cn_tab = best_cp;
return;
}
@ -154,10 +156,13 @@ cninit()
/*
* Initialize console, then attach to it. This ordering allows
* debugging using the previous console, if any.
* XXX if there was a previous console, then its driver should
* be informed when we forget about it.
*/
(*best_cp->cn_init)(best_cp);
if (cn_tab != NULL && cn_tab != best_cp) {
/* Turn off the previous console. */
if (cn_tab->cn_term != NULL)
(*cn_tab->cn_term)(cn_tab);
}
cn_tab = best_cp;
}

View File

@ -24,15 +24,14 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: splash_bmp.c,v 1.7 1999/03/29 15:13:53 yokota Exp $
* $Id: splash_bmp.c,v 1.8 1999/06/16 14:04:45 yokota Exp $
*/
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/linker.h>
#include <machine/console.h>
#include <sys/fbio.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>

View File

@ -27,15 +27,14 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id$
* $Id: splash_pcx.c,v 1.1 1999/04/12 13:39:11 des Exp $
*/
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/linker.h>
#include <machine/console.h>
#include <sys/fbio.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>

View File

@ -25,82 +25,35 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: blank_saver.c,v 1.14 1998/11/04 03:49:38 peter Exp $
* $Id: blank_saver.c,v 1.15 1999/01/11 03:18:44 yokota Exp $
*/
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/consio.h>
#include <sys/fbio.h>
#include <dev/fb/vgareg.h>
#include <i386/isa/isa.h>
#include <saver.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>
#include <dev/syscons/syscons.h>
static int
blank_saver(video_adapter_t *adp, int blank)
{
u_char val;
if (blank) {
switch (adp->va_type) {
case KD_VGA:
outb(TSIDX, 0x01); val = inb(TSREG);
outb(TSIDX, 0x01); outb(TSREG, val | 0x20);
break;
case KD_EGA:
/* not yet done XXX */
break;
case KD_CGA:
outb(adp->va_crtc_addr + 4, 0x25);
break;
case KD_MONO:
case KD_HERCULES:
outb(adp->va_crtc_addr + 4, 0x21);
break;
default:
break;
}
}
else {
switch (adp->va_type) {
case KD_VGA:
outb(TSIDX, 0x01); val = inb(TSREG);
outb(TSIDX, 0x01); outb(TSREG, val & 0xDF);
break;
case KD_EGA:
/* not yet done XXX */
break;
case KD_CGA:
outb(adp->va_crtc_addr + 4, 0x2d);
break;
case KD_MONO:
case KD_HERCULES:
outb(adp->va_crtc_addr + 4, 0x29);
break;
default:
break;
}
}
(*vidsw[adp->va_index]->blank_display)(adp,
(blank) ? V_DISPLAY_BLANK
: V_DISPLAY_ON);
return 0;
}
static int
blank_init(video_adapter_t *adp)
{
switch (adp->va_type) {
case KD_MONO:
case KD_HERCULES:
case KD_CGA:
case KD_VGA:
break;
case KD_EGA:
/* EGA is yet to be supported */
default:
return ENODEV;
}
return 0;
if ((*vidsw[adp->va_index]->blank_display)(adp, V_DISPLAY_ON) == 0)
return 0;
return ENODEV;
}
static int

View File

@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: daemon_saver.c,v 1.14 1999/01/17 14:25:08 yokota Exp $
* $Id: daemon_saver.c,v 1.15 1999/02/05 12:40:15 des Exp $
*/
#include <sys/param.h>
@ -34,21 +34,20 @@
#include <sys/malloc.h>
#include <sys/kernel.h>
#include <sys/sysctl.h>
#include <sys/consio.h>
#include <sys/fbio.h>
#include <machine/md_var.h>
#include <machine/pc/display.h>
#include <saver.h>
#define CONSOLE_VECT(x, y) \
(window + (y)*cur_console->xsize + (x))
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>
#include <dev/syscons/syscons.h>
#define DAEMON_MAX_WIDTH 32
#define DAEMON_MAX_HEIGHT 19
static char *message;
static int messagelen;
static u_short *window;
static int blanked;
/* Who is the author of this ASCII pic? */
@ -119,20 +118,23 @@ xflip_symbol(char symbol)
}
static void
clear_daemon(int xpos, int ypos, int dxdir, int xoff, int yoff,
clear_daemon(sc_softc_t *sc, int xpos, int ypos, int dxdir, int xoff, int yoff,
int xlen, int ylen)
{
int y;
if (xlen <= 0)
return;
for (y = yoff; y < ylen; y++)
fillw(((FG_LIGHTGREY|BG_BLACK) << 8) | scr_map[0x20],
CONSOLE_VECT(xpos + xoff, ypos + y), xlen - xoff);
for (y = yoff; y < ylen; y++) {
sc_vtb_erase(&sc->cur_scp->scr,
(ypos + y)*sc->cur_scp->xsize + xpos + xoff,
xlen - xoff,
sc->scr_map[0x20], (FG_LIGHTGREY | BG_BLACK) << 8);
}
}
static void
draw_daemon(int xpos, int ypos, int dxdir, int xoff, int yoff,
draw_daemon(sc_softc_t *sc, int xpos, int ypos, int dxdir, int xoff, int yoff,
int xlen, int ylen)
{
int x, y;
@ -148,41 +150,60 @@ draw_daemon(int xpos, int ypos, int dxdir, int xoff, int yoff,
continue;
for (x = xoff; (x < xlen) && (daemon_pic[y][px] != '\0'); x++, px++) {
switch (daemon_attr[y][px]) {
#ifndef PC98
case 'R': attr = (FG_LIGHTRED|BG_BLACK)<<8; break;
case 'Y': attr = (FG_YELLOW|BG_BLACK)<<8; break;
case 'B': attr = (FG_LIGHTBLUE|BG_BLACK)<<8; break;
case 'W': attr = (FG_LIGHTGREY|BG_BLACK)<<8; break;
case 'C': attr = (FG_CYAN|BG_BLACK)<<8; break;
default: attr = (FG_WHITE|BG_BLACK)<<8; break;
#else /* PC98 */
case 'R': attr = (FG_RED|BG_BLACK)<<8; break;
case 'Y': attr = (FG_BROWN|BG_BLACK)<<8; break;
case 'B': attr = (FG_BLUE|BG_BLACK)<<8; break;
case 'W': attr = (FG_LIGHTGREY|BG_BLACK)<<8; break;
case 'C': attr = (FG_CYAN|BG_BLACK)<<8; break;
default: attr = (FG_LIGHTGREY|BG_BLACK)<<8; break;
#endif /* PC98 */
}
if (dxdir < 0) { /* Moving left */
*CONSOLE_VECT(xpos + x, ypos + y) =
scr_map[daemon_pic[y][px]]|attr;
sc_vtb_putc(&sc->cur_scp->scr,
(ypos + y)*sc->cur_scp->xsize
+ xpos + x,
sc->scr_map[daemon_pic[y][px]],
attr);
} else { /* Moving right */
*CONSOLE_VECT(xpos + DAEMON_MAX_WIDTH - px - 1, ypos + y) =
scr_map[xflip_symbol(daemon_pic[y][px])]|attr;
sc_vtb_putc(&sc->cur_scp->scr,
(ypos + y)*sc->cur_scp->xsize
+ xpos + DAEMON_MAX_WIDTH
- px - 1,
sc->scr_map[xflip_symbol(daemon_pic[y][px])],
attr);
}
}
}
}
static void
clear_string(int xpos, int ypos, int xoff, char *s, int len)
clear_string(sc_softc_t *sc, int xpos, int ypos, int xoff, char *s, int len)
{
if (len <= 0)
return;
fillw(((FG_LIGHTGREY|BG_BLACK) << 8) | scr_map[0x20],
CONSOLE_VECT(xpos + xoff, ypos), len - xoff);
sc_vtb_erase(&sc->cur_scp->scr,
ypos*sc->cur_scp->xsize + xpos + xoff, len - xoff,
sc->scr_map[0x20], (FG_LIGHTGREY | BG_BLACK) << 8);
}
static void
draw_string(int xpos, int ypos, int xoff, char *s, int len)
draw_string(sc_softc_t *sc, int xpos, int ypos, int xoff, char *s, int len)
{
int x;
for (x = xoff; x < len; x++)
*CONSOLE_VECT(xpos + x, ypos) =
scr_map[s[x]]|(FG_LIGHTGREEN|BG_BLACK)<<8;
for (x = xoff; x < len; x++) {
sc_vtb_putc(&sc->cur_scp->scr,
ypos*sc->cur_scp->xsize + xpos + x,
sc->scr_map[s[x]], (FG_LIGHTGREEN | BG_BLACK) << 8);
}
}
static int
@ -195,17 +216,30 @@ daemon_saver(video_adapter_t *adp, int blank)
static int moved_daemon = 0;
static int xoff, yoff, toff;
static int xlen, ylen, tlen;
scr_stat *scp = cur_console;
sc_softc_t *sc;
scr_stat *scp;
int min, max;
sc = sc_find_softc(adp, NULL);
if (sc == NULL)
return EAGAIN;
scp = sc->cur_scp;
if (blank) {
if (adp->va_info.vi_flags & V_INFO_GRAPHICS)
return EAGAIN;
if (blanked == 0) {
window = (u_short *)adp->va_window;
#ifdef PC98
if (epson_machine_id == 0x20) {
outb(0x43f, 0x42);
outb(0x0c17, inb(0xc17) & ~0x08);
outb(0x43f, 0x40);
}
#endif /* PC98 */
/* clear the screen and set the border color */
fillw(((FG_LIGHTGREY|BG_BLACK) << 8) | scr_map[0x20],
window, scp->xsize * scp->ysize);
sc_vtb_clear(&scp->scr, sc->scr_map[0x20],
(FG_LIGHTGREY | BG_BLACK) << 8);
(*vidsw[adp->va_index]->set_hw_cursor)(adp, -1, -1);
set_border(scp, 0);
xlen = ylen = tlen = 0;
}
@ -213,8 +247,8 @@ daemon_saver(video_adapter_t *adp, int blank)
return 0;
blanked = 1;
clear_daemon(dxpos, dypos, dxdir, xoff, yoff, xlen, ylen);
clear_string(txpos, typos, toff, (char *)message, tlen);
clear_daemon(sc, dxpos, dypos, dxdir, xoff, yoff, xlen, ylen);
clear_string(sc, txpos, typos, toff, (char *)message, tlen);
if (++moved_daemon) {
/*
@ -319,9 +353,16 @@ daemon_saver(video_adapter_t *adp, int blank)
else if (txpos + tlen > scp->xsize)
tlen = scp->xsize - txpos;
draw_daemon(dxpos, dypos, dxdir, xoff, yoff, xlen, ylen);
draw_string(txpos, typos, toff, (char *)message, tlen);
draw_daemon(sc, dxpos, dypos, dxdir, xoff, yoff, xlen, ylen);
draw_string(sc, txpos, typos, toff, (char *)message, tlen);
} else {
#ifdef PC98
if (epson_machine_id == 0x20) {
outb(0x43f, 0x42);
outb(0x0c17, inb(0xc17) | 0x08);
outb(0x43f, 0x40);
}
#endif /* PC98 */
blanked = 0;
}
return 0;

View File

@ -25,17 +25,19 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: fade_saver.c,v 1.15 1998/11/04 03:49:38 peter Exp $
* $Id: fade_saver.c,v 1.16 1999/01/11 03:18:46 yokota Exp $
*/
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/consio.h>
#include <sys/fbio.h>
#include <i386/isa/isa.h>
#include <saver.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>
#include <dev/syscons/syscons.h>
static u_char palette[256*3];
static int blanked;
@ -49,11 +51,10 @@ fade_saver(video_adapter_t *adp, int blank)
if (blank) {
blanked = TRUE;
switch (adp->va_type) {
case KD_VGA:
if (ISPALAVAIL(adp->va_flags)) {
if (count <= 0)
save_palette(adp, palette);
if (count < 64) {
if (count < 256) {
pal[0] = pal[1] = pal[2] = 0;
for (i = 3; i < 256*3; i++) {
if (palette[i] - count > 60)
@ -64,39 +65,17 @@ fade_saver(video_adapter_t *adp, int blank)
load_palette(adp, pal);
count++;
}
break;
case KD_EGA:
/* not yet done XXX */
break;
case KD_CGA:
outb(adp->va_crtc_addr + 4, 0x25);
break;
case KD_MONO:
case KD_HERCULES:
outb(adp->va_crtc_addr + 4, 0x21);
break;
default:
break;
} else {
(*vidsw[adp->va_index]->blank_display)(adp,
V_DISPLAY_BLANK);
}
}
else {
switch (adp->va_type) {
case KD_VGA:
} else {
if (ISPALAVAIL(adp->va_flags)) {
load_palette(adp, palette);
count = 0;
break;
case KD_EGA:
/* not yet done XXX */
break;
case KD_CGA:
outb(adp->va_crtc_addr + 4, 0x2d);
break;
case KD_MONO:
case KD_HERCULES:
outb(adp->va_crtc_addr + 4, 0x29);
break;
default:
break;
} else {
(*vidsw[adp->va_index]->blank_display)(adp,
V_DISPLAY_ON);
}
blanked = FALSE;
}
@ -106,21 +85,9 @@ fade_saver(video_adapter_t *adp, int blank)
static int
fade_init(video_adapter_t *adp)
{
switch (adp->va_type) {
case KD_MONO:
case KD_HERCULES:
case KD_CGA:
/*
* `fade' saver is not fully implemented for MDA and CGA.
* It simply blanks the display instead.
*/
case KD_VGA:
break;
case KD_EGA:
/* EGA is yet to be supported */
default:
if (!ISPALAVAIL(adp->va_flags)
&& (*vidsw[adp->va_index]->blank_display)(adp, V_DISPLAY_ON) != 0)
return ENODEV;
}
blanked = FALSE;
return 0;
}

View File

@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: fire_saver.c,v 1.2.2.1 1999/05/10 15:20:30 des Exp $
* $Id: fire_saver.c,v 1.4 1999/05/10 15:25:50 des Exp $
*/
/*
@ -38,11 +38,14 @@
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/syslog.h>
#include <sys/consio.h>
#include <sys/fbio.h>
#include <machine/md_var.h>
#include <machine/random.h>
#include <saver.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>
#include <dev/syscons/syscons.h>
#define X_SIZE 320
#define Y_SIZE 200

View File

@ -25,93 +25,35 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: green_saver.c,v 1.14 1998/11/04 03:49:38 peter Exp $
* $Id: green_saver.c,v 1.15 1999/01/11 03:18:48 yokota Exp $
*/
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/consio.h>
#include <sys/fbio.h>
#include <dev/fb/vgareg.h>
#include <i386/isa/isa.h>
#include <saver.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>
#include <dev/syscons/syscons.h>
static int
green_saver(video_adapter_t *adp, int blank)
{
int crtc_addr;
u_char val;
crtc_addr = adp->va_crtc_addr;
if (blank) {
switch (adp->va_type) {
case KD_VGA:
outb(TSIDX, 0x01); val = inb(TSREG);
outb(TSIDX, 0x01); outb(TSREG, val | 0x20);
outb(crtc_addr, 0x17); val = inb(crtc_addr + 1);
outb(crtc_addr + 1, val & ~0x80);
break;
case KD_EGA:
/* not yet done XXX */
break;
case KD_CGA:
outb(crtc_addr + 4, 0x25);
break;
case KD_MONO:
case KD_HERCULES:
outb(crtc_addr + 4, 0x21);
break;
default:
break;
}
}
else {
switch (adp->va_type) {
case KD_VGA:
outb(TSIDX, 0x01); val = inb(TSREG);
outb(TSIDX, 0x01); outb(TSREG, val & 0xDF);
outb(crtc_addr, 0x17); val = inb(crtc_addr + 1);
outb(crtc_addr + 1, val | 0x80);
break;
case KD_EGA:
/* not yet done XXX */
break;
case KD_CGA:
outb(crtc_addr + 4, 0x2d);
break;
case KD_MONO:
case KD_HERCULES:
outb(crtc_addr + 4, 0x29);
break;
default:
break;
}
}
(*vidsw[adp->va_index]->blank_display)(adp,
(blank) ? V_DISPLAY_STAND_BY
: V_DISPLAY_ON);
return 0;
}
static int
green_init(video_adapter_t *adp)
{
switch (adp->va_type) {
case KD_MONO:
case KD_HERCULES:
case KD_CGA:
/*
* `green' saver is not fully implemented for MDA and CGA.
* It simply blanks the display instead.
*/
case KD_VGA:
break;
case KD_EGA:
/* EGA is yet to be supported */
default:
return ENODEV;
}
return 0;
if ((*vidsw[adp->va_index]->blank_display)(adp, V_DISPLAY_ON) == 0)
return 0;
return ENODEV;
}
static int

View File

@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: logo_saver.c,v 1.5 1999/02/05 12:40:15 des Exp $
* $Id: logo_saver.c,v 1.6 1999/04/12 13:34:57 des Exp $
*/
#include <sys/param.h>
@ -33,8 +33,12 @@
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/syslog.h>
#include <sys/consio.h>
#include <sys/fbio.h>
#include <saver.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>
#include <dev/syscons/syscons.h>
static u_char *vid;
static int banksize, scrmode, bpsl, scrw, scrh;
@ -104,6 +108,7 @@ logo_saver(video_adapter_t *adp, int blank)
#endif
blanked++;
vid = (u_char *)adp->va_window;
banksize = adp->va_window_size;
bpsl = adp->va_line_width;
splx(pl);
for (i = 0; i < bpsl*scrh; i += banksize) {
@ -132,7 +137,6 @@ logo_init(video_adapter_t *adp)
return ENODEV;
}
banksize = info.vi_window_size;
scrw = info.vi_width;
scrh = info.vi_height;
blanked = 0;

View File

@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: rain_saver.c,v 1.2 1999/01/11 03:18:50 yokota Exp $
* $Id: rain_saver.c,v 1.3 1999/04/12 13:34:57 des Exp $
*/
#include <sys/param.h>
@ -33,10 +33,14 @@
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/syslog.h>
#include <sys/consio.h>
#include <sys/fbio.h>
#include <machine/random.h>
#include <saver.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>
#include <dev/syscons/syscons.h>
static u_char *vid;

View File

@ -1,39 +0,0 @@
/*-
* Copyright (c) 1995-1998 Søren Schmidt
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer,
* without modification, immediately at the beginning of the file.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: saver.h,v 1.16 1999/01/16 10:20:13 des Exp $
*/
#include <machine/apm_bios.h>
#include <machine/console.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>
#include <dev/syscons/syscons.h>
extern scr_stat *cur_console;
extern char scr_map[];

View File

@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: snake_saver.c,v 1.22 1999/01/17 14:25:19 yokota Exp $
* $Id: snake_saver.c,v 1.23 1999/02/05 12:40:15 des Exp $
*/
#include <sys/param.h>
@ -34,16 +34,18 @@
#include <sys/malloc.h>
#include <sys/kernel.h>
#include <sys/sysctl.h>
#include <sys/consio.h>
#include <sys/fbio.h>
#include <machine/md_var.h>
#include <machine/pc/display.h>
#include <saver.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>
#include <dev/syscons/syscons.h>
static char *message;
static u_char **messagep;
static int *messagep;
static int messagelen;
static u_short *window;
static int blanked;
static int
@ -51,36 +53,50 @@ snake_saver(video_adapter_t *adp, int blank)
{
static int dirx, diry;
int f;
scr_stat *scp = cur_console;
sc_softc_t *sc;
scr_stat *scp;
/* XXX hack for minimal changes. */
#define save message
#define savs messagep
sc = sc_find_softc(adp, NULL);
if (sc == NULL)
return EAGAIN;
scp = sc->cur_scp;
if (blank) {
if (adp->va_info.vi_flags & V_INFO_GRAPHICS)
return EAGAIN;
if (blanked <= 0) {
window = (u_short *)adp->va_window;
fillw(((FG_LIGHTGREY|BG_BLACK)<<8) | scr_map[0x20],
window, scp->xsize * scp->ysize);
#ifdef PC98
if (epson_machine_id == 0x20) {
outb(0x43f, 0x42);
outb(0x0c17, inb(0xc17) & ~0x08);
outb(0x43f, 0x40);
}
#endif /* PC98 */
sc_vtb_clear(&scp->scr, sc->scr_map[0x20],
(FG_LIGHTGREY | BG_BLACK) << 8);
(*vidsw[adp->va_index]->set_hw_cursor)(adp, -1, -1);
set_border(scp, 0);
dirx = (scp->xpos ? 1 : -1);
diry = (scp->ypos ?
scp->xsize : -scp->xsize);
for (f=0; f< messagelen; f++)
savs[f] = (u_char *)window + 2 *
(scp->xpos+scp->ypos*scp->xsize);
*(savs[0]) = scr_map[*save];
savs[f] = scp->xpos + scp->ypos*scp->xsize;
sc_vtb_putc(&scp->scr, savs[0], sc->scr_map[*save],
(FG_LIGHTGREY | BG_BLACK) << 8);
blanked = 1;
}
if (blanked++ < 4)
return 0;
blanked = 1;
*(savs[messagelen-1]) = scr_map[0x20];
sc_vtb_putc(&scp->scr, savs[messagelen - 1], sc->scr_map[0x20],
(FG_LIGHTGREY | BG_BLACK) << 8);
for (f=messagelen-1; f > 0; f--)
savs[f] = savs[f-1];
f = (savs[0] - (u_char *)window) / 2;
f = savs[0];
if ((f % scp->xsize) == 0 ||
(f % scp->xsize) == scp->xsize - 1 ||
(random() % 50) == 0)
@ -89,11 +105,19 @@ snake_saver(video_adapter_t *adp, int blank)
(f / scp->xsize) == scp->ysize - 1 ||
(random() % 20) == 0)
diry = -diry;
savs[0] += 2*dirx + 2*diry;
savs[0] += dirx + diry;
for (f=messagelen-1; f>=0; f--)
*(savs[f]) = scr_map[save[f]];
sc_vtb_putc(&scp->scr, savs[f], sc->scr_map[save[f]],
(FG_LIGHTGREY | BG_BLACK) << 8);
}
else {
#ifdef PC98
if (epson_machine_id == 0x20) {
outb(0x43f, 0x42);
outb(0x0c17, inb(0xc17) | 0x08);
outb(0x43f, 0x40);
}
#endif /* PC98 */
blanked = 0;
}
return 0;

View File

@ -25,22 +25,24 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: star_saver.c,v 1.19 1999/01/17 14:25:19 yokota Exp $
* $Id: star_saver.c,v 1.20 1999/02/05 12:40:16 des Exp $
*/
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/consio.h>
#include <sys/fbio.h>
#include <machine/md_var.h>
#include <machine/pc/display.h>
#include <saver.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>
#include <dev/syscons/syscons.h>
#define NUM_STARS 50
static u_short *window;
static int blanked;
/*
@ -50,21 +52,39 @@ static int blanked;
static int
star_saver(video_adapter_t *adp, int blank)
{
scr_stat *scp = cur_console;
sc_softc_t *sc;
scr_stat *scp;
int cell, i;
char pattern[] = {"...........++++*** "};
#ifndef PC98
char colors[] = {FG_DARKGREY, FG_LIGHTGREY,
FG_WHITE, FG_LIGHTCYAN};
#else
char colors[] = {FG_BLUE, FG_LIGHTGREY,
FG_LIGHTGREY, FG_CYAN};
#endif /* PC98 */
static u_short stars[NUM_STARS][2];
sc = sc_find_softc(adp, NULL);
if (sc == NULL)
return EAGAIN;
scp = sc->cur_scp;
if (blank) {
if (adp->va_info.vi_flags & V_INFO_GRAPHICS)
return EAGAIN;
if (!blanked) {
window = (u_short *)adp->va_window;
#ifdef PC98
if (epson_machine_id == 0x20) {
outb(0x43f, 0x42);
outb(0x0c17, inb(0xc17) & ~0x08);
outb(0x43f, 0x40);
}
#endif /* PC98 */
/* clear the screen and set the border color */
fillw(((FG_LIGHTGREY|BG_BLACK) << 8) | scr_map[0x20],
window, scp->xsize * scp->ysize);
sc_vtb_clear(&scp->scr, sc->scr_map[0x20],
(FG_LIGHTGREY | BG_BLACK) << 8);
(*vidsw[adp->va_index]->set_hw_cursor)(adp, -1, -1);
set_border(scp, 0);
blanked = TRUE;
for(i=0; i<NUM_STARS; i++) {
@ -74,15 +94,22 @@ star_saver(video_adapter_t *adp, int blank)
}
}
cell = random() % NUM_STARS;
*((u_short*)(window + stars[cell][0])) =
scr_map[pattern[stars[cell][1]]] |
colors[random()%sizeof(colors)] << 8;
sc_vtb_putc(&scp->scr, stars[cell][0],
sc->scr_map[pattern[stars[cell][1]]],
colors[random()%sizeof(colors)] << 8);
if ((stars[cell][1]+=(random()%4)) >= sizeof(pattern)-1) {
stars[cell][0] = random() % (scp->xsize*scp->ysize);
stars[cell][1] = 0;
}
}
else {
#ifdef PC98
if (epson_machine_id == 0x20) {
outb(0x43f, 0x42);
outb(0x0c17, inb(0xc17) | 0x08);
outb(0x43f, 0x40);
}
#endif /* PC98 */
blanked = FALSE;
}
return 0;

View File

@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: warp_saver.c,v 1.4 1999/01/11 03:18:55 yokota Exp $
* $Id: warp_saver.c,v 1.5 1999/04/12 13:34:58 des Exp $
*/
#include <sys/param.h>
@ -33,11 +33,14 @@
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/syslog.h>
#include <sys/consio.h>
#include <sys/fbio.h>
#include <machine/md_var.h>
#include <machine/random.h>
#include <saver.h>
#include <dev/fb/fbreg.h>
#include <dev/fb/splashreg.h>
#include <dev/syscons/syscons.h>
static u_char *vid;
static int blanked;

View File

@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* from: @(#)cons.h 7.2 (Berkeley) 5/9/91
* $Id: cons.h,v 1.18 1999/01/07 14:14:11 yokota Exp $
* $Id: cons.h,v 1.19 1999/01/09 14:07:37 bde Exp $
*/
#ifndef _MACHINE_CONS_H_
@ -45,6 +45,7 @@
struct consdev;
typedef void cn_probe_t __P((struct consdev *));
typedef void cn_init_t __P((struct consdev *));
typedef void cn_term_t __P((struct consdev *));
typedef int cn_getc_t __P((dev_t));
typedef int cn_checkc_t __P((dev_t));
typedef void cn_putc_t __P((dev_t, int));
@ -54,6 +55,8 @@ struct consdev {
/* probe hardware and fill in consdev info */
cn_init_t *cn_init;
/* turn on as console */
cn_term_t *cn_term;
/* turn off as console */
cn_getc_t *cn_getc;
/* kernel getchar interface */
cn_checkc_t *cn_checkc;
@ -75,10 +78,10 @@ struct consdev {
extern struct linker_set cons_set;
extern int cons_unavail;
#define CONS_DRIVER(name, probe, init, getc, checkc, putc) \
static struct consdev name##_consdev = { \
probe, init, getc, checkc, putc \
}; \
#define CONS_DRIVER(name, probe, init, term, getc, checkc, putc) \
static struct consdev name##_consdev = { \
probe, init, term, getc, checkc, putc \
}; \
DATA_SET(cons_set, name##_consdev)
/* Other kernel entry points. */

385
sys/sys/consio.h Normal file
View File

@ -0,0 +1,385 @@
/*-
* Copyright (c) 1991-1996 Søren Schmidt
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer
* in this position and unchanged.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: console.h,v 1.45 1999/03/10 10:36:47 yokota Exp $
*/
#ifndef _SYS_CONSIO_H_
#define _SYS_CONSIO_H_
#ifndef KERNEL
#include <sys/types.h>
#endif
#include <sys/ioccom.h>
/*
* Console ioctl commands. Some commands are named as KDXXXX, GIO_XXX, and
* PIO_XXX, rather than CONS_XXX, for historical and compatibility reasons.
* Some other CONS_XXX commands are works as wrapper around frame buffer
* ioctl commands FBIO_XXX. Do not try to change all these commands,
* otherwise we shall have compatibility problems.
*/
/* get/set video mode */
#define KD_TEXT 0 /* set text mode restore fonts */
#define KD_TEXT0 0 /* ditto */
#define KD_GRAPHICS 1 /* set graphics mode */
#define KD_TEXT1 2 /* set text mode !restore fonts */
#define KD_PIXEL 3 /* set pixel mode */
#define KDGETMODE _IOR('K', 9, int)
#define KDSETMODE _IO('K', 10 /*, int */)
/* set border color */
#define KDSBORDER _IO('K', 13 /*, int */)
/* set up raster(pixel) text mode */
struct scr_size {
int scr_size[3];
};
typedef struct scr_size scr_size_t;
#define KDRASTER _IOW('K', 100, scr_size_t)
/* get/set screen char map */
struct scrmap {
char scrmap[256];
};
typedef struct scrmap scrmap_t;
#define GIO_SCRNMAP _IOR('k', 2, scrmap_t)
#define PIO_SCRNMAP _IOW('k', 3, scrmap_t)
/* get the current text attribute */
#define GIO_ATTR _IOR('a', 0, int)
/* get the current text color */
#define GIO_COLOR _IOR('c', 0, int)
/* get the adapter type (equivalent to FBIO_ADPTYPE) */
#define CONS_CURRENT _IOR('c', 1, int)
/* get the current video mode (equivalent to FBIO_GETMODE) */
#define CONS_GET _IOR('c', 2, int)
/* not supported? */
#define CONS_IO _IO('c', 3)
/* set blank time interval */
#define CONS_BLANKTIME _IOW('c', 4, int)
/* set/get the screen saver (these ioctls are current noop) */
struct ssaver {
#define MAXSSAVER 16
char name[MAXSSAVER];
int num;
long time;
};
typedef struct ssaver ssaver_t;
#define CONS_SSAVER _IOW('c', 5, ssaver_t)
#define CONS_GSAVER _IOWR('c', 6, ssaver_t)
/* set the text cursor shape */
#define CONS_BLINK_CURSOR (1 << 0)
#define CONS_CHAR_CURSOR (1 << 1)
#define CONS_CURSORTYPE _IOW('c', 7, int)
/* set the bell type to audible or visual */
#define CONS_VISUAL_BELL (1 << 0)
#define CONS_QUIET_BELL (1 << 1)
#define CONS_BELLTYPE _IOW('c', 8, int)
/* set the history (scroll back) buffer size (in lines) */
#define CONS_HISTORY _IOW('c', 9, int)
/* mouse cursor ioctl */
struct mouse_data {
int x;
int y;
int z;
int buttons;
};
typedef struct mouse_data mouse_data_t;
struct mouse_mode {
int mode;
int signal;
};
typedef struct mouse_mode mouse_mode_t;
struct mouse_event {
int id; /* one based */
int value;
};
typedef struct mouse_event mouse_event_t;
struct mouse_info {
int operation;
#define MOUSE_SHOW 0x01
#define MOUSE_HIDE 0x02
#define MOUSE_MOVEABS 0x03
#define MOUSE_MOVEREL 0x04
#define MOUSE_GETINFO 0x05
#define MOUSE_MODE 0x06
#define MOUSE_ACTION 0x07
#define MOUSE_MOTION_EVENT 0x08
#define MOUSE_BUTTON_EVENT 0x09
union {
mouse_data_t data;
mouse_mode_t mode;
mouse_event_t event;
} u;
};
typedef struct mouse_info mouse_info_t;
#define CONS_MOUSECTL _IOWR('c', 10, mouse_info_t)
/* see if the vty has been idle */
#define CONS_IDLE _IOR('c', 11, int)
/* set the screen saver mode */
#define CONS_LKM_SAVER 0
#define CONS_USR_SAVER 1
#define CONS_SAVERMODE _IOW('c', 12, int)
/* start the screen saver */
#define CONS_SAVERSTART _IOW('c', 13, int)
/* set/get font data */
struct fnt8 {
char fnt8x8[8*256];
};
typedef struct fnt8 fnt8_t;
struct fnt14 {
char fnt8x14[14*256];
};
typedef struct fnt14 fnt14_t;
struct fnt16 {
char fnt8x16[16*256];
};
typedef struct fnt16 fnt16_t;
#define PIO_FONT8x8 _IOW('c', 64, fnt8_t)
#define GIO_FONT8x8 _IOR('c', 65, fnt8_t)
#define PIO_FONT8x14 _IOW('c', 66, fnt14_t)
#define GIO_FONT8x14 _IOR('c', 67, fnt14_t)
#define PIO_FONT8x16 _IOW('c', 68, fnt16_t)
#define GIO_FONT8x16 _IOR('c', 69, fnt16_t)
/* get video mode information */
struct colors {
char fore;
char back;
};
struct vid_info {
short size;
short m_num;
u_short mv_row, mv_col;
u_short mv_rsz, mv_csz;
struct colors mv_norm,
mv_rev,
mv_grfc;
u_char mv_ovscan;
u_char mk_keylock;
};
typedef struct vid_info vid_info_t;
#define CONS_GETINFO _IOWR('c', 73, vid_info_t)
/* get version */
#define CONS_GETVERS _IOR('c', 74, int)
/* get the video adapter index (equivalent to FBIO_ADAPTER) */
#define CONS_CURRENTADP _IOR('c', 100, int)
/* get the video adapter information (equivalent to FBIO_ADPINFO) */
#define CONS_ADPINFO _IOWR('c', 101, video_adapter_info_t)
/* get the video mode information (equivalent to FBIO_MODEINFO) */
#define CONS_MODEINFO _IOWR('c', 102, video_info_t)
/* find a video mode (equivalent to FBIO_FINDMODE) */
#define CONS_FINDMODE _IOWR('c', 103, video_info_t)
/* set the frame buffer window origin (equivalent to FBIO_SETWINORG) */
#define CONS_SETWINORG _IO('c', 104 /*, u_int */)
/* use the specified keyboard */
#define CONS_SETKBD _IO('c', 110 /*, int */)
/* release the current keyboard */
#define CONS_RELKBD _IO('c', 111)
#ifdef PC98
#define ADJUST_CLOCK _IO('t',100) /* for 98note resume */
#endif
/*
* Vty switching ioctl commands.
*/
/* get the next available vty */
#define VT_OPENQRY _IOR('v', 1, int)
/* set/get vty switching mode */
#ifndef _VT_MODE_DECLARED
#define _VT_MODE_DECLARED
struct vt_mode {
char mode;
#define VT_AUTO 0 /* switching is automatic */
#define VT_PROCESS 1 /* switching controlled by prog */
#define VT_KERNEL 255 /* switching controlled in kernel */
char waitv; /* not implemented yet SOS */
short relsig;
short acqsig;
short frsig; /* not implemented yet SOS */
};
typedef struct vt_mode vtmode_t;
#endif /* !_VT_MODE_DECLARED */
#define VT_SETMODE _IOW('v', 2, vtmode_t)
#define VT_GETMODE _IOR('v', 3, vtmode_t)
/* acknowledge release or acquisition of a vty */
#define VT_FALSE 0
#define VT_TRUE 1
#define VT_ACKACQ 2
#define VT_RELDISP _IO('v', 4 /*, int */)
/* activate the specified vty */
#define VT_ACTIVATE _IO('v', 5 /*, int */)
/* wait until the specified vty is activate */
#define VT_WAITACTIVE _IO('v', 6 /*, int */)
/* get the currently active vty */
#define VT_GETACTIVE _IOR('v', 7, int)
/* get the index of the vty */
#define VT_GETINDEX _IOR('v', 8, int)
/*
* Video mode switching ioctl. See sys/fbio.h for mode numbers.
*/
#define SW_B40x25 _IO('S', M_B40x25)
#define SW_C40x25 _IO('S', M_C40x25)
#define SW_B80x25 _IO('S', M_B80x25)
#define SW_C80x25 _IO('S', M_C80x25)
#define SW_BG320 _IO('S', M_BG320)
#define SW_CG320 _IO('S', M_CG320)
#define SW_BG640 _IO('S', M_BG640)
#define SW_EGAMONO80x25 _IO('S', M_EGAMONO80x25)
#define SW_CG320_D _IO('S', M_CG320_D)
#define SW_CG640_E _IO('S', M_CG640_E)
#define SW_EGAMONOAPA _IO('S', M_EGAMONOAPA)
#define SW_CG640x350 _IO('S', M_CG640x350)
#define SW_ENH_MONOAPA2 _IO('S', M_ENHMONOAPA2)
#define SW_ENH_CG640 _IO('S', M_ENH_CG640)
#define SW_ENH_B40x25 _IO('S', M_ENH_B40x25)
#define SW_ENH_C40x25 _IO('S', M_ENH_C40x25)
#define SW_ENH_B80x25 _IO('S', M_ENH_B80x25)
#define SW_ENH_C80x25 _IO('S', M_ENH_C80x25)
#define SW_ENH_B80x43 _IO('S', M_ENH_B80x43)
#define SW_ENH_C80x43 _IO('S', M_ENH_C80x43)
#define SW_MCAMODE _IO('S', M_MCA_MODE)
#define SW_VGA_C40x25 _IO('S', M_VGA_C40x25)
#define SW_VGA_C80x25 _IO('S', M_VGA_C80x25)
#define SW_VGA_C80x30 _IO('S', M_VGA_C80x30)
#define SW_VGA_C80x50 _IO('S', M_VGA_C80x50)
#define SW_VGA_C80x60 _IO('S', M_VGA_C80x60)
#define SW_VGA_M80x25 _IO('S', M_VGA_M80x25)
#define SW_VGA_M80x30 _IO('S', M_VGA_M80x30)
#define SW_VGA_M80x50 _IO('S', M_VGA_M80x50)
#define SW_VGA_M80x60 _IO('S', M_VGA_M80x60)
#define SW_VGA11 _IO('S', M_VGA11)
#define SW_BG640x480 _IO('S', M_VGA11)
#define SW_VGA12 _IO('S', M_VGA12)
#define SW_CG640x480 _IO('S', M_VGA12)
#define SW_VGA13 _IO('S', M_VGA13)
#define SW_VGA_CG320 _IO('S', M_VGA13)
#define SW_VGA_CG640 _IO('S', M_VGA_CG640)
#define SW_VGA_MODEX _IO('S', M_VGA_MODEX)
#define SW_PC98_80x25 _IO('S', M_PC98_80x25)
#define SW_PC98_80x30 _IO('S', M_PC98_80x30)
#define SW_VGA_C90x25 _IO('S', M_VGA_C90x25)
#define SW_VGA_M90x25 _IO('S', M_VGA_M90x25)
#define SW_VGA_C90x30 _IO('S', M_VGA_C90x30)
#define SW_VGA_M90x30 _IO('S', M_VGA_M90x30)
#define SW_VGA_C90x43 _IO('S', M_VGA_C90x43)
#define SW_VGA_M90x43 _IO('S', M_VGA_M90x43)
#define SW_VGA_C90x50 _IO('S', M_VGA_C90x50)
#define SW_VGA_M90x50 _IO('S', M_VGA_M90x50)
#define SW_VGA_C90x60 _IO('S', M_VGA_C90x60)
#define SW_VGA_M90x60 _IO('S', M_VGA_M90x60)
#define SW_TEXT_80x25 _IO('S', M_TEXT_80x25)
#define SW_TEXT_80x30 _IO('S', M_TEXT_80x30)
#define SW_TEXT_80x43 _IO('S', M_TEXT_80x43)
#define SW_TEXT_80x50 _IO('S', M_TEXT_80x50)
#define SW_TEXT_80x60 _IO('S', M_TEXT_80x60)
#define SW_TEXT_132x25 _IO('S', M_TEXT_132x25)
#define SW_TEXT_132x30 _IO('S', M_TEXT_132x30)
#define SW_TEXT_132x43 _IO('S', M_TEXT_132x43)
#define SW_TEXT_132x50 _IO('S', M_TEXT_132x50)
#define SW_TEXT_132x60 _IO('S', M_TEXT_132x60)
#define SW_VESA_CG640x400 _IO('V', M_VESA_CG640x400 - M_VESA_BASE)
#define SW_VESA_CG640x480 _IO('V', M_VESA_CG640x480 - M_VESA_BASE)
#define SW_VESA_800x600 _IO('V', M_VESA_800x600 - M_VESA_BASE)
#define SW_VESA_CG800x600 _IO('V', M_VESA_CG800x600 - M_VESA_BASE)
#define SW_VESA_1024x768 _IO('V', M_VESA_1024x768 - M_VESA_BASE)
#define SW_VESA_CG1024x768 _IO('V', M_VESA_CG1024x768 - M_VESA_BASE)
#define SW_VESA_1280x1024 _IO('V', M_VESA_1280x1024 - M_VESA_BASE)
#define SW_VESA_CG1280x1024 _IO('V', M_VESA_CG1280x1024 - M_VESA_BASE)
#define SW_VESA_C80x60 _IO('V', M_VESA_C80x60 - M_VESA_BASE)
#define SW_VESA_C132x25 _IO('V', M_VESA_C132x25 - M_VESA_BASE)
#define SW_VESA_C132x43 _IO('V', M_VESA_C132x43 - M_VESA_BASE)
#define SW_VESA_C132x50 _IO('V', M_VESA_C132x50 - M_VESA_BASE)
#define SW_VESA_C132x60 _IO('V', M_VESA_C132x60 - M_VESA_BASE)
#define SW_VESA_32K_320 _IO('V', M_VESA_32K_320 - M_VESA_BASE)
#define SW_VESA_64K_320 _IO('V', M_VESA_64K_320 - M_VESA_BASE)
#define SW_VESA_FULL_320 _IO('V', M_VESA_FULL_320 - M_VESA_BASE)
#define SW_VESA_32K_640 _IO('V', M_VESA_32K_640 - M_VESA_BASE)
#define SW_VESA_64K_640 _IO('V', M_VESA_64K_640 - M_VESA_BASE)
#define SW_VESA_FULL_640 _IO('V', M_VESA_FULL_640 - M_VESA_BASE)
#define SW_VESA_32K_800 _IO('V', M_VESA_32K_800 - M_VESA_BASE)
#define SW_VESA_64K_800 _IO('V', M_VESA_64K_800 - M_VESA_BASE)
#define SW_VESA_FULL_800 _IO('V', M_VESA_FULL_800 - M_VESA_BASE)
#define SW_VESA_32K_1024 _IO('V', M_VESA_32K_1024 - M_VESA_BASE)
#define SW_VESA_64K_1024 _IO('V', M_VESA_64K_1024 - M_VESA_BASE)
#define SW_VESA_FULL_1024 _IO('V', M_VESA_FULL_1024 - M_VESA_BASE)
#define SW_VESA_32K_1280 _IO('V', M_VESA_32K_1280 - M_VESA_BASE)
#define SW_VESA_64K_1280 _IO('V', M_VESA_64K_1280 - M_VESA_BASE)
#define SW_VESA_FULL_1280 _IO('V', M_VESA_FULL_1280 - M_VESA_BASE)
#endif /* !_SYS_CONSIO_H_ */

View File

@ -36,12 +36,17 @@
*
* @(#)fbio.h 8.2 (Berkeley) 10/30/93
*
* $Id$
* $Id: fbio.h,v 1.5 1997/02/22 09:45:12 peter Exp $
*/
#ifndef _SYS_FBIO_H_
#define _SYS_FBIO_H_
#ifndef KERNEL
#include <sys/types.h>
#endif
#include <sys/ioccom.h>
/*
* Frame buffer ioctls (from Sprite, trimmed to essentials for X11).
*/
@ -72,7 +77,15 @@
#define FBTYPE_RESERVED2 18 /* reserved, do not use */
#define FBTYPE_RESERVED1 19 /* reserved, do not use */
#define FBTYPE_LASTPLUSONE 20 /* max number of fbs (change as add) */
#define FBTYPE_MDA 20
#define FBTYPE_HERCULES 21
#define FBTYPE_CGA 22
#define FBTYPE_EGA 23
#define FBTYPE_VGA 24
#define FBTYPE_PC98 25
#define FBTYPE_TGA 26
#define FBTYPE_LASTPLUSONE 27 /* max number of fbs (change as add) */
/*
* Frame buffer descriptor as returned by FBIOGTYPE.
@ -188,4 +201,274 @@ struct fbcursor {
/* get maximum cursor size */
#define FBIOGCURMAX _IOR('F', 28, struct fbcurpos)
#endif
/* The new style frame buffer ioctls. */
/* video mode information block */
struct video_info {
int vi_mode; /* mode number, see below */
int vi_flags;
#define V_INFO_COLOR (1 << 0)
#define V_INFO_GRAPHICS (1 << 1)
#define V_INFO_LINEAR (1 << 2)
#define V_INFO_VESA (1 << 3)
int vi_width;
int vi_height;
int vi_cwidth;
int vi_cheight;
int vi_depth;
int vi_planes;
u_int vi_window; /* physical address */
size_t vi_window_size;
size_t vi_window_gran;
u_int vi_buffer; /* physical address */
size_t vi_buffer_size;
int vi_mem_model;
#define V_INFO_MM_OTHER (-1)
#define V_INFO_MM_TEXT 0
#define V_INFO_MM_PLANAR 1
#define V_INFO_MM_PACKED 2
#define V_INFO_MM_DIRECT 3
#define V_INFO_MM_CGA 100
#define V_INFO_MM_HGC 101
/* for MM_PACKED and MM_DIRECT only */
int vi_pixel_size; /* in bytes */
/* for MM_DIRECT only */
int vi_pixel_fields[4]; /* RGB and reserved fields */
int vi_pixel_fsizes[4];
/* reserved */
u_char vi_reserved[64];
};
typedef struct video_info video_info_t;
/* adapter infromation block */
struct video_adapter {
int va_index;
int va_type;
#define KD_OTHER 0 /* unknown */
#define KD_MONO 1 /* monochrome adapter */
#define KD_HERCULES 2 /* hercules adapter */
#define KD_CGA 3 /* color graphics adapter */
#define KD_EGA 4 /* enhanced graphics adapter */
#define KD_VGA 5 /* video graphics adapter */
#define KD_PC98 6 /* PC-98 display */
#define KD_TGA 7 /* TGA */
char *va_name;
int va_unit;
int va_minor;
int va_flags;
#define V_ADP_COLOR (1 << 0)
#define V_ADP_MODECHANGE (1 << 1)
#define V_ADP_STATESAVE (1 << 2)
#define V_ADP_STATELOAD (1 << 3)
#define V_ADP_FONT (1 << 4)
#define V_ADP_PALETTE (1 << 5)
#define V_ADP_BORDER (1 << 6)
#define V_ADP_VESA (1 << 7)
#define V_ADP_PROBED (1 << 16)
#define V_ADP_INITIALIZED (1 << 17)
#define V_ADP_REGISTERED (1 << 18)
int va_io_base;
int va_io_size;
int va_crtc_addr;
int va_mem_base;
int va_mem_size;
vm_offset_t va_window; /* virtual address */
size_t va_window_size;
size_t va_window_gran;
u_int va_window_orig;
vm_offset_t va_buffer; /* virtual address */
size_t va_buffer_size;
int va_initial_mode;
int va_initial_bios_mode;
int va_mode;
struct video_info va_info;
int va_line_width;
struct {
int x;
int y;
} va_disp_start;
void *va_token;
};
typedef struct video_adapter video_adapter_t;
struct video_adapter_info {
int va_index;
int va_type;
char va_name[16];
int va_unit;
int va_flags;
int va_io_base;
int va_io_size;
int va_crtc_addr;
int va_mem_base;
int va_mem_size;
u_int va_window; /* virtual address */
size_t va_window_size;
size_t va_window_gran;
u_int va_unused0;
size_t va_buffer_size;
int va_initial_mode;
int va_initial_bios_mode;
int va_mode;
int va_line_width;
struct {
int x;
int y;
} va_disp_start;
u_int va_window_orig;
/* reserved */
u_char va_reserved[64];
};
typedef struct video_adapter_info video_adapter_info_t;
/* some useful video adapter index */
#define V_ADP_PRIMARY 0
#define V_ADP_SECONDARY 1
/* video mode numbers */
#define M_B40x25 0 /* black & white 40 columns */
#define M_C40x25 1 /* color 40 columns */
#define M_B80x25 2 /* black & white 80 columns */
#define M_C80x25 3 /* color 80 columns */
#define M_BG320 4 /* black & white graphics 320x200 */
#define M_CG320 5 /* color graphics 320x200 */
#define M_BG640 6 /* black & white graphics 640x200 hi-res */
#define M_EGAMONO80x25 7 /* ega-mono 80x25 */
#define M_CG320_D 13 /* ega mode D */
#define M_CG640_E 14 /* ega mode E */
#define M_EGAMONOAPA 15 /* ega mode F */
#define M_CG640x350 16 /* ega mode 10 */
#define M_ENHMONOAPA2 17 /* ega mode F with extended memory */
#define M_ENH_CG640 18 /* ega mode 10* */
#define M_ENH_B40x25 19 /* ega enhanced black & white 40 columns */
#define M_ENH_C40x25 20 /* ega enhanced color 40 columns */
#define M_ENH_B80x25 21 /* ega enhanced black & white 80 columns */
#define M_ENH_C80x25 22 /* ega enhanced color 80 columns */
#define M_VGA_C40x25 23 /* vga 8x16 font on color */
#define M_VGA_C80x25 24 /* vga 8x16 font on color */
#define M_VGA_M80x25 25 /* vga 8x16 font on mono */
#define M_VGA11 26 /* vga 640x480 2 colors */
#define M_BG640x480 26
#define M_VGA12 27 /* vga 640x480 16 colors */
#define M_CG640x480 27
#define M_VGA13 28 /* vga 320x200 256 colors */
#define M_VGA_CG320 28
#define M_VGA_C80x50 30 /* vga 8x8 font on color */
#define M_VGA_M80x50 31 /* vga 8x8 font on color */
#define M_VGA_C80x30 32 /* vga 8x16 font on color */
#define M_VGA_M80x30 33 /* vga 8x16 font on color */
#define M_VGA_C80x60 34 /* vga 8x8 font on color */
#define M_VGA_M80x60 35 /* vga 8x8 font on color */
#define M_VGA_CG640 36 /* vga 640x400 256 color */
#define M_VGA_MODEX 37 /* vga 320x240 256 color */
#define M_VGA_C90x25 40 /* vga 8x16 font on color */
#define M_VGA_M90x25 41 /* vga 8x16 font on mono */
#define M_VGA_C90x30 42 /* vga 8x16 font on color */
#define M_VGA_M90x30 43 /* vga 8x16 font on mono */
#define M_VGA_C90x43 44 /* vga 8x8 font on color */
#define M_VGA_M90x43 45 /* vga 8x8 font on mono */
#define M_VGA_C90x50 46 /* vga 8x8 font on color */
#define M_VGA_M90x50 47 /* vga 8x8 font on mono */
#define M_VGA_C90x60 48 /* vga 8x8 font on color */
#define M_VGA_M90x60 49 /* vga 8x8 font on mono */
#define M_ENH_B80x43 0x70 /* ega black & white 80x43 */
#define M_ENH_C80x43 0x71 /* ega color 80x43 */
#define M_PC98_80x25 98 /* PC98 80x25 */
#define M_PC98_80x30 99 /* PC98 80x30 */
#define M_HGC_P0 0xe0 /* hercules graphics - page 0 @ B0000 */
#define M_HGC_P1 0xe1 /* hercules graphics - page 1 @ B8000 */
#define M_MCA_MODE 0xff /* monochrome adapter mode */
#define M_TEXT_80x25 200 /* generic text modes */
#define M_TEXT_80x30 201
#define M_TEXT_80x43 202
#define M_TEXT_80x50 203
#define M_TEXT_80x60 204
#define M_TEXT_132x25 205
#define M_TEXT_132x30 206
#define M_TEXT_132x43 207
#define M_TEXT_132x50 208
#define M_TEXT_132x60 209
#define M_VESA_BASE 0x100 /* VESA mode number base */
#define M_VESA_CG640x400 0x100 /* 640x400, 256 color */
#define M_VESA_CG640x480 0x101 /* 640x480, 256 color */
#define M_VESA_800x600 0x102 /* 800x600, 16 color */
#define M_VESA_CG800x600 0x103 /* 800x600, 256 color */
#define M_VESA_1024x768 0x104 /* 1024x768, 16 color */
#define M_VESA_CG1024x768 0x105 /* 1024x768, 256 color */
#define M_VESA_1280x1024 0x106 /* 1280x1024, 16 color */
#define M_VESA_CG1280x1024 0x107 /* 1280x1024, 256 color */
#define M_VESA_C80x60 0x108 /* 8x8 font */
#define M_VESA_C132x25 0x109 /* 8x16 font */
#define M_VESA_C132x43 0x10a /* 8x14 font */
#define M_VESA_C132x50 0x10b /* 8x8 font */
#define M_VESA_C132x60 0x10c /* 8x8 font */
#define M_VESA_32K_320 0x10d /* 320x200, 5:5:5 */
#define M_VESA_64K_320 0x10e /* 320x200, 5:6:5 */
#define M_VESA_FULL_320 0x10f /* 320x200, 8:8:8 */
#define M_VESA_32K_640 0x110 /* 640x480, 5:5:5 */
#define M_VESA_64K_640 0x111 /* 640x480, 5:6:5 */
#define M_VESA_FULL_640 0x112 /* 640x480, 8:8:8 */
#define M_VESA_32K_800 0x113 /* 800x600, 5:5:5 */
#define M_VESA_64K_800 0x114 /* 800x600, 5:6:5 */
#define M_VESA_FULL_800 0x115 /* 800x600, 8:8:8 */
#define M_VESA_32K_1024 0x116 /* 1024x768, 5:5:5 */
#define M_VESA_64K_1024 0x117 /* 1024x768, 5:6:5 */
#define M_VESA_FULL_1024 0x118 /* 1024x768, 8:8:8 */
#define M_VESA_32K_1280 0x119 /* 1280x1024, 5:5:5 */
#define M_VESA_64K_1280 0x11a /* 1280x1024, 5:6:5 */
#define M_VESA_FULL_1280 0x11b /* 1280x1024, 8:8:8 */
#define M_VESA_MODE_MAX 0x1ff
struct video_display_start {
int x;
int y;
};
typedef struct video_display_start video_display_start_t;
struct video_color_palette {
int index; /* first element (zero-based) */
int count; /* number of elements */
u_char *red; /* red */
u_char *green; /* green */
u_char *blue; /* blue */
u_char *transparent; /* may be NULL */
};
typedef struct video_color_palette video_color_palette_t;
/* adapter info. */
#define FBIO_ADAPTER _IOR('F', 100, int)
#define FBIO_ADPTYPE _IOR('F', 101, int)
#define FBIO_ADPINFO _IOR('F', 102, struct video_adapter_info)
/* video mode control */
#define FBIO_MODEINFO _IOWR('F', 103, struct video_info)
#define FBIO_FINDMODE _IOWR('F', 104, struct video_info)
#define FBIO_GETMODE _IOR('F', 105, int)
#define FBIO_SETMODE _IOW('F', 106, int)
/* get/set frame buffer window origin */
#define FBIO_GETWINORG _IOR('F', 107, u_int)
#define FBIO_SETWINORG _IOW('F', 108, u_int)
/* get/set display start address */
#define FBIO_GETDISPSTART _IOR('F', 109, video_display_start_t)
#define FBIO_SETDISPSTART _IOW('F', 110, video_display_start_t)
/* get/set scan line width */
#define FBIO_GETLINEWIDTH _IOR('F', 111, u_int)
#define FBIO_SETLINEWIDTH _IOW('F', 112, u_int)
/* color palette control */
#define FBIO_GETPALETTE _IOW('F', 113, video_color_palette_t)
#define FBIO_SETPALETTE _IOW('F', 114, video_color_palette_t)
#endif /* !_SYS_FBIO_H_ */

228
sys/sys/kbio.h Normal file
View File

@ -0,0 +1,228 @@
/*-
* $Id: $
*/
#ifndef _SYS_KBIO_H_
#define _SYS_KBIO_H_
#ifndef KERNEL
#include <sys/types.h>
#endif
#include <sys/ioccom.h>
/* get/set keyboard I/O mode */
#define K_RAW 0 /* keyboard returns scancodes */
#define K_XLATE 1 /* keyboard returns ascii */
#define K_CODE 2 /* keyboard returns keycodes */
#define KDGKBMODE _IOR('K', 6, int)
#define KDSKBMODE _IO('K', 7 /*, int */)
/* make tone */
#define KDMKTONE _IO('K', 8 /*, int */)
/* see console.h for the definitions of the following ioctls */
#if notdef
#define KDGETMODE _IOR('K', 9, int)
#define KDSETMODE _IO('K', 10 /*, int */)
#define KDSBORDER _IO('K', 13 /*, int */)
#endif
/* get/set keyboard lock state */
#define CLKED 1 /* Caps locked */
#define NLKED 2 /* Num locked */
#define SLKED 4 /* Scroll locked */
#define ALKED 8 /* AltGr locked */
#define LOCK_MASK (CLKED | NLKED | SLKED | ALKED)
#define KDGKBSTATE _IOR('K', 19, int)
#define KDSKBSTATE _IO('K', 20 /*, int */)
/* enable/disable I/O access */
#define KDENABIO _IO('K', 60)
#define KDDISABIO _IO('K', 61)
/* make sound */
#define KIOCSOUND _IO('K', 63 /*, int */)
/* get keyboard model */
#define KB_OTHER 0 /* keyboard not known */
#define KB_84 1 /* 'old' 84 key AT-keyboard */
#define KB_101 2 /* MF-101 or MF-102 keyboard */
#define KDGKBTYPE _IOR('K', 64, int)
/* get/set keyboard LED state */
#define LED_CAP 1 /* Caps lock LED */
#define LED_NUM 2 /* Num lock LED */
#define LED_SCR 4 /* Scroll lock LED */
#define LED_MASK (LED_CAP | LED_NUM | LED_SCR)
#define KDGETLED _IOR('K', 65, int)
#define KDSETLED _IO('K', 66 /*, int */)
/* set keyboard repeat rate (obsolete, use KDSETREPEAT below) */
#define KDSETRAD _IO('K', 67 /*, int */)
/* see console.h for the definition of the following ioctl */
#if notdef
#define KDRASTER _IOW('K', 100, scr_size_t)
#endif
/* get keyboard information */
struct keyboard_info {
int kb_index; /* kbdio index# */
char kb_name[16]; /* driver name */
int kb_unit; /* unit# */
int kb_type; /* KB_84, KB_101, KB_OTHER,... */
int kb_config; /* device configuration flags */
int kb_flags; /* internal flags */
};
typedef struct keyboard_info keyboard_info_t;
#define KDGKBINFO _IOR('K', 101, keyboard_info_t)
/* set keyboard repeat rate (new interface) */
struct keyboard_repeat {
int kb_repeat[2];
};
typedef struct keyboard_repeat keyboard_repeat_t;
#define KDSETREPEAT _IOW('K', 102, keyboard_repeat_t)
/* get/set key map/accent map/function key strings */
#define NUM_KEYS 256 /* number of keys in table */
#define NUM_STATES 8 /* states per key */
#define ALTGR_OFFSET 128 /* offset for altlock keys */
#define NUM_DEADKEYS 15 /* number of accent keys */
#define NUM_ACCENTCHARS 52 /* max number of accent chars */
#define NUM_FKEYS 96 /* max number of function keys */
#define MAXFK 16 /* max length of a function key str */
#ifndef _KEYMAP_DECLARED
#define _KEYMAP_DECLARED
struct keyent_t {
u_char map[NUM_STATES];
u_char spcl;
u_char flgs;
#define FLAG_LOCK_O 0
#define FLAG_LOCK_C 1
#define FLAG_LOCK_N 2
};
struct keymap {
u_short n_keys;
struct keyent_t key[NUM_KEYS];
};
typedef struct keymap keymap_t;
#endif /* !_KEYMAP_DECLARED */
/* defines for "special" keys (spcl bit set in keymap) */
#define NOP 0x00 /* nothing (dead key) */
#define LSH 0x02 /* left shift key */
#define RSH 0x03 /* right shift key */
#define CLK 0x04 /* caps lock key */
#define NLK 0x05 /* num lock key */
#define SLK 0x06 /* scroll lock key */
#define LALT 0x07 /* left alt key */
#define BTAB 0x08 /* backwards tab */
#define LCTR 0x09 /* left control key */
#define NEXT 0x0a /* switch to next screen */
#define F_SCR 0x0b /* switch to first screen */
#define L_SCR 0x1a /* switch to last screen */
#define F_FN 0x1b /* first function key */
#define L_FN 0x7a /* last function key */
/* 0x7b-0x7f reserved do not use ! */
#define RCTR 0x80 /* right control key */
#define RALT 0x81 /* right alt (altgr) key */
#define ALK 0x82 /* alt lock key */
#define ASH 0x83 /* alt shift key */
#define META 0x84 /* meta key */
#define RBT 0x85 /* boot machine */
#define DBG 0x86 /* call debugger */
#define SUSP 0x87 /* suspend power (APM) */
#define SPSC 0x88 /* toggle splash/text screen */
#define F_ACC DGRA /* first accent key */
#define DGRA 0x89 /* grave */
#define DACU 0x8a /* acute */
#define DCIR 0x8b /* circumflex */
#define DTIL 0x8c /* tilde */
#define DMAC 0x8d /* macron */
#define DBRE 0x8e /* breve */
#define DDOT 0x8f /* dot */
#define DUML 0x90 /* umlaut/diaresis */
#define DDIA 0x90 /* diaresis */
#define DSLA 0x91 /* slash */
#define DRIN 0x92 /* ring */
#define DCED 0x93 /* cedilla */
#define DAPO 0x94 /* apostrophe */
#define DDAC 0x95 /* double acute */
#define DOGO 0x96 /* ogonek */
#define DCAR 0x97 /* caron */
#define L_ACC DCAR /* last accent key */
#define STBY 0x98 /* Go into standby mode (apm) */
#define PREV 0x99 /* switch to previous screen */
#define F(x) ((x)+F_FN-1)
#define S(x) ((x)+F_SCR-1)
#define ACC(x) ((x)+F_ACC)
struct acc_t {
u_char accchar;
u_char map[NUM_ACCENTCHARS][2];
};
struct accentmap {
u_short n_accs;
struct acc_t acc[NUM_DEADKEYS];
};
typedef struct accentmap accentmap_t;
struct keyarg {
u_short keynum;
struct keyent_t key;
};
typedef struct keyarg keyarg_t;
struct fkeytab {
u_char str[MAXFK];
u_char len;
};
typedef struct fkeytab fkeytab_t;
struct fkeyarg {
u_short keynum;
char keydef[MAXFK];
char flen;
};
typedef struct fkeyarg fkeyarg_t;
#define GETFKEY _IOWR('k', 0, fkeyarg_t)
#define SETFKEY _IOWR('k', 1, fkeyarg_t)
#if notdef /* see console.h */
#define GIO_SCRNMAP _IOR('k', 2, scrmap_t)
#define PIO_SCRNMAP _IOW('k', 3, scrmap_t)
#endif
#define GIO_KEYMAP _IOR('k', 6, keymap_t)
#define PIO_KEYMAP _IOW('k', 7, keymap_t)
#define GIO_DEADKEYMAP _IOR('k', 8, accentmap_t)
#define PIO_DEADKEYMAP _IOW('k', 9, accentmap_t)
#define GIO_KEYMAPENT _IOWR('k', 10, keyarg_t)
#define PIO_KEYMAPENT _IOW('k', 11, keyarg_t)
/* flags set to the return value in the KD_XLATE mode */
#define NOKEY 0x100 /* no key pressed marker */
#define FKEY 0x200 /* function key marker */
#define MKEY 0x400 /* meta key marker (prepend ESC)*/
#define BKEY 0x800 /* backtab (ESC [ Z) */
#define SPCLKEY 0x8000 /* special key */
#define RELKEY 0x4000 /* key released */
#define ERRKEY 0x2000 /* error */
#define KEYCHAR(c) ((c) & 0x00ff)
#define KEYFLAGS(c) ((c) & ~0x00ff)
#endif /* !_SYS_KBIO_H_ */