|
|
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: * <pearpc.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 "pearpc/pearpc.h"
25: #include <stdarg.h>
26:
27: #define UART_BASE 0x3f8
28:
29: // FIXME
30: unsigned long virt_offset = 0;
31:
32:
33: void
34: exit( int status )
35: {
36: for (;;);
37: }
38:
39: void
40: fatal_error( const char *err )
41: {
42: printk("Fatal error: %s\n", err );
43: exit(0);
44: }
45:
46: void
47: panic( const char *err )
48: {
49: printk("Panic: %s\n", err );
50: exit(0);
51:
52: /* won't come here... this keeps the gcc happy */
53: for( ;; )
54: ;
55: }
56:
57:
58: /************************************************************************/
59: /* print using OSI interface */
60: /************************************************************************/
61:
62: static int do_indent;
63:
64: int
65: printk( const char *fmt, ... )
66: {
67: char *p, buf[1024];
68: va_list args;
69: int i;
70:
71: va_start(args, fmt);
72: i = vsnprintf(buf, sizeof(buf), fmt, args);
73: va_end(args);
74:
75: for( p=buf; *p; p++ ) {
76: if( *p == '\n' )
77: do_indent = 0;
78: if( do_indent++ == 1 ) {
79: putchar( '>' );
80: putchar( '>' );
81: putchar( ' ' );
82: }
83: putchar( *p );
84: }
85: return i;
86: }
87:
88:
89: /************************************************************************/
90: /* TTY iface */
91: /************************************************************************/
92:
93: static int ttychar = -1;
94:
95: static int
96: tty_avail( void )
97: {
98: return 1;
99: }
100:
101: static int
102: tty_putchar( int c )
103: {
104: if( tty_avail() ) {
105: while (!(inb(UART_BASE + 0x05) & 0x20))
106: ;
107: outb(c, UART_BASE);
108: while (!(inb(UART_BASE + 0x05) & 0x40))
109: ;
110: }
111: return c;
112: }
113:
114: int
115: availchar( void )
116: {
117: if( !tty_avail() )
118: return 0;
119:
120: if( ttychar < 0 )
121: ttychar = inb(UART_BASE);
122: return (ttychar >= 0);
123: }
124:
125: int
126: getchar( void )
127: {
128: int ch;
129:
130: if( !tty_avail() )
131: return 0;
132:
133: if( ttychar < 0 )
134: return inb(UART_BASE);
135: ch = ttychar;
136: ttychar = -1;
137: return ch;
138: }
139:
140: int
141: putchar( int c )
142: {
143: if (c == '\n')
144: tty_putchar('\r');
145: return tty_putchar(c);
146: }
147:
148:
149: /************************************************************************/
150: /* briQ specific stuff */
151: /************************************************************************/
152:
153: #define IO_NVRAM_PA_START 0x80860000
154: #define IO_NVRAM_PA_END 0x80880000
155:
156: static char *nvram=(char *)IO_NVRAM_PA_START;
157:
158: void
159: dump_nvram(void)
160: {
161: static char hexdigit[] = "0123456789abcdef";
162: int i;
163: for (i = 0; i < 16*4; i++)
164: {
165: printk ("%c", hexdigit[nvram[i<<4] >> 4]);
166: printk ("%c", hexdigit[nvram[i<<4] % 16]);
167: if (!((i + 1) % 16))
168: {
169: printk ("\n");
170: }
171: else
172: {
173: printk (" ");
174: }
175: }
176: }
177:
178:
179: int
180: arch_nvram_size( void )
181: {
182: return (IO_NVRAM_PA_END-IO_NVRAM_PA_START)>>4;
183: }
184:
185: void
186: arch_nvram_put( char *buf )
187: {
188: int i;
189: for (i=0; i<(IO_NVRAM_PA_END-IO_NVRAM_PA_START)>>4; i++)
190: nvram[i<<4]=buf[i];
191: // memcpy(nvram, buf, IO_NVRAM_PA_END-IO_NVRAM_PA_START);
192: printk("new nvram:\n");
193: dump_nvram();
194: }
195:
196: void
197: arch_nvram_get( char *buf )
198: {
199: int i;
200: for (i=0; i<(IO_NVRAM_PA_END-IO_NVRAM_PA_START)>>4; i++)
201: buf[i]=nvram[i<<4];
202:
203: //memcpy(buf, nvram, IO_NVRAM_PA_END-IO_NVRAM_PA_START);
204: printk("current nvram:\n");
205: dump_nvram();
206: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.