Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | /* * arch/mips/lib/console.c * * Copyright (C) 1994 by Waldorf Electronic, * written by Ralf Baechle and Andreas Busse * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of this archive for * more details. * * FIXME: This file is hacked to be hardwired for the Deskstation * Only thought as a debugging console output. It's as inefficient * as a piece of code can be but probably a good piece of code to * implement a preliminary console for a new target. */ #include <linux/tty.h> #include <asm/bootinfo.h> static unsigned int size_x; static unsigned int size_y; static unsigned short cursor_x; static unsigned short cursor_y; static volatile unsigned short *vram_addr; static int console_needs_init = 1; extern struct screen_info screen_info; /* ---------------------------------------------------------------------- * init_console() * ---------------------------------------------------------------------- */ void init_console(void) { size_x = 80; size_y = 25; cursor_x = 0; cursor_y = 0; vram_addr = (unsigned short *)0xb00b8000; console_needs_init = 0; } void set_size_x(unsigned int x) { size_x = x; } void set_size_y(unsigned int y) { size_y = y; } void set_vram(unsigned short *vram) { vram_addr = vram; } void set_crsr(unsigned int x, unsigned int y) { cursor_x = x; cursor_y = y; } void print_char(unsigned int x, unsigned int y, unsigned char c) { volatile unsigned short *caddr; caddr = vram_addr + (y * size_x) + x; *caddr = (*caddr & 0xff00) | 0x0f00 | (unsigned short) c; } static void scroll(void) { volatile unsigned short *caddr; register int i; caddr = vram_addr; for(i=0; i<size_x * (size_y-1); i++) *(caddr++) = *(caddr + size_x); /* blank last line */ caddr = vram_addr + (size_x * (size_y-1)); for(i=0; i<size_x; i++) *(caddr++) = (*caddr & 0xff00) | (unsigned short) ' '; } void print_string(const unsigned char *str) { unsigned char c; if (console_needs_init) init_console(); while((c = *str++)) switch(c) { case '\n': cursor_x = 0; cursor_y++; if(cursor_y == size_y) { scroll(); cursor_y = size_y - 1; } break; default: print_char(cursor_x, cursor_y, c); cursor_x++; if(cursor_x == size_x) { cursor_x = 0; cursor_y++; if(cursor_y == size_y) { scroll(); cursor_y = size_y - 1; } } break; } } /* end of file */ |