green_saver.c revision 40885
133965Sjdp/*-
2130561Sobrien * Copyright (c) 1995-1998 S�ren Schmidt
333965Sjdp * All rights reserved.
433965Sjdp *
533965Sjdp * Redistribution and use in source and binary forms, with or without
633965Sjdp * modification, are permitted provided that the following conditions
733965Sjdp * are met:
833965Sjdp * 1. Redistributions of source code must retain the above copyright
933965Sjdp *    notice, this list of conditions and the following disclaimer,
1033965Sjdp *    without modification, immediately at the beginning of the file.
1133965Sjdp * 2. Redistributions in binary form must reproduce the above copyright
1233965Sjdp *    notice, this list of conditions and the following disclaimer in the
1333965Sjdp *    documentation and/or other materials provided with the distribution.
1433965Sjdp * 3. The name of the author may not be used to endorse or promote products
1533965Sjdp *    derived from this software without specific prior written permission.
1633965Sjdp *
1733965Sjdp * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1833965Sjdp * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19218822Sdim * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20218822Sdim * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2133965Sjdp * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2233965Sjdp * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2333965Sjdp * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2433965Sjdp * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2533965Sjdp * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2633965Sjdp * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2733965Sjdp *
28130561Sobrien *	$Id: green_saver.c,v 1.13 1998/09/17 19:40:30 sos Exp $
2933965Sjdp */
3033965Sjdp
3133965Sjdp#include <sys/param.h>
3233965Sjdp#include <sys/systm.h>
3333965Sjdp#include <sys/kernel.h>
3433965Sjdp#include <sys/module.h>
3533965Sjdp
3633965Sjdp#include <i386/isa/isa.h>
3733965Sjdp
3833965Sjdp#include <saver.h>
3933965Sjdp
4033965Sjdpstatic void
4133965Sjdpgreen_saver(int blank)
4233965Sjdp{
4333965Sjdp	u_char val;
4433965Sjdp	if (blank) {
4533965Sjdp		scrn_blanked = 1;
4633965Sjdp		cur_console->status |= SAVER_RUNNING;
4733965Sjdp		switch (crtc_type) {
4833965Sjdp		case KD_VGA:
4933965Sjdp			outb(TSIDX, 0x01); val = inb(TSREG);
5033965Sjdp			outb(TSIDX, 0x01); outb(TSREG, val | 0x20);
5133965Sjdp			outb(crtc_addr, 0x17); val = inb(crtc_addr + 1);
5233965Sjdp			outb(crtc_addr + 1, val & ~0x80);
5333965Sjdp			break;
5433965Sjdp		case KD_EGA:
5533965Sjdp			/* not yet done XXX */
5633965Sjdp			break;
5733965Sjdp		case KD_CGA:
5833965Sjdp			outb(crtc_addr + 4, 0x25);
5933965Sjdp			break;
6033965Sjdp		case KD_MONO:
6133965Sjdp		case KD_HERCULES:
6233965Sjdp			outb(crtc_addr + 4, 0x21);
6333965Sjdp			break;
6433965Sjdp		default:
6533965Sjdp			break;
6633965Sjdp		}
6733965Sjdp	}
6833965Sjdp	else {
6933965Sjdp		switch (crtc_type) {
7033965Sjdp		case KD_VGA:
7133965Sjdp			outb(TSIDX, 0x01); val = inb(TSREG);
7233965Sjdp			outb(TSIDX, 0x01); outb(TSREG, val & 0xDF);
7333965Sjdp			outb(crtc_addr, 0x17); val = inb(crtc_addr + 1);
7433965Sjdp			outb(crtc_addr + 1, val | 0x80);
7533965Sjdp			break;
7633965Sjdp		case KD_EGA:
7733965Sjdp			/* not yet done XXX */
7833965Sjdp			break;
7933965Sjdp		case KD_CGA:
8033965Sjdp			outb(crtc_addr + 4, 0x2d);
8133965Sjdp			break;
8233965Sjdp		case KD_MONO:
8333965Sjdp		case KD_HERCULES:
8433965Sjdp			outb(crtc_addr + 4, 0x29);
8533965Sjdp			break;
8633965Sjdp		default:
8733965Sjdp			break;
8833965Sjdp		}
8933965Sjdp		cur_console->status &= ~SAVER_RUNNING;
9033965Sjdp		scrn_blanked = 0;
9133965Sjdp	}
9233965Sjdp}
9333965Sjdp
9433965Sjdpstatic int
9533965Sjdpgreen_saver_load(void)
9633965Sjdp{
9733965Sjdp	switch (crtc_type) {
9833965Sjdp	case KD_MONO:
9933965Sjdp	case KD_HERCULES:
10033965Sjdp	case KD_CGA:
10133965Sjdp		/*
10233965Sjdp		 * `green' saver is not fully implemented for MDA and CGA.
10333965Sjdp		 * It simply blanks the display instead.
10433965Sjdp		 */
10533965Sjdp	case KD_VGA:
10633965Sjdp		break;
10733965Sjdp	case KD_EGA:
10833965Sjdp		/* EGA is yet to be supported */
10933965Sjdp	default:
11033965Sjdp		return ENODEV;
11133965Sjdp	}
11233965Sjdp	return add_scrn_saver(green_saver);
11333965Sjdp}
11433965Sjdp
11533965Sjdpstatic int
11633965Sjdpgreen_saver_unload(void)
11733965Sjdp{
11833965Sjdp	return remove_scrn_saver(green_saver);
11933965Sjdp}
12033965Sjdp
12133965SjdpSAVER_MODULE(green_saver);
12233965Sjdp