diff options
40 files changed, 2000 insertions, 2114 deletions
diff --git a/sys/amd64/conf/GENERIC b/sys/amd64/conf/GENERIC index 88943bb..76781f4 100644 --- a/sys/amd64/conf/GENERIC +++ b/sys/amd64/conf/GENERIC @@ -11,7 +11,7 @@ # device lines is present in the ./LINT configuration file. If you are # in doubt as to the purpose or necessity of a line, check first in LINT. # -# $Id: GENERIC,v 1.141 1999/01/01 08:09:57 peter Exp $ +# $Id: GENERIC,v 1.142 1999/01/09 18:12:07 wpaul Exp $ machine "i386" cpu "I386_CPU" @@ -108,10 +108,20 @@ controller matcd0 at isa? port 0x230 bio device scd0 at isa? port 0x230 bio +# atkbdc0 controlls both the keyboard and the PS/2 mouse +controller atkbdc0 at isa? port IO_KBD tty +device atkbd0 at isa? tty irq 1 +device psm0 at isa? tty irq 12 + +device vga0 at isa? port ? conflicts + +# splash screen/screen saver +pseudo-device splash + # syscons is the default console driver, resembling an SCO console -device sc0 at isa? port IO_KBD conflicts tty irq 1 +device sc0 at isa? tty # Enable this and PCVT_FREEBSD for pcvt vt220 compatible console driver -#device vt0 at isa? port IO_KBD conflicts tty irq 1 +#device vt0 at isa? tty #options XSERVER # support for X server #options FAT_CURSOR # start with block cursor # If you have a ThinkPAD, uncomment this along with the rest of the PCVT lines @@ -136,8 +146,6 @@ device sio3 at isa? disable port "IO_COM4" tty irq 9 device lpt0 at isa? port? tty irq 7 -device psm0 at isa? port IO_KBD conflicts tty irq 12 - # Order is important here due to intrusive probes, do *not* alphabetize # this list of network interfaces until the probes have been fixed. # Right now it appears that the ie0 must be probed before ep0. See diff --git a/sys/conf/NOTES b/sys/conf/NOTES index 7e93763..80171ee 100644 --- a/sys/conf/NOTES +++ b/sys/conf/NOTES @@ -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.529 1999/01/09 18:12:07 wpaul Exp $ +# $Id: LINT,v 1.531 1999/01/10 07:45:33 phk 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 @@ -842,15 +842,35 @@ options "NTIMECOUNTER=20" # configure cards from USERCONFIG. See pnp(4) for more info. controller pnp0 +# The keyboard controller; it controlls the keyboard and the PS/2 mouse. +controller atkbdc0 at isa? port IO_KBD tty + +# The AT keyboard +device atkbd0 at isa? tty irq 1 + +# PS/2 mouse +device psm0 at isa? tty irq 12 + +# Options for psm: +options PSM_HOOKAPM #hook the APM resume event, useful + #for some laptops +options PSM_RESETAFTERSUSPEND #reset the device at the resume event + +# The video card driver. +device vga0 at isa? port ? conflicts + +# Splash screen at start up! Screen savers require this too. +pseudo-device splash + # The pcvt console driver (vt220 compatible). -device vt0 at isa? port IO_KBD conflicts tty irq 1 +device vt0 at isa? tty options XSERVER # support for running an X server. options FAT_CURSOR # start with block cursor # This PCVT option is for keyboards such as those used on IBM ThinkPad laptops options PCVT_SCANSET=2 # IBM keyboards are non-std # The syscons console driver (sco color console compatible). -device sc0 at isa? port IO_KBD conflicts tty irq 1 +device sc0 at isa? tty options MAXCONS=16 # number of virtual consoles options SLOW_VGA # do byte-wide i/o's to TS and GDC regs options "STD8X16FONT" # Compile font in @@ -1050,7 +1070,7 @@ disk fd0 at fdc0 drive 0 disk fd1 at fdc0 drive 1 # -# Other standard PC hardware: `lpt', `mse', `psm', `sio', etc. +# Other standard PC hardware: `lpt', `mse', `sio', etc. # # lpt: printer port # lpt specials: @@ -1059,18 +1079,11 @@ disk fd1 at fdc0 drive 1 # The irq clause may be omitted. This will force the port # into polling mode. # mse: Logitech and ATI InPort bus mouse ports -# psm: PS/2 mouse port [note: conflicts with sc0/vt0, thus "conflicts" keywd] # sio: serial ports (see sio(4)) device lpt0 at isa? port? tty irq 7 device lpt1 at isa? port "IO_LPT3" tty irq 5 device mse0 at isa? port 0x23c tty irq 5 -device psm0 at isa? port IO_KBD conflicts tty irq 12 - -# Options for psm: -options PSM_HOOKAPM #hook the APM resume event, useful - #for some laptops -options PSM_RESETAFTERSUSPEND #reset the device at the resume event device sio0 at isa? port "IO_COM1" tty flags 0x10 irq 4 diff --git a/sys/conf/files.i386 b/sys/conf/files.i386 index f955863..9aa97d4 100644 --- a/sys/conf/files.i386 +++ b/sys/conf/files.i386 @@ -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.216 1998/12/31 08:17:08 luigi Exp $ +# $Id: files.i386,v 1.217 1999/01/01 08:09:58 peter Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -24,6 +24,17 @@ font8x16.o optional std8x16font \ no-implicit-rule before-depend \ clean "${STD8X16FONT}-8x16 font8x16.c" # +dev/fb/fb.c optional fb device-driver +dev/fb/fb.c optional vga device-driver +dev/fb/splash.c optional splash +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/scvidctl.c optional sc device-driver +dev/syscons/scvesactl.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 @@ -98,6 +109,8 @@ i386/isa/aha_isa.c optional aha device-driver #i386/isa/aic6360.c optional aic device-driver i386/isa/aic_isa.c optional aic device-driver i386/isa/alog.c optional alog device-driver +i386/isa/atkbd_isa.c optional atkbd device-driver +i386/isa/atkbdc_isa.c optional atkbdc device-driver i386/isa/bt_isa.c optional bt device-driver i386/isa/clock.c standard i386/isa/cronyx.c optional cx device-driver @@ -133,9 +146,6 @@ i386/isa/intr_machdep.c standard i386/isa/isa.c optional isa device-driver i386/isa/istallion.c optional stli device-driver i386/isa/joy.c optional joy device-driver -i386/isa/kbdio.c optional psm device-driver -i386/isa/kbdio.c optional sc device-driver -i386/isa/kbdio.c optional vt device-driver i386/isa/loran.c optional loran device-driver i386/isa/lpt.c optional lpt device-driver i386/isa/labpc.c optional labpc device-driver @@ -235,11 +245,8 @@ i386/isa/sound/cs4232.c optional css device-driver i386/isa/spigot.c optional spigot device-driver i386/isa/spkr.c optional speaker device-driver i386/isa/stallion.c optional stl device-driver -i386/isa/syscons.c optional sc device-driver -i386/isa/scvidctl.c optional sc device-driver -i386/isa/scvesactl.c optional sc device-driver -i386/isa/videoio.c optional sc device-driver -i386/isa/vesa.c optional sc device-driver +i386/isa/vesa.c optional vga device-driver +i386/isa/vga_isa.c optional vga device-driver i386/isa/tw.c optional tw device-driver i386/isa/wd.c optional wdc device-driver i386/isa/wd.c optional wd device-driver diff --git a/sys/conf/options.i386 b/sys/conf/options.i386 index 1b844a6..2704d56 100644 --- a/sys/conf/options.i386 +++ b/sys/conf/options.i386 @@ -1,4 +1,4 @@ -# $Id: options.i386,v 1.101 1999/01/01 08:09:58 peter Exp $ +# $Id: options.i386,v 1.102 1999/01/10 17:41:33 nsouch Exp $ DISABLE_PSE IDE_DELAY @@ -66,16 +66,26 @@ I486_CPU opt_global.h I586_CPU opt_global.h I686_CPU opt_global.h -SC_SPLASH_SCREEN opt_syscons.h MAXCONS opt_syscons.h -SLOW_VGA opt_syscons.h +# obsolete, use VGA_SLOW_IOACCESS +#SLOW_VGA opt_syscons.h STD8X16FONT opt_syscons.h SC_HISTORY_SIZE opt_syscons.h SC_DISABLE_REBOOT opt_syscons.h SC_MOUSE_CHAR opt_syscons.h -SC_ALT_SEQACCESS opt_syscons.h +# obsolete, use VGA_ALT_SEQACCESS +#SC_ALT_SEQACCESS opt_syscons.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 VESA opt_vesa.h +VESA_DEBUG opt_vesa.h PSM_HOOKAPM opt_psm.h PSM_RESETAFTERSUSPEND opt_psm.h @@ -83,10 +93,11 @@ PSM_DEBUG opt_psm.h PCIC_RESUME_RESET opt_pcic.h -KBD_RESETDELAY opt_kbdio.h -KBD_MAXRETRY opt_kbdio.h -KBD_MAXWAIT opt_kbdio.h -KBDIO_DEBUG opt_kbdio.h +KBD_INSTALL_CDEV opt_kbd.h +KBD_MAXRETRY opt_kbd.h +KBD_MAXWAIT opt_kbd.h +KBD_RESETDELAY opt_kbd.h +KBDIO_DEBUG opt_kbd.h ATAPI opt_atapi.h ATAPI_STATIC opt_atapi.h diff --git a/sys/dev/syscons/blank/blank_saver.c b/sys/dev/syscons/blank/blank_saver.c index 9ad6e3f..89dd199 100644 --- a/sys/dev/syscons/blank/blank_saver.c +++ b/sys/dev/syscons/blank/blank_saver.c @@ -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: blank_saver.c,v 1.13 1998/09/17 19:40:29 sos Exp $ + * $Id: blank_saver.c,v 1.14 1998/11/04 03:49:38 peter Exp $ */ #include <sys/param.h> @@ -33,18 +33,18 @@ #include <sys/kernel.h> #include <sys/module.h> +#include <dev/fb/vgareg.h> + #include <i386/isa/isa.h> #include <saver.h> -static void -blank_saver(int blank) +static int +blank_saver(video_adapter_t *adp, int blank) { u_char val; if (blank) { - scrn_blanked = 1; - cur_console->status |= SAVER_RUNNING; - switch (crtc_type) { + switch (adp->va_type) { case KD_VGA: outb(TSIDX, 0x01); val = inb(TSREG); outb(TSIDX, 0x01); outb(TSREG, val | 0x20); @@ -53,18 +53,18 @@ blank_saver(int blank) /* not yet done XXX */ break; case KD_CGA: - outb(crtc_addr + 4, 0x25); + outb(adp->va_crtc_addr + 4, 0x25); break; case KD_MONO: case KD_HERCULES: - outb(crtc_addr + 4, 0x21); + outb(adp->va_crtc_addr + 4, 0x21); break; default: break; } } else { - switch (crtc_type) { + switch (adp->va_type) { case KD_VGA: outb(TSIDX, 0x01); val = inb(TSREG); outb(TSIDX, 0x01); outb(TSREG, val & 0xDF); @@ -73,24 +73,23 @@ blank_saver(int blank) /* not yet done XXX */ break; case KD_CGA: - outb(crtc_addr + 4, 0x2d); + outb(adp->va_crtc_addr + 4, 0x2d); break; case KD_MONO: case KD_HERCULES: - outb(crtc_addr + 4, 0x29); + outb(adp->va_crtc_addr + 4, 0x29); break; default: break; } - cur_console->status &= ~SAVER_RUNNING; - scrn_blanked = 0; } + return 0; } static int -blank_saver_load(void) +blank_init(video_adapter_t *adp) { - switch (crtc_type) { + switch (adp->va_type) { case KD_MONO: case KD_HERCULES: case KD_CGA: @@ -101,13 +100,17 @@ blank_saver_load(void) default: return ENODEV; } - return add_scrn_saver(blank_saver); + return 0; } static int -blank_saver_unload(void) +blank_term(video_adapter_t *adp) { - return remove_scrn_saver(blank_saver); + return 0; } -SAVER_MODULE(blank_saver); +static scrn_saver_t blank_module = { + "blank_saver", blank_init, blank_term, blank_saver, NULL, +}; + +SAVER_MODULE(blank_saver, blank_module); diff --git a/sys/dev/syscons/daemon/daemon_saver.c b/sys/dev/syscons/daemon/daemon_saver.c index d3f9036..8e45a72 100644 --- a/sys/dev/syscons/daemon/daemon_saver.c +++ b/sys/dev/syscons/daemon/daemon_saver.c @@ -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.11 1998/09/17 19:40:30 sos Exp $ + * $Id: daemon_saver.c,v 1.12 1998/11/04 03:49:38 peter Exp $ */ #include <sys/param.h> @@ -49,6 +49,7 @@ static char *message; static int messagelen; static u_short *window; +static int blanked; /* Who is the author of this ASCII pic? */ @@ -184,8 +185,8 @@ draw_string(int xpos, int ypos, int xoff, char *s, int len) scr_map[s[x]]|(FG_LIGHTGREEN|BG_BLACK)<<8; } -static void -daemon_saver(int blank) +static int +daemon_saver(video_adapter_t *adp, int blank) { static int txpos = 10, typos = 10; static int txdir = -1, tydir = -1; @@ -198,20 +199,19 @@ daemon_saver(int blank) int min, max; if (blank) { - if (!ISTEXTSC(scp)) - return; - if (scrn_blanked == 0) { - scp->status |= SAVER_RUNNING; - window = (u_short *)(*biosvidsw.adapter)(scp->adp)->va_window; + if (adp->va_mode_flags & V_INFO_GRAPHICS) + return ENODEV; + if (blanked == 0) { + window = (u_short *)adp->va_window; /* clear the screen and set the border color */ fillw(((FG_LIGHTGREY|BG_BLACK) << 8) | scr_map[0x20], window, scp->xsize * scp->ysize); set_border(scp, 0); xlen = ylen = tlen = 0; } - if (scrn_blanked++ < 2) - return; - scrn_blanked = 1; + if (blanked++ < 2) + return 0; + blanked = 1; clear_daemon(dxpos, dypos, dxdir, xoff, yoff, xlen, ylen); clear_string(txpos, typos, toff, (char *)message, tlen); @@ -322,39 +322,31 @@ daemon_saver(int blank) draw_daemon(dxpos, dypos, dxdir, xoff, yoff, xlen, ylen); draw_string(txpos, typos, toff, (char *)message, tlen); } else { - if (scrn_blanked > 0) { - set_border(scp, scp->border); - scrn_blanked = 0; - scp->status &= ~SAVER_RUNNING; - } + blanked = 0; } + return 0; } static int -daemon_saver_load(void) +daemon_init(video_adapter_t *adp) { - int err; - messagelen = strlen(hostname) + 3 + strlen(ostype) + 1 + strlen(osrelease); message = malloc(messagelen + 1, M_DEVBUF, M_WAITOK); sprintf(message, "%s - %s %s", hostname, ostype, osrelease); - - err = add_scrn_saver(daemon_saver); - if (err != 0) - free(message, M_DEVBUF); - return err; + blanked = 0; + return 0; } static int -daemon_saver_unload(void) +daemon_term(video_adapter_t *adp) { - int err; - - err = remove_scrn_saver(daemon_saver); - if (err == 0) - free(message, M_DEVBUF); - return err; + free(message, M_DEVBUF); + return 0; } -SAVER_MODULE(daemon_saver); +static scrn_saver_t daemon_module = { + "daemon_saver", daemon_init, daemon_term, daemon_saver, NULL, +}; + +SAVER_MODULE(daemon_saver, daemon_module); diff --git a/sys/dev/syscons/fade/fade_saver.c b/sys/dev/syscons/fade/fade_saver.c index 3a2cc0c..70d36c9 100644 --- a/sys/dev/syscons/fade/fade_saver.c +++ b/sys/dev/syscons/fade/fade_saver.c @@ -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: fade_saver.c,v 1.14 1998/09/17 19:40:30 sos Exp $ + * $Id: fade_saver.c,v 1.15 1998/11/04 03:49:38 peter Exp $ */ #include <sys/param.h> @@ -37,18 +37,22 @@ #include <saver.h> -static void -fade_saver(int blank) +static u_char palette[256*3]; +static int blanked; + +static int +fade_saver(video_adapter_t *adp, int blank) { static int count = 0; u_char pal[256*3]; int i; if (blank) { - scrn_blanked = 1; - cur_console->status |= SAVER_RUNNING; - switch (crtc_type) { + blanked = TRUE; + switch (adp->va_type) { case KD_VGA: + if (count <= 0) + save_palette(adp, palette); if (count < 64) { pal[0] = pal[1] = pal[2] = 0; for (i = 3; i < 256*3; i++) { @@ -57,7 +61,7 @@ fade_saver(int blank) else pal[i] = 60; } - load_palette(cur_console, pal); + load_palette(adp, pal); count++; } break; @@ -65,44 +69,44 @@ fade_saver(int blank) /* not yet done XXX */ break; case KD_CGA: - outb(crtc_addr + 4, 0x25); + outb(adp->va_crtc_addr + 4, 0x25); break; case KD_MONO: case KD_HERCULES: - outb(crtc_addr + 4, 0x21); + outb(adp->va_crtc_addr + 4, 0x21); break; default: break; } } else { - switch (crtc_type) { + switch (adp->va_type) { case KD_VGA: - load_palette(cur_console, palette); + load_palette(adp, palette); count = 0; break; case KD_EGA: /* not yet done XXX */ break; case KD_CGA: - outb(crtc_addr + 4, 0x2d); + outb(adp->va_crtc_addr + 4, 0x2d); break; case KD_MONO: case KD_HERCULES: - outb(crtc_addr + 4, 0x29); + outb(adp->va_crtc_addr + 4, 0x29); break; default: break; } - cur_console->status &= ~SAVER_RUNNING; - scrn_blanked = 0; + blanked = FALSE; } + return 0; } static int -fade_saver_load(void) +fade_init(video_adapter_t *adp) { - switch (crtc_type) { + switch (adp->va_type) { case KD_MONO: case KD_HERCULES: case KD_CGA: @@ -117,13 +121,18 @@ fade_saver_load(void) default: return ENODEV; } - return add_scrn_saver(fade_saver); + blanked = FALSE; + return 0; } static int -fade_saver_unload(void) +fade_term(video_adapter_t *adp) { - return remove_scrn_saver(fade_saver); + return 0; } -SAVER_MODULE(fade_saver); +static scrn_saver_t fade_module = { + "fade_saver", fade_init, fade_term, fade_saver, NULL, +}; + +SAVER_MODULE(fade_saver, fade_module); diff --git a/sys/dev/syscons/green/green_saver.c b/sys/dev/syscons/green/green_saver.c index 0491c67..9decd72 100644 --- a/sys/dev/syscons/green/green_saver.c +++ b/sys/dev/syscons/green/green_saver.c @@ -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: green_saver.c,v 1.13 1998/09/17 19:40:30 sos Exp $ + * $Id: green_saver.c,v 1.14 1998/11/04 03:49:38 peter Exp $ */ #include <sys/param.h> @@ -33,18 +33,21 @@ #include <sys/kernel.h> #include <sys/module.h> +#include <dev/fb/vgareg.h> + #include <i386/isa/isa.h> #include <saver.h> -static void -green_saver(int blank) +static int +green_saver(video_adapter_t *adp, int blank) { + int crtc_addr; u_char val; + + crtc_addr = adp->va_crtc_addr; if (blank) { - scrn_blanked = 1; - cur_console->status |= SAVER_RUNNING; - switch (crtc_type) { + switch (adp->va_type) { case KD_VGA: outb(TSIDX, 0x01); val = inb(TSREG); outb(TSIDX, 0x01); outb(TSREG, val | 0x20); @@ -66,7 +69,7 @@ green_saver(int blank) } } else { - switch (crtc_type) { + switch (adp->va_type) { case KD_VGA: outb(TSIDX, 0x01); val = inb(TSREG); outb(TSIDX, 0x01); outb(TSREG, val & 0xDF); @@ -86,15 +89,14 @@ green_saver(int blank) default: break; } - cur_console->status &= ~SAVER_RUNNING; - scrn_blanked = 0; } + return 0; } static int -green_saver_load(void) +green_init(video_adapter_t *adp) { - switch (crtc_type) { + switch (adp->va_type) { case KD_MONO: case KD_HERCULES: case KD_CGA: @@ -109,13 +111,17 @@ green_saver_load(void) default: return ENODEV; } - return add_scrn_saver(green_saver); + return 0; } static int -green_saver_unload(void) +green_term(video_adapter_t *adp) { - return remove_scrn_saver(green_saver); + return 0; } -SAVER_MODULE(green_saver); +static scrn_saver_t green_module = { + "green_saver", green_init, green_term, green_saver, NULL, +}; + +SAVER_MODULE(green_saver, green_module); diff --git a/sys/dev/syscons/logo/logo_saver.c b/sys/dev/syscons/logo/logo_saver.c index ff42be0..105fcae 100644 --- a/sys/dev/syscons/logo/logo_saver.c +++ b/sys/dev/syscons/logo/logo_saver.c @@ -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.1 1998/12/28 14:22:57 des Exp $ + * $Id: logo_saver.c,v 1.2 1999/01/01 14:40:49 des Exp $ */ #include <sys/param.h> @@ -34,26 +34,24 @@ #include <sys/module.h> #include <sys/syslog.h> -#include <machine/md_var.h> - #include <saver.h> static u_char *vid; static int banksize, scrmode, scrw, scrh; -static u_char save_pal[768]; +static int blanked; #include "logo.c" -#define set_origin(scp, o) (*biosvidsw.set_win_org)((scp)->adp, o) +#define set_origin(adp, o) (*vidsw[(adp)->va_index]->set_win_org)(adp, o) static void -logo_blit(int x, int y) +logo_blit(video_adapter_t *adp, int x, int y) { int d, l, o, p; for (o = 0, p = y * scrw + x; p > banksize; p -= banksize) o += banksize; - set_origin(cur_console, o); + set_origin(adp, o); for (d = 0; d < sizeof logo_img; d += logo_w) { if (p + logo_w < banksize) { @@ -62,12 +60,12 @@ logo_blit(int x, int y) } else if (p < banksize) { l = banksize - p; bcopy(logo_img + d, vid + p, l); - set_origin(cur_console, (o += banksize)); + set_origin(adp, (o += banksize)); bcopy(logo_img + d + l, vid, logo_w - l); p += scrw - banksize; } else { p -= banksize; - set_origin(cur_console, (o += banksize)); + set_origin(adp, (o += banksize)); bcopy(logo_img + d, vid + p, logo_w); p += scrw; } @@ -75,7 +73,7 @@ logo_blit(int x, int y) } static void -logo_update(void) +logo_update(video_adapter_t *adp) { static int xpos = 0, ypos = 0; static int xinc = 1, yinc = 1; @@ -89,62 +87,42 @@ logo_update(void) ypos += yinc; /* XXX Relies on margin around logo to erase trail */ - logo_blit(xpos, ypos); + logo_blit(adp, xpos, ypos); } -static void -logo_saver(int blank) +static int +logo_saver(video_adapter_t *adp, int blank) { - scr_stat *scp = cur_console; - static int saved_mode; int i, pl; if (blank) { /* switch to graphics mode */ - if (scrn_blanked <= 0) { + if (blanked <= 0) { pl = splhigh(); - saved_mode = scp->mode; - scp->mode = scrmode; - scp->status |= SAVER_RUNNING|GRAPHICS_MODE; - save_palette(scp, (char *)save_pal); - set_mode(scp); - load_palette(scp, (char *)logo_pal); - scrn_blanked++; - vid = (u_char *)Crtat; + set_video_mode(adp, scrmode, logo_pal, 0); + blanked++; + vid = (u_char *)adp->va_window; splx(pl); for (i = 0; i < scrw*scrh; i += banksize) { - set_origin(scp, i); + set_origin(adp, i); bzero(vid, banksize); } } - logo_update(); + logo_update(adp); } else { - /* return to previous video mode */ - if (scrn_blanked > 0) { - if (saved_mode) { - pl = splhigh(); - scrn_blanked = 0; - scp->mode = saved_mode; - scp->status &= ~(SAVER_RUNNING|GRAPHICS_MODE); - set_mode(scp); - load_palette(scp, (char *)save_pal); - saved_mode = 0; - splx(pl); - } - } + blanked = 0; } + return 0; } static int -logo_saver_load(void) +logo_init(video_adapter_t *adp) { video_info_t info; - int adp; - adp = cur_console->adp; - if (!(*biosvidsw.get_info)(adp, M_VESA_CG800x600, &info)) { + if (!get_mode_info(adp, M_VESA_CG800x600, &info)) { scrmode = M_VESA_CG800x600; - } else if (!(*biosvidsw.get_info)(adp, M_VGA_CG320, &info)) { + } else if (!get_mode_info(adp, M_VGA_CG320, &info)) { scrmode = M_VGA_CG320; } else { log(LOG_NOTICE, "logo_saver: no suitable graphics mode\n"); @@ -154,14 +132,19 @@ logo_saver_load(void) banksize = info.vi_window_size; scrw = info.vi_width; scrh = info.vi_height; + blanked = 0; - return add_scrn_saver(logo_saver); + return 0; } static int -logo_saver_unload(void) +logo_term(video_adapter_t *adp) { - return remove_scrn_saver(logo_saver); + return 0; } -SAVER_MODULE(logo_saver); +static scrn_saver_t logo_module = { + "logo_saver", logo_init, logo_term, logo_saver, NULL, +}; + +SAVER_MODULE(logo_saver, logo_module); diff --git a/sys/dev/syscons/rain/rain_saver.c b/sys/dev/syscons/rain/rain_saver.c index 0ca46c8..0b4b2ee 100644 --- a/sys/dev/syscons/rain/rain_saver.c +++ b/sys/dev/syscons/rain/rain_saver.c @@ -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$ + * $Id: rain_saver.c,v 1.1 1998/12/31 13:41:40 des Exp $ */ #include <sys/param.h> @@ -34,7 +34,6 @@ #include <sys/module.h> #include <sys/syslog.h> -#include <machine/md_var.h> #include <machine/random.h> #include <saver.h> @@ -45,11 +44,11 @@ static u_char *vid; #define SCRH 200 #define MAX 63 -static u_char save_pal[768]; static u_char rain_pal[768]; +static int blanked; static void -rain_update(void) +rain_update(video_adapter_t *adp) { int i, t; @@ -57,28 +56,21 @@ rain_update(void) for (i = (MAX*3+2); i > 5; i -= 3) rain_pal[i] = rain_pal[i-3]; rain_pal[5] = t; - load_palette(cur_console, rain_pal); + load_palette(adp, rain_pal); } -static void -rain_saver(int blank) +static int +rain_saver(video_adapter_t *adp, int blank) { - scr_stat *scp = cur_console; - static int saved_mode; int i, j, k, pl; if (blank) { /* switch to graphics mode */ - if (scrn_blanked <= 0) { + if (blanked <= 0) { pl = splhigh(); - saved_mode = scp->mode; - scp->mode = M_VGA_CG320; - scp->status |= SAVER_RUNNING|GRAPHICS_MODE; - save_palette(scp, save_pal); - set_mode(scp); - load_palette(scp, rain_pal); - scrn_blanked++; - vid = (u_char *)Crtat; + set_video_mode(adp, M_VGA_CG320, rain_pal, 0); + blanked++; + vid = (u_char *)adp->va_window; splx(pl); bzero(vid, SCRW*SCRH); for (i = 0; i < SCRW; i += 2) @@ -89,33 +81,22 @@ rain_saver(int blank) } /* update display */ - rain_update(); + rain_update(adp); } else { - /* return to previous video mode */ - if (scrn_blanked > 0) { - if (saved_mode) { - pl = splhigh(); - scrn_blanked = 0; - scp->mode = saved_mode; - scp->status &= ~(SAVER_RUNNING|GRAPHICS_MODE); - set_mode(scp); - load_palette(scp, save_pal); - saved_mode = 0; - splx(pl); - } - } + blanked = 0; } + return 0; } static int -rain_saver_load(void) +rain_init(video_adapter_t *adp) { video_info_t info; int i; /* check that the console is capable of running in 320x200x256 */ - if ((*biosvidsw.get_info)(cur_console->adp, M_VGA_CG320, &info)) { + if (get_mode_info(adp, M_VGA_CG320, &info)) { log(LOG_NOTICE, "rain_saver: the console does not support M_VGA_CG320\n"); return ENODEV; } @@ -123,14 +104,20 @@ rain_saver_load(void) /* intialize the palette */ for (i = 3; i < (MAX+1)*3; i += 3) rain_pal[i+2] = rain_pal[i-1] + 4; - - return add_scrn_saver(rain_saver); + + blanked = 0; + + return 0; } static int -rain_saver_unload(void) +rain_term(video_adapter_t *adp) { - return remove_scrn_saver(rain_saver); + return 0; } -SAVER_MODULE(rain_saver); +static scrn_saver_t rain_module = { + "rain_saver", rain_init, rain_term, rain_saver, NULL, +}; + +SAVER_MODULE(rain_saver, rain_module); diff --git a/sys/dev/syscons/scvesactl.c b/sys/dev/syscons/scvesactl.c index a1507c8..6f48630 100644 --- a/sys/dev/syscons/scvesactl.c +++ b/sys/dev/syscons/scvesactl.c @@ -23,14 +23,21 @@ * (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.7 1998/12/07 21:58:22 archie Exp $ + * $Id: $ */ #include "sc.h" +#include "vga.h" +#include "opt_syscons.h" +#include "opt_vga.h" #include "opt_vesa.h" #include "opt_vm86.h" -#if (NSC > 0 && defined(VESA) && defined(VM86)) || defined(KLD_MODULE) +#ifdef VGA_NO_MODE_CHANGE +#undef VESA +#endif + +#if (NSC > 0 && NVGA > 0 && defined(VESA) && defined(VM86)) || defined(KLD_MODULE) #include <sys/param.h> #include <sys/systm.h> @@ -42,8 +49,8 @@ #include <machine/console.h> #include <machine/pc/vesa.h> -#include <i386/isa/videoio.h> -#include <i386/isa/syscons.h> +#include <dev/fb/fbreg.h> +#include <dev/syscons/syscons.h> static d_ioctl_t *prev_user_ioctl; @@ -52,7 +59,6 @@ vesa_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) { scr_stat *scp; struct tty *tp; - video_adapter_t *adp; int mode; tp = scdevtotty(dev); @@ -66,8 +72,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: - adp = get_adapter(scp); - if (!(adp->va_flags & V_ADP_MODECHANGE)) + if (!(scp->adp->va_flags & V_ADP_MODECHANGE)) return ENODEV; return sc_set_text_mode(scp, tp, cmd & 0xff, 0, 0, 0); @@ -77,8 +82,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: - adp = get_adapter(scp); - if (!(adp->va_flags & V_ADP_MODECHANGE)) + if (!(scp->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); @@ -104,8 +108,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: - adp = get_adapter(scp); - if (!(adp->va_flags & V_ADP_MODECHANGE)) + if (!(scp->adp->va_flags & V_ADP_MODECHANGE)) return ENODEV; mode = (cmd & 0xff) + M_VESA_BASE; return sc_set_graphics_mode(scp, tp, mode); @@ -137,4 +140,4 @@ vesa_unload_ioctl(void) return 0; } -#endif /* (NSC > 0 && VESA && VM86) || KLD_MODULE */ +#endif /* (NSC > 0 && NVGA > 0 && VESA && VM86) || KLD_MODULE */ diff --git a/sys/dev/syscons/scvidctl.c b/sys/dev/syscons/scvidctl.c index 065dee2..f267e6e 100644 --- a/sys/dev/syscons/scvidctl.c +++ b/sys/dev/syscons/scvidctl.c @@ -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.4 1998/09/29 02:00:56 ache Exp $ + * $Id: $ */ #include "sc.h" @@ -40,11 +40,36 @@ #include <machine/apm_bios.h> #include <machine/console.h> -#include <i386/isa/videoio.h> -#include <i386/isa/syscons.h> - -/* video ioctl */ - +#include <dev/fb/fbreg.h> +#include <dev/syscons/syscons.h> + +/* for compatibility with previous versions */ +typedef struct old_video_adapter { + int va_index; + int va_type; + 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) + int va_crtc_addr; + 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; +} old_video_adapter_t; + +#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; @@ -54,15 +79,13 @@ int sc_set_text_mode(scr_stat *scp, struct tty *tp, int mode, int xsize, int ysize, int fontsize) { - video_adapter_t *adp; video_info_t info; int error; int s; int i; - if ((*biosvidsw.get_info)(scp->adp, mode, &info)) + if ((*vidsw[scp->ad]->get_info)(scp->adp, mode, &info)) return ENODEV; - adp = get_adapter(scp); /* adjust argument values */ if (fontsize <= 0) @@ -108,12 +131,14 @@ sc_set_text_mode(scr_stat *scp, struct tty *tp, int mode, int xsize, int ysize, 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; /* allocate buffers */ sc_alloc_scr_buffer(scp, TRUE, TRUE); - if (ISMOUSEAVAIL(adp->va_flags)) + if (ISMOUSEAVAIL(scp->adp->va_flags)) sc_alloc_cut_buffer(scp, FALSE); sc_alloc_history_buffer(scp, sc_history_size, i, FALSE); splx(s); @@ -137,14 +162,12 @@ 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) { - video_adapter_t *adp; video_info_t info; int error; int s; - if ((*biosvidsw.get_info)(scp->adp, mode, &info)) + if ((*vidsw[scp->ad]->get_info)(scp->adp, mode, &info)) return ENODEV; - adp = get_adapter(scp); /* stop screen saver, etc */ s = spltty(); @@ -157,6 +180,8 @@ sc_set_graphics_mode(scr_stat *scp, struct tty *tp, int mode) scp->status |= (UNKNOWN_MODE | GRAPHICS_MODE); scp->status &= ~PIXEL_MODE; scp->mode = mode; + scp->xoff = 0; + scp->yoff = 0; scp->xpixel = info.vi_width; scp->ypixel = info.vi_height; scp->xsize = info.vi_width/8; @@ -187,15 +212,13 @@ int sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize, int fontsize) { - video_adapter_t *adp; video_info_t info; int error; int s; int i; - if ((*biosvidsw.get_info)(scp->adp, scp->mode, &info)) + if ((*vidsw[scp->ad]->get_info)(scp->adp, scp->mode, &info)) return ENODEV; /* this shouldn't happen */ - adp = get_adapter(scp); #ifdef SC_VIDEO_DEBUG if (scp->scr_buf != NULL) { @@ -230,7 +253,7 @@ sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize, 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", - adp->va_window, info.vi_width, info.vi_height, + scp->adp->va_window, info.vi_width, info.vi_height, (info.vi_width/8 - xsize)/2, (info.vi_height/fontsize - ysize)/2); } @@ -274,7 +297,7 @@ sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize, /* allocate buffers */ sc_alloc_scr_buffer(scp, TRUE, TRUE); - if (ISMOUSEAVAIL(adp->va_flags)) + if (ISMOUSEAVAIL(scp->adp->va_flags)) sc_alloc_cut_buffer(scp, FALSE); sc_alloc_history_buffer(scp, sc_history_size, i, FALSE); splx(s); @@ -304,7 +327,6 @@ 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; int error; int s; @@ -313,19 +335,66 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p) switch (cmd) { case CONS_CURRENT: /* get current adapter type */ - adp = get_adapter(scp); - *(int *)data = adp->va_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->adp; + *(int *)data = scp->ad; + 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 CONS_ADPINFO: /* adapter information */ - adp = (*biosvidsw.adapter)(((video_adapter_t *)data)->va_index); - if (adp == NULL) + if (scp->adp == NULL) return ENODEV; - bcopy(adp, data, sizeof(*adp)); + ((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_mode_flags = scp->adp->va_mode_flags; + ((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; return 0; case CONS_GET: /* get current video mode */ @@ -333,16 +402,16 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p) return 0; case CONS_MODEINFO: /* get mode information */ - return ((*biosvidsw.get_info)(scp->adp, + return ((*vidsw[scp->ad]->get_info)(scp->adp, ((video_info_t *)data)->vi_mode, (video_info_t *)data) ? ENODEV : 0); case CONS_FINDMODE: /* find a matching video mode */ - return ((*biosvidsw.query_mode)(scp->adp, (video_info_t *)data) + return ((*vidsw[scp->ad]->query_mode)(scp->adp, (video_info_t *)data) ? ENODEV : 0); case CONS_SETWINORG: - return ((*biosvidsw.set_win_org)(scp->adp, *(u_int *)data) + return ((*vidsw[scp->ad]->set_win_org)(scp->adp, *(u_int *)data) ? ENODEV : 0); /* generic text modes */ @@ -363,8 +432,13 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p) case SW_ENH_B80x25: case SW_ENH_C80x25: case SW_ENH_B80x43: case SW_ENH_C80x43: case SW_EGAMONO80x25: - adp = get_adapter(scp); - if (!(adp->va_flags & V_ADP_MODECHANGE)) + +#ifdef PC98 + /* PC98 TEXT MODES */ + case SW_PC98_80x25: + case SW_PC98_80x30: +#endif + if (!(scp->adp->va_flags & V_ADP_MODECHANGE)) return ENODEV; return sc_set_text_mode(scp, tp, cmd & 0xff, 0, 0, 0); @@ -374,8 +448,7 @@ 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: - adp = get_adapter(scp); - if (!(adp->va_flags & V_ADP_MODECHANGE)) + if (!(scp->adp->va_flags & V_ADP_MODECHANGE)) return ENODEV; return sc_set_graphics_mode(scp, tp, cmd & 0xff); @@ -390,8 +463,7 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p) return EINVAL; /* restore fonts & palette ! */ #if 0 - adp = get_adapter(scp); - if (ISFONTAVAIL(adp->va_flags) + if (ISFONTAVAIL(scp->adp->va_flags) && !(scp->status & (GRAPHICS_MODE | PIXEL_MODE))) /* * FONT KLUDGE @@ -405,10 +477,10 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p) copy_font(scp, LOAD, 16, font_16); } #endif - load_palette(scp, palette); + load_palette(scp->adp, palette); /* move hardware cursor out of the way */ - (*biosvidsw.set_hw_cursor)(scp->adp, -1, -1); + (*vidsw[scp->ad]->set_hw_cursor)(scp->adp, -1, -1); /* FALL THROUGH */ @@ -424,6 +496,7 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p) splx(s); return error; } +#ifndef PC98 scp->status |= UNKNOWN_MODE; splx(s); /* no restore fonts & palette */ @@ -431,6 +504,14 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p) 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) + set_mode(scp); + sc_clear_screen(scp); + splx(s); +#endif /* PC98 */ return 0; case KD_PIXEL: /* pixel (raster) display */ @@ -448,7 +529,7 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p) splx(s); if (scp == cur_console) { set_mode(scp); - load_palette(scp, palette); + load_palette(scp->adp, palette); } sc_clear_screen(scp); scp->status &= ~UNKNOWN_MODE; @@ -462,6 +543,10 @@ 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) + set_mode(scp); +#endif return 0; default: @@ -486,7 +571,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) - set_border(cur_console, scp->border); + set_border(scp, scp->border); return 0; } diff --git a/sys/dev/syscons/snake/snake_saver.c b/sys/dev/syscons/snake/snake_saver.c index 3100ff3..c7c9ff5 100644 --- a/sys/dev/syscons/snake/snake_saver.c +++ b/sys/dev/syscons/snake/snake_saver.c @@ -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.19 1998/09/17 19:40:30 sos Exp $ + * $Id: snake_saver.c,v 1.20 1998/11/04 03:49:39 peter Exp $ */ #include <sys/param.h> @@ -44,9 +44,10 @@ static char *message; static u_char **messagep; static int messagelen; static u_short *window; +static int blanked; -static void -snake_saver(int blank) +static int +snake_saver(video_adapter_t *adp, int blank) { static int dirx, diry; int f; @@ -57,12 +58,11 @@ snake_saver(int blank) #define savs messagep if (blank) { - if (!ISTEXTSC(scp)) - return; - if (scrn_blanked <= 0) { - scp->status |= SAVER_RUNNING; - window = (u_short *)(*biosvidsw.adapter)(scp->adp)->va_window; - fillw((FG_LIGHTGREY|BG_BLACK)<<8 | scr_map[0x20], + if (adp->va_mode_flags & V_INFO_GRAPHICS) + return ENODEV; + if (blanked <= 0) { + window = (u_short *)adp->va_window; + fillw(((FG_LIGHTGREY|BG_BLACK)<<8) | scr_map[0x20], window, scp->xsize * scp->ysize); set_border(scp, 0); dirx = (scp->xpos ? 1 : -1); @@ -72,16 +72,11 @@ snake_saver(int blank) savs[f] = (u_char *)window + 2 * (scp->xpos+scp->ypos*scp->xsize); *(savs[0]) = scr_map[*save]; - f = scp->ysize * scp->xsize + 5; - outb(crtc_addr, 14); - outb(crtc_addr+1, f >> 8); - outb(crtc_addr, 15); - outb(crtc_addr+1, f & 0xff); - scrn_blanked = 1; + blanked = 1; } - if (scrn_blanked++ < 4) - return; - scrn_blanked = 1; + if (blanked++ < 4) + return 0; + blanked = 1; *(savs[messagelen-1]) = scr_map[0x20]; for (f=messagelen-1; f > 0; f--) savs[f] = savs[f-1]; @@ -99,43 +94,31 @@ snake_saver(int blank) *(savs[f]) = scr_map[save[f]]; } else { - if (scrn_blanked > 0) { - set_border(scp, scp->border); - scrn_blanked = 0; - scp->status &= ~SAVER_RUNNING; - } + blanked = 0; } + return 0; } static int -snake_saver_load(void) +snake_init(video_adapter_t *adp) { - int err; - messagelen = strlen(ostype) + 1 + strlen(osrelease); message = malloc(messagelen + 1, M_DEVBUF, M_WAITOK); sprintf(message, "%s %s", ostype, osrelease); messagep = malloc(messagelen * sizeof *messagep, M_DEVBUF, M_WAITOK); - - err = add_scrn_saver(snake_saver); - if (err != 0) { - free(message, M_DEVBUF); - free(messagep, M_DEVBUF); - } - return err; + return 0; } static int -snake_saver_unload(void) +snake_term(video_adapter_t *adp) { - int err; - - err = remove_scrn_saver(snake_saver); - if (err == 0) { - free(message, M_DEVBUF); - free(messagep, M_DEVBUF); - } - return err; + free(message, M_DEVBUF); + free(messagep, M_DEVBUF); + return 0; } -SAVER_MODULE(snake_saver); +static scrn_saver_t snake_module = { + "snake_saver", snake_init, snake_term, snake_saver, NULL, +}; + +SAVER_MODULE(snake_saver, snake_module); diff --git a/sys/dev/syscons/star/star_saver.c b/sys/dev/syscons/star/star_saver.c index 719d502..ca4b588 100644 --- a/sys/dev/syscons/star/star_saver.c +++ b/sys/dev/syscons/star/star_saver.c @@ -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: star_saver.c,v 1.16 1998/09/17 19:40:30 sos Exp $ + * $Id: star_saver.c,v 1.17 1998/11/04 03:49:39 peter Exp $ */ #include <sys/param.h> @@ -41,13 +41,14 @@ #define NUM_STARS 50 static u_short *window; +static int blanked; /* * Alternate saver that got its inspiration from a well known utility * package for an inferior^H^H^H^H^H^Hfamous OS. */ -static void -star_saver(int blank) +static int +star_saver(video_adapter_t *adp, int blank) { scr_stat *scp = cur_console; int cell, i; @@ -57,15 +58,15 @@ star_saver(int blank) static u_short stars[NUM_STARS][2]; if (blank) { - if (!ISTEXTSC(scp)) - return; - if (scrn_blanked <= 0) { - scp->status |= SAVER_RUNNING; - window = (u_short *)(*biosvidsw.adapter)(scp->adp)->va_window; - scrn_blanked = 1; - fillw((FG_LIGHTGREY|BG_BLACK)<<8|scr_map[0x20], window, - scp->xsize * scp->ysize); + if (adp->va_mode_flags & V_INFO_GRAPHICS) + return ENODEV; + if (!blanked) { + window = (u_short *)adp->va_window; + /* clear the screen and set the border color */ + fillw(((FG_LIGHTGREY|BG_BLACK) << 8) | scr_map[0x20], + window, scp->xsize * scp->ysize); set_border(scp, 0); + blanked = TRUE; for(i=0; i<NUM_STARS; i++) { stars[i][0] = random() % (scp->xsize*scp->ysize); @@ -82,24 +83,26 @@ star_saver(int blank) } } else { - if (scrn_blanked > 0) { - set_border(scp, scp->border); - scrn_blanked = 0; - scp->status &= ~SAVER_RUNNING; - } + blanked = FALSE; } + return 0; } static int -star_saver_load(void) +star_init(video_adapter_t *adp) { - return add_scrn_saver(star_saver); + blanked = FALSE; + return 0; } static int -star_saver_unload(void) +star_term(video_adapter_t *adp) { - return remove_scrn_saver(star_saver); + return 0; } -SAVER_MODULE(star_saver); +static scrn_saver_t star_module = { + "star_saver", star_init, star_term, star_saver, NULL, +}; + +SAVER_MODULE(star_saver, star_module); diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c index fbc0b16..57672bc 100644 --- a/sys/dev/syscons/syscons.c +++ b/sys/dev/syscons/syscons.c @@ -25,10 +25,11 @@ * (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.c,v 1.288 1998/12/07 21:58:23 archie Exp $ + * $Id: syscons.c,v 1.289 1999/01/07 14:14:22 yokota Exp $ */ #include "sc.h" +#include "splash.h" #include "apm.h" #include "opt_ddb.h" #include "opt_devfs.h" @@ -67,13 +68,15 @@ #include <vm/vm_param.h> #include <vm/pmap.h> +#include <dev/kbd/kbdreg.h> +#include <dev/fb/fbreg.h> +#include <dev/fb/vgareg.h> +#include <dev/fb/splashreg.h> +#include <dev/syscons/syscons.h> + #include <i386/isa/isa.h> #include <i386/isa/isa_device.h> #include <i386/isa/timerreg.h> -#include <i386/isa/kbdtables.h> -#include <i386/isa/kbdio.h> -#include <i386/isa/videoio.h> -#include <i386/isa/syscons.h> #if !defined(MAXCONS) #define MAXCONS 16 @@ -119,10 +122,6 @@ typedef struct old_mouse_info { } u; } old_mouse_info_t; -/* XXX use sc_bcopy where video memory is concerned */ -extern void generic_bcopy(const void *, void *, size_t); -extern void generic_bzero(void *, size_t); - static default_attr user_default = { (FG_LIGHTGREY | BG_BLACK) << 8, (FG_BLACK | BG_LIGHTGREY) << 8 @@ -145,8 +144,6 @@ static scr_stat *new_scp, *old_scp; static term_stat kernel_console; static default_attr *current_default; static int sc_flags; -static int sc_port = IO_KBD; -static KBDC sc_kbdc = NULL; static char init_done = COLD; static u_short sc_buffer[ROW*COL]; static char shutdown_in_progress = FALSE; @@ -155,17 +152,12 @@ static char switch_in_progress = FALSE; static char write_in_progress = FALSE; static char blink_in_progress = FALSE; static int blinkrate = 0; - u_int crtc_addr = MONO_BASE; - char crtc_type = KD_MONO; -static char crtc_vga = FALSE; -static int adp_flags; -static u_char shfts = 0, ctls = 0, alts = 0, agrs = 0, metas = 0; -static u_char accents = 0; -static u_char nlkcnt = 0, clkcnt = 0, slkcnt = 0, alkcnt = 0; -static const u_int n_fkey_tab = sizeof(fkey_tab) / sizeof(*fkey_tab); +static int adapter = -1; +static int keyboard = -1; +static keyboard_t *kbd; static int delayed_next_scr = FALSE; static long scrn_blank_time = 0; /* screen saver timeout value */ - int scrn_blanked = 0; /* screen saver active flag */ +static int scrn_blanked = FALSE; /* screen saver active flag */ static long scrn_time_stamp; static int saver_mode = CONS_LKM_SAVER; /* LKM/user saver */ static int run_scrn_saver = FALSE; /* should run the saver? */ @@ -173,7 +165,6 @@ static int scrn_idle = FALSE; /* about to run the saver */ u_char scr_map[256]; u_char scr_rmap[256]; static int initial_video_mode; /* initial video mode # */ -static int bios_video_mode; /* video mode # set by BIOS */ int fonts_loaded = 0 #ifdef STD8X16FONT | FONT_16 @@ -210,7 +201,6 @@ static int extra_history_size = static void none_saver(int blank) { } static void (*current_saver)(int blank) = none_saver; -static void (*default_saver)(int blank) = none_saver; d_ioctl_t *sc_user_ioctl; static int sticky_splash = FALSE; @@ -237,20 +227,40 @@ static const int nsccons = MAXCONS+2; + (offset)) % (scp)->history_size)) #define ISSIGVALID(sig) ((sig) > 0 && (sig) < NSIG) +/* some useful macros */ +#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)) + /* prototypes */ static int scattach(struct isa_device *dev); -static ointhand2_t scintr; +static kbd_callback_func_t sckbdevent; static int scparam(struct tty *tp, struct termios *t); static int scprobe(struct isa_device *dev); -static int scvidprobe(int unit, int flags); -static int sckbdprobe(int unit, int flags); +static int scvidprobe(int unit, int flags, int cons); +static int sckbdprobe(int unit, int flags, int cons); static void scstart(struct tty *tp); static void scmousestart(struct tty *tp); static void scinit(void); static void scshutdown(int howto, void *arg); -static u_int scgetc(u_int flags); +static u_int scgetc(keyboard_t *kbd, u_int flags); #define SCGETC_CN 1 #define SCGETC_NONBLOCK 2 +static int sccngetch(int flags); static void sccnupdate(scr_stat *scp); static scr_stat *alloc_scp(void); static void init_scp(scr_stat *scp); @@ -258,7 +268,10 @@ static void sc_bcopy(scr_stat *scp, u_short *p, int from, int to, int mark); static int get_scr_num(void); static timeout_t scrn_timer; static void scrn_update(scr_stat *scp, int show_cursor); -static void scrn_saver(void (*saver)(int), int blank); +static int add_scrn_saver(void (*this_saver)(int)); +static int remove_scrn_saver(void (*this_saver)(int)); +static int set_scrn_saver_mode(scr_stat *scp, int mode, u_char *pal, int border); +static int restore_scrn_saver_mode(scr_stat *scp); static void stop_scrn_saver(void (*saver)(int)); static int wait_scrn_saver_stop(void); static int switch_scr(scr_stat *scp, u_int next_scr); @@ -268,13 +281,13 @@ static void ansi_put(scr_stat *scp, u_char *buf, int len); static void draw_cursor_image(scr_stat *scp); static void remove_cursor_image(scr_stat *scp); static void move_crsr(scr_stat *scp, int x, int y); -static u_char *get_fstr(u_int c, u_int *len); static void history_to_screen(scr_stat *scp); static int history_up_line(scr_stat *scp); static int history_down_line(scr_stat *scp); static int mask2attr(struct term_stat *term); -static void set_keyboard(int command, int data); -static void update_leds(int which); +static int save_kbd_state(scr_stat *scp); +static int update_kbd_state(int state, int mask); +static int update_kbd_leds(int which); static void set_destructive_cursor(scr_stat *scp); static void set_mouse_pos(scr_stat *scp); static int skip_spc_right(scr_stat *scp, u_short *p); @@ -292,14 +305,13 @@ static void draw_cutmarking(scr_stat *scp); static void remove_cutmarking(scr_stat *scp); static void do_bell(scr_stat *scp, int pitch, int duration); static timeout_t blink_screen; -#ifdef SC_SPLASH_SCREEN -static void scsplash_init(scr_stat *scp); -static void scsplash_term(scr_stat *scp); +#if NSPLASH > 0 +static int scsplash_callback(int); static void scsplash_saver(int show); #define scsplash_stick(stick) (sticky_splash = (stick)) #else #define scsplash_stick(stick) -#endif +#endif /* NSPLASH */ static cn_probe_t sccnprobe; static cn_init_t sccninit; @@ -342,7 +354,7 @@ draw_cursor_image(scr_stat *scp) return; } - ptr = (u_short *)(get_adapter(scp)->va_window) + ptr = (u_short *)(scp->adp->va_window) + (scp->cursor_pos - scp->scr_buf); /* do we have a destructive cursor ? */ @@ -395,7 +407,7 @@ remove_cursor_image(scr_stat *scp) sc_bcopy(scp, scp->scr_buf, scp->cursor_oldpos - scp->scr_buf, scp->cursor_oldpos - scp->scr_buf, 0); else - *((u_short *)(get_adapter(scp)->va_window) + *((u_short *)(scp->adp->va_window) + (scp->cursor_oldpos - scp->scr_buf)) = scp->cursor_saveunder; } @@ -419,228 +431,69 @@ move_crsr(scr_stat *scp, int x, int y) static int scprobe(struct isa_device *dev) { - if (!scvidprobe(dev->id_unit, dev->id_flags)) { + if (!scvidprobe(dev->id_unit, dev->id_flags, FALSE)) { if (bootverbose) printf("sc%d: no video adapter is found.\n", dev->id_unit); return (0); } -#if defined(VESA) && defined(VM86) - if (vesa_load()) - return FALSE; -#endif - - (*biosvidsw.diag)(bootverbose); - - sc_port = dev->id_iobase; - if (sckbdprobe(dev->id_unit, dev->id_flags)) - return (IO_KBDSIZE); - else - return ((dev->id_flags & DETECT_KBD) ? 0 : IO_KBDSIZE); + return ((sckbdprobe(dev->id_unit, dev->id_flags, FALSE)) ? -1 : 0); } /* probe video adapters, return TRUE if found */ static int -scvidprobe(int unit, int flags) +scvidprobe(int unit, int flags, int cons) { video_adapter_t *adp; - /* do this test only once */ - if (init_done != COLD) - return (crtc_type != -1); + /* + * Access the video adapter driver through the back door! + * Video adapter drivers need to be configured before syscons. + * However, when syscons is being probed as the low-level console, + * they have not been initialized yet. We force them to initialize + * themselves here. XXX + */ + vid_configure(cons ? VIO_PROBE_ONLY : 0); - if ((*biosvidsw.init)() <= 0) - return FALSE; - if ((adp = (*biosvidsw.adapter)(V_ADP_PRIMARY)) == NULL) - return FALSE; + /* allocate a frame buffer */ + if (adapter < 0) { + adapter = vid_allocate("*", -1, (void *)&adapter); + if (adapter < 0) + return FALSE; + } + adp = vid_get_adapter(adapter); /* shouldn't fail */ - crtc_type = adp->va_type; - crtc_vga = (crtc_type == KD_VGA); - crtc_addr = adp->va_crtc_addr; Crtat = (u_short *)adp->va_window; - adp_flags = adp->va_flags; initial_video_mode = adp->va_initial_mode; - bios_video_mode = adp->va_initial_bios_mode; return TRUE; } /* probe the keyboard, return TRUE if found */ static int -sckbdprobe(int unit, int flags) +sckbdprobe(int unit, int flags, int cons) { - int codeset; - int c = -1; - int m; - int res, id; - - sc_kbdc = kbdc_open(sc_port); - - if (!kbdc_lock(sc_kbdc, TRUE)) { - /* driver error? */ - printf("sc%d: unable to lock the controller.\n", unit); - return ((flags & DETECT_KBD) ? FALSE : TRUE); + /* access the keyboard driver through the backdoor! */ + kbd_configure(cons ? KB_CONF_PROBE_ONLY : 0); + + /* allocate a keyboard and register the keyboard event handler */ + if (keyboard < 0) { + keyboard = kbd_allocate("*", -1, (void *)&keyboard, sckbdevent, NULL); + if (keyboard < 0) + return FALSE; } + kbd = kbd_get_keyboard(keyboard); /* shouldn't fail */ - /* flush any noise in the buffer */ - empty_both_buffers(sc_kbdc, 10); - - /* save the current keyboard controller command byte */ - m = kbdc_get_device_mask(sc_kbdc) & ~KBD_KBD_CONTROL_BITS; - c = get_controller_command_byte(sc_kbdc); - if (c == -1) { - /* CONTROLLER ERROR */ - printf("sc%d: unable to get the current command byte value.\n", unit); - goto fail; - } - if (bootverbose) - printf("sc%d: the current keyboard controller command byte %04x\n", - unit, c); -#if 0 - /* override the keyboard lock switch */ - c |= KBD_OVERRIDE_KBD_LOCK; -#endif - - /* - * The keyboard may have been screwed up by the boot block. - * We may just be able to recover from error by testing the controller - * and the keyboard port. The controller command byte needs to be saved - * before this recovery operation, as some controllers seem to set - * the command byte to particular values. - */ - test_controller(sc_kbdc); - test_kbd_port(sc_kbdc); - - /* enable the keyboard port, but disable the keyboard intr. */ - if (!set_controller_command_byte(sc_kbdc, - KBD_KBD_CONTROL_BITS, - KBD_ENABLE_KBD_PORT | KBD_DISABLE_KBD_INT)) { - /* CONTROLLER ERROR - * there is very little we can do... - */ - printf("sc%d: unable to set the command byte.\n", unit); - goto fail; - } - - /* - * Check if we have an XT keyboard before we attempt to reset it. - * The procedure assumes that the keyboard and the controller have - * been set up properly by BIOS and have not been messed up - * during the boot process. - */ - codeset = -1; - if (flags & XT_KEYBD) - /* the user says there is a XT keyboard */ - codeset = 1; -#ifdef DETECT_XT_KEYBOARD - else if ((c & KBD_TRANSLATION) == 0) { - /* SET_SCANCODE_SET is not always supported; ignore error */ - if (send_kbd_command_and_data(sc_kbdc, KBDC_SET_SCANCODE_SET, 0) - == KBD_ACK) - codeset = read_kbd_data(sc_kbdc); - } - if (bootverbose) - printf("sc%d: keyboard scancode set %d\n", unit, codeset); -#endif /* DETECT_XT_KEYBOARD */ - - if (flags & KBD_NORESET) { - write_kbd_command(sc_kbdc, KBDC_ECHO); - if (read_kbd_data(sc_kbdc) != KBD_ECHO) { - empty_both_buffers(sc_kbdc, 10); - test_controller(sc_kbdc); - test_kbd_port(sc_kbdc); - if (bootverbose) - printf("sc%d: failed to get response from the keyboard.\n", - unit); - goto fail; - } - } else { - /* reset keyboard hardware */ - if (!reset_kbd(sc_kbdc)) { - /* KEYBOARD ERROR - * Keyboard reset may fail either because the keyboard doen't - * exist, or because the keyboard doesn't pass the self-test, - * or the keyboard controller on the motherboard and the keyboard - * somehow fail to shake hands. It is just possible, particularly - * in the last case, that the keyoard controller may be left - * in a hung state. test_controller() and test_kbd_port() appear - * to bring the keyboard controller back (I don't know why and - * how, though.) - */ - empty_both_buffers(sc_kbdc, 10); - test_controller(sc_kbdc); - test_kbd_port(sc_kbdc); - /* We could disable the keyboard port and interrupt... but, - * the keyboard may still exist (see above). - */ - if (bootverbose) - printf("sc%d: failed to reset the keyboard.\n", unit); - goto fail; - } - } - - /* - * Allow us to set the XT_KEYBD flag in UserConfig so that keyboards - * such as those on the IBM ThinkPad laptop computers can be used - * with the standard console driver. - */ - if (codeset == 1) { - if (send_kbd_command_and_data( - sc_kbdc, KBDC_SET_SCANCODE_SET, codeset) == KBD_ACK) { - /* XT kbd doesn't need scan code translation */ - c &= ~KBD_TRANSLATION; - } else { - /* KEYBOARD ERROR - * The XT kbd isn't usable unless the proper scan code set - * is selected. - */ - printf("sc%d: unable to set the XT keyboard mode.\n", unit); - goto fail; - } - } - /* enable the keyboard port and intr. */ - if (!set_controller_command_byte(sc_kbdc, - KBD_KBD_CONTROL_BITS | KBD_TRANSLATION | KBD_OVERRIDE_KBD_LOCK, - (c & (KBD_TRANSLATION | KBD_OVERRIDE_KBD_LOCK)) - | KBD_ENABLE_KBD_PORT | KBD_ENABLE_KBD_INT)) { - /* CONTROLLER ERROR - * This is serious; we are left with the disabled keyboard intr. - */ - printf("sc%d: unable to enable the keyboard port and intr.\n", unit); - goto fail; - } - - /* Get the ID of the keyboard, if any */ - empty_kbd_buffer(sc_kbdc, 5); - res = send_kbd_command(sc_kbdc, KBDC_SEND_DEV_ID); - if (res == KBD_ACK) { - /* 10ms delay */ - DELAY(10000); - id = (read_kbd_data(sc_kbdc) << 8) | read_kbd_data(sc_kbdc); - if (bootverbose) - printf("sc%d: keyboard device ID: %04x\n", unit, id); - } - - kbdc_set_device_mask(sc_kbdc, m | KBD_KBD_CONTROL_BITS), - kbdc_lock(sc_kbdc, FALSE); return TRUE; - -fail: - if (c != -1) - /* try to restore the command byte as before, if possible */ - set_controller_command_byte(sc_kbdc, 0xff, c); - kbdc_set_device_mask(sc_kbdc, - (flags & DETECT_KBD) ? m : m | KBD_KBD_CONTROL_BITS); - kbdc_lock(sc_kbdc, FALSE); - return FALSE; } #if NAPM > 0 static int scresume(void *dummy) { - shfts = ctls = alts = agrs = metas = accents = 0; - return 0; + if (kbd != NULL) + kbd_clear_state(kbd); + return 0; } #endif @@ -656,21 +509,19 @@ scattach(struct isa_device *dev) int vc; #endif - dev->id_ointr = scintr; scinit(); + scp = console[0]; sc_flags = dev->id_flags; - if (!ISFONTAVAIL(adp_flags)) + if (!ISFONTAVAIL(scp->adp->va_flags)) sc_flags &= ~CHAR_CURSOR; - scp = console[0]; - /* copy temporary buffer to final buffer */ scp->scr_buf = NULL; sc_alloc_scr_buffer(scp, FALSE, FALSE); bcopy(sc_buffer, scp->scr_buf, scp->xsize*scp->ysize*sizeof(u_short)); /* cut buffer is available only when the mouse pointer is used */ - if (ISMOUSEAVAIL(adp_flags)) + if (ISMOUSEAVAIL(scp->adp->va_flags)) sc_alloc_cut_buffer(scp, FALSE); /* initialize history buffer & pointers */ @@ -678,15 +529,16 @@ scattach(struct isa_device *dev) #if defined(VESA) && defined(VM86) if ((sc_flags & VESA800X600) - && ((*biosvidsw.get_info)(scp->adp, M_VESA_800x600, &info) == 0)) { -#ifdef SC_SPLASH_SCREEN - scsplash_term(scp); + && ((*vidsw[scp->ad]->get_info)(scp->adp, M_VESA_800x600, &info) == 0)) { +#if NSPLASH > 0 + splash_term(scp->adp); #endif sc_set_graphics_mode(scp, NULL, M_VESA_800x600); sc_set_pixel_mode(scp, NULL, COL, ROW, 16); initial_video_mode = M_VESA_800x600; -#ifdef SC_SPLASH_SCREEN - scsplash_init(scp); +#if NSPLASH > 0 + /* put up the splash again! */ + splash_init(scp->adp, scsplash_callback); #endif } #endif /* VESA && VM86 */ @@ -698,15 +550,25 @@ scattach(struct isa_device *dev) /* get screen update going */ scrn_timer((void *)TRUE); - update_leds(scp->status); - + /* set up the keyboard */ + kbd_ioctl(kbd, KDSKBMODE, (caddr_t)&scp->kbd_mode); + update_kbd_state(scp->status, LOCK_MASK); + + if (bootverbose) { + printf("sc%d:", dev->id_unit); + if (adapter >= 0) + printf(" fb%d", adapter); + if (keyboard >= 0) + printf(" kbd%d", keyboard); + printf("\n"); + } printf("sc%d: ", dev->id_unit); - switch(crtc_type) { + switch(scp->adp->va_type) { case KD_VGA: - printf("VGA %s", (adp_flags & V_ADP_COLOR) ? "color" : "mono"); + printf("VGA %s", (scp->adp->va_flags & V_ADP_COLOR) ? "color" : "mono"); break; case KD_EGA: - printf("EGA %s", (adp_flags & V_ADP_COLOR) ? "color" : "mono"); + printf("EGA %s", (scp->adp->va_flags & V_ADP_COLOR) ? "color" : "mono"); break; case KD_CGA: printf("CGA"); @@ -763,6 +625,7 @@ int scopen(dev_t dev, int flag, int mode, struct proc *p) { struct tty *tp = scdevtotty(dev); + keyarg_t key; if (!tp) return(ENXIO); @@ -774,7 +637,9 @@ scopen(dev_t dev, int flag, int mode, struct proc *p) ttychars(tp); /* Use the current setting of the <-- key as default VERASE. */ /* If the Delete key is preferable, an stty is necessary */ - tp->t_cc[VERASE] = key_map.key[0x0e].map[0]; + key.keynum = 0x0e; /* how do we know this magic number... XXX */ + kbd_ioctl(kbd, GIO_KEYMAPENT, (caddr_t)&key); + tp->t_cc[VERASE] = key.key.map[0]; tp->t_iflag = TTYDEF_IFLAG; tp->t_oflag = TTYDEF_OFLAG; tp->t_cflag = TTYDEF_CFLAG; @@ -863,38 +728,53 @@ scwrite(dev_t dev, struct uio *uio, int flag) return((*linesw[tp->t_line].l_write)(tp, uio, flag)); } -static void -scintr(int unit) +static int +sckbdevent(keyboard_t *thiskbd, int event, void *arg) { static struct tty *cur_tty; - int c, len; + int c; + size_t len; u_char *cp; + /* assert(thiskbd == kbd) */ + + switch (event) { + case KBDIO_KEYINPUT: + break; + case KBDIO_UNLOADING: + kbd = NULL; + kbd_release(thiskbd, (void *)keyboard); + return 0; + default: + return EINVAL; + } + /* * Loop while there is still input to get from the keyboard. * I don't think this is nessesary, and it doesn't fix * the Xaccel-2.1 keyboard hang, but it can't hurt. XXX */ - while ((c = scgetc(SCGETC_NONBLOCK)) != NOKEY) { + while ((c = scgetc(thiskbd, SCGETC_NONBLOCK)) != NOKEY) { cur_tty = VIRTUAL_TTY(get_scr_num()); if (!(cur_tty->t_state & TS_ISOPEN)) if (!((cur_tty = CONSOLE_TTY)->t_state & TS_ISOPEN)) continue; - switch (c & 0xff00) { + switch (KEYFLAGS(c)) { case 0x0000: /* normal key */ - (*linesw[cur_tty->t_line].l_rint)(c & 0xFF, cur_tty); + (*linesw[cur_tty->t_line].l_rint)(KEYCHAR(c), cur_tty); break; case FKEY: /* function key, return string */ - if (cp = get_fstr((u_int)c, (u_int *)&len)) { + cp = kbd_get_fkeystr(thiskbd, KEYCHAR(c), &len); + if (cp != NULL) { while (len-- > 0) - (*linesw[cur_tty->t_line].l_rint)(*cp++ & 0xFF, cur_tty); + (*linesw[cur_tty->t_line].l_rint)(*cp++, cur_tty); } break; case MKEY: /* meta is active, prepend ESC */ (*linesw[cur_tty->t_line].l_rint)(0x1b, cur_tty); - (*linesw[cur_tty->t_line].l_rint)(c & 0xFF, cur_tty); + (*linesw[cur_tty->t_line].l_rint)(KEYCHAR(c), cur_tty); break; case BKEY: /* backtab fixed sequence (esc [ Z) */ (*linesw[cur_tty->t_line].l_rint)(0x1b, cur_tty); @@ -904,17 +784,12 @@ scintr(int unit) } } -#if 0 - if (cur_console->status & MOUSE_ENABLED) { - cur_console->status &= ~MOUSE_VISIBLE; - remove_mouse_image(cur_console); - } -#else if (cur_console->status & MOUSE_VISIBLE) { remove_mouse_image(cur_console); cur_console->status &= ~MOUSE_VISIBLE; } -#endif + + return 0; } static int @@ -959,7 +834,7 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) return 0; case GIO_COLOR: /* is this a color console ? */ - *(int *)data = (adp_flags & V_ADP_COLOR) ? 1 : 0; + *(int *)data = (scp->adp->va_flags & V_ADP_COLOR) ? 1 : 0; return 0; case CONS_BLANKTIME: /* set screen saver timeout (0 = no saver) */ @@ -977,7 +852,7 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) else sc_flags &= ~BLINK_CURSOR; if ((*(int*)data) & 0x02) { - if (!ISFONTAVAIL(get_adapter(scp)->va_flags)) + if (!ISFONTAVAIL(scp->adp->va_flags)) return ENXIO; sc_flags |= CHAR_CURSOR; } else @@ -1054,7 +929,7 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) mouse_info_t buf; /* FIXME: */ - if (!ISMOUSEAVAIL(get_adapter(scp)->va_flags)) + if (!ISMOUSEAVAIL(scp->adp->va_flags)) return ENODEV; if (cmd == OLD_CONS_MOUSECTL) { @@ -1317,8 +1192,7 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) return EINVAL; } /* make screensaver happy */ - scsplash_stick(FALSE); - run_scrn_saver = FALSE; + sc_touch_scrn_saver(); return 0; } @@ -1439,7 +1313,9 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) ptr->mv_grfc.fore = 0; /* not supported */ ptr->mv_grfc.back = 0; /* not supported */ ptr->mv_ovscan = scp->border; - ptr->mk_keylock = scp->status & LOCK_KEY_MASK; + if (scp == cur_console) + save_kbd_state(scp); + ptr->mk_keylock = scp->status & LOCK_MASK; return 0; } return EINVAL; @@ -1607,41 +1483,36 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) return 0; case KDSKBSTATE: /* set keyboard state (locks) */ - if (*(int *)data & ~LOCK_KEY_MASK) + if (*(int *)data & ~LOCK_MASK) return EINVAL; - scp->status &= ~LOCK_KEY_MASK; + scp->status &= ~LOCK_MASK; scp->status |= *(int *)data; if (scp == cur_console) - update_leds(scp->status); + update_kbd_state(scp->status, LOCK_MASK); return 0; case KDGKBSTATE: /* get keyboard state (locks) */ - *(int *)data = scp->status & LOCK_KEY_MASK; + if (scp == cur_console) + save_kbd_state(scp); + *(int *)data = scp->status & LOCK_MASK; return 0; case KDSETRAD: /* set keyboard repeat & delay rates */ if (*(int *)data & ~0x7f) return EINVAL; - if (sc_kbdc != NULL) - set_keyboard(KBDC_SET_TYPEMATIC, *(int *)data); - return 0; + error = kbd_ioctl(kbd, KDSETRAD, data); + if (error == ENOIOCTL) + error = ENODEV; + return error; case KDSKBMODE: /* set keyboard mode */ switch (*(int *)data) { + case K_XLATE: /* switch to XLT ascii mode */ case K_RAW: /* switch to RAW scancode mode */ - scp->status &= ~KBD_CODE_MODE; - scp->status |= KBD_RAW_MODE; - return 0; - case K_CODE: /* switch to CODE mode */ - scp->status &= ~KBD_RAW_MODE; - scp->status |= KBD_CODE_MODE; - return 0; - - case K_XLATE: /* switch to XLT ascii mode */ - if (scp == cur_console && scp->status & KBD_RAW_MODE) - shfts = ctls = alts = agrs = metas = accents = 0; - scp->status &= ~(KBD_RAW_MODE | KBD_CODE_MODE); + scp->kbd_mode = *(int *)data; + if (scp == cur_console) + kbd_ioctl(kbd, cmd, data); return 0; default: return EINVAL; @@ -1649,10 +1520,15 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) /* NOT REACHED */ case KDGKBMODE: /* get keyboard mode */ - *(int *)data = (scp->status & KBD_RAW_MODE) ? K_RAW : - ((scp->status & KBD_CODE_MODE) ? K_CODE : K_XLATE); + *(int *)data = scp->kbd_mode; return 0; + case KDGKBINFO: + error = kbd_ioctl(kbd, cmd, data); + if (error == ENOIOCTL) + error = ENODEV; + return error; + case KDMKTONE: /* sound the bell */ if (*(int*)data) do_bell(scp, (*(int*)data)&0xffff, @@ -1686,43 +1562,73 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) return 0; case KDGKBTYPE: /* get keyboard type */ - *(int *)data = 0; /* type not known (yet) */ + error = kbd_ioctl(kbd, cmd, data); + if (error == ENOIOCTL) { + /* always return something? XXX */ + *(int *)data = 0; + } return 0; case KDSETLED: /* set keyboard LED status */ - if (*(int *)data & ~LED_MASK) + if (*(int *)data & ~LED_MASK) /* FIXME: LOCK_MASK? */ return EINVAL; scp->status &= ~LED_MASK; scp->status |= *(int *)data; if (scp == cur_console) - update_leds(scp->status); + update_kbd_leds(scp->status); return 0; case KDGETLED: /* get keyboard LED status */ + if (scp == cur_console) + save_kbd_state(scp); *(int *)data = scp->status & LED_MASK; return 0; - case GETFKEY: /* get functionkey string */ - if (*(u_short*)data < n_fkey_tab) { - fkeyarg_t *ptr = (fkeyarg_t*)data; - bcopy(&fkey_tab[ptr->keynum].str, ptr->keydef, - fkey_tab[ptr->keynum].len); - ptr->flen = fkey_tab[ptr->keynum].len; - return 0; + case CONS_SETKBD: /* set the new keyboard */ + { + keyboard_t *newkbd; + + s = spltty(); + newkbd = kbd_get_keyboard(*(int *)data); + if (newkbd == NULL) { + splx(s); + return EINVAL; + } + error = 0; + if (kbd != newkbd) { + i = kbd_allocate(newkbd->kb_name, newkbd->kb_unit, + (void *)&keyboard, sckbdevent, NULL); + /* i == newkbd->kb_index */ + if (i >= 0) { + if (kbd != NULL) { + save_kbd_state(cur_console); + kbd_release(kbd, (void *)&keyboard); + } + kbd = kbd_get_keyboard(i); /* kbd == newkbd */ + keyboard = i; + kbd_ioctl(kbd, KDSKBMODE, (caddr_t)&cur_console->kbd_mode); + update_kbd_state(cur_console->status, LOCK_MASK); + } else { + error = EPERM; /* XXX */ + } + } + splx(s); + return error; } - else - return EINVAL; - case SETFKEY: /* set functionkey string */ - if (*(u_short*)data < n_fkey_tab) { - fkeyarg_t *ptr = (fkeyarg_t*)data; - bcopy(ptr->keydef, &fkey_tab[ptr->keynum].str, - min(ptr->flen, MAXFK)); - fkey_tab[ptr->keynum].len = min(ptr->flen, MAXFK); - return 0; + case CONS_RELKBD: /* release the current keyboard */ + s = spltty(); + error = 0; + if (kbd != NULL) { + save_kbd_state(cur_console); + error = kbd_release(kbd, (void *)&keyboard); + if (error == 0) { + kbd = NULL; + keyboard = -1; + } } - else - return EINVAL; + splx(s); + return error; case GIO_SCRNMAP: /* get output translation table */ bcopy(&scr_map, data, sizeof(scr_map)); @@ -1734,27 +1640,19 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) scr_rmap[scr_map[i]] = i; return 0; - case GIO_KEYMAP: /* get keyboard translation table */ - bcopy(&key_map, data, sizeof(key_map)); - return 0; - - case PIO_KEYMAP: /* set keyboard translation table */ - accents = 0; - bzero(&accent_map, sizeof(accent_map)); - bcopy(data, &key_map, sizeof(key_map)); - return 0; - - case GIO_DEADKEYMAP: /* get accent key translation table */ - bcopy(&accent_map, data, sizeof(accent_map)); - return 0; - - case PIO_DEADKEYMAP: /* set accent key translation table */ - accents = 0; - bcopy(data, &accent_map, sizeof(accent_map)); - return 0; + case GIO_KEYMAP: /* get keyboard translation table */ + case PIO_KEYMAP: /* set keyboard translation table */ + case GIO_DEADKEYMAP: /* get accent key translation table */ + case PIO_DEADKEYMAP: /* set accent key translation table */ + case GETFKEY: /* get function key string */ + case SETFKEY: /* set function key string */ + error = kbd_ioctl(kbd, cmd, data); + if (error == ENOIOCTL) + error = ENODEV; + return error; case PIO_FONT8x8: /* set 8x8 dot font */ - if (!ISFONTAVAIL(get_adapter(scp)->va_flags)) + if (!ISFONTAVAIL(scp->adp->va_flags)) return ENXIO; bcopy(data, font_8, 8*256); fonts_loaded |= FONT_8; @@ -1768,7 +1666,7 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) return 0; case GIO_FONT8x8: /* get 8x8 dot font */ - if (!ISFONTAVAIL(get_adapter(scp)->va_flags)) + if (!ISFONTAVAIL(scp->adp->va_flags)) return ENXIO; if (fonts_loaded & FONT_8) { bcopy(font_8, data, 8*256); @@ -1778,7 +1676,7 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) return ENXIO; case PIO_FONT8x14: /* set 8x14 dot font */ - if (!ISFONTAVAIL(get_adapter(scp)->va_flags)) + if (!ISFONTAVAIL(scp->adp->va_flags)) return ENXIO; bcopy(data, font_14, 14*256); fonts_loaded |= FONT_14; @@ -1793,7 +1691,7 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) return 0; case GIO_FONT8x14: /* get 8x14 dot font */ - if (!ISFONTAVAIL(get_adapter(scp)->va_flags)) + if (!ISFONTAVAIL(scp->adp->va_flags)) return ENXIO; if (fonts_loaded & FONT_14) { bcopy(font_14, data, 14*256); @@ -1803,7 +1701,7 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) return ENXIO; case PIO_FONT8x16: /* set 8x16 dot font */ - if (!ISFONTAVAIL(get_adapter(scp)->va_flags)) + if (!ISFONTAVAIL(scp->adp->va_flags)) return ENXIO; bcopy(data, font_16, 16*256); fonts_loaded |= FONT_16; @@ -1817,7 +1715,7 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) return 0; case GIO_FONT8x16: /* get 8x16 dot font */ - if (!ISFONTAVAIL(get_adapter(scp)->va_flags)) + if (!ISFONTAVAIL(scp->adp->va_flags)) return ENXIO; if (fonts_loaded & FONT_16) { bcopy(font_16, data, 16*256); @@ -1898,16 +1796,15 @@ sccnprobe(struct consdev *cp) return; } - if (!scvidprobe(dvp->id_unit, dvp->id_flags)) { + if (!scvidprobe(dvp->id_unit, dvp->id_flags, TRUE)) { cp->cn_pri = CN_DEAD; return; } + sckbdprobe(dvp->id_unit, dvp->id_flags, TRUE); /* initialize required fields */ cp->cn_dev = makedev(CDEV_MAJOR, SC_CONSOLE); cp->cn_pri = CN_INTERNAL; - - sc_kbdc = kbdc_open(sc_port); } static void @@ -1920,9 +1817,34 @@ static void sccnputc(dev_t dev, int c) { u_char buf[1]; - int s; scr_stat *scp = console[0]; term_stat save = scp->term; + u_short *p; + int s; + int i; + + if (scp == cur_console && scp->status & SLKED) { + scp->status &= ~SLKED; + update_kbd_state(scp->status, SLKED); + if (cur_console->status & BUFFER_SAVED) { + p = cur_console->history_save; + for (i = 0; i < cur_console->ysize; ++i) { + bcopy(p, cur_console->scr_buf + (cur_console->xsize*i), + cur_console->xsize*sizeof(u_short)); + p += cur_console->xsize; + if (p + cur_console->xsize + > cur_console->history + cur_console->history_size) + p = cur_console->history; + } + cur_console->status &= ~BUFFER_SAVED; + cur_console->history_head = cur_console->history_save; + cur_console->status |= CURSOR_ENABLED; + mark_all(cur_console); + } +#if 1 /* XXX */ + scstart(VIRTUAL_TTY(get_scr_num())); +#endif + } scp->term = kernel_console; current_default = &kernel_default; @@ -1934,7 +1856,7 @@ sccnputc(dev_t dev, int c) current_default = &user_default; scp->term = save; - s = spltty(); /* block scintr and scrn_timer */ + s = spltty(); /* block sckbdevent and scrn_timer */ sccnupdate(scp); splx(s); } @@ -1942,35 +1864,63 @@ sccnputc(dev_t dev, int c) static int sccngetc(dev_t dev) { - int s = spltty(); /* block scintr and scrn_timer while we poll */ + return sccngetch(0); +} + +static int +sccncheckc(dev_t dev) +{ + return sccngetch(SCGETC_NONBLOCK); +} + +static int +sccngetch(int flags) +{ + int cur_mode; + int s = spltty(); /* block sckbdevent and scrn_timer while we poll */ int c; /* * Stop the screen saver and update the screen if necessary. * What if we have been running in the screen saver code... XXX */ - scsplash_stick(FALSE); - run_scrn_saver = FALSE; + sc_touch_scrn_saver(); sccnupdate(cur_console); - c = scgetc(SCGETC_CN); - splx(s); - return(c); -} + if (kbd == NULL) { + splx(s); + return -1; + } -static int -sccncheckc(dev_t dev) -{ - int s = spltty(); /* block scintr and scrn_timer while we poll */ - int c; + /* + * Make sure the keyboard is accessible even when the kbd device + * driver is disabled. + */ + kbd_enable(kbd); - scsplash_stick(FALSE); - run_scrn_saver = FALSE; - sccnupdate(cur_console); + /* we shall always use the keyboard in the XLATE mode here */ + cur_mode = cur_console->kbd_mode; + cur_console->kbd_mode = K_XLATE; + kbd_ioctl(kbd, KDSKBMODE, (caddr_t)&cur_console->kbd_mode); - c = scgetc(SCGETC_CN | SCGETC_NONBLOCK); + c = scgetc(kbd, SCGETC_CN | flags); + + cur_console->kbd_mode = cur_mode; + kbd_ioctl(kbd, KDSKBMODE, (caddr_t)&cur_console->kbd_mode); + kbd_disable(kbd); splx(s); - return(c == NOKEY ? -1 : c); /* c == -1 can't happen */ + + switch (KEYFLAGS(c)) { + case 0: /* normal char */ + return KEYCHAR(c); + case FKEY: /* function key */ + return c; /* XXX */ + case NOKEY: + case ERRKEY: + default: + return -1; + } + /* NOT REACHED */ } static void @@ -1982,8 +1932,7 @@ sccnupdate(scr_stat *scp) return; if (panicstr || shutdown_in_progress) { - scsplash_stick(FALSE); - run_scrn_saver = FALSE; + sc_touch_scrn_saver(); } else if (scp != cur_console) { return; } @@ -2026,6 +1975,7 @@ get_scr_num() static void scrn_timer(void *arg) { + static int kbd_interval = 0; struct timeval tv; scr_stat *scp; int s; @@ -2038,37 +1988,26 @@ scrn_timer(void *arg) } s = spltty(); - /* - * With release 2.1 of the Xaccel server, the keyboard is left - * hanging pretty often. Apparently an interrupt from the - * keyboard is lost, and I don't know why (yet). - * This ugly hack calls scintr if input is ready for the keyboard - * and conveniently hides the problem. XXX - */ - /* Try removing anything stuck in the keyboard controller; whether - * it's a keyboard scan code or mouse data. `scintr()' doesn't - * read the mouse data directly, but `kbdio' routines will, as a - * side effect. - */ - if (kbdc_lock(sc_kbdc, TRUE)) { - /* - * We have seen the lock flag is not set. Let's reset the flag early; - * otherwise `update_led()' failes which may want the lock - * during `scintr()'. - */ - kbdc_lock(sc_kbdc, FALSE); - if (kbdc_data_ready(sc_kbdc)) - scintr(0); + if ((kbd == NULL) && (sc_flags & AUTODETECT_KBD)) { + /* try to allocate a keyboard automatically */ + if (++kbd_interval >= 25) { + keyboard = kbd_allocate("*", -1, (void *)&keyboard, + sckbdevent, NULL); + if (keyboard >= 0) { + kbd = kbd_get_keyboard(keyboard); + kbd_ioctl(kbd, KDSKBMODE, (caddr_t)&cur_console->kbd_mode); + update_kbd_state(cur_console->status, LOCK_MASK); + } + kbd_interval = 0; + } } scp = cur_console; /* should we stop the screen saver? */ getmicrouptime(&tv); - if (panicstr || shutdown_in_progress) { - scsplash_stick(FALSE); - run_scrn_saver = FALSE; - } + if (panicstr || shutdown_in_progress) + sc_touch_scrn_saver(); if (run_scrn_saver) { scrn_idle = (tv.tv_sec > scrn_time_stamp + scrn_blank_time); } else { @@ -2096,7 +2035,7 @@ scrn_timer(void *arg) /* should we activate the screen saver? */ if ((saver_mode == CONS_LKM_SAVER) && scrn_idle) if (!ISGRAPHSC(scp) || (scp->status & SAVER_RUNNING)) - scrn_saver(current_saver, TRUE); + (*current_saver)(TRUE); if (arg) timeout(scrn_timer, (void *)TRUE, hz / 25); @@ -2172,25 +2111,90 @@ scrn_update(scr_stat *scp, int show_cursor) scp->start = scp->xsize*scp->ysize - 1; } -int +#if NSPLASH > 0 + +static int +scsplash_callback(int event) +{ + int error; + + switch (event) { + case SPLASH_INIT: + if (add_scrn_saver(scsplash_saver) == 0) { + run_scrn_saver = TRUE; + if (cold && !(boothowto & (RB_VERBOSE | RB_CONFIG))) { + scsplash_stick(TRUE); + (*current_saver)(TRUE); + } + } + return 0; + + case SPLASH_TERM: + if (current_saver == scsplash_saver) { + scsplash_stick(FALSE); + error = remove_scrn_saver(scsplash_saver); + if (error) + return error; + } + return 0; + + default: + return EINVAL; + } +} + +static void +scsplash_saver(int show) +{ + static int busy = FALSE; + static int failed = FALSE; + scr_stat *scp; + + if (busy) + return; + busy = TRUE; + + scp = cur_console; + if (show) { + if (!failed) { + if (!scrn_blanked) + set_scrn_saver_mode(scp, -1, NULL, 0); + if (splash(scp->adp, TRUE) == 0) { + scrn_blanked = TRUE; + } else { + failed = TRUE; + scsplash_stick(FALSE); + printf("scsplash_saver(): failed to put up the image\n"); + restore_scrn_saver_mode(scp); + } + } + } else if (!sticky_splash) { + if (scrn_blanked && (splash(scp->adp, FALSE) == 0)) { + restore_scrn_saver_mode(scp); + scrn_blanked = FALSE; + } + } + busy = FALSE; +} + +static int add_scrn_saver(void (*this_saver)(int)) { -#ifdef SC_SPLASH_SCREEN - if (current_saver == scsplash) { - scsplash_stick(FALSE); - stop_scrn_saver(scsplash); + int error; + + if (current_saver != none_saver) { + error = remove_scrn_saver(current_saver); + if (error) + return error; } -#endif - if (current_saver != default_saver) - return EBUSY; run_scrn_saver = FALSE; saver_mode = CONS_LKM_SAVER; current_saver = this_saver; return 0; } -int +static int remove_scrn_saver(void (*this_saver)(int)) { if (current_saver != this_saver) @@ -2203,35 +2207,77 @@ remove_scrn_saver(void (*this_saver)(int)) * before stopping the current saver, rather than blocking by `splXX()'. */ current_saver = none_saver; - if (scrn_blanked > 0) + if (scrn_blanked) stop_scrn_saver(this_saver); - if (scrn_blanked > 0) - return EBUSY; /* XXX */ + return (scrn_blanked ? EBUSY : 0); +} - current_saver = default_saver; - return 0; +static int +set_scrn_saver_mode(scr_stat *scp, int mode, u_char *pal, int border) +{ + int s; + + /* assert(scp == cur_console) */ + s = spltty(); + scp->splash_save_mode = scp->mode; + scp->splash_save_status = scp->status & (GRAPHICS_MODE | PIXEL_MODE); + scp->status &= ~PIXEL_MODE; + scp->status |= (UNKNOWN_MODE | SAVER_RUNNING); + splx(s); + if (mode < 0) + return 0; + scp->mode = mode; + if (set_mode(scp) == 0) { + if (scp->adp->va_mode_flags & V_INFO_GRAPHICS) + scp->status |= GRAPHICS_MODE; + if (pal != NULL) + load_palette(scp->adp, pal); + set_border(scp, border); + return 0; + } else { + s = spltty(); + scp->mode = scp->splash_save_mode; + scp->status &= ~(UNKNOWN_MODE | SAVER_RUNNING); + scp->status |= scp->splash_save_status; + splx(s); + return 1; + } } -static void -scrn_saver(void (*saver)(int), int blank) +static int +restore_scrn_saver_mode(scr_stat *scp) { - static int busy = FALSE; + int mode; + int status; + int s; - if (busy) - return; - busy = TRUE; - (*saver)(blank); - busy = FALSE; + /* assert(scp == cur_console) */ + s = spltty(); + mode = scp->mode; + status = scp->status; + scp->mode = scp->splash_save_mode; + scp->status &= ~(UNKNOWN_MODE | GRAPHICS_MODE | SAVER_RUNNING); + scp->status |= scp->splash_save_status; + if (set_mode(scp) == 0) { + load_palette(scp->adp, palette); + splx(s); + return 0; + } else { + scp->mode = mode; + scp->status = status; + splx(s); + return 1; + } } static void stop_scrn_saver(void (*saver)(int)) { - scrn_saver(saver, FALSE); + (*saver)(FALSE); run_scrn_saver = FALSE; /* the screen saver may have chosen not to stop after all... */ - if (scrn_blanked > 0) + if (scrn_blanked) return; mark_all(cur_console); @@ -2245,7 +2291,7 @@ wait_scrn_saver_stop(void) { int error = 0; - while (scrn_blanked > 0) { + while (scrn_blanked) { run_scrn_saver = FALSE; error = tsleep((caddr_t)&scrn_blanked, PZERO | PCATCH, "scrsav", 0); run_scrn_saver = FALSE; @@ -2255,6 +2301,15 @@ wait_scrn_saver_stop(void) return error; } +#endif /* NSPLASH */ + +void +sc_touch_scrn_saver(void) +{ + scsplash_stick(FALSE); + run_scrn_saver = FALSE; +} + void sc_clear_screen(scr_stat *scp) { @@ -2270,9 +2325,8 @@ static int switch_scr(scr_stat *scp, u_int next_scr) { /* delay switch if actively updating screen */ - if (scrn_blanked > 0 || write_in_progress || blink_in_progress) { - scsplash_stick(FALSE); - run_scrn_saver = FALSE; + if (scrn_blanked || write_in_progress || blink_in_progress) { + sc_touch_scrn_saver(); delayed_next_scr = next_scr+1; return 0; } @@ -2331,7 +2385,12 @@ switch_scr(scr_stat *scp, u_int next_scr) static void exchange_scr(void) { + /* save the current state of video and keyboard */ move_crsr(old_scp, old_scp->xpos, old_scp->ypos); + if (old_scp->kbd_mode == K_XLATE) + save_kbd_state(old_scp); + + /* set up the video for the new screen */ cur_console = new_scp; if (old_scp->mode != new_scp->mode || ISUNKNOWNSC(old_scp)) set_mode(new_scp); @@ -2339,12 +2398,14 @@ exchange_scr(void) if (ISTEXTSC(new_scp) && (sc_flags & CHAR_CURSOR)) set_destructive_cursor(new_scp); if (ISGRAPHSC(old_scp)) - load_palette(new_scp, palette); - if (old_scp->status & KBD_RAW_MODE || new_scp->status & KBD_RAW_MODE || - old_scp->status & KBD_CODE_MODE || new_scp->status & KBD_CODE_MODE) - shfts = ctls = alts = agrs = metas = accents = 0; + load_palette(new_scp->adp, palette); set_border(new_scp, new_scp->border); - update_leds(new_scp->status); + + /* set up the keyboard for the new screen */ + if (old_scp->kbd_mode != new_scp->kbd_mode) + kbd_ioctl(kbd, KDSKBMODE, (caddr_t)&new_scp->kbd_mode); + update_kbd_state(new_scp->status, LOCK_MASK); + delayed_next_scr = FALSE; mark_all(new_scp); } @@ -2817,7 +2878,7 @@ scan_esc(scr_stat *scp, u_char c) else sc_flags &= ~BLINK_CURSOR; if ((scp->term.param[0] & 0x02) - && ISFONTAVAIL(get_adapter(scp)->va_flags)) + && ISFONTAVAIL(scp->adp->va_flags)) sc_flags |= CHAR_CURSOR; else sc_flags &= ~CHAR_CURSOR; @@ -3022,6 +3083,7 @@ outloop: static void scinit(void) { + video_adapter_t *adp; int col; int row; u_int i; @@ -3030,9 +3092,10 @@ scinit(void) return; init_done = WARM; - /* extract the hardware cursor location and move it out of the way */ - (*biosvidsw.read_hw_cursor)(V_ADP_PRIMARY, &col, &row); - (*biosvidsw.set_hw_cursor)(V_ADP_PRIMARY, -1, -1); + /* extract the hardware cursor location and hide the cursor for now */ + adp = vid_get_adapter(adapter); + (*vidsw[adapter]->read_hw_cursor)(adp, &col, &row); + (*vidsw[adapter]->set_hw_cursor)(adp, -1, -1); /* set up the first console */ current_default = &user_default; @@ -3042,7 +3105,7 @@ scinit(void) /* copy screen to temporary buffer */ if (ISTEXTSC(console[0])) - generic_bcopy((ushort *)(get_adapter(console[0])->va_window), sc_buffer, + generic_bcopy((ushort *)(console[0]->adp->va_window), sc_buffer, console[0]->xsize * console[0]->ysize * sizeof(u_short)); console[0]->scr_buf = console[0]->mouse_pos = console[0]->mouse_oldpos @@ -3071,7 +3134,7 @@ scinit(void) } /* Save font and palette */ - if (ISFONTAVAIL(get_adapter(cur_console)->va_flags)) { + if (ISFONTAVAIL(cur_console->adp->va_flags)) { if (fonts_loaded & FONT_16) { copy_font(cur_console, LOAD, 16, font_16); } else { @@ -3083,21 +3146,20 @@ scinit(void) * FONT KLUDGE * Always use the font page #0. XXX */ - (*biosvidsw.show_font)(cur_console->adp, 0); + (*vidsw[cur_console->ad]->show_font)(cur_console->adp, 0); } - save_palette(cur_console, palette); + save_palette(cur_console->adp, palette); -#ifdef SC_SPLASH_SCREEN - /* put up the splash. */ - scsplash_init(cur_console); +#if NSPLASH > 0 + /* we are ready to put up the splash image! */ + splash_init(cur_console->adp, scsplash_callback); #endif } static void scshutdown(int howto, void *arg) { - scsplash_stick(FALSE); - run_scrn_saver = FALSE; + sc_touch_scrn_saver(); if (!cold && cur_console->smode.mode == VT_AUTO && console[0]->smode.mode == VT_AUTO) switch_scr(cur_console, 0); @@ -3187,11 +3249,11 @@ static scr_stat scp = (scr_stat *)malloc(sizeof(scr_stat), M_DEVBUF, M_WAITOK); init_scp(scp); sc_alloc_scr_buffer(scp, TRUE, TRUE); - if (ISMOUSEAVAIL(get_adapter(scp)->va_flags)) + if (ISMOUSEAVAIL(scp->adp->va_flags)) sc_alloc_cut_buffer(scp, TRUE); sc_alloc_history_buffer(scp, sc_history_size, 0, TRUE); /* SOS - if (get_adapter(scp)->va_flags & V_ADP_MODECHANGE) + if (scp->adp->va_flags & V_ADP_MODECHANGE) set_mode(scp); */ sc_clear_screen(scp); @@ -3204,11 +3266,12 @@ init_scp(scr_stat *scp) { video_info_t info; - scp->adp = V_ADP_PRIMARY; - (*biosvidsw.get_info)(scp->adp, initial_video_mode, &info); + scp->ad = adapter; + scp->adp = vid_get_adapter(scp->ad); + (*vidsw[scp->ad]->get_info)(scp->adp, initial_video_mode, &info); scp->status = 0; - scp->mode = scp->initial_mode = initial_video_mode; + scp->mode = initial_video_mode; scp->scr_buf = NULL; if (info.vi_flags & V_INFO_GRAPHICS) { scp->status |= GRAPHICS_MODE; @@ -3244,6 +3307,7 @@ init_scp(scr_stat *scp) scp->mouse_signal = 0; scp->mouse_pid = 0; scp->mouse_proc = NULL; + scp->kbd_mode = K_XLATE; scp->bell_pitch = BELL_PITCH; scp->bell_duration = BELL_DURATION; scp->status |= (*(u_int8_t *)pa_to_va(0x417) & 0x20) ? NLKED : 0; @@ -3255,20 +3319,6 @@ init_scp(scr_stat *scp) scp->history_size = imax(sc_history_size, scp->ysize) * scp->xsize; } -static u_char -*get_fstr(u_int c, u_int *len) -{ - u_int i; - - if (!(c & FKEY)) - return(NULL); - i = (c & 0xFF) - F_FN; - if (i > n_fkey_tab) - return(NULL); - *len = fkey_tab[i].len; - return(fkey_tab[i].str); -} - static void history_to_screen(scr_stat *scp) { @@ -3314,151 +3364,46 @@ history_down_line(scr_stat *scp) * return NOKEY if there is nothing there. */ static u_int -scgetc(u_int flags) +scgetc(keyboard_t *kbd, u_int flags) { - struct key_t *key; - u_char scancode, keycode; - u_int state, action; - int c; - static u_char esc_flag = 0, compose = 0; - static u_int chr = 0; + u_int c; + int this_scr; + int f; + int i; + + if (kbd == NULL) + return NOKEY; next_code: + /* I don't like this, but... XXX */ + if (flags & SCGETC_CN) + sccnupdate(cur_console); /* first see if there is something in the keyboard port */ - if (flags & SCGETC_NONBLOCK) { - c = read_kbd_data_no_wait(sc_kbdc); - if (c == -1) - return(NOKEY); - } else { - do { - c = read_kbd_data(sc_kbdc); - } while(c == -1); + for (;;) { + c = kbd_read_char(kbd, !(flags & SCGETC_NONBLOCK)); + if (c == ERRKEY) { + if (!(flags & SCGETC_CN)) + do_bell(cur_console, BELL_PITCH, BELL_DURATION); + } else if (c == NOKEY) + return c; + else + break; } - scancode = (u_char)c; /* make screensaver happy */ - if (!(scancode & 0x80)) { - scsplash_stick(FALSE); - run_scrn_saver = FALSE; - } + if (!(c & RELKEY)) + sc_touch_scrn_saver(); - if (!(flags & SCGETC_CN)) { + if (!(flags & SCGETC_CN)) /* do the /dev/random device a favour */ - add_keyboard_randomness(scancode); + add_keyboard_randomness(c); - if (cur_console->status & KBD_RAW_MODE) - return scancode; - } - - keycode = scancode & 0x7F; - switch (esc_flag) { - case 0x00: /* normal scancode */ - switch(scancode) { - case 0xB8: /* left alt (compose key) */ - if (compose) { - compose = 0; - if (chr > 255) { - do_bell(cur_console, - BELL_PITCH, BELL_DURATION); - chr = 0; - } - } - break; - case 0x38: - if (!compose) { - compose = 1; - chr = 0; - } - break; - case 0xE0: - case 0xE1: - esc_flag = scancode; - goto next_code; - } - break; - case 0xE0: /* 0xE0 prefix */ - esc_flag = 0; - switch (keycode) { - case 0x1C: /* right enter key */ - keycode = 0x59; - break; - case 0x1D: /* right ctrl key */ - keycode = 0x5A; - break; - case 0x35: /* keypad divide key */ - keycode = 0x5B; - break; - case 0x37: /* print scrn key */ - keycode = 0x5C; - break; - case 0x38: /* right alt key (alt gr) */ - keycode = 0x5D; - break; - case 0x47: /* grey home key */ - keycode = 0x5E; - break; - case 0x48: /* grey up arrow key */ - keycode = 0x5F; - break; - case 0x49: /* grey page up key */ - keycode = 0x60; - break; - case 0x4B: /* grey left arrow key */ - keycode = 0x61; - break; - case 0x4D: /* grey right arrow key */ - keycode = 0x62; - break; - case 0x4F: /* grey end key */ - keycode = 0x63; - break; - case 0x50: /* grey down arrow key */ - keycode = 0x64; - break; - case 0x51: /* grey page down key */ - keycode = 0x65; - break; - case 0x52: /* grey insert key */ - keycode = 0x66; - break; - case 0x53: /* grey delete key */ - keycode = 0x67; - break; - - /* the following 3 are only used on the MS "Natural" keyboard */ - case 0x5b: /* left Window key */ - keycode = 0x69; - break; - case 0x5c: /* right Window key */ - keycode = 0x6a; - break; - case 0x5d: /* menu key */ - keycode = 0x6b; - break; - default: /* ignore everything else */ - goto next_code; - } - break; - case 0xE1: /* 0xE1 prefix */ - esc_flag = 0; - if (keycode == 0x1D) - esc_flag = 0x1D; - goto next_code; - /* NOT REACHED */ - case 0x1D: /* pause / break */ - esc_flag = 0; - if (keycode != 0x45) - goto next_code; - keycode = 0x68; - break; - } - - if (!(flags & SCGETC_CN) && (cur_console->status & KBD_CODE_MODE)) - return (keycode | (scancode & 0x80)); + if (cur_console->kbd_mode != K_XLATE) + return KEYCHAR(c); /* if scroll-lock pressed allow history browsing */ - if (cur_console->history && cur_console->status & SLKED) { - int i; + if (!ISGRAPHSC(cur_console) && cur_console->history + && cur_console->status & SLKED) { cur_console->status &= ~CURSOR_ENABLED; if (!(cur_console->status & BUFFER_SAVED)) { @@ -3478,170 +3423,81 @@ next_code: cur_console->history_pos = cur_console->history_head; history_to_screen(cur_console); } - switch (scancode) { - case 0x47: /* home key */ + switch (c) { + /* FIXME: key codes */ + case SPCLKEY | FKEY | F(49): /* home key */ + remove_cutmarking(cur_console); cur_console->history_pos = cur_console->history_head; history_to_screen(cur_console); goto next_code; - case 0x4F: /* end key */ + case SPCLKEY | FKEY | F(57): /* end key */ + remove_cutmarking(cur_console); cur_console->history_pos = WRAPHIST(cur_console, cur_console->history_head, cur_console->xsize*cur_console->ysize); history_to_screen(cur_console); goto next_code; - case 0x48: /* up arrow key */ + case SPCLKEY | FKEY | F(50): /* up arrow key */ + remove_cutmarking(cur_console); if (history_up_line(cur_console)) - do_bell(cur_console, BELL_PITCH, BELL_DURATION); + if (!(flags & SCGETC_CN)) + do_bell(cur_console, BELL_PITCH, BELL_DURATION); goto next_code; - case 0x50: /* down arrow key */ + case SPCLKEY | FKEY | F(58): /* down arrow key */ + remove_cutmarking(cur_console); if (history_down_line(cur_console)) - do_bell(cur_console, BELL_PITCH, BELL_DURATION); + if (!(flags & SCGETC_CN)) + do_bell(cur_console, BELL_PITCH, BELL_DURATION); goto next_code; - case 0x49: /* page up key */ + case SPCLKEY | FKEY | F(51): /* page up key */ + remove_cutmarking(cur_console); for (i=0; i<cur_console->ysize; i++) if (history_up_line(cur_console)) { - do_bell(cur_console, BELL_PITCH, BELL_DURATION); + if (!(flags & SCGETC_CN)) + do_bell(cur_console, BELL_PITCH, BELL_DURATION); break; } goto next_code; - case 0x51: /* page down key */ + case SPCLKEY | FKEY | F(59): /* page down key */ + remove_cutmarking(cur_console); for (i=0; i<cur_console->ysize; i++) if (history_down_line(cur_console)) { - do_bell(cur_console, BELL_PITCH, BELL_DURATION); + if (!(flags & SCGETC_CN)) + do_bell(cur_console, BELL_PITCH, BELL_DURATION); break; } goto next_code; } } - if (compose) { - switch (scancode) { - /* key pressed process it */ - case 0x47: case 0x48: case 0x49: /* keypad 7,8,9 */ - chr = (scancode - 0x40) + chr*10; - goto next_code; - case 0x4B: case 0x4C: case 0x4D: /* keypad 4,5,6 */ - chr = (scancode - 0x47) + chr*10; - goto next_code; - case 0x4F: case 0x50: case 0x51: /* keypad 1,2,3 */ - chr = (scancode - 0x4E) + chr*10; - goto next_code; - case 0x52: /* keypad 0 */ - chr *= 10; - goto next_code; - - /* key release, no interest here */ - case 0xC7: case 0xC8: case 0xC9: /* keypad 7,8,9 */ - case 0xCB: case 0xCC: case 0xCD: /* keypad 4,5,6 */ - case 0xCF: case 0xD0: case 0xD1: /* keypad 1,2,3 */ - case 0xD2: /* keypad 0 */ - goto next_code; - - case 0x38: /* left alt key */ - break; - default: - if (chr) { - compose = chr = 0; - do_bell(cur_console, BELL_PITCH, BELL_DURATION); - goto next_code; - } - break; - } - } - - state = (shfts ? 1 : 0 ) | (2 * (ctls ? 1 : 0)) | (4 * (alts ? 1 : 0)); - if ((!agrs && (cur_console->status & ALKED)) - || (agrs && !(cur_console->status & ALKED))) - keycode += ALTGR_OFFSET; - key = &key_map.key[keycode]; - if ( ((key->flgs & FLAG_LOCK_C) && (cur_console->status & CLKED)) - || ((key->flgs & FLAG_LOCK_N) && (cur_console->status & NLKED)) ) - state ^= 1; - - /* Check for make/break */ - action = key->map[state]; - if (scancode & 0x80) { /* key released */ - if (key->spcl & (0x80>>state)) { - switch (action) { - case LSH: - shfts &= ~1; - break; - case RSH: - shfts &= ~2; - break; - case LCTR: - ctls &= ~1; - break; - case RCTR: - ctls &= ~2; - break; - case LALT: - alts &= ~1; - break; - case RALT: - alts &= ~2; - break; - case NLK: - nlkcnt = 0; - break; - case CLK: - clkcnt = 0; - break; - case SLK: - slkcnt = 0; - break; - case ASH: - agrs = 0; - break; - case ALK: - alkcnt = 0; - break; - case META: - metas = 0; - break; - } - } - if (chr && !compose) { - action = chr; - chr = 0; - return(action); - } + /* + * Process and consume special keys here. Return a plain char code + * or a char code with the META flag or a function key code. + */ + if (c & RELKEY) { + /* key released */ + /* goto next_code */ } else { /* key pressed */ - if (key->spcl & (0x80>>state)) { - switch (action) { + if (c & SPCLKEY) { + c &= ~SPCLKEY; + switch (KEYCHAR(c)) { /* LOCKING KEYS */ - case NLK: - if (!nlkcnt) { - nlkcnt++; - if (cur_console->status & NLKED) - cur_console->status &= ~NLKED; - else - cur_console->status |= NLKED; - update_leds(cur_console->status); - } - break; - case CLK: - if (!clkcnt) { - clkcnt++; - if (cur_console->status & CLKED) - cur_console->status &= ~CLKED; - else - cur_console->status |= CLKED; - update_leds(cur_console->status); - } + case NLK: case CLK: case ALK: break; case SLK: - if (!slkcnt) { - slkcnt++; + kbd_ioctl(kbd, KDGKBSTATE, (caddr_t)&f); + if (f & SLKED) { + cur_console->status |= SLKED; + } else { if (cur_console->status & SLKED) { cur_console->status &= ~SLKED; - if (cur_console->status & BUFFER_SAVED){ + if (cur_console->status & BUFFER_SAVED) { int i; u_short *ptr = cur_console->history_save; @@ -3663,73 +3519,64 @@ next_code: } scstart(VIRTUAL_TTY(get_scr_num())); } - else - cur_console->status |= SLKED; - update_leds(cur_console->status); - } - break; - case ALK: - if (!alkcnt) { - alkcnt++; - if (cur_console->status & ALKED) - cur_console->status &= ~ALKED; - else - cur_console->status |= ALKED; - update_leds(cur_console->status); } break; /* NON-LOCKING KEYS */ case NOP: + case LSH: case RSH: case LCTR: case RCTR: + case LALT: case RALT: case ASH: case META: break; + + case BTAB: + return c; + case SPSC: /* force activatation/deactivation of the screen saver */ - accents = 0; - if (scrn_blanked <= 0) { + if (!scrn_blanked) { run_scrn_saver = TRUE; scrn_time_stamp -= scrn_blank_time; } -#ifdef SC_SPLASH_SCREEN +#if NSPLASH > 0 if (cold) { /* * While devices are being probed, the screen saver need * to be invoked explictly. XXX */ - if (scrn_blanked > 0) { + if (scrn_blanked) { scsplash_stick(FALSE); stop_scrn_saver(current_saver); } else { if (!ISGRAPHSC(cur_console)) { scsplash_stick(TRUE); - scrn_saver(current_saver, TRUE); + (*current_saver)(TRUE); } } } -#endif +#endif /* NSPLASH */ break; + case RBT: #ifndef SC_DISABLE_REBOOT - accents = 0; shutdown_nice(); #endif break; - case SUSP: + #if NAPM > 0 - accents = 0; + case SUSP: apm_suspend(PMST_SUSPEND); -#endif break; - case STBY: -#if NAPM > 0 - accents = 0; apm_suspend(PMST_STANDBY); -#endif break; +#else + case SUSP: + case STBY: + break; +#endif case DBG: -#ifdef DDB /* try to switch to console 0 */ - accents = 0; +#ifdef DDB /* try to switch to console 0 */ /* * TRY to make sure the screen saver is stopped, * and the screen is updated before switching to @@ -3744,131 +3591,47 @@ next_code: printf("No debugger in kernel\n"); #endif break; - case LSH: - shfts |= 1; - break; - case RSH: - shfts |= 2; - break; - case LCTR: - ctls |= 1; - break; - case RCTR: - ctls |= 2; - break; - case LALT: - alts |= 1; - break; - case RALT: - alts |= 2; - break; - case ASH: - agrs = 1; - break; - case META: - metas = 1; - break; + case NEXT: - { - int next, this = get_scr_num(); - accents = 0; - for (next = this+1; next != this; next = (next+1)%MAXCONS) { - struct tty *tp = VIRTUAL_TTY(next); + this_scr = get_scr_num(); + for (i = this_scr + 1; i != this_scr; i = (i + 1)%MAXCONS) { + struct tty *tp = VIRTUAL_TTY(i); if (tp->t_state & TS_ISOPEN) { - switch_scr(cur_console, next); + switch_scr(cur_console, i); break; } } - } break; - case BTAB: - accents = 0; - return(BKEY); + default: - if (action >= F_ACC && action <= L_ACC) { - /* turn it into an index */ - action -= F_ACC - 1; - if ((action > accent_map.n_accs) - || (accent_map.acc[action - 1].accchar == 0)) { - /* - * The index is out of range or pointing to an - * empty entry. - */ - accents = 0; - do_bell(cur_console, BELL_PITCH, BELL_DURATION); - } - /* - * If the same accent key has been hit twice, - * produce the accent char itself. - */ - if (action == accents) { - action = accent_map.acc[accents - 1].accchar; - accents = 0; - if (metas) - action |= MKEY; - return (action); - } - /* remember the index and wait for the next key stroke */ - accents = action; + if (KEYCHAR(c) >= F_SCR && KEYCHAR(c) <= L_SCR) { + switch_scr(cur_console, KEYCHAR(c) - F_SCR); break; } - if (accents > 0) { - accents = 0; - do_bell(cur_console, BELL_PITCH, BELL_DURATION); - } - if (action >= F_SCR && action <= L_SCR) { - switch_scr(cur_console, action - F_SCR); - break; - } - if (action >= F_FN && action <= L_FN) - action |= FKEY; - return(action); + /* assert(c & FKEY) */ + return c; } - } - else { - if (accents) { - struct acc_t *acc; - int i; - - acc = &accent_map.acc[accents - 1]; - accents = 0; - /* - * If the accent key is followed by the space key, - * produce the accent char itself. - */ - if (action == ' ') { - action = acc->accchar; - if (metas) - action |= MKEY; - return (action); - } - for (i = 0; i < NUM_ACCENTCHARS; ++i) { - if (acc->map[i][0] == 0) /* end of the map entry */ - break; - if (acc->map[i][0] == action) { - action = acc->map[i][1]; - if (metas) - action |= MKEY; - return (action); - } - } - do_bell(cur_console, BELL_PITCH, BELL_DURATION); - goto next_code; - } - if (metas) - action |= MKEY; - return(action); + /* goto next_code */ + } else { + /* regular keys (maybe MKEY is set) */ + return c; } } + goto next_code; } int scmmap(dev_t dev, vm_offset_t offset, int nprot) { - if (offset > 0x20000 - PAGE_SIZE) - return -1; - return i386_btop((VIDEOMEM + offset)); + struct tty *tp; + struct scr_stat *scp; + + tp = scdevtotty(dev); + if (!tp) + return ENXIO; + scp = sc_get_scr_stat(tp->t_dev); + return (*vidsw[scp->ad]->mmap)(scp->adp, offset); } /* @@ -3900,82 +3663,64 @@ mask2attr(struct term_stat *term) return attr; } -static void -set_keyboard(int command, int data) +static int +save_kbd_state(scr_stat *scp) { - int s; - - if (sc_kbdc == NULL) - return; - - /* prevent the timeout routine from polling the keyboard */ - if (!kbdc_lock(sc_kbdc, TRUE)) - return; + int state; + int error; - /* disable the keyboard and mouse interrupt */ - s = spltty(); -#if 0 - c = get_controller_command_byte(sc_kbdc); - if ((c == -1) - || !set_controller_command_byte(sc_kbdc, - kbdc_get_device_mask(sc_kbdc), - KBD_DISABLE_KBD_PORT | KBD_DISABLE_KBD_INT - | KBD_DISABLE_AUX_PORT | KBD_DISABLE_AUX_INT)) { - /* CONTROLLER ERROR */ - kbdc_lock(sc_kbdc, FALSE); - splx(s); - return; + error = kbd_ioctl(kbd, KDGKBSTATE, (caddr_t)&state); + if (error == ENOIOCTL) + error = ENODEV; + if (error == 0) { + scp->status &= ~LOCK_MASK; + scp->status |= state; } - /* - * Now that the keyboard controller is told not to generate - * the keyboard and mouse interrupts, call `splx()' to allow - * the other tty interrupts. The clock interrupt may also occur, - * but the timeout routine (`scrn_timer()') will be blocked - * by the lock flag set via `kbdc_lock()' - */ - splx(s); -#endif + return error; +} - if (send_kbd_command_and_data(sc_kbdc, command, data) != KBD_ACK) - send_kbd_command(sc_kbdc, KBDC_ENABLE_KBD); +static int +update_kbd_state(int new_bits, int mask) +{ + int state; + int error; -#if 0 - /* restore the interrupts */ - if (!set_controller_command_byte(sc_kbdc, - kbdc_get_device_mask(sc_kbdc), - c & (KBD_KBD_CONTROL_BITS | KBD_AUX_CONTROL_BITS))) { - /* CONTROLLER ERROR */ + if (mask != LOCK_MASK) { + error = kbd_ioctl(kbd, KDGKBSTATE, (caddr_t)&state); + if (error == ENOIOCTL) + error = ENODEV; + if (error) + return error; + state &= ~mask; + state |= new_bits & mask; + } else { + state = new_bits & LOCK_MASK; } -#else - splx(s); -#endif - kbdc_lock(sc_kbdc, FALSE); + error = kbd_ioctl(kbd, KDSKBSTATE, (caddr_t)&state); + if (error == ENOIOCTL) + error = ENODEV; + return error; } -static void -update_leds(int which) +static int +update_kbd_leds(int which) { - static u_char xlate_leds[8] = { 0, 4, 2, 6, 1, 5, 3, 7 }; - - /* replace CAPS led with ALTGR led for ALTGR keyboards */ - if (key_map.n_keys > ALTGR_OFFSET) { - if (which & ALKED) - which |= CLKED; - else - which &= ~CLKED; - } + int error; - set_keyboard(KBDC_SET_LEDS, xlate_leds[which & LED_MASK]); + which &= LOCK_MASK; + error = kbd_ioctl(kbd, KDSETLED, (caddr_t)&which); + if (error == ENOIOCTL) + error = ENODEV; + return error; } int set_mode(scr_stat *scp) { video_info_t info; - video_adapter_t *adp; /* reject unsupported mode */ - if ((*biosvidsw.get_info)(scp->adp, scp->mode, &info)) + if ((*vidsw[scp->ad]->get_info)(scp->adp, scp->mode, &info)) return 1; /* if this vty is not currently showing, do nothing */ @@ -3983,14 +3728,12 @@ set_mode(scr_stat *scp) return 0; /* setup video hardware for the given mode */ - adp = get_adapter(scp); - (*biosvidsw.set_mode)(scp->adp, scp->mode); - Crtat = (u_short *)adp->va_window; + (*vidsw[scp->ad]->set_mode)(scp->adp, scp->mode); + Crtat = (u_short *)scp->adp->va_window; if (!(scp->status & GRAPHICS_MODE)) { /* load appropriate font */ - if (!(scp->status & PIXEL_MODE) - && ISFONTAVAIL(get_adapter(scp)->va_flags)) { + if (!(scp->status & PIXEL_MODE) && ISFONTAVAIL(scp->adp->va_flags)) { if (scp->font_size < 14) { if (fonts_loaded & FONT_8) copy_font(scp, LOAD, 8, font_8); @@ -4002,23 +3745,24 @@ set_mode(scr_stat *scp) copy_font(scp, LOAD, 14, font_14); } /* - * FONT KLUDGE: - * This is an interim kludge to display correct font. - * Always use the font page #0 on the video plane 2. - * Somehow we cannot show the font in other font pages on - * some video cards... XXX - */ - (*biosvidsw.show_font)(scp->adp, 0); + * FONT KLUDGE: + * This is an interim kludge to display correct font. + * Always use the font page #0 on the video plane 2. + * Somehow we cannot show the font in other font pages on + * some video cards... XXX + */ + (*vidsw[scp->ad]->show_font)(scp->adp, 0); } mark_all(scp); } if (scp->status & PIXEL_MODE) - generic_bzero((u_char *)(adp->va_window), scp->xpixel*scp->ypixel/8); + generic_bzero((u_char *)(scp->adp->va_window), + scp->xpixel*scp->ypixel/8); set_border(scp, scp->border); /* move hardware cursor out of the way */ - (*biosvidsw.set_hw_cursor)(scp->adp, -1, -1); + (*vidsw[scp->ad]->set_hw_cursor)(scp->adp, -1, -1); return 0; } @@ -4033,7 +3777,7 @@ set_border(scr_stat *scp, int color) int ylen; int i; - (*biosvidsw.set_border)(scp->adp, color); + (*vidsw[scp->ad]->set_border)(scp->adp, color); if (scp->status & PIXEL_MODE) { outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */ @@ -4041,7 +3785,7 @@ set_border(scr_stat *scp, int color) outw(GDCIDX, 0x0f01); /* set/reset enable */ outw(GDCIDX, 0xff08); /* bit mask */ outw(GDCIDX, (color << 8) | 0x00); /* set/reset */ - p = (u_char *)(get_adapter(scp)->va_window); + p = (u_char *)(scp->adp->va_window); xoff = scp->xoff; yoff = scp->yoff*scp->font_size; xlen = scp->xpixel/8; @@ -4075,11 +3819,11 @@ copy_font(scr_stat *scp, int operation, int font_size, u_char *buf) */ font_loading_in_progress = TRUE; if (operation == LOAD) { - (*biosvidsw.load_font)(scp->adp, 0, font_size, buf, 0, 256); + (*vidsw[scp->ad]->load_font)(scp->adp, 0, font_size, buf, 0, 256); if (sc_flags & CHAR_CURSOR) set_destructive_cursor(scp); } else if (operation == SAVE) { - (*biosvidsw.save_font)(scp->adp, 0, font_size, buf, 0, 256); + (*vidsw[scp->ad]->save_font)(scp->adp, 0, font_size, buf, 0, 256); } font_loading_in_progress = FALSE; } @@ -4090,9 +3834,10 @@ set_destructive_cursor(scr_stat *scp) u_char cursor[32]; u_char *font_buffer; int font_size; + int crtc_addr; int i; - if (!ISFONTAVAIL(get_adapter(scp)->va_flags) + if (!ISFONTAVAIL(scp->adp->va_flags) || (scp->status & (GRAPHICS_MODE | PIXEL_MODE))) return; @@ -4128,10 +3873,11 @@ set_destructive_cursor(scr_stat *scp) (scp->cursor_start >= scp->font_size && i == scp->font_size - 1)) cursor[i] |= 0xff; #if 1 + crtc_addr = scp->adp->va_crtc_addr; while (!(inb(crtc_addr+6) & 0x08)) /* wait for vertical retrace */ ; #endif font_loading_in_progress = TRUE; - (*biosvidsw.load_font)(scp->adp, 0, font_size, cursor, DEAD_CHAR, 1); + (*vidsw[scp->ad]->load_font)(scp->adp, 0, font_size, cursor, DEAD_CHAR, 1); font_loading_in_progress = FALSE; } @@ -4385,10 +4131,11 @@ draw_mouse_image(scr_stat *scp) { u_short buffer[32]; u_short xoffset, yoffset; - u_short *crt_pos = (u_short *)(get_adapter(scp)->va_window) + u_short *crt_pos = (u_short *)(scp->adp->va_window) + (scp->mouse_pos - scp->scr_buf); u_char *font_buffer; int font_size; + int crtc_addr; int i; if (scp->font_size < 14) { @@ -4436,10 +4183,11 @@ draw_mouse_image(scr_stat *scp) #if 1 /* wait for vertical retrace to avoid jitter on some videocards */ + crtc_addr = scp->adp->va_crtc_addr; while (!(inb(crtc_addr+6) & 0x08)) /* idle */ ; #endif font_loading_in_progress = TRUE; - (*biosvidsw.load_font)(scp->adp, 0, 32, scp->mouse_cursor, + (*vidsw[scp->ad]->load_font)(scp->adp, 0, 32, scp->mouse_cursor, SC_MOUSE_CHAR, 4); font_loading_in_progress = FALSE; @@ -4463,7 +4211,7 @@ remove_mouse_image(scr_stat *scp) if (!ISTEXTSC(scp)) return; - crt_pos = (u_short *)(get_adapter(scp)->va_window) + crt_pos = (u_short *)(scp->adp->va_window) + (scp->mouse_oldpos - scp->scr_buf); *(crt_pos) = *(scp->mouse_oldpos); *(crt_pos+1) = *(scp->mouse_oldpos+1); @@ -4480,7 +4228,7 @@ draw_cutmarking(scr_stat *scp) u_short *ptr; u_short och, nch; - crt_pos = (u_short *)(get_adapter(scp)->va_window); + crt_pos = (u_short *)(scp->adp->va_window); for (ptr=scp->scr_buf; ptr<=(scp->scr_buf+(scp->xsize*scp->ysize)); ptr++) { nch = och = *(crt_pos + (ptr - scp->scr_buf)); /* are we outside the selected area ? */ @@ -4553,11 +4301,11 @@ blink_screen(void *arg) else { if (blink_in_progress & 1) fillw(kernel_default.std_color | scr_map[0x20], - (u_short *)(get_adapter(scp)->va_window), + (u_short *)(scp->adp->va_window), scp->xsize * scp->ysize); else fillw(kernel_default.rev_color | scr_map[0x20], - (u_short *)(get_adapter(scp)->va_window), + (u_short *)(scp->adp->va_window), scp->xsize * scp->ysize); blink_in_progress--; timeout(blink_screen, scp, hz / 10); @@ -4579,7 +4327,7 @@ sc_bcopy(scr_stat *scp, u_short *p, int from, int to, int mark) u_char c; if (ISTEXTSC(scp)) { - generic_bcopy(p + from, (u_short *)(get_adapter(scp)->va_window) + from, + generic_bcopy(p + from, (u_short *)(scp->adp->va_window) + from, (to - from + 1)*sizeof(u_short)); } else /* if ISPIXELSC(scp) */ { if (mark) @@ -4593,7 +4341,7 @@ sc_bcopy(scr_stat *scp, u_short *p, int from, int to, int mark) font = font_14; line_length = scp->xpixel/8; xsize = scp->xsize; - d = (u_char *)(get_adapter(scp)->va_window) + d = (u_char *)(scp->adp->va_window) + scp->xoff + scp->yoff*font_size*line_length + (from%xsize) + font_size*line_length*(from/xsize); @@ -4662,42 +4410,4 @@ sc_bcopy(scr_stat *scp, u_short *p, int from, int to, int mark) } } -#ifdef SC_SPLASH_SCREEN - -static void -scsplash_init(scr_stat *scp) -{ - video_info_t info; - - if (scsplash_load(scp) == 0 && add_scrn_saver(scsplash_saver) == 0) { - default_saver = scsplash_saver; - scrn_blank_time = DEFAULT_BLANKTIME; - run_scrn_saver = TRUE; - if (!(boothowto & (RB_VERBOSE | RB_CONFIG))) { - scsplash_stick(TRUE); - scsplash_saver(TRUE); - } - } -} - -static void -scsplash_term(scr_stat *scp) -{ - default_saver = none_saver; - scsplash_stick(FALSE); - remove_scrn_saver(scsplash_saver); - scsplash_unload(scp); -} - -static void -scsplash_saver(int show) -{ - if (show) - scsplash(TRUE); - else if (!sticky_splash) - scsplash(FALSE); -} - -#endif /* SC_SPLASH_SCREEN */ - #endif /* NSC */ diff --git a/sys/dev/syscons/syscons.h b/sys/dev/syscons/syscons.h index 0298cbb..c6129e4 100644 --- a/sys/dev/syscons/syscons.h +++ b/sys/dev/syscons/syscons.h @@ -25,11 +25,11 @@ * (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.43 1998/09/29 02:00:57 ache Exp $ + * $Id: syscons.h,v 1.44 1998/10/01 11:39:18 yokota Exp $ */ -#ifndef _I386_ISA_SYSCONS_H_ -#define _I386_ISA_SYSCONS_H_ +#ifndef _DEV_SYSCONS_SYSCONS_H_ +#define _DEV_SYSCONS_SYSCONS_H_ /* vm things */ #define ISMAPPED(pa, width) \ @@ -52,11 +52,7 @@ } /* status flags */ -#define LOCK_KEY_MASK 0x0000F -#define LED_MASK 0x00007 #define UNKNOWN_MODE 0x00010 -#define KBD_RAW_MODE 0x00020 -#define KBD_CODE_MODE 0x00040 #define SWITCH_WAIT_REL 0x00080 #define SWITCH_WAIT_ACQ 0x00100 #define BUFFER_SAVED 0x00200 @@ -73,11 +69,15 @@ #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 /* attribute flags */ #define NORMAL_ATTR 0x00 @@ -128,7 +128,8 @@ typedef struct term_stat { } term_stat; typedef struct scr_stat { - int adp; /* video adapter index */ + int ad; /* video adapter index */ + video_adapter_t *adp; /* video adapter structure */ u_short *scr_buf; /* buffer when off screen */ int xpos; /* current X position */ int ypos; /* current Y position */ @@ -145,6 +146,7 @@ typedef struct scr_stat { 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 */ @@ -164,7 +166,6 @@ typedef struct scr_stat { u_short bell_duration; u_short bell_pitch; u_char border; /* border color */ - int initial_mode; /* initial mode */ int mode; /* mode */ pid_t pid; /* pid of controlling proc */ struct proc *proc; /* proc* of controlling proc */ @@ -175,10 +176,8 @@ typedef struct scr_stat { u_short *history_save; /* save area index */ int history_size; /* size of history buffer */ struct apmhook r_hook; /* reconfiguration support */ -#ifdef SC_SPLASH_SCREEN int splash_save_mode; /* saved mode for splash screen */ int splash_save_status; /* saved status for splash screen */ -#endif } scr_stat; typedef struct default_attr { @@ -211,13 +210,12 @@ 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); -#define save_palette(scp, pal) (*biosvidsw.save_palette)((scp)->adp, pal) -#define load_palette(scp, pal) (*biosvidsw.load_palette)((scp)->adp, pal) -#define get_adapter(scp) (*biosvidsw.adapter)((scp)->adp) - -int add_scrn_saver(void (*this)(int)); -int remove_scrn_saver(void (*this)(int)); +#define save_palette(adp, pal) \ + (*vidsw[(adp)->va_index]->save_palette)((adp), (pal)) +#define load_palette(adp, pal) \ + (*vidsw[(adp)->va_index]->load_palette)((adp), (pal)) +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); @@ -235,11 +233,4 @@ int sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p); -#ifdef SC_SPLASH_SCREEN -/* splash.c */ -void scsplash(int); -int scsplash_load(scr_stat *scp); -int scsplash_unload(scr_stat *scp); -#endif - -#endif /* !_I386_ISA_SYSCONS_H_ */ +#endif /* !_DEV_SYSCONS_SYSCONS_H_ */ diff --git a/sys/dev/syscons/warp/warp_saver.c b/sys/dev/syscons/warp/warp_saver.c index e84f1ad..ef0afa2 100644 --- a/sys/dev/syscons/warp/warp_saver.c +++ b/sys/dev/syscons/warp/warp_saver.c @@ -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.2 1998/12/28 14:20:13 des Exp $ + * $Id: warp_saver.c,v 1.3 1998/12/31 13:38:59 des Exp $ */ #include <sys/param.h> @@ -40,6 +40,7 @@ #include <saver.h> static u_char *vid; +static int blanked; #define SCRW 320 #define SCRH 200 @@ -47,7 +48,6 @@ static u_char *vid; #define STARS (SPP*(1+2+4+8)) static int star[STARS]; -static u_char save_pal[768]; static u_char warp_pal[768] = { 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, @@ -72,25 +72,18 @@ warp_update(void) } } -static void -warp_saver(int blank) +static int +warp_saver(video_adapter_t *adp, int blank) { - scr_stat *scp = cur_console; - static int saved_mode; int pl; if (blank) { /* switch to graphics mode */ - if (scrn_blanked <= 0) { + if (blanked <= 0) { pl = splhigh(); - saved_mode = scp->mode; - scp->mode = M_VGA_CG320; - scp->status |= SAVER_RUNNING|GRAPHICS_MODE; - save_palette(scp, save_pal); - set_mode(scp); - load_palette(scp, warp_pal); - scrn_blanked++; - vid = (u_char *)Crtat; + set_video_mode(adp, M_VGA_CG320, warp_pal, 0); + blanked++; + vid = (u_char *)adp->va_window; splx(pl); bzero(vid, SCRW*SCRH); } @@ -99,30 +92,19 @@ warp_saver(int blank) warp_update(); } else { - /* return to previous video mode */ - if (scrn_blanked > 0) { - if (saved_mode) { - pl = splhigh(); - scrn_blanked = 0; - scp->mode = saved_mode; - scp->status &= ~(SAVER_RUNNING|GRAPHICS_MODE); - set_mode(scp); - load_palette(scp, save_pal); - saved_mode = 0; - splx(pl); - } - } + blanked = 0; } + return 0; } static int -warp_saver_load(void) +warp_init(video_adapter_t *adp) { video_info_t info; int i; /* check that the console is capable of running in 320x200x256 */ - if ((*biosvidsw.get_info)(cur_console->adp, M_VGA_CG320, &info)) { + if (get_mode_info(adp, M_VGA_CG320, &info)) { log(LOG_NOTICE, "warp_saver: the console does not support M_VGA_CG320\n"); return ENODEV; } @@ -132,13 +114,19 @@ warp_saver_load(void) star[i] = random() % (SCRW*SCRH); } - return add_scrn_saver(warp_saver); + blanked = 0; + + return 0; } static int -warp_saver_unload(void) +warp_term(video_adapter_t *adp) { - return remove_scrn_saver(warp_saver); + return 0; } -SAVER_MODULE(warp_saver); +static scrn_saver_t warp_module = { + "warp_saver", warp_init, warp_term, warp_saver, NULL, +}; + +SAVER_MODULE(warp_saver, warp_module); diff --git a/sys/i386/conf/GENERIC b/sys/i386/conf/GENERIC index 88943bb..76781f4 100644 --- a/sys/i386/conf/GENERIC +++ b/sys/i386/conf/GENERIC @@ -11,7 +11,7 @@ # device lines is present in the ./LINT configuration file. If you are # in doubt as to the purpose or necessity of a line, check first in LINT. # -# $Id: GENERIC,v 1.141 1999/01/01 08:09:57 peter Exp $ +# $Id: GENERIC,v 1.142 1999/01/09 18:12:07 wpaul Exp $ machine "i386" cpu "I386_CPU" @@ -108,10 +108,20 @@ controller matcd0 at isa? port 0x230 bio device scd0 at isa? port 0x230 bio +# atkbdc0 controlls both the keyboard and the PS/2 mouse +controller atkbdc0 at isa? port IO_KBD tty +device atkbd0 at isa? tty irq 1 +device psm0 at isa? tty irq 12 + +device vga0 at isa? port ? conflicts + +# splash screen/screen saver +pseudo-device splash + # syscons is the default console driver, resembling an SCO console -device sc0 at isa? port IO_KBD conflicts tty irq 1 +device sc0 at isa? tty # Enable this and PCVT_FREEBSD for pcvt vt220 compatible console driver -#device vt0 at isa? port IO_KBD conflicts tty irq 1 +#device vt0 at isa? tty #options XSERVER # support for X server #options FAT_CURSOR # start with block cursor # If you have a ThinkPAD, uncomment this along with the rest of the PCVT lines @@ -136,8 +146,6 @@ device sio3 at isa? disable port "IO_COM4" tty irq 9 device lpt0 at isa? port? tty irq 7 -device psm0 at isa? port IO_KBD conflicts tty irq 12 - # Order is important here due to intrusive probes, do *not* alphabetize # this list of network interfaces until the probes have been fixed. # Right now it appears that the ie0 must be probed before ep0. See diff --git a/sys/i386/conf/LINT b/sys/i386/conf/LINT index 7e93763..80171ee 100644 --- a/sys/i386/conf/LINT +++ b/sys/i386/conf/LINT @@ -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.529 1999/01/09 18:12:07 wpaul Exp $ +# $Id: LINT,v 1.531 1999/01/10 07:45:33 phk 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 @@ -842,15 +842,35 @@ options "NTIMECOUNTER=20" # configure cards from USERCONFIG. See pnp(4) for more info. controller pnp0 +# The keyboard controller; it controlls the keyboard and the PS/2 mouse. +controller atkbdc0 at isa? port IO_KBD tty + +# The AT keyboard +device atkbd0 at isa? tty irq 1 + +# PS/2 mouse +device psm0 at isa? tty irq 12 + +# Options for psm: +options PSM_HOOKAPM #hook the APM resume event, useful + #for some laptops +options PSM_RESETAFTERSUSPEND #reset the device at the resume event + +# The video card driver. +device vga0 at isa? port ? conflicts + +# Splash screen at start up! Screen savers require this too. +pseudo-device splash + # The pcvt console driver (vt220 compatible). -device vt0 at isa? port IO_KBD conflicts tty irq 1 +device vt0 at isa? tty options XSERVER # support for running an X server. options FAT_CURSOR # start with block cursor # This PCVT option is for keyboards such as those used on IBM ThinkPad laptops options PCVT_SCANSET=2 # IBM keyboards are non-std # The syscons console driver (sco color console compatible). -device sc0 at isa? port IO_KBD conflicts tty irq 1 +device sc0 at isa? tty options MAXCONS=16 # number of virtual consoles options SLOW_VGA # do byte-wide i/o's to TS and GDC regs options "STD8X16FONT" # Compile font in @@ -1050,7 +1070,7 @@ disk fd0 at fdc0 drive 0 disk fd1 at fdc0 drive 1 # -# Other standard PC hardware: `lpt', `mse', `psm', `sio', etc. +# Other standard PC hardware: `lpt', `mse', `sio', etc. # # lpt: printer port # lpt specials: @@ -1059,18 +1079,11 @@ disk fd1 at fdc0 drive 1 # The irq clause may be omitted. This will force the port # into polling mode. # mse: Logitech and ATI InPort bus mouse ports -# psm: PS/2 mouse port [note: conflicts with sc0/vt0, thus "conflicts" keywd] # sio: serial ports (see sio(4)) device lpt0 at isa? port? tty irq 7 device lpt1 at isa? port "IO_LPT3" tty irq 5 device mse0 at isa? port 0x23c tty irq 5 -device psm0 at isa? port IO_KBD conflicts tty irq 12 - -# Options for psm: -options PSM_HOOKAPM #hook the APM resume event, useful - #for some laptops -options PSM_RESETAFTERSUSPEND #reset the device at the resume event device sio0 at isa? port "IO_COM1" tty flags 0x10 irq 4 diff --git a/sys/i386/conf/NOTES b/sys/i386/conf/NOTES index 7e93763..80171ee 100644 --- a/sys/i386/conf/NOTES +++ b/sys/i386/conf/NOTES @@ -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.529 1999/01/09 18:12:07 wpaul Exp $ +# $Id: LINT,v 1.531 1999/01/10 07:45:33 phk 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 @@ -842,15 +842,35 @@ options "NTIMECOUNTER=20" # configure cards from USERCONFIG. See pnp(4) for more info. controller pnp0 +# The keyboard controller; it controlls the keyboard and the PS/2 mouse. +controller atkbdc0 at isa? port IO_KBD tty + +# The AT keyboard +device atkbd0 at isa? tty irq 1 + +# PS/2 mouse +device psm0 at isa? tty irq 12 + +# Options for psm: +options PSM_HOOKAPM #hook the APM resume event, useful + #for some laptops +options PSM_RESETAFTERSUSPEND #reset the device at the resume event + +# The video card driver. +device vga0 at isa? port ? conflicts + +# Splash screen at start up! Screen savers require this too. +pseudo-device splash + # The pcvt console driver (vt220 compatible). -device vt0 at isa? port IO_KBD conflicts tty irq 1 +device vt0 at isa? tty options XSERVER # support for running an X server. options FAT_CURSOR # start with block cursor # This PCVT option is for keyboards such as those used on IBM ThinkPad laptops options PCVT_SCANSET=2 # IBM keyboards are non-std # The syscons console driver (sco color console compatible). -device sc0 at isa? port IO_KBD conflicts tty irq 1 +device sc0 at isa? tty options MAXCONS=16 # number of virtual consoles options SLOW_VGA # do byte-wide i/o's to TS and GDC regs options "STD8X16FONT" # Compile font in @@ -1050,7 +1070,7 @@ disk fd0 at fdc0 drive 0 disk fd1 at fdc0 drive 1 # -# Other standard PC hardware: `lpt', `mse', `psm', `sio', etc. +# Other standard PC hardware: `lpt', `mse', `sio', etc. # # lpt: printer port # lpt specials: @@ -1059,18 +1079,11 @@ disk fd1 at fdc0 drive 1 # The irq clause may be omitted. This will force the port # into polling mode. # mse: Logitech and ATI InPort bus mouse ports -# psm: PS/2 mouse port [note: conflicts with sc0/vt0, thus "conflicts" keywd] # sio: serial ports (see sio(4)) device lpt0 at isa? port? tty irq 7 device lpt1 at isa? port "IO_LPT3" tty irq 5 device mse0 at isa? port 0x23c tty irq 5 -device psm0 at isa? port IO_KBD conflicts tty irq 12 - -# Options for psm: -options PSM_HOOKAPM #hook the APM resume event, useful - #for some laptops -options PSM_RESETAFTERSUSPEND #reset the device at the resume event device sio0 at isa? port "IO_COM1" tty flags 0x10 irq 4 diff --git a/sys/i386/conf/files.i386 b/sys/i386/conf/files.i386 index f955863..9aa97d4 100644 --- a/sys/i386/conf/files.i386 +++ b/sys/i386/conf/files.i386 @@ -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.216 1998/12/31 08:17:08 luigi Exp $ +# $Id: files.i386,v 1.217 1999/01/01 08:09:58 peter Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -24,6 +24,17 @@ font8x16.o optional std8x16font \ no-implicit-rule before-depend \ clean "${STD8X16FONT}-8x16 font8x16.c" # +dev/fb/fb.c optional fb device-driver +dev/fb/fb.c optional vga device-driver +dev/fb/splash.c optional splash +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/scvidctl.c optional sc device-driver +dev/syscons/scvesactl.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 @@ -98,6 +109,8 @@ i386/isa/aha_isa.c optional aha device-driver #i386/isa/aic6360.c optional aic device-driver i386/isa/aic_isa.c optional aic device-driver i386/isa/alog.c optional alog device-driver +i386/isa/atkbd_isa.c optional atkbd device-driver +i386/isa/atkbdc_isa.c optional atkbdc device-driver i386/isa/bt_isa.c optional bt device-driver i386/isa/clock.c standard i386/isa/cronyx.c optional cx device-driver @@ -133,9 +146,6 @@ i386/isa/intr_machdep.c standard i386/isa/isa.c optional isa device-driver i386/isa/istallion.c optional stli device-driver i386/isa/joy.c optional joy device-driver -i386/isa/kbdio.c optional psm device-driver -i386/isa/kbdio.c optional sc device-driver -i386/isa/kbdio.c optional vt device-driver i386/isa/loran.c optional loran device-driver i386/isa/lpt.c optional lpt device-driver i386/isa/labpc.c optional labpc device-driver @@ -235,11 +245,8 @@ i386/isa/sound/cs4232.c optional css device-driver i386/isa/spigot.c optional spigot device-driver i386/isa/spkr.c optional speaker device-driver i386/isa/stallion.c optional stl device-driver -i386/isa/syscons.c optional sc device-driver -i386/isa/scvidctl.c optional sc device-driver -i386/isa/scvesactl.c optional sc device-driver -i386/isa/videoio.c optional sc device-driver -i386/isa/vesa.c optional sc device-driver +i386/isa/vesa.c optional vga device-driver +i386/isa/vga_isa.c optional vga device-driver i386/isa/tw.c optional tw device-driver i386/isa/wd.c optional wdc device-driver i386/isa/wd.c optional wd device-driver diff --git a/sys/i386/conf/options.i386 b/sys/i386/conf/options.i386 index 1b844a6..2704d56 100644 --- a/sys/i386/conf/options.i386 +++ b/sys/i386/conf/options.i386 @@ -1,4 +1,4 @@ -# $Id: options.i386,v 1.101 1999/01/01 08:09:58 peter Exp $ +# $Id: options.i386,v 1.102 1999/01/10 17:41:33 nsouch Exp $ DISABLE_PSE IDE_DELAY @@ -66,16 +66,26 @@ I486_CPU opt_global.h I586_CPU opt_global.h I686_CPU opt_global.h -SC_SPLASH_SCREEN opt_syscons.h MAXCONS opt_syscons.h -SLOW_VGA opt_syscons.h +# obsolete, use VGA_SLOW_IOACCESS +#SLOW_VGA opt_syscons.h STD8X16FONT opt_syscons.h SC_HISTORY_SIZE opt_syscons.h SC_DISABLE_REBOOT opt_syscons.h SC_MOUSE_CHAR opt_syscons.h -SC_ALT_SEQACCESS opt_syscons.h +# obsolete, use VGA_ALT_SEQACCESS +#SC_ALT_SEQACCESS opt_syscons.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 VESA opt_vesa.h +VESA_DEBUG opt_vesa.h PSM_HOOKAPM opt_psm.h PSM_RESETAFTERSUSPEND opt_psm.h @@ -83,10 +93,11 @@ PSM_DEBUG opt_psm.h PCIC_RESUME_RESET opt_pcic.h -KBD_RESETDELAY opt_kbdio.h -KBD_MAXRETRY opt_kbdio.h -KBD_MAXWAIT opt_kbdio.h -KBDIO_DEBUG opt_kbdio.h +KBD_INSTALL_CDEV opt_kbd.h +KBD_MAXRETRY opt_kbd.h +KBD_MAXWAIT opt_kbd.h +KBD_RESETDELAY opt_kbd.h +KBDIO_DEBUG opt_kbd.h ATAPI opt_atapi.h ATAPI_STATIC opt_atapi.h diff --git a/sys/i386/include/console.h b/sys/i386/include/console.h index b8d918f..c79759c 100644 --- a/sys/i386/include/console.h +++ b/sys/i386/include/console.h @@ -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: console.h,v 1.41 1998/10/01 11:39:09 yokota Exp $ + * $Id: console.h,v 1.42 1999/01/01 14:38:28 des Exp $ */ #ifndef _MACHINE_CONSOLE_H_ @@ -52,6 +52,7 @@ #define KDSETLED _IO('K', 66 /*, int */) #define KDSETRAD _IO('K', 67 /*, int */) #define KDRASTER _IOW('K', 100, scr_size_t) +#define KDGKBINFO _IOR('K', 101, keyboard_info_t) #define GETFKEY _IOWR('k', 0, fkeyarg_t) #define SETFKEY _IOWR('k', 1, fkeyarg_t) @@ -61,6 +62,8 @@ #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) @@ -86,11 +89,14 @@ #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_t) +#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 @@ -189,9 +195,11 @@ struct mouse_info { #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 @@ -204,7 +212,7 @@ struct mouse_info { #ifndef _KEYMAP_DECLARED #define _KEYMAP_DECLARED -struct key_t { +struct keyent_t { u_char map[NUM_STATES]; u_char spcl; u_char flgs; @@ -212,10 +220,17 @@ struct key_t { struct keymap { u_short n_keys; - struct key_t key[NUM_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 */ @@ -274,6 +289,9 @@ struct ssaver { 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) @@ -283,7 +301,14 @@ struct video_adapter { #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; @@ -292,6 +317,30 @@ struct video_adapter { int va_initial_mode; int va_initial_bios_mode; int va_mode; + int va_mode_flags; /* copy of vi_flags */ + 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_mode_flags; }; #define V_ADP_PRIMARY 0 @@ -319,6 +368,15 @@ struct video_info { /* XXX pixel format, memory model,... */ }; +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; @@ -330,7 +388,9 @@ 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; /* defines for "special" keys (spcl bit set in keymap) */ @@ -388,6 +448,13 @@ typedef struct {int scr_size[3];} scr_size_t; #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 */ diff --git a/sys/i386/include/pc/vesa.h b/sys/i386/include/pc/vesa.h index edbb7e4..16b0709 100644 --- a/sys/i386/include/pc/vesa.h +++ b/sys/i386/include/pc/vesa.h @@ -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.h,v 1.2 1998/09/25 11:55:41 yokota Exp $ + * $Id: vesa.h,v 1.3 1999/01/08 12:57:06 yokota Exp $ */ #ifndef _MACHINE_PC_VESA_H @@ -115,10 +115,6 @@ struct vesa_mode int vesa_load_ioctl(void); int vesa_unload_ioctl(void); -#ifndef KLD_MODULE -int vesa_load(void); -#endif - #endif /* KERNEL */ #endif /* !_MACHINE_PC_VESA_H */ diff --git a/sys/i386/isa/pcvt/pcvt_drv.c b/sys/i386/isa/pcvt/pcvt_drv.c index 26c02f3..c4ed5a1 100644 --- a/sys/i386/isa/pcvt/pcvt_drv.c +++ b/sys/i386/isa/pcvt/pcvt_drv.c @@ -114,6 +114,11 @@ static void vgapelinit(void); /* read initial VGA DAC palette */ static int pcvt_xmode_set(int on, struct proc *p); /* initialize for X mode */ #endif /* XSERVER && !PCVT_USL_VT_COMPAT */ +#ifdef _DEV_KBD_KBDREG_H_ +static void detect_kbd(void *arg); +static kbd_callback_func_t pcevent; +#endif + static cn_probe_t pccnprobe; static cn_init_t pccninit; static cn_getc_t pccngetc; @@ -161,17 +166,19 @@ pcprobe(struct isa_device *dev) #endif /* PCVT_NETBSD > 9 */ #endif /* PCVT_NETBSD > 100 */ { -#ifdef _I386_ISA_KBDIO_H_ - kbdc = kbdc_open(IO_KBD); +#ifdef _DEV_KBD_KBDREG_H_ + int i; - if(kbdc == NULL) + kbd = NULL; + kbd_configure(KB_CONF_PROBE_ONLY); + i = kbd_allocate("*", -1, (void *)&kbd, pcevent, (void *)dev->id_unit); + if ((i < 0) || ((kbd = kbd_get_keyboard(i)) == NULL)) { reset_keyboard = 0; - return 1; + return (-1); } - reset_keyboard = 1; /* it's now safe to do kbd reset */ -#endif /* _I386_ISA_KBDIO_H_ */ +#endif /* _DEV_KBD_KBDREG_H_ */ kbd_code_init(); @@ -179,7 +186,9 @@ pcprobe(struct isa_device *dev) ((struct isa_attach_args *)aux)->ia_iosize = 16; return 1; #else -#if PCVT_NETBSD || PCVT_FREEBSD +#ifdef _DEV_KBD_KBDREG_H_ + return (-1); +#elif PCVT_NETBSD || PCVT_FREEBSD return (16); #else return 1; @@ -207,6 +216,11 @@ pcattach(struct isa_device *dev) vt_coldmalloc(); /* allocate memory for screens */ +#ifdef _DEV_KBD_KBDREG_H_ + if (kbd == NULL) + timeout(detect_kbd, (void *)dev->id_unit, hz*2); +#endif /* _DEV_KBD_KBDREG_H_ */ + #if PCVT_NETBSD || PCVT_FREEBSD #if PCVT_NETBSD > 9 @@ -849,6 +863,50 @@ pcvt_timeout(void *arg) } #endif +#ifdef _DEV_KBD_KBDREG_H_ +static void +detect_kbd(void *arg) +{ + int unit = (int)arg; + int i; + + if (kbd != NULL) + return; + i = kbd_allocate("*", -1, (void *)&kbd, pcevent, (void *)unit); + if (i >= 0) + kbd = kbd_get_keyboard(i); + if (kbd != NULL) + { + reset_keyboard = 1; /* ok to reset the keyboard */ + kbd_code_init(); + return; + } + reset_keyboard = 0; + timeout(detect_kbd, (void *)unit, hz*2); +} + +int +pcevent(keyboard_t *thiskbd, int event, void *arg) +{ + int unit = (int)arg; + + if (thiskbd != kbd) + return EINVAL; /* shouldn't happen */ + + switch (event) { + case KBDIO_KEYINPUT: + pcrint(unit); + return 0; + case KBDIO_UNLOADING: + kbd = NULL; + kbd_release(thiskbd, (void *)&kbd); + timeout(detect_kbd, (void *)unit, hz*4); + return 0; + default: + return EINVAL; + } +} +#endif /* _DEV_KBD_KBDREG_H_ */ void pcrint(int unit) @@ -862,7 +920,7 @@ pcrint(int unit) int s; # endif -# ifdef _I386_ISA_KBDIO_H_ +# ifdef _DEV_KBD_KBDREG_H_ int c; # endif @@ -870,25 +928,6 @@ pcrint(int unit) u_char *cp; #endif /* PCVT_KBD_FIFO */ - /* - * in case the keyboard was not plugged in while booting, kbdc - * was set to NULL at that time. When a keyboard IRQ occurs and - * kbdc is NULL, the keyboard was probably reconnected to the - * keyboard controller and we have to initialize the keyboard. - */ - - if(kbdc == NULL) - { - kbdc = kbdc_open(IO_KBD); - if(kbdc == NULL) - { - reset_keyboard = 0; - return; - } - reset_keyboard = 1; - kbd_code_init(); - } - #if PCVT_SCREENSAVER pcvt_scrnsv_reset(); #endif /* PCVT_SCREENSAVER */ @@ -900,7 +939,7 @@ pcrint(int unit) return; } -# ifndef _I386_ISA_KBDIO_H_ +# ifndef _DEV_KBD_KBDREG_H_ while (inb(CONTROLLER_CTRL) & STATUS_OUTPBF) /* check 8042 buffer */ { ret = 1; /* got something */ @@ -909,11 +948,11 @@ pcrint(int unit) dt = inb(CONTROLLER_DATA); /* get it 8042 data */ # else - while ((c = read_kbd_data_no_wait(kbdc)) != -1) + while ((c = (*kbdsw[kbd->kb_index]->read)(kbd, FALSE)) != -1) { ret = 1; /* got something */ dt = c; -# endif /* _I386_ISA_KBDIO_H_ */ +# endif /* _DEV_KBD_KBDREG_H_ */ if (pcvt_kbd_count >= PCVT_KBD_FIFO_SZ) /* fifo overflow ? */ { @@ -1131,32 +1170,40 @@ int pccnprobe(struct consdev *cp) { struct isa_device *dvp; + int i; + + /* + * Take control if we are the highest priority enabled display device. + */ + dvp = find_display(); + if (dvp == NULL || dvp->id_driver != &vtdriver) { + cp->cn_pri = CN_DEAD; + return; + } + +#ifdef _DEV_KBD_KBDREG_H_ + kbd = NULL; + kbd_configure(KB_CONF_PROBE_ONLY); + i = kbd_allocate("*", -1, (void *)&kbd, pcevent, (void *)dvp->id_unit); + if (i >= 0) + kbd = kbd_get_keyboard(i); -#ifdef _I386_ISA_KBDIO_H_ - kbdc = kbdc_open(IO_KBD); /* * Don't reset the keyboard via `kbdio' just yet. * The system clock has not been calibrated... */ reset_keyboard = 0; + #if PCVT_SCANSET == 2 /* * Turn off scancode translation early so that UserConfig * and DDB can read the keyboard. */ - empty_both_buffers(kbdc, 10); - set_controller_command_byte(kbdc, KBD_TRANSLATION, 0); + empty_both_buffers(*(KBDC *)kbd->kb_data, 10); + set_controller_command_byte(*(KBDC *)kbd->kb_data, KBD_TRANSLATION, 0); #endif /* PCVT_SCANSET == 2 */ -#endif /* _I386_ISA_KBDIO_H_ */ - /* - * Take control if we are the highest priority enabled display device. - */ - dvp = find_display(); - if (dvp == NULL || dvp->id_driver != &vtdriver) { - cp->cn_pri = CN_DEAD; - return; - } +#endif /* _DEV_KBD_KBDREG_H_ */ /* initialize required fields */ @@ -1254,7 +1301,13 @@ pccngetc(Dev_t dev) s = spltty(); /* block pcrint while we poll */ kbd_polling = 1; +#ifdef _DEV_KBD_KBDREG_H_ + (*kbdsw[kbd->kb_index]->enable)(kbd); +#endif cp = sgetc(0); +#ifdef _DEV_KBD_KBDREG_H_ + (*kbdsw[kbd->kb_index]->disable)(kbd); +#endif kbd_polling = 0; splx(s); c = *cp++; @@ -1281,7 +1334,13 @@ pccncheckc(Dev_t dev) char *cp; int x = spltty(); kbd_polling = 1; +#ifdef _DEV_KBD_KBDREG_H_ + (*kbdsw[kbd->kb_index]->enable)(kbd); +#endif cp = sgetc(1); +#ifdef _DEV_KBD_KBDREG_H_ + (*kbdsw[kbd->kb_index]->disable)(kbd); +#endif kbd_polling = 0; splx(x); return (cp == NULL ? -1 : *cp); @@ -1520,7 +1579,7 @@ pcvt_xmode_set(int on, struct proc *p) vsp->Crtat = vsp->Memory; /* operate in memory now */ -#ifndef _I386_ISA_KBDIO_H_ +#ifndef _DEV_KBD_KBDREG_H_ #if PCVT_SCANSET == 2 /* put keyboard to return ancient PC scan codes */ @@ -1534,15 +1593,15 @@ pcvt_xmode_set(int on, struct proc *p) #endif /* PCVT_USEKBDSEC */ #endif /* PCVT_SCANSET == 2 */ -#else /* _I386_ISA_KBDIO_H_ */ +#else /* _DEV_KBD_KBDREG_H_ */ #if PCVT_SCANSET == 2 /* put keyboard to return ancient PC scan codes */ - set_controller_command_byte(kbdc, + set_controller_command_byte(*(KBDC *)kbd->kb_data, KBD_TRANSLATION, KBD_TRANSLATION); #endif /* PCVT_SCANSET == 2 */ -#endif /* !_I386_ISA_KBDIO_H_ */ +#endif /* !_DEV_KBD_KBDREG_H_ */ #if PCVT_NETBSD > 9 fp->tf_eflags |= PSL_IOPL; @@ -1579,7 +1638,7 @@ pcvt_xmode_set(int on, struct proc *p) pcvt_set_scrnsv_tmo(saved_scrnsv_tmo); #endif /* PCVT_SCREENSAVER */ -#ifndef _I386_ISA_KBDIO_H_ +#ifndef _DEV_KBD_KBDREG_H_ #if PCVT_SCANSET == 2 kbc_8042cmd(CONTR_WRITE); @@ -1592,13 +1651,14 @@ pcvt_xmode_set(int on, struct proc *p) #endif /* PCVT_USEKBDSEC */ #endif /* PCVT_SCANSET == 2 */ -#else /* _I386_ISA_KBDIO_H_ */ +#else /* _DEV_KBD_KBDREG_H_ */ #if PCVT_SCANSET == 2 - set_controller_command_byte(kbdc, KBD_TRANSLATION, 0); + set_controller_command_byte(*(KBDC *)kbd->kb_data, + KBD_TRANSLATION, 0); #endif /* PCVT_SCANSET == 2 */ -#endif /* !_I386_ISA_KBDIO_H_ */ +#endif /* !_DEV_KBD_KBDREG_H_ */ if(adaptor_type == MDA_ADAPTOR) { diff --git a/sys/i386/isa/pcvt/pcvt_hdr.h b/sys/i386/isa/pcvt/pcvt_hdr.h index 11adc9c..2c9aac8 100644 --- a/sys/i386/isa/pcvt/pcvt_hdr.h +++ b/sys/i386/isa/pcvt/pcvt_hdr.h @@ -107,7 +107,9 @@ #endif /* PCVT_FREEBSD >= 200 */ #include <i386/isa/pcvt/pcvt_conf.h> -#include <i386/isa/kbdio.h> + +#include <dev/kbd/kbdreg.h> +#include <dev/kbd/atkbdcreg.h> #if PCVT_NETBSD > 9 #include "device.h" @@ -168,6 +170,14 @@ #include <machine/clock.h> #include <machine/md_var.h> #endif +/* + * The following values are defined in machine/console.h, but the header + * file is not included here due to conflicts with pcvt_ioctl.h. + */ +#define KDGKBTYPE _IOR('K', 64, int) +#define KB_84 1 +#define KB_101 2 +#define KB_OTHER 3 #else /* PCVT_FREEBSD >= 200 */ #include "machine/pc/display.h" #endif /* PCVT_FREEBSD >= 200 */ @@ -260,7 +270,7 @@ in the config file" * Keyboard and Keyboard Controller *---------------------------------------------------------------------------*/ -#ifndef _I386_ISA_KBDIO_H_ +#ifndef _DEV_KBD_KBDREG_H_ #define CONTROLLER_CTRL 0x64 /* W - command, R - status */ #define CONTROLLER_DATA 0x60 /* R/W - data */ @@ -308,7 +318,7 @@ in the config file" #define KEYB_C_ECHO 0xee /* diagnostic, echo 0xee */ #define KEYB_C_LEDS 0xed /* set/reset numlock,capslock & scroll lock */ -#endif /* _I386_ISA_KBDIO_H_ */ +#endif /* _DEV_KBD_KBDREG_H_ */ /* responses from the KEYBOARD (via the 8042 controller on mainboard..) */ @@ -1000,10 +1010,10 @@ u_char chargen_access = 0; /* synchronize access */ u_char keyboard_type = KB_UNKNOWN; /* type of keyboard */ u_char keyboard_is_initialized = 0; /* for ddb sanity */ u_char kbd_polling = 0; /* keyboard is being polled */ -#ifdef _I386_ISA_KBDIO_H_ +#ifdef _DEV_KBD_KBDREG_H_ u_char reset_keyboard = 0; /* OK to reset keyboard */ -KBDC kbdc = NULL; /* keyboard controller */ -#endif /* _I386_ISA_KBDIO_H_ */ +keyboard_t *kbd = NULL; +#endif /* _DEV_KBD_KBDREG_H_ */ #if PCVT_SHOWKEYS u_char keyboard_show = 0; /* normal display */ @@ -1141,10 +1151,10 @@ extern u_char can_do_132col; extern u_char vga_family; extern u_char keyboard_is_initialized; extern u_char kbd_polling; -#ifdef _I386_ISA_KBDIO_H_ +#ifdef _DEV_KBD_KBDREG_H_ extern u_char reset_keyboard; -extern KBDC kbdc; -#endif /* _I386_ISA_KBDIO_H_ */ +extern keyboard_t *kbd; +#endif /* _DEV_KBD_KBDREG_H_ */ #if PCVT_SHOWKEYS extern u_char keyboard_show; @@ -1268,10 +1278,10 @@ void fkl_on ( struct video_state *svsp ); struct tty *get_pccons ( Dev_t dev ); void init_sfkl ( struct video_state *svsp ); void init_ufkl ( struct video_state *svsp ); -#ifndef _I386_ISA_KBDIO_H_ +#ifndef _DEV_KBD_KBDREG_H_ int kbd_cmd ( int val ); int kbd_response ( void ); -#endif /* _I386_ISA_KBDIO_H_ */ +#endif /* _DEV_KBD_KBDREG_H_ */ void kbd_code_init ( void ); void kbd_code_init1 ( void ); diff --git a/sys/i386/isa/pcvt/pcvt_kbd.c b/sys/i386/isa/pcvt/pcvt_kbd.c index 2113ee0..c7a2cfc 100644 --- a/sys/i386/isa/pcvt/pcvt_kbd.c +++ b/sys/i386/isa/pcvt/pcvt_kbd.c @@ -91,11 +91,9 @@ static void doreset ( void ); static void ovlinit ( int force ); static void settpmrate ( int rate ); static void setlockkeys ( int snc ); -#ifndef _I386_ISA_KBDIO_H_ +#ifndef _DEV_KBD_KBDREG_H_ static int kbc_8042cmd ( int val ); -#else -static int set_keyboard_param( int command, int data ); -#endif /* !_I386_ISA_KBDIO_H_ */ +#endif /* !_DEV_KBD_KBDREG_H_ */ static int getokeydef ( unsigned key, struct kbd_ovlkey *thisdef ); static int getckeydef ( unsigned key, struct kbd_ovlkey *thisdef ); static int rmkeydef ( int key ); @@ -170,7 +168,7 @@ do_vgapage(int page) #define PCVT_UPDLED_LOSES_INTR 0 /* disabled for now */ -#if PCVT_UPDLED_LOSES_INTR || defined(_I386_ISA_KBDIO_H_) +#if PCVT_UPDLED_LOSES_INTR || defined(_DEV_KBD_KBDREG_H_) /*---------------------------------------------------------------------------* * check for lost keyboard interrupts @@ -203,7 +201,7 @@ static struct callout_handle lost_intr_ch = static void check_for_lost_intr (void *arg) { -#ifndef _I386_ISA_KBDIO_H_ +#ifndef _DEV_KBD_KBDREG_H_ lost_intr_timeout_queued = 0; if (inb(CONTROLLER_CTRL) & STATUS_OUTPBF) { @@ -215,19 +213,20 @@ check_for_lost_intr (void *arg) int opri; lost_intr_timeout_queued = 0; - if (kbdc_lock(kbdc, TRUE)) { + if ((*kbdsw[kbd->kb_index]->lock)(kbd, TRUE)) { opri = spltty (); - kbdc_lock(kbdc, FALSE); - if (kbdc_data_ready(kbdc)) + (*kbdsw[kbd->kb_index]->lock)(kbd, FALSE); + if ((*kbdsw[kbd->kb_index]->check)(kbd)) pcrint (0); splx (opri); } + lost_intr_ch = timeout(check_for_lost_intr, (void *)NULL, hz); lost_intr_timeout_queued = 1; -#endif /* !_I386_ISA_KBDIO_H_ */ +#endif /* !_DEV_KBD_KBDREG_H_ */ } -#endif /* PCVT_UPDLED_LOSES_INTR || defined(_I386_ISA_KBDIO_H_) */ +#endif /* PCVT_UPDLED_LOSES_INTR || defined(_DEV_KBD_KBDREG_H_) */ /*---------------------------------------------------------------------------* * update keyboard led's @@ -242,13 +241,19 @@ update_led(void) int opri, new_ledstate; opri = spltty(); +#ifndef _DEV_KBD_KBDREG_H_ new_ledstate = (vsp->scroll_lock) | (vsp->num_lock * 2) | (vsp->caps_lock * 4); +#else + new_ledstate = ((vsp->scroll_lock) ? LED_SCR : 0) | + ((vsp->num_lock) ? LED_NUM : 0) | + ((vsp->caps_lock) ? LED_CAP : 0); +#endif /* _DEV_KBD_KBDREG_H_ */ if (new_ledstate != ledstate) { -#ifndef _I386_ISA_KBDIO_H_ +#ifndef _DEV_KBD_KBDREG_H_ int response1, response2; ledstate = LEDSTATE_UPDATE_PENDING; @@ -296,19 +301,20 @@ update_led(void) printf( "Keyboard LED command not ACKed (responses %#x %#x)\n", response1, response2); -#else /* _I386_ISA_KBDIO_H_ */ +#else /* _DEV_KBD_KBDREG_H_ */ - if (kbdc == NULL) { + if (kbd == NULL) { ledstate = new_ledstate; splx(opri); } else { ledstate = LEDSTATE_UPDATE_PENDING; splx(opri); - if (set_keyboard_param(KBDC_SET_LEDS, new_ledstate) == 0) + if ((*kbdsw[kbd->kb_index]->ioctl)(kbd, KDSETLED, + (caddr_t)&new_ledstate) == 0) ledstate = new_ledstate; } -#endif /* !_I386_ISA_KBDIO_H_ */ +#endif /* !_DEV_KBD_KBDREG_H_ */ #if PCVT_UPDLED_LOSES_INTR if (lost_intr_timeout_queued) @@ -320,7 +326,7 @@ update_led(void) } -#ifndef _I386_ISA_KBDIO_H_ +#ifndef _DEV_KBD_KBDREG_H_ splx(opri); #endif @@ -333,7 +339,7 @@ update_led(void) static void settpmrate(int rate) { -#ifndef _I386_ISA_KBDIO_H_ +#ifndef _DEV_KBD_KBDREG_H_ tpmrate = rate & 0x7f; if(kbd_cmd(KEYB_C_TYPEM) != 0) printf("Keyboard TYPEMATIC command timeout\n"); @@ -341,12 +347,13 @@ settpmrate(int rate) printf("Keyboard TYPEMATIC data timeout\n"); #else tpmrate = rate & 0x7f; - if (set_keyboard_param(KBDC_SET_TYPEMATIC, tpmrate) != 0) + if ((*kbdsw[kbd->kb_index]->ioctl)(kbd, KDSETRAD, + (caddr_t)&tpmrate) == 0) printf("pcvt: failed to set keyboard TYPEMATIC.\n"); -#endif /* !_I386_ISA_KBDIO_H_ */ +#endif /* !_DEV_KBD_KBDREG_H_ */ } -#ifndef _I386_ISA_KBDIO_H_ +#ifndef _DEV_KBD_KBDREG_H_ /*---------------------------------------------------------------------------* * Pass command to keyboard controller (8042) *---------------------------------------------------------------------------*/ @@ -408,64 +415,7 @@ kbd_response(void) return ch; } -#else -static int -set_keyboard_param(int command, int data) -{ - int s; -#if 0 - int c; -#endif - - if (kbdc == NULL) - return 1; - - /* prevent the timeout routine from polling the keyboard */ - if (!kbdc_lock(kbdc, TRUE)) - return 1; - - /* disable the keyboard and mouse interrupt */ - s = spltty(); -#if 0 - c = get_controller_command_byte(kbdc); - if ((c == -1) - || !set_controller_command_byte(kbdc, - kbdc_get_device_mask(kbdc), - KBD_DISABLE_KBD_PORT | KBD_DISABLE_KBD_INT - | KBD_DISABLE_AUX_PORT | KBD_DISABLE_AUX_INT)) { - /* CONTROLLER ERROR */ - kbdc_lock(kbdc, FALSE); - splx(s); - return 1; - } - /* - * Now that the keyboard controller is told not to generate - * the keyboard and mouse interrupts, call `splx()' to allow - * the other tty interrupts. The clock interrupt may also occur, - * but the timeout routine (`scrn_timer()') will be blocked - * by the lock flag set via `kbdc_lock()' - */ - splx(s); -#endif - - if (send_kbd_command_and_data(kbdc, command, data) != KBD_ACK) - send_kbd_command(kbdc, KBDC_ENABLE_KBD); - -#if 0 - /* restore the interrupts */ - if (!set_controller_command_byte(kbdc, - kbdc_get_device_mask(kbdc), - c & (KBD_KBD_CONTROL_BITS | KBD_AUX_CONTROL_BITS))) { - /* CONTROLLER ERROR */ - } -#else - splx(s); -#endif - kbdc_lock(kbdc, FALSE); - - return 0; -} -#endif /* !_I386_ISA_KBDIO_H_ */ +#endif /* _DEV_KBD_KBDREG_H_ */ #if PCVT_SCANSET > 1 /*---------------------------------------------------------------------------* @@ -474,7 +424,7 @@ set_keyboard_param(int command, int data) void kbd_emulate_pc(int do_emulation) { -#ifndef _I386_ISA_KBDIO_H_ +#ifndef _DEV_KBD_KBDREG_H_ int cmd, timeo = 10000; cmd = COMMAND_SYSFLG|COMMAND_IRQEN; /* common base cmd */ @@ -492,9 +442,9 @@ kbd_emulate_pc(int do_emulation) break; outb(CONTROLLER_DATA, cmd); #else - set_controller_command_byte(kbdc, KBD_TRANSLATION, + set_controller_command_byte(*(KBDC *)kbd->kb_data, KBD_TRANSLATION, (do_emulation) ? KBD_TRANSLATION : 0); -#endif /* !_I386_ISA_KBDIO_H_ */ +#endif /* !_DEV_KBD_KBDREG_H_ */ } #endif /* PCVT_SCANSET > 1 */ @@ -510,7 +460,7 @@ kbd_emulate_pc(int do_emulation) static void doreset(void) { -#ifndef _I386_ISA_KBDIO_H_ +#ifndef _DEV_KBD_KBDREG_H_ int again = 0; int once = 0; int response, opri; @@ -671,10 +621,8 @@ r_entry: #endif /* PCVT_KEYBDID */ -#else /* _I386_ISA_KBDIO_H_ */ - int c; - int m; - int s; +#else /* _DEV_KBD_KBDREG_H_ */ + int type; if (!reset_keyboard) /* no, we are not ready to reset */ return; @@ -684,29 +632,11 @@ r_entry: lost_intr_timeout_queued = 0; } - if (kbdc == NULL) - kbdc = kbdc_open(IO_KBD); + if (kbd == NULL) + return; /* shouldn't happen */ + (*kbdsw[kbd->kb_index]->init)(kbd); - if (!kbdc_lock(kbdc, TRUE)) /* strange, somebody got there first */ - return; - - /* remove any noise */ - empty_both_buffers(kbdc, 10); - - s = spltty(); - - /* save the current controller command byte */ - m = kbdc_get_device_mask(kbdc) & ~KBD_KBD_CONTROL_BITS; - c = get_controller_command_byte(kbdc); - if (c == -1) { - /* CONTROLLER ERROR */ - kbdc_set_device_mask(kbdc, m); - kbdc_lock(kbdc, FALSE); - kbdc = NULL; - splx(s); - printf("pcvt: unable to get the command byte.\n"); - return; - } + ledstate = LEDSTATE_UPDATE_PENDING; #if PCVT_USEKBDSEC /* security enabled */ @@ -726,105 +656,33 @@ r_entry: #endif /* PCVT_USEKBDSEC */ - /* disable the keyboard interrupt and the aux port and interrupt */ - if (!set_controller_command_byte(kbdc, - KBD_KBD_CONTROL_BITS | KBD_TRANSLATION | KBD_OVERRIDE_KBD_LOCK, - KBD_ENABLE_KBD_PORT | KBD_DISABLE_KBD_INT | KBDINITCMD)) { - /* CONTROLLER ERROR: there is very little we can do... */ - kbdc_set_device_mask(kbdc, m); - kbdc_lock(kbdc, FALSE); - kbdc = NULL; - splx(s); - printf("pcvt: unable to set the command byte.\n"); - return; - } - splx(s); - - /* reset keyboard hardware */ - ledstate = LEDSTATE_UPDATE_PENDING; - if (!reset_kbd(kbdc)) { - /* KEYBOARD ERROR */ - empty_both_buffers(kbdc, 10); - test_controller(kbdc); - test_kbd_port(kbdc); - /* - * We could disable the keyboard port and interrupt now... - * but, the keyboard may still exist. - */ - printf("pcvt: failed to reset the keyboard.\n"); - /* try to restore the original command byte */ - set_controller_command_byte(kbdc, 0xff, c); - kbdc_set_device_mask(kbdc, m); - kbdc_lock(kbdc, FALSE); - kbdc = NULL; - return; - } - -#if PCVT_KEYBDID - - keyboard_type = KB_UNKNOWN; - if (send_kbd_command(kbdc, KBDC_SEND_DEV_ID) == KBD_ACK) { - DELAY(10000); /* 10msec delay */ - switch (read_kbd_data(kbdc)) { - case KEYB_R_MF2ID1: - switch (read_kbd_data(kbdc)) { - case KEYB_R_MF2ID2: - case KEYB_R_MF2ID2HP: - keyboard_type = KB_MFII; - break; - case -1: - default: - break; - } - break; - case -1: - keyboard_type = KB_AT; - /* fall through */ - default: - /* XXX: should we read the second byte? */ - empty_both_buffers(kbdc, 10); /* XXX */ - break; - } - } else { - /* - * The send ID command failed. This error is considered - * benign, but may need recovery. - */ - empty_both_buffers(kbdc, 10); - test_controller(kbdc); - test_kbd_port(kbdc); - } - -#else /* PCVT_KEYBDID */ + set_controller_command_byte(*(KBDC *)kbd->kb_data, + KBD_OVERRIDE_KBD_LOCK | KBD_TRANSLATION, KBDINITCMD); keyboard_type = KB_MFII; /* force it .. */ - -#endif /* PCVT_KEYBDID */ - - /* enable the keyboard port and intr. */ - if (!set_controller_command_byte(kbdc, - KBD_KBD_CONTROL_BITS, - KBD_ENABLE_KBD_PORT | KBD_ENABLE_KBD_INT)) { - /* CONTROLLER ERROR - * This is serious; we are left with the disabled - * keyboard intr. - */ - printf("pcvt: failed to enable the keyboard port and intr.\n"); - kbdc_set_device_mask(kbdc, m); - kbdc_lock(kbdc, FALSE); - kbdc = NULL; - return; +#if PCVT_KEYBDID + type = KB_101; + (*kbdsw[kbd->kb_index]->ioctl)(kbd, KDGKBTYPE, (caddr_t)&type); + switch (type) + { + case KB_84: + keyboard_type = KB_AT; + break; + case KB_101: + keyboard_type = KB_MFII; + break; + default: + keyboard_type = KB_UNKNOWN; + break; } - - kbdc_set_device_mask(kbdc, m | KBD_KBD_CONTROL_BITS); - kbdc_lock(kbdc, FALSE); +#endif /* PCVT_KEYBDID */ update_led(); lost_intr_ch = timeout(check_for_lost_intr, (void *)NULL, hz); lost_intr_timeout_queued = 1; -#endif /* !_I386_ISA_KBDIO_H_ */ +#endif /* !_DEV_KBD_KBDREG_H_ */ } /*---------------------------------------------------------------------------* @@ -1246,15 +1104,15 @@ sgetc(int noblock) static char keybuf[2] = {0}; /* the second 0 is a delimiter! */ #endif /* XSERVER */ -#ifdef _I386_ISA_KBDIO_H_ +#ifdef _DEV_KBD_KBDREG_H_ int c; -#endif /* _I386_ISA_KBDIO_H_ */ +#endif /* _DEV_KBD_KBDREG_H_ */ loop: #ifdef XSERVER -#ifndef _I386_ISA_KBDIO_H_ +#ifndef _DEV_KBD_KBDREG_H_ #if PCVT_KBD_FIFO @@ -1289,7 +1147,7 @@ loop: #endif /* !PCVT_KBD_FIFO */ -#else /* _I386_ISA_KBDIO_H_ */ +#else /* _DEV_KBD_KBDREG_H_ */ #if PCVT_KBD_FIFO if (pcvt_kbd_count) { @@ -1302,18 +1160,18 @@ loop: } else #endif /* PCVT_KBD_FIFO */ if (!noblock) { - while ((c = read_kbd_data(kbdc)) == -1) + while ((c = (*kbdsw[kbd->kb_index]->read)(kbd, TRUE)) == -1) ; dt = c; } else { - if ((c = read_kbd_data_no_wait(kbdc)) == -1) + if ((c = (*kbdsw[kbd->kb_index]->read)(kbd, FALSE)) == -1) return NULL; dt = c; } { -#endif /* !_I386_ISA_KBDIO_H_ */ +#endif /* !_DEV_KBD_KBDREG_H_ */ /* * If x mode is active, only care for locking keys, then @@ -1591,7 +1449,7 @@ no_mouse_event: #else /* !XSERVER */ -#ifndef _I386_ISA_KBDIO_H_ +#ifndef _DEV_KBD_KBDREG_H_ # if PCVT_KBD_FIFO @@ -1628,7 +1486,7 @@ no_mouse_event: #endif /* !PCVT_KBD_FIFO */ -#else /* _I386_ISA_KBDIO_H_ */ +#else /* _DEV_KBD_KBDREG_H_ */ #if PCVT_KBD_FIFO if (pcvt_kbd_count) { @@ -1641,20 +1499,20 @@ no_mouse_event: } else #endif /* PCVT_KBD_FIFO */ if (!noblock) { - while ((c = read_kbd_data(kbdc)) == -1) + while ((c = (*kbdsw[kbd->kb_index]->read)(kbd, TRUE)) == -1) ; dt = c; } else { - if ((c = read_kbd_data_no_wait(kbdc)) == -1) + if ((c = (*kbdsw[kbd->kb_index]->read)(kbd, FALSE)) == -1) return NULL; dt = c; } -#endif /* !_I386_ISA_KBDIO_H_ */ +#endif /* !_DEV_KBD_KBDREG_H_ */ #endif /* !XSERVER */ -#ifndef _I386_ISA_KBDIO_H_ +#ifndef _DEV_KBD_KBDREG_H_ else { if(noblock) @@ -1662,7 +1520,7 @@ no_mouse_event: else goto loop; } -#endif /* !_I386_ISA_KBDIO_H_ */ +#endif /* !_DEV_KBD_KBDREG_H_ */ #if PCVT_SHOWKEYS showkey (' ', dt); diff --git a/sys/i386/isa/psm.c b/sys/i386/isa/psm.c index 4cee984..07290af 100644 --- a/sys/i386/isa/psm.c +++ b/sys/i386/isa/psm.c @@ -20,7 +20,7 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: psm.c,v 1.57 1998/11/20 11:46:43 yokota Exp $ + * $Id: psm.c,v 1.58 1999/01/06 05:40:01 yokota Exp $ */ /* @@ -86,9 +86,10 @@ #include <machine/limits.h> #include <machine/mouse.h> +#include <dev/kbd/atkbdcreg.h> + #include <i386/isa/isa.h> #include <i386/isa/isa_device.h> -#include <i386/isa/kbdio.h> /* * Driver specific options: the following options may be set by @@ -1003,7 +1004,7 @@ psmprobe(struct isa_device *dvp) psm_softc[unit] = sc; kbdc_set_device_mask(sc->kbdc, mask | KBD_AUX_CONTROL_BITS); kbdc_lock(sc->kbdc, FALSE); - return (IO_PSMSIZE); + return ((dvp->id_iobase < 0) ? -1 : IO_PSMSIZE); } static int diff --git a/sys/i386/isa/vesa.c b/sys/i386/isa/vesa.c index 2e93239..306aaa4 100644 --- a/sys/i386/isa/vesa.c +++ b/sys/i386/isa/vesa.c @@ -23,14 +23,20 @@ * (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.10 1998/12/30 11:21:08 yokota Exp $ + * $Id: $ */ -#include "sc.h" +#include "vga.h" +#include "opt_vga.h" #include "opt_vesa.h" #include "opt_vm86.h" +#include "opt_fb.h" -#if (NSC > 0 && defined(VESA) && defined(VM86)) || defined(KLD_MODULE) +#ifdef VGA_NO_MODE_CHANGE +#undef VESA +#endif + +#if (NVGA > 0 && defined(VESA) && defined(VM86)) || defined(KLD_MODULE) #include <sys/param.h> #include <sys/systm.h> @@ -46,7 +52,18 @@ #include <machine/pc/bios.h> #include <machine/pc/vesa.h> -#include <i386/isa/videoio.h> +#include <dev/fb/fbreg.h> +#include <dev/fb/vgareg.h> + +#ifndef __i386__ +#include <isa/isareg.h> +#else +#include <i386/isa/isa.h> +#endif + +#ifndef VESA_DEBUG +#define VESA_DEBUG 1 +#endif /* VESA video adapter state buffer stub */ struct adp_state { @@ -59,11 +76,14 @@ 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 vi_probe_t vesa_probe; static vi_init_t vesa_init; -static vi_adapter_t vesa_adapter; static vi_get_info_t vesa_get_info; static vi_query_mode_t vesa_query_mode; static vi_set_mode_t vesa_set_mode; @@ -78,17 +98,34 @@ static vi_load_state_t vesa_load_state; 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_mmap_t vesa_mmap; static vi_diag_t vesa_diag; -static struct vidsw vesavidsw = { - vesa_init, vesa_adapter, vesa_get_info, vesa_query_mode, - vesa_set_mode, vesa_save_font, vesa_load_font, vesa_show_font, - vesa_save_palette,vesa_load_palette,vesa_set_border,vesa_save_state, - vesa_load_state,vesa_set_origin,vesa_read_hw_cursor,vesa_set_hw_cursor, +static video_switch_t vesavidsw = { + vesa_probe, + vesa_init, + vesa_get_info, + vesa_query_mode, + vesa_set_mode, + vesa_save_font, + vesa_load_font, + vesa_show_font, + vesa_save_palette, + vesa_load_palette, + vesa_set_border, + vesa_save_state, + vesa_load_state, + vesa_set_origin, + vesa_read_hw_cursor, + vesa_set_hw_cursor, + vesa_set_hw_cursor_shape, + (vi_blank_display_t *)vesa_nop, + vesa_mmap, vesa_diag, }; -static struct vidsw prevvidsw; +static video_switch_t *prevvidsw; /* VESA BIOS video modes */ #define VESA_MAXMODES 64 @@ -111,6 +148,7 @@ static char *vesa_revstr = NULL; /* local macros and functions */ #define BIOS_SADDRTOLADDR(p) ((((p) & 0xffff0000) >> 12) + ((p) & 0x0000ffff)) +static int int10_set_mode(int mode); static int vesa_bios_get_mode(int mode, struct vesa_mode *vmode); static int vesa_bios_set_mode(int mode); static int vesa_bios_set_dac(int bits); @@ -146,6 +184,18 @@ dump_buffer(u_char *buf, size_t len) } } +/* INT 10 BIOS calls */ +static int +int10_set_mode(int mode) +{ + struct vm86frame vmf; + + bzero(&vmf, sizeof(vmf)); + vmf.vmf_eax = 0x0000 | mode; + vm86_intcall(0x10, &vmf); + return 0; +} + /* VESA BIOS calls */ static int vesa_bios_get_mode(int mode, struct vesa_mode *vmode) @@ -362,8 +412,10 @@ vesa_bios_init(void) if ((err != 0) || (vmf.vmf_eax != 0x4f) || bcmp("VESA", buf, 4)) return 1; vesa_adp_info = (struct vesa_info *)buf; - if (bootverbose) + if (bootverbose) { + printf("VESA: information block\n"); dump_buffer(buf, 64); + } if (vesa_adp_info->v_flags & V_NONVGA) return 1; @@ -446,42 +498,101 @@ vesa_clear_modes(video_info_t *info, int color) } } -/* exported functions */ +/* entry points */ static int -vesa_init(void) +vesa_configure(int flags) { + video_adapter_t *adp; int adapters; + int error; int i; - adapters = (*prevvidsw.init)(); - for (i = 0; i < adapters; ++i) { - if ((vesa_adp = (*prevvidsw.adapter)(i)) == NULL) - continue; - if (vesa_adp->va_type == KD_VGA) { - vesa_adp->va_flags |= V_ADP_VESA; - return adapters; - } + if (vesa_init_done) + return 0; + if (flags & VIO_PROBE_ONLY) + return 0; /* XXX */ + + /* + * If the VESA module has already been loaded, abort loading + * the module this time. + */ + for (i = 0; (adp = vid_get_adapter(i)) != NULL; ++i) { + if (adp->va_flags & V_ADP_VESA) + return ENXIO; + if (adp->va_type == KD_VGA) + break; } - vesa_adp = NULL; - return adapters; + /* + * The VGA adapter is not found. This is because either + * 1) the VGA driver has not been initialized, or 2) the VGA card + * is not present. If 1) is the case, we shall defer + * initialization for now and try again later. + */ + if (adp == NULL) { + vga_sub_configure = vesa_configure; + return ENODEV; + } + + /* count number of registered adapters */ + for (++i; vid_get_adapter(i) != NULL; ++i) + ; + adapters = i; + + /* call VESA BIOS */ + vesa_adp = adp; + if (vesa_bios_init()) { + vesa_adp = NULL; + return ENXIO; + } + vesa_adp->va_flags |= V_ADP_VESA; + + /* remove conflicting modes if we have more than one adapter */ + if (adapters > 1) { + vesa_clear_modes(vesa_vmode, + (vesa_adp->va_flags & V_ADP_COLOR) ? + V_INFO_COLOR : 0); + } + + if ((error = vesa_load_ioctl()) == 0) { + prevvidsw = vidsw[vesa_adp->va_index]; + vidsw[vesa_adp->va_index] = &vesavidsw; + vesa_init_done = TRUE; + } else { + vesa_adp = NULL; + return error; + } + + return 0; } -static video_adapter_t -*vesa_adapter(int ad) +static int +vesa_nop(void) +{ + return 0; +} + +static int +vesa_probe(int unit, video_adapter_t **adpp, void *arg, int flags) { - return (*prevvidsw.adapter)(ad); + return (*prevvidsw->probe)(unit, adpp, arg, flags); } static int -vesa_get_info(int ad, int mode, video_info_t *info) +vesa_init(int unit, video_adapter_t *adp, int flags) +{ + return (*prevvidsw->init)(unit, adp, flags); +} + +static int +vesa_get_info(video_adapter_t *adp, int mode, video_info_t *info) { int i; - if ((*prevvidsw.get_info)(ad, mode, info) == 0) + if ((*prevvidsw->get_info)(adp, mode, info) == 0) return 0; - if (ad != vesa_adp->va_index) + if (adp != vesa_adp) return 1; mode = vesa_map_gen_mode_num(vesa_adp->va_type, @@ -498,13 +609,13 @@ vesa_get_info(int ad, int mode, video_info_t *info) } static int -vesa_query_mode(int ad, video_info_t *info) +vesa_query_mode(video_adapter_t *adp, video_info_t *info) { int i; - if ((i = (*prevvidsw.query_mode)(ad, info)) != -1) + if ((i = (*prevvidsw->query_mode)(adp, info)) != -1) return i; - if (ad != vesa_adp->va_index) + if (adp != vesa_adp) return -1; for (i = 0; vesa_vmode[i].vi_mode != EOT; ++i) { @@ -536,17 +647,19 @@ vesa_query_mode(int ad, video_info_t *info) } static int -vesa_set_mode(int ad, int mode) +vesa_set_mode(video_adapter_t *adp, int mode) { video_info_t info; +#if 0 size_t len; +#endif - if (ad != vesa_adp->va_index) - return (*prevvidsw.set_mode)(ad, mode); + 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); -#ifdef SC_VIDEO_DEBUG +#if VESA_DEBUG > 0 printf("VESA: set_mode(): %d(%x) -> %d(%x)\n", vesa_adp->va_mode, vesa_adp->va_mode, mode, mode); #endif @@ -554,37 +667,40 @@ vesa_set_mode(int ad, int mode) * 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)() + * 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 ((*prevvidsw.get_info)(ad, mode, &info) == 0) { + 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(ad, vesa_state_buf)) + || vesa_load_state(adp, vesa_state_buf)) return 1; free(vesa_state_buf, M_DEVBUF); vesa_state_buf = NULL; -#ifdef SC_VIDEO_DEBUG +#if VESA_DEBUG > 0 printf("VESA: restored\n"); #endif +#endif /* 0 */ } /* - * 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... */ - if ((*prevvidsw.set_mode)(ad, mode) == 0) + if ((*prevvidsw->set_mode)(adp, mode) == 0) return 0; /* is the new mode supported? */ - if (vesa_get_info(ad, mode, &info)) + if (vesa_get_info(adp, mode, &info)) return 1; /* assert(VESA_MODE(mode)); */ -#ifdef SC_VIDEO_DEBUG +#if VESA_DEBUG > 0 printf("VESA: about to set a VESA mode...\n"); #endif /* @@ -592,27 +708,29 @@ vesa_set_mode(int ad, int mode) * 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(ad, NULL, 0); + len = vesa_save_state(adp, NULL, 0); vesa_state_buf = malloc(len, M_DEVBUF, M_WAITOK); - if (vesa_save_state(ad, vesa_state_buf, len)) { -#ifdef SC_VIDEO_DEBUG + 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; } -#ifdef SC_VIDEO_DEBUG +#if VESA_DEBUG > 0 printf("VESA: saved (len=%d)\n", len); dump_buffer(vesa_state_buf, len); #endif } +#endif /* 0 */ if (vesa_bios_set_mode(mode)) return 1; -#ifdef SC_VIDEO_DEBUG +#if VESA_DEBUG > 0 printf("VESA: mode set!\n"); #endif vesa_adp->va_mode = mode; @@ -620,7 +738,7 @@ vesa_set_mode(int ad, int mode) vesa_adp->va_flags |= (info.vi_flags & V_INFO_COLOR) ? V_ADP_COLOR : 0; vesa_adp->va_crtc_addr = - (vesa_adp->va_flags & V_ADP_COLOR) ? COLOR_BASE : MONO_BASE; + (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; @@ -632,58 +750,63 @@ vesa_set_mode(int ad, int mode) vesa_adp->va_buffer_size = info.vi_buffer_size; } + /* move hardware cursor out of the way */ + (*vidsw[adp->va_index]->set_hw_cursor)(adp, -1, -1); + return 0; } static int -vesa_save_font(int ad, int page, int fontsize, u_char *data, int ch, int count) +vesa_save_font(video_adapter_t *adp, int page, int fontsize, u_char *data, + int ch, int count) { - return (*prevvidsw.save_font)(ad, page, fontsize, data, ch, count); + return (*prevvidsw->save_font)(adp, page, fontsize, data, ch, count); } static int -vesa_load_font(int ad, int page, int fontsize, u_char *data, int ch, int count) +vesa_load_font(video_adapter_t *adp, int page, int fontsize, u_char *data, + int ch, int count) { - return (*prevvidsw.load_font)(ad, page, fontsize, data, ch, count); + return (*prevvidsw->load_font)(adp, page, fontsize, data, ch, count); } static int -vesa_show_font(int ad, int page) +vesa_show_font(video_adapter_t *adp, int page) { - return (*prevvidsw.show_font)(ad, page); + return (*prevvidsw->show_font)(adp, page); } static int -vesa_save_palette(int ad, u_char *palette) +vesa_save_palette(video_adapter_t *adp, u_char *palette) { - if ((ad != vesa_adp->va_index) || !(vesa_adp_info->v_flags & V_DAC8) + if ((adp != vesa_adp) || !(vesa_adp_info->v_flags & V_DAC8) || vesa_bios_set_dac(8)) - return (*prevvidsw.save_palette)(ad, palette); + return (*prevvidsw->save_palette)(adp, palette); return vesa_bios_save_palette(0, 256, palette); } static int -vesa_load_palette(int ad, u_char *palette) +vesa_load_palette(video_adapter_t *adp, u_char *palette) { - if ((ad != vesa_adp->va_index) || !(vesa_adp_info->v_flags & V_DAC8) + if ((adp != vesa_adp) || !(vesa_adp_info->v_flags & V_DAC8) || vesa_bios_set_dac(8)) - return (*prevvidsw.load_palette)(ad, palette); + return (*prevvidsw->load_palette)(adp, palette); return vesa_bios_load_palette(0, 256, palette); } static int -vesa_set_border(int ad, int color) +vesa_set_border(video_adapter_t *adp, int color) { - return (*prevvidsw.set_border)(ad, color); + return (*prevvidsw->set_border)(adp, color); } static int -vesa_save_state(int ad, void *p, size_t size) +vesa_save_state(video_adapter_t *adp, void *p, size_t size) { - if (ad != vesa_adp->va_index) - return (*prevvidsw.save_state)(ad, p, size); + if (adp != vesa_adp) + return (*prevvidsw->save_state)(adp, p, size); if (vesa_state_buf_size == 0) vesa_state_buf_size = vesa_bios_state_buf_size(); @@ -699,18 +822,17 @@ vesa_save_state(int ad, void *p, size_t size) } static int -vesa_load_state(int ad, void *p) +vesa_load_state(video_adapter_t *adp, void *p) { - if ((ad != vesa_adp->va_index) - || (((adp_state_t *)p)->sig != V_STATE_SIG)) - return (*prevvidsw.load_state)(ad, p); + if ((adp != vesa_adp) || (((adp_state_t *)p)->sig != V_STATE_SIG)) + return (*prevvidsw->load_state)(adp, p); return vesa_bios_save_restore(STATE_LOAD, ((adp_state_t *)p)->regs, vesa_state_buf_size); } static int -vesa_set_origin(int ad, off_t offset) +vesa_set_origin(video_adapter_t *adp, off_t offset) { struct vm86frame vmf; int err; @@ -721,8 +843,8 @@ vesa_set_origin(int ad, off_t offset) * error checking is kept minimal and let the VESA BIOS to * detect error. */ - if (ad != vesa_adp->va_index) - return (*prevvidsw.set_win_org)(ad, offset); + if (adp != vesa_adp) + return (*prevvidsw->set_win_org)(adp, offset); if (vesa_adp->va_window_gran == 0) return 1; @@ -735,26 +857,45 @@ vesa_set_origin(int ad, off_t offset) } static int -vesa_read_hw_cursor(int ad, int *col, int *row) +vesa_read_hw_cursor(video_adapter_t *adp, int *col, int *row) { - return (*prevvidsw.read_hw_cursor)(ad, col, row); + return (*prevvidsw->read_hw_cursor)(adp, col, row); } static int -vesa_set_hw_cursor(int ad, int col, int row) +vesa_set_hw_cursor(video_adapter_t *adp, int col, int row) { - return (*prevvidsw.set_hw_cursor)(ad, col, row); + return (*prevvidsw->set_hw_cursor)(adp, col, row); } static int -vesa_diag(int level) +vesa_set_hw_cursor_shape(video_adapter_t *adp, int base, int height, + int celsize, int blink) { + return (*prevvidsw->set_hw_cursor_shape)(adp, base, height, celsize, + blink); +} + +static int +vesa_mmap(video_adapter_t *adp, vm_offset_t offset) +{ + return (*prevvidsw->mmap)(adp, offset); +} + +static int +vesa_diag(video_adapter_t *adp, int level) +{ +#if VESA_DEBUG > 1 struct vesa_mode vmode; int i; +#endif + + if (adp != vesa_adp) + return 1; #ifndef KLD_MODULE /* call the previous handler first */ - (*prevvidsw.diag)(level); + (*prevvidsw->diag)(adp, level); #endif /* general adapter information */ @@ -784,6 +925,7 @@ vesa_diag(int level) printf("VESA: %s\n", vesa_revstr); } +#if VESA_DEBUG > 1 /* mode information */ for (i = 0; (i < (M_VESA_MODE_MAX - M_VESA_BASE + 1)) @@ -818,70 +960,31 @@ vesa_diag(int level) printf("size:%dk, gran:%dk\n", vmode.v_wsize, vmode.v_wgran); } +#endif return 0; } /* module loading */ -#ifdef KLD_MODULE -static -#endif -int +static int vesa_load(void) { - int adapters; int error; -#ifdef KLD_MODULE int s; -#endif - int i; if (vesa_init_done) return 0; - /* - * If the VESA module is statically linked to the kernel, or - * it has already been loaded, abort loading this module this time. - */ - vesa_adp = NULL; - adapters = (*biosvidsw.init)(); - for (i = 0; i < adapters; ++i) { - if ((vesa_adp = (*biosvidsw.adapter)(i)) == NULL) - continue; - if (vesa_adp->va_flags & V_ADP_VESA) - return ENXIO; - if (vesa_adp->va_type == KD_VGA) - break; - } - /* if a VGA adapter is not found, abort */ - if (i >= adapters) - return ENXIO; - - if (vesa_bios_init()) - return ENXIO; - vesa_adp->va_flags |= V_ADP_VESA; - - /* remove conflicting modes if we have more than one adapter */ - if (adapters > 1) { - vesa_clear_modes(vesa_vmode, - (vesa_adp->va_flags & V_ADP_COLOR) ? - V_INFO_COLOR : 0); - } - -#ifdef KLD_MODULE + /* locate a VGA adapter */ s = spltty(); -#endif - if ((error = vesa_load_ioctl()) == 0) { - bcopy(&biosvidsw, &prevvidsw, sizeof(prevvidsw)); - bcopy(&vesavidsw, &biosvidsw, sizeof(vesavidsw)); - vesa_init_done = TRUE; - } -#ifdef KLD_MODULE + vesa_adp = NULL; + error = vesa_configure(0); splx(s); +#ifdef KLD_MODULE if (error == 0) - vesa_diag(bootverbose); + vesa_diag(vesa_adp, bootverbose); #endif return error; @@ -905,9 +1008,9 @@ vesa_unload(void) s = spltty(); if ((error = vesa_unload_ioctl()) == 0) { - if (vesa_adp) + if (vesa_adp != NULL) vesa_adp->va_flags &= ~V_ADP_VESA; - bcopy(&prevvidsw, &biosvidsw, sizeof(biosvidsw)); + vidsw[vesa_adp->va_index] = prevvidsw; } splx(s); @@ -934,8 +1037,13 @@ static moduledata_t vesa_mod = { NULL, }; -DECLARE_MODULE(vesa, vesa_mod, SI_SUB_PSEUDO, SI_ORDER_MIDDLE); +DECLARE_MODULE(vesa, vesa_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE); + +#else /* KLD_MODULE */ + +SYSINIT(vesa, SI_SUB_DRIVERS, SI_ORDER_MIDDLE, + (void (*)(void *))vesa_load, NULL); #endif /* KLD_MODULE */ -#endif /* (NSC > 0 && VESA && VM86) || KLD_MODULE */ +#endif /* (NVGA > 0 && VESA && VM86) || KLD_MODULE */ diff --git a/sys/modules/syscons/blank/blank_saver.c b/sys/modules/syscons/blank/blank_saver.c index 9ad6e3f..89dd199 100644 --- a/sys/modules/syscons/blank/blank_saver.c +++ b/sys/modules/syscons/blank/blank_saver.c @@ -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: blank_saver.c,v 1.13 1998/09/17 19:40:29 sos Exp $ + * $Id: blank_saver.c,v 1.14 1998/11/04 03:49:38 peter Exp $ */ #include <sys/param.h> @@ -33,18 +33,18 @@ #include <sys/kernel.h> #include <sys/module.h> +#include <dev/fb/vgareg.h> + #include <i386/isa/isa.h> #include <saver.h> -static void -blank_saver(int blank) +static int +blank_saver(video_adapter_t *adp, int blank) { u_char val; if (blank) { - scrn_blanked = 1; - cur_console->status |= SAVER_RUNNING; - switch (crtc_type) { + switch (adp->va_type) { case KD_VGA: outb(TSIDX, 0x01); val = inb(TSREG); outb(TSIDX, 0x01); outb(TSREG, val | 0x20); @@ -53,18 +53,18 @@ blank_saver(int blank) /* not yet done XXX */ break; case KD_CGA: - outb(crtc_addr + 4, 0x25); + outb(adp->va_crtc_addr + 4, 0x25); break; case KD_MONO: case KD_HERCULES: - outb(crtc_addr + 4, 0x21); + outb(adp->va_crtc_addr + 4, 0x21); break; default: break; } } else { - switch (crtc_type) { + switch (adp->va_type) { case KD_VGA: outb(TSIDX, 0x01); val = inb(TSREG); outb(TSIDX, 0x01); outb(TSREG, val & 0xDF); @@ -73,24 +73,23 @@ blank_saver(int blank) /* not yet done XXX */ break; case KD_CGA: - outb(crtc_addr + 4, 0x2d); + outb(adp->va_crtc_addr + 4, 0x2d); break; case KD_MONO: case KD_HERCULES: - outb(crtc_addr + 4, 0x29); + outb(adp->va_crtc_addr + 4, 0x29); break; default: break; } - cur_console->status &= ~SAVER_RUNNING; - scrn_blanked = 0; } + return 0; } static int -blank_saver_load(void) +blank_init(video_adapter_t *adp) { - switch (crtc_type) { + switch (adp->va_type) { case KD_MONO: case KD_HERCULES: case KD_CGA: @@ -101,13 +100,17 @@ blank_saver_load(void) default: return ENODEV; } - return add_scrn_saver(blank_saver); + return 0; } static int -blank_saver_unload(void) +blank_term(video_adapter_t *adp) { - return remove_scrn_saver(blank_saver); + return 0; } -SAVER_MODULE(blank_saver); +static scrn_saver_t blank_module = { + "blank_saver", blank_init, blank_term, blank_saver, NULL, +}; + +SAVER_MODULE(blank_saver, blank_module); diff --git a/sys/modules/syscons/daemon/daemon_saver.c b/sys/modules/syscons/daemon/daemon_saver.c index d3f9036..8e45a72 100644 --- a/sys/modules/syscons/daemon/daemon_saver.c +++ b/sys/modules/syscons/daemon/daemon_saver.c @@ -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.11 1998/09/17 19:40:30 sos Exp $ + * $Id: daemon_saver.c,v 1.12 1998/11/04 03:49:38 peter Exp $ */ #include <sys/param.h> @@ -49,6 +49,7 @@ static char *message; static int messagelen; static u_short *window; +static int blanked; /* Who is the author of this ASCII pic? */ @@ -184,8 +185,8 @@ draw_string(int xpos, int ypos, int xoff, char *s, int len) scr_map[s[x]]|(FG_LIGHTGREEN|BG_BLACK)<<8; } -static void -daemon_saver(int blank) +static int +daemon_saver(video_adapter_t *adp, int blank) { static int txpos = 10, typos = 10; static int txdir = -1, tydir = -1; @@ -198,20 +199,19 @@ daemon_saver(int blank) int min, max; if (blank) { - if (!ISTEXTSC(scp)) - return; - if (scrn_blanked == 0) { - scp->status |= SAVER_RUNNING; - window = (u_short *)(*biosvidsw.adapter)(scp->adp)->va_window; + if (adp->va_mode_flags & V_INFO_GRAPHICS) + return ENODEV; + if (blanked == 0) { + window = (u_short *)adp->va_window; /* clear the screen and set the border color */ fillw(((FG_LIGHTGREY|BG_BLACK) << 8) | scr_map[0x20], window, scp->xsize * scp->ysize); set_border(scp, 0); xlen = ylen = tlen = 0; } - if (scrn_blanked++ < 2) - return; - scrn_blanked = 1; + if (blanked++ < 2) + return 0; + blanked = 1; clear_daemon(dxpos, dypos, dxdir, xoff, yoff, xlen, ylen); clear_string(txpos, typos, toff, (char *)message, tlen); @@ -322,39 +322,31 @@ daemon_saver(int blank) draw_daemon(dxpos, dypos, dxdir, xoff, yoff, xlen, ylen); draw_string(txpos, typos, toff, (char *)message, tlen); } else { - if (scrn_blanked > 0) { - set_border(scp, scp->border); - scrn_blanked = 0; - scp->status &= ~SAVER_RUNNING; - } + blanked = 0; } + return 0; } static int -daemon_saver_load(void) +daemon_init(video_adapter_t *adp) { - int err; - messagelen = strlen(hostname) + 3 + strlen(ostype) + 1 + strlen(osrelease); message = malloc(messagelen + 1, M_DEVBUF, M_WAITOK); sprintf(message, "%s - %s %s", hostname, ostype, osrelease); - - err = add_scrn_saver(daemon_saver); - if (err != 0) - free(message, M_DEVBUF); - return err; + blanked = 0; + return 0; } static int -daemon_saver_unload(void) +daemon_term(video_adapter_t *adp) { - int err; - - err = remove_scrn_saver(daemon_saver); - if (err == 0) - free(message, M_DEVBUF); - return err; + free(message, M_DEVBUF); + return 0; } -SAVER_MODULE(daemon_saver); +static scrn_saver_t daemon_module = { + "daemon_saver", daemon_init, daemon_term, daemon_saver, NULL, +}; + +SAVER_MODULE(daemon_saver, daemon_module); diff --git a/sys/modules/syscons/fade/fade_saver.c b/sys/modules/syscons/fade/fade_saver.c index 3a2cc0c..70d36c9 100644 --- a/sys/modules/syscons/fade/fade_saver.c +++ b/sys/modules/syscons/fade/fade_saver.c @@ -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: fade_saver.c,v 1.14 1998/09/17 19:40:30 sos Exp $ + * $Id: fade_saver.c,v 1.15 1998/11/04 03:49:38 peter Exp $ */ #include <sys/param.h> @@ -37,18 +37,22 @@ #include <saver.h> -static void -fade_saver(int blank) +static u_char palette[256*3]; +static int blanked; + +static int +fade_saver(video_adapter_t *adp, int blank) { static int count = 0; u_char pal[256*3]; int i; if (blank) { - scrn_blanked = 1; - cur_console->status |= SAVER_RUNNING; - switch (crtc_type) { + blanked = TRUE; + switch (adp->va_type) { case KD_VGA: + if (count <= 0) + save_palette(adp, palette); if (count < 64) { pal[0] = pal[1] = pal[2] = 0; for (i = 3; i < 256*3; i++) { @@ -57,7 +61,7 @@ fade_saver(int blank) else pal[i] = 60; } - load_palette(cur_console, pal); + load_palette(adp, pal); count++; } break; @@ -65,44 +69,44 @@ fade_saver(int blank) /* not yet done XXX */ break; case KD_CGA: - outb(crtc_addr + 4, 0x25); + outb(adp->va_crtc_addr + 4, 0x25); break; case KD_MONO: case KD_HERCULES: - outb(crtc_addr + 4, 0x21); + outb(adp->va_crtc_addr + 4, 0x21); break; default: break; } } else { - switch (crtc_type) { + switch (adp->va_type) { case KD_VGA: - load_palette(cur_console, palette); + load_palette(adp, palette); count = 0; break; case KD_EGA: /* not yet done XXX */ break; case KD_CGA: - outb(crtc_addr + 4, 0x2d); + outb(adp->va_crtc_addr + 4, 0x2d); break; case KD_MONO: case KD_HERCULES: - outb(crtc_addr + 4, 0x29); + outb(adp->va_crtc_addr + 4, 0x29); break; default: break; } - cur_console->status &= ~SAVER_RUNNING; - scrn_blanked = 0; + blanked = FALSE; } + return 0; } static int -fade_saver_load(void) +fade_init(video_adapter_t *adp) { - switch (crtc_type) { + switch (adp->va_type) { case KD_MONO: case KD_HERCULES: case KD_CGA: @@ -117,13 +121,18 @@ fade_saver_load(void) default: return ENODEV; } - return add_scrn_saver(fade_saver); + blanked = FALSE; + return 0; } static int -fade_saver_unload(void) +fade_term(video_adapter_t *adp) { - return remove_scrn_saver(fade_saver); + return 0; } -SAVER_MODULE(fade_saver); +static scrn_saver_t fade_module = { + "fade_saver", fade_init, fade_term, fade_saver, NULL, +}; + +SAVER_MODULE(fade_saver, fade_module); diff --git a/sys/modules/syscons/green/green_saver.c b/sys/modules/syscons/green/green_saver.c index 0491c67..9decd72 100644 --- a/sys/modules/syscons/green/green_saver.c +++ b/sys/modules/syscons/green/green_saver.c @@ -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: green_saver.c,v 1.13 1998/09/17 19:40:30 sos Exp $ + * $Id: green_saver.c,v 1.14 1998/11/04 03:49:38 peter Exp $ */ #include <sys/param.h> @@ -33,18 +33,21 @@ #include <sys/kernel.h> #include <sys/module.h> +#include <dev/fb/vgareg.h> + #include <i386/isa/isa.h> #include <saver.h> -static void -green_saver(int blank) +static int +green_saver(video_adapter_t *adp, int blank) { + int crtc_addr; u_char val; + + crtc_addr = adp->va_crtc_addr; if (blank) { - scrn_blanked = 1; - cur_console->status |= SAVER_RUNNING; - switch (crtc_type) { + switch (adp->va_type) { case KD_VGA: outb(TSIDX, 0x01); val = inb(TSREG); outb(TSIDX, 0x01); outb(TSREG, val | 0x20); @@ -66,7 +69,7 @@ green_saver(int blank) } } else { - switch (crtc_type) { + switch (adp->va_type) { case KD_VGA: outb(TSIDX, 0x01); val = inb(TSREG); outb(TSIDX, 0x01); outb(TSREG, val & 0xDF); @@ -86,15 +89,14 @@ green_saver(int blank) default: break; } - cur_console->status &= ~SAVER_RUNNING; - scrn_blanked = 0; } + return 0; } static int -green_saver_load(void) +green_init(video_adapter_t *adp) { - switch (crtc_type) { + switch (adp->va_type) { case KD_MONO: case KD_HERCULES: case KD_CGA: @@ -109,13 +111,17 @@ green_saver_load(void) default: return ENODEV; } - return add_scrn_saver(green_saver); + return 0; } static int -green_saver_unload(void) +green_term(video_adapter_t *adp) { - return remove_scrn_saver(green_saver); + return 0; } -SAVER_MODULE(green_saver); +static scrn_saver_t green_module = { + "green_saver", green_init, green_term, green_saver, NULL, +}; + +SAVER_MODULE(green_saver, green_module); diff --git a/sys/modules/syscons/logo/logo_saver.c b/sys/modules/syscons/logo/logo_saver.c index ff42be0..105fcae 100644 --- a/sys/modules/syscons/logo/logo_saver.c +++ b/sys/modules/syscons/logo/logo_saver.c @@ -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.1 1998/12/28 14:22:57 des Exp $ + * $Id: logo_saver.c,v 1.2 1999/01/01 14:40:49 des Exp $ */ #include <sys/param.h> @@ -34,26 +34,24 @@ #include <sys/module.h> #include <sys/syslog.h> -#include <machine/md_var.h> - #include <saver.h> static u_char *vid; static int banksize, scrmode, scrw, scrh; -static u_char save_pal[768]; +static int blanked; #include "logo.c" -#define set_origin(scp, o) (*biosvidsw.set_win_org)((scp)->adp, o) +#define set_origin(adp, o) (*vidsw[(adp)->va_index]->set_win_org)(adp, o) static void -logo_blit(int x, int y) +logo_blit(video_adapter_t *adp, int x, int y) { int d, l, o, p; for (o = 0, p = y * scrw + x; p > banksize; p -= banksize) o += banksize; - set_origin(cur_console, o); + set_origin(adp, o); for (d = 0; d < sizeof logo_img; d += logo_w) { if (p + logo_w < banksize) { @@ -62,12 +60,12 @@ logo_blit(int x, int y) } else if (p < banksize) { l = banksize - p; bcopy(logo_img + d, vid + p, l); - set_origin(cur_console, (o += banksize)); + set_origin(adp, (o += banksize)); bcopy(logo_img + d + l, vid, logo_w - l); p += scrw - banksize; } else { p -= banksize; - set_origin(cur_console, (o += banksize)); + set_origin(adp, (o += banksize)); bcopy(logo_img + d, vid + p, logo_w); p += scrw; } @@ -75,7 +73,7 @@ logo_blit(int x, int y) } static void -logo_update(void) +logo_update(video_adapter_t *adp) { static int xpos = 0, ypos = 0; static int xinc = 1, yinc = 1; @@ -89,62 +87,42 @@ logo_update(void) ypos += yinc; /* XXX Relies on margin around logo to erase trail */ - logo_blit(xpos, ypos); + logo_blit(adp, xpos, ypos); } -static void -logo_saver(int blank) +static int +logo_saver(video_adapter_t *adp, int blank) { - scr_stat *scp = cur_console; - static int saved_mode; int i, pl; if (blank) { /* switch to graphics mode */ - if (scrn_blanked <= 0) { + if (blanked <= 0) { pl = splhigh(); - saved_mode = scp->mode; - scp->mode = scrmode; - scp->status |= SAVER_RUNNING|GRAPHICS_MODE; - save_palette(scp, (char *)save_pal); - set_mode(scp); - load_palette(scp, (char *)logo_pal); - scrn_blanked++; - vid = (u_char *)Crtat; + set_video_mode(adp, scrmode, logo_pal, 0); + blanked++; + vid = (u_char *)adp->va_window; splx(pl); for (i = 0; i < scrw*scrh; i += banksize) { - set_origin(scp, i); + set_origin(adp, i); bzero(vid, banksize); } } - logo_update(); + logo_update(adp); } else { - /* return to previous video mode */ - if (scrn_blanked > 0) { - if (saved_mode) { - pl = splhigh(); - scrn_blanked = 0; - scp->mode = saved_mode; - scp->status &= ~(SAVER_RUNNING|GRAPHICS_MODE); - set_mode(scp); - load_palette(scp, (char *)save_pal); - saved_mode = 0; - splx(pl); - } - } + blanked = 0; } + return 0; } static int -logo_saver_load(void) +logo_init(video_adapter_t *adp) { video_info_t info; - int adp; - adp = cur_console->adp; - if (!(*biosvidsw.get_info)(adp, M_VESA_CG800x600, &info)) { + if (!get_mode_info(adp, M_VESA_CG800x600, &info)) { scrmode = M_VESA_CG800x600; - } else if (!(*biosvidsw.get_info)(adp, M_VGA_CG320, &info)) { + } else if (!get_mode_info(adp, M_VGA_CG320, &info)) { scrmode = M_VGA_CG320; } else { log(LOG_NOTICE, "logo_saver: no suitable graphics mode\n"); @@ -154,14 +132,19 @@ logo_saver_load(void) banksize = info.vi_window_size; scrw = info.vi_width; scrh = info.vi_height; + blanked = 0; - return add_scrn_saver(logo_saver); + return 0; } static int -logo_saver_unload(void) +logo_term(video_adapter_t *adp) { - return remove_scrn_saver(logo_saver); + return 0; } -SAVER_MODULE(logo_saver); +static scrn_saver_t logo_module = { + "logo_saver", logo_init, logo_term, logo_saver, NULL, +}; + +SAVER_MODULE(logo_saver, logo_module); diff --git a/sys/modules/syscons/rain/rain_saver.c b/sys/modules/syscons/rain/rain_saver.c index 0ca46c8..0b4b2ee 100644 --- a/sys/modules/syscons/rain/rain_saver.c +++ b/sys/modules/syscons/rain/rain_saver.c @@ -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$ + * $Id: rain_saver.c,v 1.1 1998/12/31 13:41:40 des Exp $ */ #include <sys/param.h> @@ -34,7 +34,6 @@ #include <sys/module.h> #include <sys/syslog.h> -#include <machine/md_var.h> #include <machine/random.h> #include <saver.h> @@ -45,11 +44,11 @@ static u_char *vid; #define SCRH 200 #define MAX 63 -static u_char save_pal[768]; static u_char rain_pal[768]; +static int blanked; static void -rain_update(void) +rain_update(video_adapter_t *adp) { int i, t; @@ -57,28 +56,21 @@ rain_update(void) for (i = (MAX*3+2); i > 5; i -= 3) rain_pal[i] = rain_pal[i-3]; rain_pal[5] = t; - load_palette(cur_console, rain_pal); + load_palette(adp, rain_pal); } -static void -rain_saver(int blank) +static int +rain_saver(video_adapter_t *adp, int blank) { - scr_stat *scp = cur_console; - static int saved_mode; int i, j, k, pl; if (blank) { /* switch to graphics mode */ - if (scrn_blanked <= 0) { + if (blanked <= 0) { pl = splhigh(); - saved_mode = scp->mode; - scp->mode = M_VGA_CG320; - scp->status |= SAVER_RUNNING|GRAPHICS_MODE; - save_palette(scp, save_pal); - set_mode(scp); - load_palette(scp, rain_pal); - scrn_blanked++; - vid = (u_char *)Crtat; + set_video_mode(adp, M_VGA_CG320, rain_pal, 0); + blanked++; + vid = (u_char *)adp->va_window; splx(pl); bzero(vid, SCRW*SCRH); for (i = 0; i < SCRW; i += 2) @@ -89,33 +81,22 @@ rain_saver(int blank) } /* update display */ - rain_update(); + rain_update(adp); } else { - /* return to previous video mode */ - if (scrn_blanked > 0) { - if (saved_mode) { - pl = splhigh(); - scrn_blanked = 0; - scp->mode = saved_mode; - scp->status &= ~(SAVER_RUNNING|GRAPHICS_MODE); - set_mode(scp); - load_palette(scp, save_pal); - saved_mode = 0; - splx(pl); - } - } + blanked = 0; } + return 0; } static int -rain_saver_load(void) +rain_init(video_adapter_t *adp) { video_info_t info; int i; /* check that the console is capable of running in 320x200x256 */ - if ((*biosvidsw.get_info)(cur_console->adp, M_VGA_CG320, &info)) { + if (get_mode_info(adp, M_VGA_CG320, &info)) { log(LOG_NOTICE, "rain_saver: the console does not support M_VGA_CG320\n"); return ENODEV; } @@ -123,14 +104,20 @@ rain_saver_load(void) /* intialize the palette */ for (i = 3; i < (MAX+1)*3; i += 3) rain_pal[i+2] = rain_pal[i-1] + 4; - - return add_scrn_saver(rain_saver); + + blanked = 0; + + return 0; } static int -rain_saver_unload(void) +rain_term(video_adapter_t *adp) { - return remove_scrn_saver(rain_saver); + return 0; } -SAVER_MODULE(rain_saver); +static scrn_saver_t rain_module = { + "rain_saver", rain_init, rain_term, rain_saver, NULL, +}; + +SAVER_MODULE(rain_saver, rain_module); diff --git a/sys/modules/syscons/saver.h b/sys/modules/syscons/saver.h index 6be8a70..6e4c8f5 100644 --- a/sys/modules/syscons/saver.h +++ b/sys/modules/syscons/saver.h @@ -25,40 +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: saver.h,v 1.13 1998/11/04 03:49:38 peter Exp $ + * $Id: saver.h,v 1.14 1998/12/31 13:40:26 des Exp $ */ #include <machine/apm_bios.h> #include <machine/console.h> -#include <i386/isa/videoio.h> -#include <i386/isa/syscons.h> +#include <dev/fb/fbreg.h> +#include <dev/fb/splashreg.h> +#include <dev/syscons/syscons.h> + +#define set_video_mode(adp, mode, pal, border) \ + { \ + (*vidsw[(adp)->va_index]->set_mode)((adp), (mode)); \ + (*vidsw[(adp)->va_index]->load_palette)((adp), (pal)); \ + (*vidsw[(adp)->va_index]->set_border)((adp), (border)); \ + } +#define get_mode_info(adp, mode, buf) \ + (*vidsw[(adp)->va_index]->get_info)((adp), (mode), (buf)) + extern scr_stat *cur_console; -extern u_short *Crtat; -extern u_int crtc_addr; -extern char crtc_type; extern char scr_map[]; -extern int scrn_blanked; -extern int fonts_loaded; -extern char font_8[], font_14[], font_16[]; -extern char palette[]; - -#define SAVER_MODULE(name) \ - static int name ## _modevent(module_t mod, int type, void *data) \ - { \ - switch ((modeventtype_t)type) { \ - case MOD_LOAD: \ - return name ## _load(); \ - case MOD_UNLOAD: \ - return name ## _unload(); \ - default: \ - break; \ - } \ - return 0; \ - } \ - static moduledata_t name ## _mod = { \ - #name, \ - name ## _modevent, \ - NULL \ - }; \ - DECLARE_MODULE(name, name ## _mod, SI_SUB_PSEUDO, SI_ORDER_MIDDLE) diff --git a/sys/modules/syscons/snake/snake_saver.c b/sys/modules/syscons/snake/snake_saver.c index 3100ff3..c7c9ff5 100644 --- a/sys/modules/syscons/snake/snake_saver.c +++ b/sys/modules/syscons/snake/snake_saver.c @@ -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.19 1998/09/17 19:40:30 sos Exp $ + * $Id: snake_saver.c,v 1.20 1998/11/04 03:49:39 peter Exp $ */ #include <sys/param.h> @@ -44,9 +44,10 @@ static char *message; static u_char **messagep; static int messagelen; static u_short *window; +static int blanked; -static void -snake_saver(int blank) +static int +snake_saver(video_adapter_t *adp, int blank) { static int dirx, diry; int f; @@ -57,12 +58,11 @@ snake_saver(int blank) #define savs messagep if (blank) { - if (!ISTEXTSC(scp)) - return; - if (scrn_blanked <= 0) { - scp->status |= SAVER_RUNNING; - window = (u_short *)(*biosvidsw.adapter)(scp->adp)->va_window; - fillw((FG_LIGHTGREY|BG_BLACK)<<8 | scr_map[0x20], + if (adp->va_mode_flags & V_INFO_GRAPHICS) + return ENODEV; + if (blanked <= 0) { + window = (u_short *)adp->va_window; + fillw(((FG_LIGHTGREY|BG_BLACK)<<8) | scr_map[0x20], window, scp->xsize * scp->ysize); set_border(scp, 0); dirx = (scp->xpos ? 1 : -1); @@ -72,16 +72,11 @@ snake_saver(int blank) savs[f] = (u_char *)window + 2 * (scp->xpos+scp->ypos*scp->xsize); *(savs[0]) = scr_map[*save]; - f = scp->ysize * scp->xsize + 5; - outb(crtc_addr, 14); - outb(crtc_addr+1, f >> 8); - outb(crtc_addr, 15); - outb(crtc_addr+1, f & 0xff); - scrn_blanked = 1; + blanked = 1; } - if (scrn_blanked++ < 4) - return; - scrn_blanked = 1; + if (blanked++ < 4) + return 0; + blanked = 1; *(savs[messagelen-1]) = scr_map[0x20]; for (f=messagelen-1; f > 0; f--) savs[f] = savs[f-1]; @@ -99,43 +94,31 @@ snake_saver(int blank) *(savs[f]) = scr_map[save[f]]; } else { - if (scrn_blanked > 0) { - set_border(scp, scp->border); - scrn_blanked = 0; - scp->status &= ~SAVER_RUNNING; - } + blanked = 0; } + return 0; } static int -snake_saver_load(void) +snake_init(video_adapter_t *adp) { - int err; - messagelen = strlen(ostype) + 1 + strlen(osrelease); message = malloc(messagelen + 1, M_DEVBUF, M_WAITOK); sprintf(message, "%s %s", ostype, osrelease); messagep = malloc(messagelen * sizeof *messagep, M_DEVBUF, M_WAITOK); - - err = add_scrn_saver(snake_saver); - if (err != 0) { - free(message, M_DEVBUF); - free(messagep, M_DEVBUF); - } - return err; + return 0; } static int -snake_saver_unload(void) +snake_term(video_adapter_t *adp) { - int err; - - err = remove_scrn_saver(snake_saver); - if (err == 0) { - free(message, M_DEVBUF); - free(messagep, M_DEVBUF); - } - return err; + free(message, M_DEVBUF); + free(messagep, M_DEVBUF); + return 0; } -SAVER_MODULE(snake_saver); +static scrn_saver_t snake_module = { + "snake_saver", snake_init, snake_term, snake_saver, NULL, +}; + +SAVER_MODULE(snake_saver, snake_module); diff --git a/sys/modules/syscons/star/star_saver.c b/sys/modules/syscons/star/star_saver.c index 719d502..ca4b588 100644 --- a/sys/modules/syscons/star/star_saver.c +++ b/sys/modules/syscons/star/star_saver.c @@ -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: star_saver.c,v 1.16 1998/09/17 19:40:30 sos Exp $ + * $Id: star_saver.c,v 1.17 1998/11/04 03:49:39 peter Exp $ */ #include <sys/param.h> @@ -41,13 +41,14 @@ #define NUM_STARS 50 static u_short *window; +static int blanked; /* * Alternate saver that got its inspiration from a well known utility * package for an inferior^H^H^H^H^H^Hfamous OS. */ -static void -star_saver(int blank) +static int +star_saver(video_adapter_t *adp, int blank) { scr_stat *scp = cur_console; int cell, i; @@ -57,15 +58,15 @@ star_saver(int blank) static u_short stars[NUM_STARS][2]; if (blank) { - if (!ISTEXTSC(scp)) - return; - if (scrn_blanked <= 0) { - scp->status |= SAVER_RUNNING; - window = (u_short *)(*biosvidsw.adapter)(scp->adp)->va_window; - scrn_blanked = 1; - fillw((FG_LIGHTGREY|BG_BLACK)<<8|scr_map[0x20], window, - scp->xsize * scp->ysize); + if (adp->va_mode_flags & V_INFO_GRAPHICS) + return ENODEV; + if (!blanked) { + window = (u_short *)adp->va_window; + /* clear the screen and set the border color */ + fillw(((FG_LIGHTGREY|BG_BLACK) << 8) | scr_map[0x20], + window, scp->xsize * scp->ysize); set_border(scp, 0); + blanked = TRUE; for(i=0; i<NUM_STARS; i++) { stars[i][0] = random() % (scp->xsize*scp->ysize); @@ -82,24 +83,26 @@ star_saver(int blank) } } else { - if (scrn_blanked > 0) { - set_border(scp, scp->border); - scrn_blanked = 0; - scp->status &= ~SAVER_RUNNING; - } + blanked = FALSE; } + return 0; } static int -star_saver_load(void) +star_init(video_adapter_t *adp) { - return add_scrn_saver(star_saver); + blanked = FALSE; + return 0; } static int -star_saver_unload(void) +star_term(video_adapter_t *adp) { - return remove_scrn_saver(star_saver); + return 0; } -SAVER_MODULE(star_saver); +static scrn_saver_t star_module = { + "star_saver", star_init, star_term, star_saver, NULL, +}; + +SAVER_MODULE(star_saver, star_module); diff --git a/sys/modules/syscons/warp/warp_saver.c b/sys/modules/syscons/warp/warp_saver.c index e84f1ad..ef0afa2 100644 --- a/sys/modules/syscons/warp/warp_saver.c +++ b/sys/modules/syscons/warp/warp_saver.c @@ -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.2 1998/12/28 14:20:13 des Exp $ + * $Id: warp_saver.c,v 1.3 1998/12/31 13:38:59 des Exp $ */ #include <sys/param.h> @@ -40,6 +40,7 @@ #include <saver.h> static u_char *vid; +static int blanked; #define SCRW 320 #define SCRH 200 @@ -47,7 +48,6 @@ static u_char *vid; #define STARS (SPP*(1+2+4+8)) static int star[STARS]; -static u_char save_pal[768]; static u_char warp_pal[768] = { 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, @@ -72,25 +72,18 @@ warp_update(void) } } -static void -warp_saver(int blank) +static int +warp_saver(video_adapter_t *adp, int blank) { - scr_stat *scp = cur_console; - static int saved_mode; int pl; if (blank) { /* switch to graphics mode */ - if (scrn_blanked <= 0) { + if (blanked <= 0) { pl = splhigh(); - saved_mode = scp->mode; - scp->mode = M_VGA_CG320; - scp->status |= SAVER_RUNNING|GRAPHICS_MODE; - save_palette(scp, save_pal); - set_mode(scp); - load_palette(scp, warp_pal); - scrn_blanked++; - vid = (u_char *)Crtat; + set_video_mode(adp, M_VGA_CG320, warp_pal, 0); + blanked++; + vid = (u_char *)adp->va_window; splx(pl); bzero(vid, SCRW*SCRH); } @@ -99,30 +92,19 @@ warp_saver(int blank) warp_update(); } else { - /* return to previous video mode */ - if (scrn_blanked > 0) { - if (saved_mode) { - pl = splhigh(); - scrn_blanked = 0; - scp->mode = saved_mode; - scp->status &= ~(SAVER_RUNNING|GRAPHICS_MODE); - set_mode(scp); - load_palette(scp, save_pal); - saved_mode = 0; - splx(pl); - } - } + blanked = 0; } + return 0; } static int -warp_saver_load(void) +warp_init(video_adapter_t *adp) { video_info_t info; int i; /* check that the console is capable of running in 320x200x256 */ - if ((*biosvidsw.get_info)(cur_console->adp, M_VGA_CG320, &info)) { + if (get_mode_info(adp, M_VGA_CG320, &info)) { log(LOG_NOTICE, "warp_saver: the console does not support M_VGA_CG320\n"); return ENODEV; } @@ -132,13 +114,19 @@ warp_saver_load(void) star[i] = random() % (SCRW*SCRH); } - return add_scrn_saver(warp_saver); + blanked = 0; + + return 0; } static int -warp_saver_unload(void) +warp_term(video_adapter_t *adp) { - return remove_scrn_saver(warp_saver); + return 0; } -SAVER_MODULE(warp_saver); +static scrn_saver_t warp_module = { + "warp_saver", warp_init, warp_term, warp_saver, NULL, +}; + +SAVER_MODULE(warp_saver, warp_module); diff --git a/sys/modules/vesa/Makefile b/sys/modules/vesa/Makefile index a44334c..6de1c87 100644 --- a/sys/modules/vesa/Makefile +++ b/sys/modules/vesa/Makefile @@ -1,18 +1,32 @@ -# $Id: Makefile,v 1.3 1998/10/16 04:30:51 peter Exp $ +# $Id: Makefile,v 1.4 1998/12/30 11:21:07 yokota Exp $ -.PATH: ${.CURDIR}/../../i386/isa +.PATH: ${.CURDIR}/../../dev/syscons ${.CURDIR}/../../i386/isa KMOD = vesa -SRCS = vesa.c scvesactl.c sc.h opt_vesa.h opt_vm86.h +SRCS = vesa.c scvesactl.c sc.h vga.h opt_syscons.h opt_vga.h \ + opt_vesa.h opt_vm86.h opt_fb.h NOMAN = -CLEANFILES += sc.h opt_vesa.h opt_vm86.h +CLEANFILES += sc.h vga.h opt_syscons.h opt_vga.h opt_vesa.h opt_vm86.h \ + opt_fb.h sc.h: echo "#define NSC 1" > sc.h +vga.h: + echo "#define NVGA 1" > vga.h + +opt_syscons.h: + touch opt_syscons.h + +opt_vga.h: + touch opt_vga.h + opt_vesa.h: echo "#define VESA 1" > opt_vesa.h opt_vm86.h: echo "#define VM86 1" > opt_vm86.h +opt_fb.h: + touch opt_fb.h + .include <bsd.kmod.mk> |