|
|
1.1 root 1: /*
2: * Creation Date: <2004/08/28 18:38:22 greg>
3: * Time-stamp: <2004/08/28 18:38:22 greg>
4: *
5: * <briq.c>
6: *
7: * Copyright (C) 2004, Greg Watson
8: *
9: * derived from mol.c
10: *
11: * Copyright (C) 2003, 2004 Samuel Rydh ([email protected])
12: *
13: * This program is free software; you can redistribute it and/or
14: * modify it under the terms of the GNU General Public License
15: * version 2
16: *
17: */
18:
19: #include "config.h"
20: #include "kernel/kernel.h"
21: #include "arch/common/nvram.h"
22: #include "libc/vsprintf.h"
23: #include "libc/string.h"
24: #include "briq/briq.h"
25: #include <stdarg.h>
26:
27: #define UART_BASE 0x3f8
28:
29: unsigned long virt_offset = 0;
30:
31: void
32: exit( int status )
33: {
34: for (;;);
35: }
36:
37: void
38: fatal_error( const char *err )
39: {
40: printk("Fatal error: %s\n", err );
41: exit(0);
42: }
43:
44: void
45: panic( const char *err )
46: {
47: printk("Panic: %s\n", err );
48: exit(0);
49:
50: /* won't come here... this keeps the gcc happy */
51: for( ;; )
52: ;
53: }
54:
55:
56: /************************************************************************/
57: /* print using OSI interface */
58: /************************************************************************/
59:
60: static int do_indent;
61:
62: int
63: printk( const char *fmt, ... )
64: {
65: char *p, buf[1024];
66: va_list args;
67: int i;
68:
69: va_start(args, fmt);
70: i = vnsprintf(buf, sizeof(buf), fmt, args);
71: va_end(args);
72:
73: for( p=buf; *p; p++ ) {
74: if( *p == '\n' )
75: do_indent = 0;
76: if( do_indent++ == 1 ) {
77: putchar( '>' );
78: putchar( '>' );
79: putchar( ' ' );
80: }
81: putchar( *p );
82: }
83: return i;
84: }
85:
86:
87: /************************************************************************/
88: /* TTY iface */
89: /************************************************************************/
90:
91: static int ttychar = -1;
92:
93: static int
94: tty_avail( void )
95: {
96: return 1;
97: }
98:
99: static int
100: tty_putchar( int c )
101: {
102: if( tty_avail() ) {
103: while (!(inb(UART_BASE + 0x05) & 0x20))
104: ;
105: outb(c, UART_BASE);
106: while (!(inb(UART_BASE + 0x05) & 0x40))
107: ;
108: }
109: return c;
110: }
111:
112: int
113: availchar( void )
114: {
115: if( !tty_avail() )
116: return 0;
117:
118: if( ttychar < 0 )
119: ttychar = inb(UART_BASE);
120: return (ttychar >= 0);
121: }
122:
123: int
124: getchar( void )
125: {
126: int ch;
127:
128: if( !tty_avail() )
129: return 0;
130:
131: if( ttychar < 0 )
132: return inb(UART_BASE);
133: ch = ttychar;
134: ttychar = -1;
135: return ch;
136: }
137:
138: int
139: putchar( int c )
140: {
141: if (c == '\n')
142: tty_putchar('\r');
143: return tty_putchar(c);
144: }
145:
146:
147: /************************************************************************/
148: /* briQ specific stuff */
149: /************************************************************************/
150:
151: static char nvram[2048];
152:
153: void
154: dump_nvram(void)
155: {
156: static char hexdigit[] = "0123456789abcdef";
157: int i;
158: for (i = 0; i < 16*4; i++)
159: {
160: printk ("%c", hexdigit[nvram[i] >> 4]);
161: printk ("%c", hexdigit[nvram[i] % 16]);
162: if (!((i + 1) % 16))
163: {
164: printk ("\n");
165: }
166: else
167: {
168: printk (" ");
169: }
170: }
171: }
172:
173:
174: int
175: arch_nvram_size( void )
176: {
177: return sizeof(nvram);
178: }
179:
180: void
181: arch_nvram_put( char *buf )
182: {
183: memcpy(nvram, buf, sizeof(nvram));
184: printk("new nvram:\n");
185: dump_nvram();
186: }
187:
188: void
189: arch_nvram_get( char *buf )
190: {
191: memcpy(buf, nvram, sizeof(nvram));
192: printk("current nvram:\n");
193: dump_nvram();
194: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.