source: mainline/arch/ia32/src/drivers/ega.c@ fcfac420

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since fcfac420 was 973be64e, checked in by Ondrej Palkovsky <ondrap@…>, 20 years ago

Added generic exc_register/exc_dispatch functions,
copied from ia32 architecture. Currently only mips32 uses them.

The chardev_t can now be both input & output device (was
needed for serial driver).

Broken other architectures - ia64, sparc, powerpc will not compile.

Mips32 supports input on all msim, gxemul, indy(tested emulation
in gxemul, loses characters), simics. Simics serial line
is done using polling, I was unable to make it produce
an interrupt when the key was pressed.

  • Property mode set to 100644
File size: 3.3 KB
Line 
1/*
2 * Copyright (C) 2001-2004 Jakub Jermar
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <arch/ega.h>
30#include <putchar.h>
31#include <mm/page.h>
32#include <arch/mm/page.h>
33#include <synch/spinlock.h>
34#include <arch/types.h>
35#include <arch/asm.h>
36#include <memstr.h>
37#include <console/chardev.h>
38#include <console/console.h>
39
40/*
41 * The EGA driver.
42 * Simple and short. Function for displaying characters and "scrolling".
43 */
44
45static spinlock_t egalock;
46static __u32 ega_cursor;
47
48static void ega_putchar(chardev_t *d, const char ch);
49
50chardev_t ega_console;
51static chardev_operations_t ega_ops = {
52 .write = ega_putchar
53};
54
55void ega_move_cursor(void);
56
57void ega_init(void)
58{
59 __u8 hi, lo;
60
61 page_mapping_insert(PA2KA(VIDEORAM), VIDEORAM, PAGE_NOT_CACHEABLE, 0);
62 outb(0x3d4,0xe);
63 hi = inb(0x3d5);
64 outb(0x3d4,0xf);
65 lo = inb(0x3d5);
66 ega_cursor = (hi<<8)|lo;
67
68 chardev_initialize("ega_out", &ega_console, &ega_ops);
69 stdout = &ega_console;
70
71 putchar('\n');
72}
73
74static void ega_display_char(char ch)
75{
76 __u8 *vram = (__u8 *) PA2KA(VIDEORAM);
77
78 vram[ega_cursor*2] = ch;
79}
80
81/*
82 * This function takes care of scrolling.
83 */
84static void ega_check_cursor(void)
85{
86 if (ega_cursor < SCREEN)
87 return;
88
89 memcpy((void *)PA2KA(VIDEORAM), (void *)(PA2KA(VIDEORAM) + ROW*2), (SCREEN - ROW)*2);
90 memsetw(PA2KA(VIDEORAM) + (SCREEN - ROW)*2, ROW, 0x0720);
91 ega_cursor = ega_cursor - ROW;
92}
93
94void ega_putchar(chardev_t *d, const char ch)
95{
96 ipl_t ipl;
97
98 ipl = interrupts_disable();
99 spinlock_lock(&egalock);
100
101 switch (ch) {
102 case '\n':
103 ega_cursor = (ega_cursor + ROW) - ega_cursor % ROW;
104 break;
105 case '\t':
106 ega_cursor = (ega_cursor + 8) - ega_cursor % 8;
107 break;
108 default:
109 ega_display_char(ch);
110 ega_cursor++;
111 break;
112 }
113 ega_check_cursor();
114 ega_move_cursor();
115
116 spinlock_unlock(&egalock);
117 interrupts_restore(ipl);
118}
119
120void ega_move_cursor(void)
121{
122 outb(0x3d4,0xe);
123 outb(0x3d5,(ega_cursor>>8)&0xff);
124 outb(0x3d4,0xf);
125 outb(0x3d5,ega_cursor&0xff);
126}
Note: See TracBrowser for help on using the repository browser.