diff options
author | yokota <yokota@FreeBSD.org> | 1999-01-19 11:31:22 +0000 |
---|---|---|
committer | yokota <yokota@FreeBSD.org> | 1999-01-19 11:31:22 +0000 |
commit | 293d6c3fb6d416ab198f62f042e8400f6dadb734 (patch) | |
tree | 3afd1a71d28f2320c4775cad2f0eee29a8aacaec /sys | |
parent | 74f1f33e16c6442f35583fc9dad25b4eb21a7d90 (diff) | |
download | FreeBSD-src-293d6c3fb6d416ab198f62f042e8400f6dadb734.zip FreeBSD-src-293d6c3fb6d416ab198f62f042e8400f6dadb734.tar.gz |
syscons
- Bring down the splash screen when a vty is opened for the first
time.
- Make sure the splash screen/screen saver is stopped before
switching vtys.
- Read and save initial values in the BIOS data area early.
VESA BIOS may change BIOS data values when switching modes.
- Fix missing '&' operator.
- Move ISA specific part of driver initialization to syscons_isa.c.
atkbd
- kbdtables.h is now in /sys/dev/kbd.
all
- Adjust for forthcoming alpha port. Submitted by: dfr
Diffstat (limited to 'sys')
-rw-r--r-- | sys/conf/files.i386 | 3 | ||||
-rw-r--r-- | sys/dev/atkbdc/atkbd.c | 19 | ||||
-rw-r--r-- | sys/dev/fb/fb.c | 7 | ||||
-rw-r--r-- | sys/dev/fb/fbreg.h | 8 | ||||
-rw-r--r-- | sys/dev/kbd/atkbd.c | 19 | ||||
-rw-r--r-- | sys/dev/kbd/kbdreg.h | 4 | ||||
-rw-r--r-- | sys/dev/syscons/scvidctl.c | 4 | ||||
-rw-r--r-- | sys/dev/syscons/syscons.c | 264 | ||||
-rw-r--r-- | sys/dev/syscons/syscons.h | 7 | ||||
-rw-r--r-- | sys/i386/conf/files.i386 | 3 | ||||
-rw-r--r-- | sys/i386/isa/atkbd_isa.c | 4 | ||||
-rw-r--r-- | sys/i386/isa/syscons_isa.c | 74 |
12 files changed, 313 insertions, 103 deletions
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386 index 9aa97d4..06480c0 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.217 1999/01/01 08:09:58 peter Exp $ +# $Id: files.i386,v 1.218 1999/01/11 03:18:35 yokota Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -245,6 +245,7 @@ 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_isa.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 diff --git a/sys/dev/atkbdc/atkbd.c b/sys/dev/atkbdc/atkbd.c index 59f265c..653e295 100644 --- a/sys/dev/atkbdc/atkbd.c +++ b/sys/dev/atkbdc/atkbd.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: atkbd.c,v 1.1 1999/01/09 02:44:49 yokota Exp $ + * $Id: atkbd.c,v 1.2 1999/01/13 11:19:19 yokota Exp $ */ #include "atkbd.h" @@ -47,6 +47,8 @@ #ifndef __i386__ +#include <isa/isareg.h> + #define ATKBD_SOFTC(unit) \ ((atkbd_softc_t *)devclass_get_softc(atkbd_devclass, unit)) @@ -192,7 +194,7 @@ atkbd_timeout(void *arg) */ (*kbdsw[kbd->kb_index]->lock)(kbd, FALSE); if ((*kbdsw[kbd->kb_index]->check_char)(kbd)) - (*kbdsw[kbd->kb_index]->intr)(kbd, NULL); + (*kbdsw[kbd->kb_index]->intr)(kbd); } splx(s); timeout(atkbd_timeout, arg, hz/10); @@ -331,7 +333,7 @@ static int get_kbd_id(KBDC kbdc); /* local variables */ /* the initial key map, accent map and fkey strings */ -#include <i386/isa/kbdtables.h> +#include <dev/kbd/kbdtables.h> /* structures for the default keyboard */ static keyboard_t default_kbd; @@ -524,7 +526,7 @@ atkbd_term(keyboard_t *kbd) /* keyboard interrupt routine */ static int -atkbd_intr(keyboard_t *kbd, void *arg) +atkbd_intr(keyboard_t *kbd) { atkbd_state_t *state; int c; @@ -1204,6 +1206,15 @@ init_keyboard(KBDC kbdc, int *type, int flags) } } +#ifdef __alpha__ + if (send_kbd_command_and_data( + kbdc, KBDC_SET_SCANCODE_SET, 2) != KBD_ACK) { + printf("atkbd: can't set translation.\n"); + + } + c |= KBD_TRANSLATION; +#endif + /* enable the keyboard port and intr. */ if (!set_controller_command_byte(kbdc, KBD_KBD_CONTROL_BITS | KBD_TRANSLATION | KBD_OVERRIDE_KBD_LOCK, diff --git a/sys/dev/fb/fb.c b/sys/dev/fb/fb.c index faa9c20..99d15f8 100644 --- a/sys/dev/fb/fb.c +++ b/sys/dev/fb/fb.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: fb.c,v 1.1 1999/01/09 02:44:49 yokota Exp $ + * $Id: fb.c,v 1.2 1999/01/12 10:35:50 yokota Exp $ */ #include "fb.h" @@ -394,8 +394,9 @@ fb_dump_adp_info(char *driver, video_adapter_t *adp, int level) adp->va_initial_mode, adp->va_initial_bios_mode, adp->va_mode); printf("%s%d: window:0x%x size:%dk gran:%dk, buf:0x%x size:%dk\n", DRIVER_NAME, adp->va_index, - adp->va_window, adp->va_window_size/1024, adp->va_window_gran/1024, - adp->va_buffer, adp->va_buffer_size/1024); + adp->va_window, (int)adp->va_window_size/1024, + (int)adp->va_window_gran/1024, adp->va_buffer, + (int)adp->va_buffer_size/1024); } void diff --git a/sys/dev/fb/fbreg.h b/sys/dev/fb/fbreg.h index ee5b1f2..46f0343 100644 --- a/sys/dev/fb/fbreg.h +++ b/sys/dev/fb/fbreg.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: $ + * $Id: fbreg.h,v 1.1 1999/01/09 02:44:49 yokota Exp $ */ #ifndef _DEV_FB_FBREG_H_ @@ -35,9 +35,9 @@ /* some macros */ #ifdef __i386__ -#define bcopy_toio(s, d, c) generic_bcopy(s, d, c) -#define bcopy_fromio(s, d, c) generic_bcopy(s, d, c) -#define bzero_io(d, c) generic_bzero(d, c) +#define bcopy_toio(s, d, c) generic_bcopy((void *)(s), (void *)(d), c) +#define bcopy_fromio(s, d, c) generic_bcopy((void *)(s), (void *)(d), c) +#define bzero_io(d, c) generic_bzero((void *)(d), c) void generic_bcopy(const void *s, void *d, size_t c); void generic_bzero(void *d, size_t c); #else /* !__i386__ */ diff --git a/sys/dev/kbd/atkbd.c b/sys/dev/kbd/atkbd.c index 59f265c..653e295 100644 --- a/sys/dev/kbd/atkbd.c +++ b/sys/dev/kbd/atkbd.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: atkbd.c,v 1.1 1999/01/09 02:44:49 yokota Exp $ + * $Id: atkbd.c,v 1.2 1999/01/13 11:19:19 yokota Exp $ */ #include "atkbd.h" @@ -47,6 +47,8 @@ #ifndef __i386__ +#include <isa/isareg.h> + #define ATKBD_SOFTC(unit) \ ((atkbd_softc_t *)devclass_get_softc(atkbd_devclass, unit)) @@ -192,7 +194,7 @@ atkbd_timeout(void *arg) */ (*kbdsw[kbd->kb_index]->lock)(kbd, FALSE); if ((*kbdsw[kbd->kb_index]->check_char)(kbd)) - (*kbdsw[kbd->kb_index]->intr)(kbd, NULL); + (*kbdsw[kbd->kb_index]->intr)(kbd); } splx(s); timeout(atkbd_timeout, arg, hz/10); @@ -331,7 +333,7 @@ static int get_kbd_id(KBDC kbdc); /* local variables */ /* the initial key map, accent map and fkey strings */ -#include <i386/isa/kbdtables.h> +#include <dev/kbd/kbdtables.h> /* structures for the default keyboard */ static keyboard_t default_kbd; @@ -524,7 +526,7 @@ atkbd_term(keyboard_t *kbd) /* keyboard interrupt routine */ static int -atkbd_intr(keyboard_t *kbd, void *arg) +atkbd_intr(keyboard_t *kbd) { atkbd_state_t *state; int c; @@ -1204,6 +1206,15 @@ init_keyboard(KBDC kbdc, int *type, int flags) } } +#ifdef __alpha__ + if (send_kbd_command_and_data( + kbdc, KBDC_SET_SCANCODE_SET, 2) != KBD_ACK) { + printf("atkbd: can't set translation.\n"); + + } + c |= KBD_TRANSLATION; +#endif + /* enable the keyboard port and intr. */ if (!set_controller_command_byte(kbdc, KBD_KBD_CONTROL_BITS | KBD_TRANSLATION | KBD_OVERRIDE_KBD_LOCK, diff --git a/sys/dev/kbd/kbdreg.h b/sys/dev/kbd/kbdreg.h index f1a6c8b..d592019 100644 --- a/sys/dev/kbd/kbdreg.h +++ b/sys/dev/kbd/kbdreg.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: $ + * $Id: kbdreg.h,v 1.1 1999/01/09 02:44:50 yokota Exp $ */ #ifndef _DEV_KBD_KBDREG_H_ @@ -109,7 +109,7 @@ typedef int kbd_probe_t(int unit, keyboard_t **kbdp, void *arg, int flags); typedef int kbd_init_t(keyboard_t *kbd); typedef int kbd_term_t(keyboard_t *kbd); -typedef int kbd_intr_t(keyboard_t *kbd, void *arg); +typedef int kbd_intr_t(keyboard_t *kbd); typedef int kbd_test_if_t(keyboard_t *kbd); typedef int kbd_enable_t(keyboard_t *kbd); typedef int kbd_disable_t(keyboard_t *kbd); diff --git a/sys/dev/syscons/scvidctl.c b/sys/dev/syscons/scvidctl.c index f267e6e..8374028 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: $ + * $Id: scvidctl.c,v 1.6 1999/01/11 03:18:26 yokota Exp $ */ #include "sc.h" @@ -37,7 +37,9 @@ #include <sys/tty.h> #include <sys/kernel.h> +#ifdef __i386__ #include <machine/apm_bios.h> +#endif #include <machine/console.h> #include <dev/fb/fbreg.h> diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c index e8f0577..ce71733 100644 --- a/sys/dev/syscons/syscons.c +++ b/sys/dev/syscons/syscons.c @@ -25,16 +25,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: syscons.c,v 1.291 1999/01/13 01:14:26 yokota Exp $ + * $Id: syscons.c,v 1.292 1999/01/17 14:23:15 yokota Exp $ */ #include "sc.h" #include "splash.h" +#ifdef __i386__ #include "apm.h" +#endif #include "opt_ddb.h" #include "opt_devfs.h" +#ifdef __i386__ #include "opt_vesa.h" #include "opt_vm86.h" +#endif #include "opt_syscons.h" #if NSC > 0 @@ -60,9 +64,11 @@ #include <machine/psl.h> #include <machine/frame.h> #include <machine/pc/display.h> +#ifdef __i386__ #include <machine/pc/vesa.h> #include <machine/apm_bios.h> #include <machine/random.h> +#endif #include <vm/vm.h> #include <vm/vm_param.h> @@ -74,9 +80,13 @@ #include <dev/fb/splashreg.h> #include <dev/syscons/syscons.h> +#ifndef __i386__ +#include <isa/isareg.h> +#else #include <i386/isa/isa.h> #include <i386/isa/isa_device.h> #include <i386/isa/timerreg.h> +#endif #if !defined(MAXCONS) #define MAXCONS 16 @@ -205,6 +215,11 @@ static void (*current_saver)(int blank) = none_saver; d_ioctl_t *sc_user_ioctl; static int sticky_splash = FALSE; +static struct { + u_int8_t cursor_start; + u_int8_t cursor_end; + u_int8_t shift_state; + } bios_value; /* OS specific stuff */ #ifdef not_yet_done @@ -220,7 +235,7 @@ static struct tty sccons[MAXCONS+2]; #endif #define SC_MOUSE 128 #define SC_CONSOLE 255 -u_short *Crtat; +vm_offset_t Crtat; static const int nsccons = MAXCONS+2; #define WRAPHIST(scp, pointer, offset)\ @@ -248,10 +263,8 @@ static const int nsccons = MAXCONS+2; (*kbdsw[(kbd)->kb_index]->get_fkeystr)((kbd), (fkey), (len)) /* prototypes */ -static int scattach(struct isa_device *dev); 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, int cons); static int sckbdprobe(int unit, int flags, int cons); static void scstart(struct tty *tp); @@ -265,6 +278,7 @@ static int sccngetch(int flags); static void sccnupdate(scr_stat *scp); static scr_stat *alloc_scp(void); static void init_scp(scr_stat *scp); +static void get_bios_values(void); 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; @@ -316,6 +330,10 @@ static void remove_cutmarking(scr_stat *scp); static void do_bell(scr_stat *scp, int pitch, int duration); static timeout_t blink_screen; +#define CDEV_MAJOR 12 + +#ifdef __i386__ + static cn_probe_t sccnprobe; static cn_init_t sccninit; static cn_getc_t sccngetc; @@ -324,10 +342,19 @@ static cn_putc_t sccnputc; CONS_DRIVER(sc, sccnprobe, sccninit, sccngetc, sccncheckc, sccnputc); -struct isa_driver scdriver = { - scprobe, scattach, "sc", 1 +#else /* !__i386__ */ + +static cn_getc_t sccngetc; +static cn_checkc_t sccncheckc; +static cn_putc_t sccnputc; + +struct consdev sc_cons = { + NULL, NULL, sccngetc, sccncheckc, sccnputc, + NULL, makedev(CDEV_MAJOR, 0), CN_NORMAL, }; +#endif /* __i386__ */ + static d_open_t scopen; static d_close_t scclose; static d_read_t scread; @@ -335,8 +362,7 @@ static d_write_t scwrite; static d_ioctl_t scioctl; static d_mmap_t scmmap; -#define CDEV_MAJOR 12 -static struct cdevsw sc_cdevsw = { +struct cdevsw sc_cdevsw = { scopen, scclose, scread, scwrite, scioctl, nullstop, noreset, scdevtotty, ttpoll, scmmap, nostrategy, "sc", @@ -344,11 +370,38 @@ static struct cdevsw sc_cdevsw = { D_TTY, }; +#ifdef __i386__ + +#define fillw_io(p, b, c) fillw((p), (void *)(b), (c)) + +#endif + +#ifdef __alpha__ + +static void +fillw(int pat, void *base, size_t cnt) +{ + u_short *sp = base; + while (cnt--) + *sp++ = pat; +} + +static void +fillw_io(int pat, u_int32_t base, size_t cnt) +{ + while (cnt--) { + writew(base, pat); + base += 2; + } +} + +#endif + static void draw_cursor_image(scr_stat *scp) { u_short cursor_image; - u_short *ptr; + vm_offset_t ptr; u_short prev_image; if (ISPIXELSC(scp)) { @@ -357,13 +410,12 @@ draw_cursor_image(scr_stat *scp) return; } - ptr = (u_short *)(scp->adp->va_window) - + (scp->cursor_pos - scp->scr_buf); + ptr = scp->adp->va_window + 2*(scp->cursor_pos - scp->scr_buf); /* do we have a destructive cursor ? */ if (sc_flags & CHAR_CURSOR) { prev_image = scp->cursor_saveunder; - cursor_image = *ptr & 0x00ff; + cursor_image = readw(ptr) & 0x00ff; if (cursor_image == DEAD_CHAR) cursor_image = prev_image & 0x00ff; cursor_image |= *(scp->cursor_pos) & 0xff00; @@ -386,7 +438,7 @@ draw_cursor_image(scr_stat *scp) cursor_image |= DEAD_CHAR; } } else { - cursor_image = (*(ptr) & 0x00ff) | *(scp->cursor_pos) & 0xff00; + cursor_image = (readw(ptr) & 0x00ff) | *(scp->cursor_pos) & 0xff00; scp->cursor_saveunder = cursor_image; if (!(sc_flags & BLINK_CURSOR)||((sc_flags & BLINK_CURSOR)&&(blinkrate & 4))){ if ((cursor_image & 0x7000) == 0x7000) { @@ -400,7 +452,7 @@ draw_cursor_image(scr_stat *scp) } } } - *ptr = cursor_image; + writew(ptr, cursor_image); } static void @@ -410,9 +462,8 @@ 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 *)(scp->adp->va_window) - + (scp->cursor_oldpos - scp->scr_buf)) - = scp->cursor_saveunder; + writew(scp->adp->va_window + 2*(scp->cursor_oldpos - scp->scr_buf), + scp->cursor_saveunder); } static void @@ -431,16 +482,16 @@ move_crsr(scr_stat *scp, int x, int y) scp->cursor_pos = scp->scr_buf + scp->ypos * scp->xsize + scp->xpos; } -static int -scprobe(struct isa_device *dev) +int +sc_probe_unit(int unit, int flags) { - if (!scvidprobe(dev->id_unit, dev->id_flags, FALSE)) { + if (!scvidprobe(unit, flags, FALSE)) { if (bootverbose) - printf("sc%d: no video adapter is found.\n", dev->id_unit); - return (0); + printf("sc%d: no video adapter is found.\n", unit); + return ENXIO; } - return ((sckbdprobe(dev->id_unit, dev->id_flags, FALSE)) ? -1 : 0); + return ((sckbdprobe(unit, flags, FALSE)) ? 0 : ENXIO); } /* probe video adapters, return TRUE if found */ @@ -466,7 +517,7 @@ scvidprobe(int unit, int flags, int cons) } adp = vid_get_adapter(adapter); /* shouldn't fail */ - Crtat = (u_short *)adp->va_window; + Crtat = adp->va_window; initial_video_mode = adp->va_initial_mode; return TRUE; @@ -500,8 +551,8 @@ scresume(void *dummy) } #endif -static int -scattach(struct isa_device *dev) +int +sc_attach_unit(int unit, int flags) { scr_stat *scp; #if defined(VESA) && defined(VM86) @@ -514,7 +565,7 @@ scattach(struct isa_device *dev) scinit(); scp = console[0]; - sc_flags = dev->id_flags; + sc_flags = flags; if (!ISFONTAVAIL(scp->adp->va_flags)) sc_flags &= ~CHAR_CURSOR; @@ -558,14 +609,14 @@ scattach(struct isa_device *dev) update_kbd_state(scp->status, LOCK_MASK); if (bootverbose) { - printf("sc%d:", dev->id_unit); + printf("sc%d:", unit); if (adapter >= 0) printf(" fb%d", adapter); if (keyboard >= 0) printf(" kbd%d", keyboard); printf("\n"); } - printf("sc%d: ", dev->id_unit); + printf("sc%d: ", unit); switch(scp->adp->va_type) { case KD_VGA: printf("VGA %s", (scp->adp->va_flags & V_ADP_COLOR) ? "color" : "mono"); @@ -629,6 +680,7 @@ scopen(dev_t dev, int flag, int mode, struct proc *p) { struct tty *tp = scdevtotty(dev); keyarg_t key; + int s; if (!tp) return(ENXIO); @@ -652,6 +704,11 @@ scopen(dev_t dev, int flag, int mode, struct proc *p) (*linesw[tp->t_line].l_modem)(tp, 1); if (minor(dev) == SC_MOUSE) mouse_level = 0; /* XXX */ + if (minor(dev) < MAXCONS && console[minor(dev)]) { + s = spltty(); + sc_clean_up(console[minor(dev)]); + splx(s); + } } else if (tp->t_state & TS_XCLUDE && p->p_ucred->cr_uid != 0) @@ -746,7 +803,7 @@ sckbdevent(keyboard_t *thiskbd, int event, void *arg) break; case KBDIO_UNLOADING: kbd = NULL; - kbd_release(thiskbd, (void *)keyboard); + kbd_release(thiskbd, (void *)&keyboard); return 0; default: return EINVAL; @@ -1451,11 +1508,19 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) return EINVAL; case VT_ACTIVATE: /* switch to screen *data */ + s = spltty(); + sc_clean_up(cur_console); + splx(s); return switch_scr(scp, *(int *)data - 1); case VT_WAITACTIVE: /* wait for switch to occur */ if (*(int *)data > MAXCONS || *(int *)data < 0) return EINVAL; + s = spltty(); + error = sc_clean_up(cur_console); + splx(s); + if (error) + return error; if (minor(dev) == *(int *)data - 1) return 0; if (*(int *)data == 0) { @@ -1478,11 +1543,15 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) return error; if (securelevel > 0) return EPERM; +#ifdef __i386__ p->p_md.md_regs->tf_eflags |= PSL_IOPL; +#endif return 0; case KDDISABIO: /* disallow io operations (default) */ +#ifdef __i386__ p->p_md.md_regs->tf_eflags &= ~PSL_IOPL; +#endif return 0; case KDSKBSTATE: /* set keyboard state (locks) */ @@ -1541,6 +1610,7 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) return 0; case KIOCSOUND: /* make tone (*data) hz */ +#ifdef __i386__ if (scp == cur_console) { if (*(int*)data) { int pitch = timer_freq / *(int*)data; @@ -1562,6 +1632,7 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) release_timer2(); } } +#endif /* __i386__ */ return 0; case KDGKBTYPE: /* get keyboard type */ @@ -1785,6 +1856,11 @@ scmousestart(struct tty *tp) splx(s); } +#if __i386__ + +/* XXX kludge! */ +extern struct isa_driver scdriver; + static void sccnprobe(struct consdev *cp) { @@ -1816,6 +1892,23 @@ sccninit(struct consdev *cp) scinit(); } +#else /* !__i386__ */ + +extern struct consdev *cn_tab; + +void +sccnattach(void) +{ + if (!scvidprobe(0, 0, TRUE) || !sckbdprobe(0, 0, TRUE)) { + return; + } + + scinit(); + cn_tab = &sc_cons; +} + +#endif /* __i386__ */ + static void sccnputc(dev_t dev, int c) { @@ -3104,6 +3197,8 @@ scinit(void) return; init_done = WARM; + get_bios_values(); + /* extract the hardware cursor location and hide the cursor for now */ adp = vid_get_adapter(adapter); (*vidsw[adapter]->read_hw_cursor)(adp, &col, &row); @@ -3117,8 +3212,8 @@ scinit(void) /* copy screen to temporary buffer */ if (ISTEXTSC(console[0])) - generic_bcopy((ushort *)(console[0]->adp->va_window), sc_buffer, - console[0]->xsize * console[0]->ysize * sizeof(u_short)); + bcopy_fromio(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 = sc_buffer; @@ -3183,6 +3278,7 @@ sc_clean_up(scr_stat *scp) { int error; + sc_touch_scrn_saver(); if ((error = wait_scrn_saver_stop())) return error; scp->status &= ~MOUSE_VISIBLE; @@ -3311,8 +3407,8 @@ init_scp(scr_stat *scp) current_default->std_color; scp->term.rev_color = current_default->rev_color; scp->border = BG_BLACK; - scp->cursor_start = *(u_int8_t *)pa_to_va(0x461); - scp->cursor_end = *(u_int8_t *)pa_to_va(0x460); + scp->cursor_start = bios_value.cursor_start; + scp->cursor_end = bios_value.cursor_end; scp->mouse_xpos = scp->xsize*8/2; scp->mouse_ypos = scp->ysize*scp->font_size/2; scp->mouse_cut_start = scp->mouse_cut_end = NULL; @@ -3322,7 +3418,7 @@ init_scp(scr_stat *scp) 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; + scp->status |= (bios_value.shift_state & 0x20) ? NLKED : 0; scp->status |= CURSOR_ENABLED; scp->pid = 0; scp->proc = NULL; @@ -3332,6 +3428,14 @@ init_scp(scr_stat *scp) } static void +get_bios_values(void) +{ + bios_value.cursor_start = *(u_int8_t *)pa_to_va(0x461); + bios_value.cursor_end = *(u_int8_t *)pa_to_va(0x460); + bios_value.shift_state = *(u_int8_t *)pa_to_va(0x417); +} + +static void history_to_screen(scr_stat *scp) { int i; @@ -3406,9 +3510,11 @@ next_code: if (!(c & RELKEY)) sc_touch_scrn_saver(); +#ifdef __i386__ if (!(flags & SCGETC_CN)) /* do the /dev/random device a favour */ add_keyboard_randomness(c); +#endif if (cur_console->kbd_mode != K_XLATE) return KEYCHAR(c); @@ -3741,7 +3847,7 @@ set_mode(scr_stat *scp) /* setup video hardware for the given mode */ (*vidsw[scp->ad]->set_mode)(scp->adp, scp->mode); - Crtat = (u_short *)scp->adp->va_window; + Crtat = scp->adp->va_window; if (!(scp->status & GRAPHICS_MODE)) { /* load appropriate font */ @@ -3769,8 +3875,8 @@ set_mode(scr_stat *scp) } if (scp->status & PIXEL_MODE) - generic_bzero((u_char *)(scp->adp->va_window), - scp->xpixel*scp->ypixel/8); + bzero_io(scp->adp->va_window, scp->xpixel*scp->ypixel/8); + set_border(scp, scp->border); /* move hardware cursor out of the way */ @@ -3782,7 +3888,7 @@ set_mode(scr_stat *scp) void set_border(scr_stat *scp, int color) { - u_char *p; + vm_offset_t p; int xoff; int yoff; int xlen; @@ -3797,21 +3903,21 @@ 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 *)(scp->adp->va_window); + p = scp->adp->va_window; xoff = scp->xoff; yoff = scp->yoff*scp->font_size; xlen = scp->xpixel/8; ylen = scp->ysize*scp->font_size; if (yoff > 0) { - generic_bzero(p, xlen*yoff); - generic_bzero(p + xlen*(yoff + ylen), - xlen*scp->ypixel - xlen*(yoff + ylen)); + bzero_io(p, xlen*yoff); + bzero_io(p + xlen*(yoff + ylen), + xlen*scp->ypixel - xlen*(yoff + ylen)); } if (xoff > 0) { for (i = 0; i < ylen; ++i) { - generic_bzero(p + xlen*(yoff + i), xoff); - generic_bzero(p + xlen*(yoff + i) + xoff + scp->xsize, - xlen - xoff - scp->xsize); + bzero_io(p + xlen*(yoff + i), xoff); + bzero_io(p + xlen*(yoff + i) + xoff + scp->xsize, + xlen - xoff - scp->xsize); } } outw(GDCIDX, 0x0000); /* set/reset */ @@ -4143,8 +4249,7 @@ draw_mouse_image(scr_stat *scp) { u_short buffer[32]; u_short xoffset, yoffset; - u_short *crt_pos = (u_short *)(scp->adp->va_window) - + (scp->mouse_pos - scp->scr_buf); + vm_offset_t crt_pos = scp->adp->va_window + 2*(scp->mouse_pos - scp->scr_buf); u_char *font_buffer; int font_size; int crtc_addr; @@ -4203,13 +4308,13 @@ draw_mouse_image(scr_stat *scp) SC_MOUSE_CHAR, 4); font_loading_in_progress = FALSE; - *(crt_pos) = (*(scp->mouse_pos) & 0xff00) | SC_MOUSE_CHAR; - *(crt_pos+scp->xsize) = - (*(scp->mouse_pos + scp->xsize) & 0xff00) | (SC_MOUSE_CHAR + 2); + writew(crt_pos, (*(scp->mouse_pos) & 0xff00) | SC_MOUSE_CHAR); + writew(crt_pos+2*scp->xsize, + (*(scp->mouse_pos + scp->xsize) & 0xff00) | (SC_MOUSE_CHAR + 2)); if (scp->mouse_xpos < (scp->xsize-1)*8) { - *(crt_pos + 1) = (*(scp->mouse_pos + 1) & 0xff00) | (SC_MOUSE_CHAR + 1); - *(crt_pos+scp->xsize + 1) = - (*(scp->mouse_pos + scp->xsize + 1) & 0xff00) | (SC_MOUSE_CHAR + 3); + writew(crt_pos + 2, (*(scp->mouse_pos + 1) & 0xff00) | (SC_MOUSE_CHAR + 1)); + writew(crt_pos+2*scp->xsize + 2, + (*(scp->mouse_pos + scp->xsize + 1) & 0xff00) | (SC_MOUSE_CHAR + 3)); } mark_for_update(scp, scp->mouse_pos - scp->scr_buf); mark_for_update(scp, scp->mouse_pos + scp->xsize + 1 - scp->scr_buf); @@ -4218,17 +4323,16 @@ draw_mouse_image(scr_stat *scp) static void remove_mouse_image(scr_stat *scp) { - u_short *crt_pos; + vm_offset_t crt_pos; if (!ISTEXTSC(scp)) return; - 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); - *(crt_pos+scp->xsize) = *(scp->mouse_oldpos+scp->xsize); - *(crt_pos+scp->xsize+1) = *(scp->mouse_oldpos+scp->xsize+1); + crt_pos = scp->adp->va_window + 2*(scp->mouse_oldpos - scp->scr_buf); + writew(crt_pos, *(scp->mouse_oldpos)); + writew(crt_pos+2, *(scp->mouse_oldpos+1)); + writew(crt_pos+2*scp->xsize, *(scp->mouse_oldpos+scp->xsize)); + writew(crt_pos+2*scp->xsize+2, *(scp->mouse_oldpos+scp->xsize+1)); mark_for_update(scp, scp->mouse_oldpos - scp->scr_buf); mark_for_update(scp, scp->mouse_oldpos + scp->xsize + 1 - scp->scr_buf); } @@ -4236,13 +4340,13 @@ remove_mouse_image(scr_stat *scp) static void draw_cutmarking(scr_stat *scp) { - u_short *crt_pos; + vm_offset_t crt_pos; u_short *ptr; u_short och, nch; - crt_pos = (u_short *)(scp->adp->va_window); + crt_pos = 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)); + nch = och = readw(crt_pos + 2*(ptr - scp->scr_buf)); /* are we outside the selected area ? */ if ( ptr < (scp->mouse_cut_start > scp->mouse_cut_end ? scp->mouse_cut_end : scp->mouse_cut_start) || @@ -4264,7 +4368,7 @@ draw_cutmarking(scr_stat *scp) } } if (nch != och) - *(crt_pos + (ptr - scp->scr_buf)) = nch; + writew(crt_pos + 2*(ptr - scp->scr_buf), nch); } } @@ -4312,13 +4416,13 @@ blink_screen(void *arg) } else { if (blink_in_progress & 1) - fillw(kernel_default.std_color | scr_map[0x20], - (u_short *)(scp->adp->va_window), - scp->xsize * scp->ysize); + fillw_io(kernel_default.std_color | scr_map[0x20], + scp->adp->va_window, + scp->xsize * scp->ysize); else - fillw(kernel_default.rev_color | scr_map[0x20], - (u_short *)(scp->adp->va_window), - scp->xsize * scp->ysize); + fillw_io(kernel_default.rev_color | scr_map[0x20], + scp->adp->va_window, + scp->xsize * scp->ysize); blink_in_progress--; timeout(blink_screen, scp, hz / 10); } @@ -4328,8 +4432,8 @@ void sc_bcopy(scr_stat *scp, u_short *p, int from, int to, int mark) { u_char *font; - u_char volatile *d; - u_char *e; + vm_offset_t d; + vm_offset_t e; u_char *f; int font_size; int line_length; @@ -4339,8 +4443,8 @@ 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 *)(scp->adp->va_window) + from, - (to - from + 1)*sizeof(u_short)); + bcopy_toio(p + from, scp->adp->va_window + 2*from, + (to - from + 1)*sizeof(u_short)); } else /* if ISPIXELSC(scp) */ { if (mark) mark = 255; @@ -4353,7 +4457,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 *)(scp->adp->va_window) + d = scp->adp->va_window + scp->xoff + scp->yoff*font_size*line_length + (from%xsize) + font_size*line_length*(from/xsize); @@ -4367,16 +4471,16 @@ sc_bcopy(scr_stat *scp, u_short *p, int from, int to, int mark) bg = (p[i] & 0xf000); outw(GDCIDX, (bg >> 4) | 0x00); /* set/reset */ outw(GDCIDX, 0xff08); /* bit mask */ - *d = 0; - c = *d; /* set the background color in the latch */ + writeb(d, 0); + c = readb(d); /* set the background color in the latch */ } /* foreground color */ outw(GDCIDX, (p[i] & 0x0f00) | 0x00); /* set/reset */ - e = (u_char *)d; + e = d; f = &font[(p[i] & 0x00ff)*font_size]; for (j = 0 ; j < font_size; j++, f++) { outw(GDCIDX, ((*f^mark) << 8) | 0x08); /* bit mask */ - *e = 0; + writeb(e, 0); e += line_length; } d++; diff --git a/sys/dev/syscons/syscons.h b/sys/dev/syscons/syscons.h index c6129e4..1a88a8c 100644 --- a/sys/dev/syscons/syscons.h +++ b/sys/dev/syscons/syscons.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: syscons.h,v 1.44 1998/10/01 11:39:18 yokota Exp $ + * $Id: syscons.h,v 1.45 1999/01/11 03:18:29 yokota Exp $ */ #ifndef _DEV_SYSCONS_SYSCONS_H_ @@ -175,7 +175,9 @@ typedef struct scr_stat { u_short *history_pos; /* position shown on screen */ u_short *history_save; /* save area index */ int history_size; /* size of history buffer */ +#ifdef __i386__ struct apmhook r_hook; /* reconfiguration support */ +#endif int splash_save_mode; /* saved mode for splash screen */ int splash_save_status; /* saved status for splash screen */ } scr_stat; @@ -202,6 +204,9 @@ typedef struct default_attr { /* misc prototypes used by different syscons related LKM's */ /* syscons.c */ +int sc_probe_unit(int unit, int flags); +int sc_attach_unit(int unit, int flags); + extern int (*sc_user_ioctl)(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p); diff --git a/sys/i386/conf/files.i386 b/sys/i386/conf/files.i386 index 9aa97d4..06480c0 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.217 1999/01/01 08:09:58 peter Exp $ +# $Id: files.i386,v 1.218 1999/01/11 03:18:35 yokota Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -245,6 +245,7 @@ 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_isa.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 diff --git a/sys/i386/isa/atkbd_isa.c b/sys/i386/isa/atkbd_isa.c index d87dcdc..9cd0629 100644 --- a/sys/i386/isa/atkbd_isa.c +++ b/sys/i386/isa/atkbd_isa.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: $ + * $Id: atkbd_isa.c,v 1.1 1999/01/09 02:44:40 yokota Exp $ */ #include "atkbd.h" @@ -94,7 +94,7 @@ atkbd_isa_intr(int unit) keyboard_t *kbd; kbd = atkbd_get_softc(unit)->kbd; - (*kbdsw[kbd->kb_index]->intr)(kbd, NULL); + (*kbdsw[kbd->kb_index]->intr)(kbd); } #endif /* NATKBD > 0 */ diff --git a/sys/i386/isa/syscons_isa.c b/sys/i386/isa/syscons_isa.c new file mode 100644 index 0000000..e96542f --- /dev/null +++ b/sys/i386/isa/syscons_isa.c @@ -0,0 +1,74 @@ +/*- + * Copyright (c) 1999 Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer as + * the first lines of this file unmodified. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $Id:$ + */ + +#include "sc.h" +#include "opt_syscons.h" + +#if NSC > 0 + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/conf.h> + +#include <machine/console.h> +#include <machine/apm_bios.h> + +#include <dev/syscons/syscons.h> + +#include <i386/isa/isa_device.h> + +static int scprobe(struct isa_device *dev); +static int scattach(struct isa_device *dev); + +struct isa_driver scdriver = { + scprobe, + scattach, + "sc", + 1 +}; + +static int +scprobe(struct isa_device *dev) +{ + int error; + + error = sc_probe_unit(dev->id_unit, dev->id_flags); + return ((error == 0) ? -1 : 0); +} + +static int +scattach(struct isa_device *dev) +{ + int error; + + error = sc_attach_unit(dev->id_unit, dev->id_flags); + return ((error == 0) ? 0 : 1); +} + +#endif /* NSC > 0 */ |