|
|
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.