diff options
Diffstat (limited to 'c/src/lib/libbsp/powerpc/shared/console/polled_io.c')
-rw-r--r-- | c/src/lib/libbsp/powerpc/shared/console/polled_io.c | 118 |
1 files changed, 72 insertions, 46 deletions
diff --git a/c/src/lib/libbsp/powerpc/shared/console/polled_io.c b/c/src/lib/libbsp/powerpc/shared/console/polled_io.c index 2f1a399e71..6c3e0b401e 100644 --- a/c/src/lib/libbsp/powerpc/shared/console/polled_io.c +++ b/c/src/lib/libbsp/powerpc/shared/console/polled_io.c @@ -20,17 +20,34 @@ #include <libcpu/byteorder.h> #include <libcpu/page.h> #include <libcpu/mmu.h> -#include "keyboard.h" #include <libcpu/io.h> #include <string.h> #include <stdarg.h> #include <bsp/consoleIo.h> +#include <bsp.h> #include <libcpu/spr.h> +#ifdef BSP_KBD_IOBASE +#define USE_KBD_SUPPORT +#endif +#ifdef BSP_VGA_IOBASE +#define USE_VGA_SUPPORT +#endif + +#ifdef USE_KBD_SUPPORT +#include "keyboard.h" +#endif +#include "console.inl" + +#ifdef __BOOT__ +extern void boot_udelay(); +#endif + typedef unsigned long long u64; typedef long long s64; typedef unsigned int u32; +#ifdef USE_KBD_SUPPORT unsigned short plain_map[NR_KEYS] = { 0xf200, 0xf01b, 0xf031, 0xf032, 0xf033, 0xf034, 0xf035, 0xf036, 0xf037, 0xf038, 0xf039, 0xf030, 0xf02d, 0xf03d, 0xf07f, 0xf009, @@ -296,10 +313,11 @@ unsigned int accent_table_size = 68; /* These #defines have been copied from drivers/char/pc_keyb.h, by * Martin Mares (mj@ucw.cz). + * converted to offsets by Till Straumann <strauman@slac.stanford.edu> */ -#define KBD_STATUS_REG 0x64 /* Status register (R) */ -#define KBD_CNTL_REG 0x64 /* Controller command register (W) */ -#define KBD_DATA_REG 0x60 /* Keyboard data register (R/W) */ +#define KBD_STATUS_REG 0x4 /* Status register (R) */ +#define KBD_CNTL_REG 0x4 /* Controller command register (W) */ +#define KBD_DATA_REG 0x0 /* Keyboard data register (R/W) */ /* * Keyboard Controller Commands @@ -356,6 +374,8 @@ unsigned int accent_table_size = 68; SPR_RW(DEC) SPR_RO(PVR) +#endif /* USE_KBD_SUPPORT */ + /* Early messages after mm init but before console init are kept in log * buffers. @@ -377,10 +397,8 @@ static u_char log_page_pool [STATIC_LOG_DATA_PAGE_NB * PAGE_SIZE]; #endif static board_memory_map mem_map = { - (__io_ptr) 0x80000000, - (__io_ptr) 0xc0000000, - (__io_ptr) 0xc0000000, - (__io_ptr) 0x80000000 + (__io_ptr) _IO_BASE, /* from libcpu/io.h */ + (__io_ptr) _ISA_MEM_BASE, }; board_memory_map *ptr_mem_map = &mem_map; @@ -404,18 +422,6 @@ typedef struct console_io { extern console_io* curIo; -unsigned long ticks_per_ms = 1000000; /* Decrementer ticks per ms (true for 601) */ - -/* The decrementer is present on all processors and the RTC on the 601 - * has the annoying characteristic of jumping from 1e9 to 0, so we - * use the decrementer. - */ -void udelay(int us) { - us = us*ticks_per_ms/1000; - _write_DEC(us); - while((int)_read_DEC() >= 0); -} - void debug_putc(const u_char c) { curIo->putc(c); @@ -473,7 +479,6 @@ int vacuum_tstc(void) { #define LSR_TEMT 0x40 /* Xmitter empty */ #define LSR_ERR 0x80 /* Error */ -#define COM1 0x3F8 #ifdef STATIC_LOG_ALLOC static int global_index = 0; @@ -543,23 +548,28 @@ void flush_log(void) { } } +#ifndef INL_CONSOLE_INB +#error "BSP probably didn't define a console port" +#endif + void serial_putc(const u_char c) { - while ((inb(COM1+lsr) & LSR_THRE) == 0) ; - outb(c, COM1+thr); + while ((INL_CONSOLE_INB(lsr) & LSR_THRE) == 0) ; + INL_CONSOLE_OUTB(thr, c); } int serial_getc(void) { - while ((inb(COM1+lsr) & LSR_DR) == 0) ; - return (inb(COM1+rbr)); + while ((INL_CONSOLE_INB(lsr) & LSR_DR) == 0) ; + return (INL_CONSOLE_INB(rbr)); } int serial_tstc(void) { - return ((inb(COM1+lsr) & LSR_DR) != 0); + return ((INL_CONSOLE_INB(lsr) & LSR_DR) != 0); } +#ifdef USE_VGA_SUPPORT static void scroll(void) { int i; @@ -579,10 +589,10 @@ static void cursor(int x, int y) { int pos = console_global_data.cols*y + x; - outb(14, 0x3D4); - outb(pos>>8, 0x3D5); - outb(15, 0x3D4); - outb(pos, 0x3D5); + vga_outb(14, 0x14); + vga_outb(0x15, pos>>8); + vga_outb(0x14, 15); + vga_outb(0x15, pos); } void @@ -620,16 +630,18 @@ vga_putc(const u_char c) console_global_data.orig_x = x; console_global_data.orig_y = y; } +#endif /* USE_VGA_SUPPORT */ +#ifdef USE_KBD_SUPPORT /* Keyboard support */ static int kbd_getc(void) { unsigned char dt, brk, val; unsigned code; loop: - while((inb(KBD_STATUS_REG) & KBD_STAT_OBF) == 0) ; + while((kbd_inb(KBD_STATUS_REG) & KBD_STAT_OBF) == 0) ; - dt = inb(KBD_DATA_REG); + dt = kbd_inb(KBD_DATA_REG); brk = dt & 0x80; /* brk == 1 on key release */ dt = dt & 0x7f; /* keycode */ @@ -667,8 +679,8 @@ loop: else if (val == KVAL(K_ENTER)) { enter: /* Wait for key up */ while (1) { - while((inb(KBD_STATUS_REG) & KBD_STAT_OBF) == 0) ; - dt = inb(KBD_DATA_REG); + while((kbd_inb(KBD_STATUS_REG) & KBD_STAT_OBF) == 0) ; + dt = kbd_inb(KBD_DATA_REG); if (dt & 0x80) /* key up */ break; } return 10; @@ -732,25 +744,33 @@ enter: /* Wait for key up */ static int kbd_get(int ms) { int status, data; while(1) { - status = inb(KBD_STATUS_REG); + status = kbd_inb(KBD_STATUS_REG); if (status & KBD_STAT_OBF) { - data = inb(KBD_DATA_REG); + data = kbd_inb(KBD_DATA_REG); if (status & (KBD_STAT_GTO | KBD_STAT_PERR)) return -1; else return data; } if (--ms < 0) return -1; - udelay(1000); +#ifdef __BOOT__ + boot_udelay(1000); +#else + rtems_bsp_delay(1000); +#endif } } static void kbd_put(u_char c, int ms, int port) { - while (inb(KBD_STATUS_REG) & KBD_STAT_IBF) { + while (kbd_inb(KBD_STATUS_REG) & KBD_STAT_IBF) { if (--ms < 0) return; - udelay(1000); +#ifdef __BOOT__ + boot_udelay(1000); +#else + rtems_bsp_delay(1000); +#endif } - outb(c, port); + kbd_outb(port, c); } int kbdreset(void) @@ -796,8 +816,9 @@ int kbdreset(void) int kbd_tstc(void) { - return ((inb(KBD_STATUS_REG) & KBD_STAT_OBF) != 0); + return ((kbd_inb(KBD_STATUS_REG) & KBD_STAT_OBF) != 0); } +#endif /* USE_KBD_SUPPORT */ const struct console_io vacuum_console_functions = { @@ -811,19 +832,22 @@ log_console_functions = { log_putc, vacuum_getc, vacuum_tstc -}, - +} +, serial_console_functions = { serial_putc, serial_getc, serial_tstc -}, - +} +#if defined(USE_KBD_SUPPORT) && defined(USE_VGA_SUPPORT) +, vga_console_functions = { vga_putc, kbd_getc, kbd_tstc -}; +} +#endif +; console_io* curIo = (console_io*) &vacuum_console_functions; @@ -834,7 +858,9 @@ int select_console(ioType t) { case CONSOLE_VACUUM : curIo = (console_io*)&vacuum_console_functions; break; case CONSOLE_LOG : curIo = (console_io*)&log_console_functions; break; case CONSOLE_SERIAL : curIo = (console_io*)&serial_console_functions; break; +#if defined(USE_KBD_SUPPORT) && defined(USE_VGA_SUPPORT) case CONSOLE_VGA : curIo = (console_io*)&vga_console_functions; break; +#endif default : curIo = (console_io*)&vacuum_console_functions;break; } if (curType == CONSOLE_LOG) flush_log(); |