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

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 578aebf7 was ef67bab, checked in by Jakub Jermar <jakub@…>, 20 years ago

Memory management work.
Remove the last (i.e. 'root') argument from page_mapping_insert() and page_mapping_find().
Page table address is now extracted from the first (i.e. 'as') argument.
Add a lot of infrastructure to make the above possible.
sparc64 is now broken, most likely because of insufficient identity mapping of physical memory.

  • Property mode set to 100644
File size: 3.4 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 <mm/as.h>
33#include <arch/mm/page.h>
34#include <synch/spinlock.h>
35#include <arch/types.h>
36#include <arch/asm.h>
37#include <memstr.h>
38#include <console/chardev.h>
39#include <console/console.h>
40
41/*
42 * The EGA driver.
43 * Simple and short. Function for displaying characters and "scrolling".
44 */
45
46SPINLOCK_INITIALIZE(egalock);
47static __u32 ega_cursor;
48
49static void ega_putchar(chardev_t *d, const char ch);
50
51chardev_t ega_console;
52static chardev_operations_t ega_ops = {
53 .write = ega_putchar
54};
55
56void ega_move_cursor(void);
57
58void ega_init(void)
59{
60 __u8 hi, lo;
61
62 page_mapping_insert(AS_KERNEL, PA2KA(VIDEORAM), VIDEORAM, PAGE_NOT_CACHEABLE);
63 outb(0x3d4,0xe);
64 hi = inb(0x3d5);
65 outb(0x3d4,0xf);
66 lo = inb(0x3d5);
67 ega_cursor = (hi<<8)|lo;
68
69 chardev_initialize("ega_out", &ega_console, &ega_ops);
70 stdout = &ega_console;
71
72 putchar('\n');
73}
74
75static void ega_display_char(char ch)
76{
77 __u8 *vram = (__u8 *) PA2KA(VIDEORAM);
78
79 vram[ega_cursor*2] = ch;
80}
81
82/*
83 * This function takes care of scrolling.
84 */
85static void ega_check_cursor(void)
86{
87 if (ega_cursor < SCREEN)
88 return;
89
90 memcpy((void *)PA2KA(VIDEORAM), (void *)(PA2KA(VIDEORAM) + ROW*2), (SCREEN - ROW)*2);
91 memsetw(PA2KA(VIDEORAM) + (SCREEN - ROW)*2, ROW, 0x0720);
92 ega_cursor = ega_cursor - ROW;
93}
94
95void ega_putchar(chardev_t *d, const char ch)
96{
97 ipl_t ipl;
98
99 ipl = interrupts_disable();
100 spinlock_lock(&egalock);
101
102 switch (ch) {
103 case '\n':
104 ega_cursor = (ega_cursor + ROW) - ega_cursor % ROW;
105 break;
106 case '\t':
107 ega_cursor = (ega_cursor + 8) - ega_cursor % 8;
108 break;
109 case '\b':
110 if (ega_cursor % ROW)
111 ega_cursor--;
112 break;
113 default:
114 ega_display_char(ch);
115 ega_cursor++;
116 break;
117 }
118 ega_check_cursor();
119 ega_move_cursor();
120
121 spinlock_unlock(&egalock);
122 interrupts_restore(ipl);
123}
124
125void ega_move_cursor(void)
126{
127 outb(0x3d4,0xe);
128 outb(0x3d5,(ega_cursor>>8)&0xff);
129 outb(0x3d4,0xf);
130 outb(0x3d5,ega_cursor&0xff);
131}
Note: See TracBrowser for help on using the repository browser.