From d7d66d7d4523b904c8ccc6aea3709dc0d5aa5bdc Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 19 Apr 2018 06:28:01 +0200 Subject: bsps: Move console drivers to bsps This patch is a part of the BSP source reorganization. Update #3285. --- c/src/lib/libbsp/i386/pc386/Makefile.am | 46 +- c/src/lib/libbsp/i386/pc386/console/conscfg.c | 198 ---- .../libbsp/i386/pc386/console/console_control.c | 71 -- .../lib/libbsp/i386/pc386/console/console_select.c | 250 ----- c/src/lib/libbsp/i386/pc386/console/defkeymap.c | 262 ----- c/src/lib/libbsp/i386/pc386/console/exar17d15x.c | 224 ----- c/src/lib/libbsp/i386/pc386/console/fb_cirrus.c | 766 --------------- c/src/lib/libbsp/i386/pc386/console/fb_vesa_rm.c | 1004 -------------------- c/src/lib/libbsp/i386/pc386/console/fb_vga.c | 245 ----- c/src/lib/libbsp/i386/pc386/console/gdb_select.c | 170 ---- c/src/lib/libbsp/i386/pc386/console/i386kbd.h | 192 ---- c/src/lib/libbsp/i386/pc386/console/inch.c | 300 ------ c/src/lib/libbsp/i386/pc386/console/kbd_parser.c | 47 - c/src/lib/libbsp/i386/pc386/console/keyboard.c | 881 ----------------- c/src/lib/libbsp/i386/pc386/console/outch.c | 328 ------- c/src/lib/libbsp/i386/pc386/console/pc_keyb.c | 627 ------------ .../lib/libbsp/i386/pc386/console/printk_support.c | 84 -- c/src/lib/libbsp/i386/pc386/console/ps2_mouse.c | 562 ----------- c/src/lib/libbsp/i386/pc386/console/ps2_mouse.h | 151 --- c/src/lib/libbsp/i386/pc386/console/rtd316.c | 109 --- .../i386/pc386/console/serial_mouse_config.c | 48 - c/src/lib/libbsp/i386/pc386/console/uart_bus_pci.c | 477 ---------- c/src/lib/libbsp/i386/pc386/console/vgacons.c | 191 ---- c/src/lib/libbsp/i386/pc386/console/vgainit.c | 757 --------------- c/src/lib/libbsp/i386/pc386/console/videoAsm.S | 48 - c/src/lib/libbsp/i386/pc386/console/vt.c | 348 ------- 26 files changed, 23 insertions(+), 8363 deletions(-) delete mode 100644 c/src/lib/libbsp/i386/pc386/console/conscfg.c delete mode 100644 c/src/lib/libbsp/i386/pc386/console/console_control.c delete mode 100644 c/src/lib/libbsp/i386/pc386/console/console_select.c delete mode 100644 c/src/lib/libbsp/i386/pc386/console/defkeymap.c delete mode 100644 c/src/lib/libbsp/i386/pc386/console/exar17d15x.c delete mode 100644 c/src/lib/libbsp/i386/pc386/console/fb_cirrus.c delete mode 100644 c/src/lib/libbsp/i386/pc386/console/fb_vesa_rm.c delete mode 100644 c/src/lib/libbsp/i386/pc386/console/fb_vga.c delete mode 100644 c/src/lib/libbsp/i386/pc386/console/gdb_select.c delete mode 100644 c/src/lib/libbsp/i386/pc386/console/i386kbd.h delete mode 100644 c/src/lib/libbsp/i386/pc386/console/inch.c delete mode 100644 c/src/lib/libbsp/i386/pc386/console/kbd_parser.c delete mode 100644 c/src/lib/libbsp/i386/pc386/console/keyboard.c delete mode 100644 c/src/lib/libbsp/i386/pc386/console/outch.c delete mode 100644 c/src/lib/libbsp/i386/pc386/console/pc_keyb.c delete mode 100644 c/src/lib/libbsp/i386/pc386/console/printk_support.c delete mode 100644 c/src/lib/libbsp/i386/pc386/console/ps2_mouse.c delete mode 100644 c/src/lib/libbsp/i386/pc386/console/ps2_mouse.h delete mode 100644 c/src/lib/libbsp/i386/pc386/console/rtd316.c delete mode 100644 c/src/lib/libbsp/i386/pc386/console/serial_mouse_config.c delete mode 100644 c/src/lib/libbsp/i386/pc386/console/uart_bus_pci.c delete mode 100644 c/src/lib/libbsp/i386/pc386/console/vgacons.c delete mode 100644 c/src/lib/libbsp/i386/pc386/console/vgainit.c delete mode 100644 c/src/lib/libbsp/i386/pc386/console/videoAsm.S delete mode 100644 c/src/lib/libbsp/i386/pc386/console/vt.c (limited to 'c/src/lib/libbsp/i386') diff --git a/c/src/lib/libbsp/i386/pc386/Makefile.am b/c/src/lib/libbsp/i386/pc386/Makefile.am index 37a7203ea6..aa10b8f2ad 100644 --- a/c/src/lib/libbsp/i386/pc386/Makefile.am +++ b/c/src/lib/libbsp/i386/pc386/Makefile.am @@ -53,42 +53,42 @@ librtemsbsp_a_SOURCES +=../../../../../../bsps/i386/pc386/clock/todcfg.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/rtc/rtc-support.c if RTEMS_VGA -librtemsbsp_a_SOURCES += console/inch.c -librtemsbsp_a_SOURCES += console/outch.c -librtemsbsp_a_SOURCES += console/defkeymap.c -librtemsbsp_a_SOURCES += console/keyboard.c -librtemsbsp_a_SOURCES += console/pc_keyb.c -librtemsbsp_a_SOURCES += console/ps2_mouse.c -librtemsbsp_a_SOURCES += console/vgainit.c -librtemsbsp_a_SOURCES += console/vt.c -librtemsbsp_a_SOURCES += console/videoAsm.S -librtemsbsp_a_SOURCES += console/kbd_parser.c -librtemsbsp_a_SOURCES += console/vgacons.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/i386/pc386/console/inch.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/i386/pc386/console/outch.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/i386/pc386/console/defkeymap.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/i386/pc386/console/keyboard.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/i386/pc386/console/pc_keyb.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/i386/pc386/console/ps2_mouse.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/i386/pc386/console/vgainit.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/i386/pc386/console/vt.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/i386/pc386/console/videoAsm.S +librtemsbsp_a_SOURCES += ../../../../../../bsps/i386/pc386/console/kbd_parser.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/i386/pc386/console/vgacons.c if USE_VGA -librtemsbsp_a_SOURCES += console/fb_vga.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/i386/pc386/console/fb_vga.c endif if USE_CIRRUS_GD5446 -librtemsbsp_a_SOURCES += console/fb_cirrus.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/i386/pc386/console/fb_cirrus.c endif if USE_VBE_RM -librtemsbsp_a_SOURCES += console/fb_vesa_rm.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/i386/pc386/console/fb_vesa_rm.c endif endif # console (non-graphics support) -librtemsbsp_a_SOURCES += console/serial_mouse_config.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/i386/pc386/console/serial_mouse_config.c librtemsbsp_a_SOURCES += ../shared/comm/uart.c librtemsbsp_a_SOURCES += ../shared/comm/tty_drv.c librtemsbsp_a_SOURCES += ../shared/realmode_int/realmode_int.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console.c -librtemsbsp_a_SOURCES += console/console_select.c -librtemsbsp_a_SOURCES += console/console_control.c -librtemsbsp_a_SOURCES += console/conscfg.c -librtemsbsp_a_SOURCES += console/printk_support.c -librtemsbsp_a_SOURCES += console/exar17d15x.c -librtemsbsp_a_SOURCES += console/rtd316.c -librtemsbsp_a_SOURCES += console/uart_bus_pci.c -librtemsbsp_a_SOURCES += console/gdb_select.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/i386/pc386/console/console_select.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/i386/pc386/console/console_control.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/i386/pc386/console/conscfg.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/i386/pc386/console/printk_support.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/i386/pc386/console/exar17d15x.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/i386/pc386/console/rtd316.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/i386/pc386/console/uart_bus_pci.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/i386/pc386/console/gdb_select.c # gdb librtemsbsp_a_SOURCES += ../shared/comm/i386-stub.c diff --git a/c/src/lib/libbsp/i386/pc386/console/conscfg.c b/c/src/lib/libbsp/i386/pc386/console/conscfg.c deleted file mode 100644 index 07602a3436..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/conscfg.c +++ /dev/null @@ -1,198 +0,0 @@ -/** - * @file - * - * This file contains the libchip configuration information - * to instantiate the libchip driver for the VGA console - * and serial ports on a PC. - */ - -/* - * COPYRIGHT (c) 1989-2014, 2016. - * On-Line Applications Research Corporation (OAR). - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#include -#include -#include -#include -#if BSP_ENABLE_VGA -#include -#endif -#include -#include "../../../../../../../bsps/shared/dev/serial/legacy-console.h" - -#if BSP_ENABLE_VGA -#define VGA_CONSOLE_FUNCTIONS &vgacons_fns -#endif - -#if BSP_ENABLE_COM1_COM4 - #if 0 - #define COM_CONSOLE_FUNCTIONS &ns16550_fns_polled - #else - #define COM_CONSOLE_FUNCTIONS &ns16550_fns - #endif - - /* - * Base IO for UART - */ - #define COM1_BASE_IO 0x3F8 - #define COM2_BASE_IO 0x3E8 - #define COM3_BASE_IO 0x2F8 - #define COM4_BASE_IO 0x2E8 - - #define CLOCK_RATE (115200 * 16) - - static uint8_t com_get_register(uint32_t addr, uint8_t i) - { - register uint8_t val; - - inport_byte( (addr + i), val ); - return val; - } - - static void com_set_register(uint32_t addr, uint8_t i, uint8_t val) - { - outport_byte( (addr + i), val ); - } -#endif - -/* - * Default to the PC VGA console if present and configured. - */ -console_tbl Console_Configuration_Ports[] = { -#if BSP_ENABLE_VGA - /* - * If present the VGA console must always be minor 0. - * See console_control. - */ - { - "/dev/vgacons", /* sDeviceName */ - VGA_CONSOLE, /* deviceType */ - VGA_CONSOLE_FUNCTIONS, /* pDeviceFns */ - vgacons_probe, /* deviceProbe */ - NULL, /* pDeviceFlow */ - 16, /* ulMargin */ - 8, /* ulHysteresis */ - (void *) NULL, /* NULL */ /* pDeviceParams */ - 0x00000000, /* ulCtrlPort1 */ - 0x00000000, /* ulCtrlPort2 */ - 0x00000000, /* ulDataPort */ - NULL, /* getRegister */ - NULL, /* setRegister */ - NULL,/* unused */ /* getData */ - NULL,/* unused */ /* setData */ - 0x0, /* ulClock */ - 0x0 /* ulIntVector -- base for port */ - }, -#endif -}; - -unsigned long Console_Configuration_Count = - (sizeof(Console_Configuration_Ports)/sizeof(console_tbl)); - -static console_tbl Legacy_Ports[] = { -#if BSP_ENABLE_COM1_COM4 - { - "/dev/com1", /* sDeviceName */ - SERIAL_NS16550, /* deviceType */ - COM_CONSOLE_FUNCTIONS, /* pDeviceFns */ - NULL, /* deviceProbe */ - NULL, /* pDeviceFlow */ - 16, /* ulMargin */ - 8, /* ulHysteresis */ - (void *) 9600, /* Baud Rate */ /* pDeviceParams */ - COM1_BASE_IO, /* ulCtrlPort1 */ - 0x00000000, /* ulCtrlPort2 */ - COM1_BASE_IO, /* ulDataPort */ - com_get_register, /* getRegister */ - com_set_register, /* setRegister */ - NULL,/* unused */ /* getData */ - NULL,/* unused */ /* setData */ - CLOCK_RATE, /* ulClock */ - BSP_UART_COM1_IRQ /* ulIntVector -- base for port */ - }, - { - "/dev/com2", /* sDeviceName */ - SERIAL_NS16550, /* deviceType */ - COM_CONSOLE_FUNCTIONS, /* pDeviceFns */ - NULL, /* deviceProbe */ - NULL, /* pDeviceFlow */ - 16, /* ulMargin */ - 8, /* ulHysteresis */ - (void *) 9600, /* Baud Rate */ /* pDeviceParams */ - COM2_BASE_IO, /* ulCtrlPort1 */ - 0x00000000, /* ulCtrlPort2 */ - COM2_BASE_IO, /* ulDataPort */ - com_get_register, /* getRegister */ - com_set_register, /* setRegister */ - NULL,/* unused */ /* getData */ - NULL,/* unused */ /* setData */ - CLOCK_RATE, /* ulClock */ - BSP_UART_COM2_IRQ /* ulIntVector -- base for port */ - }, - { - "/dev/com3", /* sDeviceName */ - SERIAL_NS16550, /* deviceType */ - COM_CONSOLE_FUNCTIONS, /* pDeviceFns */ - NULL, /* deviceProbe */ - NULL, /* pDeviceFlow */ - 16, /* ulMargin */ - 8, /* ulHysteresis */ - (void *) 9600, /* Baud Rate */ /* pDeviceParams */ - COM3_BASE_IO, /* ulCtrlPort1 */ - 0x00000000, /* ulCtrlPort2 */ - COM3_BASE_IO, /* ulDataPort */ - com_get_register, /* getRegister */ - com_set_register, /* setRegister */ - NULL,/* unused */ /* getData */ - NULL,/* unused */ /* setData */ - CLOCK_RATE, /* ulClock */ - BSP_UART_COM3_IRQ /* ulIntVector -- base for port */ - }, - { - "/dev/com4", /* sDeviceName */ - SERIAL_NS16550, /* deviceType */ - COM_CONSOLE_FUNCTIONS, /* pDeviceFns */ - NULL, /* deviceProbe */ - NULL, /* pDeviceFlow */ - 16, /* ulMargin */ - 8, /* ulHysteresis */ - (void *) 9600, /* Baud Rate */ /* pDeviceParams */ - COM4_BASE_IO, /* ulCtrlPort1 */ - 0x00000000, /* ulCtrlPort2 */ - COM4_BASE_IO, /* ulDataPort */ - com_get_register, /* getRegister */ - com_set_register, /* setRegister */ - NULL,/* unused */ /* getData */ - NULL,/* unused */ /* setData */ - CLOCK_RATE, /* ulClock */ - BSP_UART_COM4_IRQ /* ulIntVector -- base for port */ - }, -#endif -}; - -#define Legacy_Port_Count \ - (sizeof(Legacy_Ports)/sizeof(console_tbl)) - -void legacy_uart_probe(void) -{ -#if BSP_ENABLE_COM1_COM4 - const char *opt; - /* - * Check the command line to see if com1-com4 are disabled. - */ - opt = bsp_cmdline_arg("--disable-com1-com4"); - if ( opt ) { - printk( "COM1-COM4: disabled\n" ); - } else { - if (Legacy_Port_Count) { - printk("Legacy UART Ports: COM1-COM4\n"); - console_register_devices( Legacy_Ports, Legacy_Port_Count ); - } - } -#endif -} diff --git a/c/src/lib/libbsp/i386/pc386/console/console_control.c b/c/src/lib/libbsp/i386/pc386/console/console_control.c deleted file mode 100644 index 2d1912d3b1..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/console_control.c +++ /dev/null @@ -1,71 +0,0 @@ -/* - * This file is an extension of the generic console driver - * shell used by all console drivers using libchip, it contains - * the console_control routine, This bsp needs its own version - * of this method to handle the keyboard and mouse as a single - * device. - */ - -/* - * COPYRIGHT (c) 1989-2011. - * On-Line Applications Research Corporation (OAR). - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#if BSP_ENABLE_VGA -#include -#endif -#include "../../../../../../../bsps/shared/dev/serial/legacy-console.h" - -/* - * console_control - * - * this routine uses the termios driver to process io - */ -rtems_device_driver console_control( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg -) -{ -#if BSP_ENABLE_VGA - if (minor == 0) { - rtems_libio_ioctl_args_t *args = arg; - - switch (args->command) { - default: - if( vt_ioctl( args->command, (unsigned long)args->buffer ) != 0 ) - return rtems_termios_ioctl (arg); - break; - - case MW_UID_REGISTER_DEVICE: - printk( "SerialMouse: reg=%s\n", (const char*) args->buffer ); - register_kbd_msg_queue( args->buffer, 0 ); - break; - - case MW_UID_UNREGISTER_DEVICE: - unregister_kbd_msg_queue( 0 ); - break; - } - - args->ioctl_return = 0; - return RTEMS_SUCCESSFUL; - } -#endif - return rtems_termios_ioctl (arg); -} diff --git a/c/src/lib/libbsp/i386/pc386/console/console_select.c b/c/src/lib/libbsp/i386/pc386/console/console_select.c deleted file mode 100644 index bde99a4c51..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/console_select.c +++ /dev/null @@ -1,250 +0,0 @@ -/** - * @file - * - * @ingroup Console - * - * @brief pc386 console select - * - * This file contains a routine to select the console based upon a number - * of criteria. - */ - -/* - * COPYRIGHT (c) 2011-2012, 2016. - * On-Line Applications Research Corporation (OAR). - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "../../../../../../../bsps/shared/dev/serial/legacy-console.h" -#ifdef RTEMS_RUNTIME_CONSOLE_SELECT - #include -#endif - -/* - * Method to return true if the device associated with the - * minor number probs available. - */ -static bool bsp_Is_Available( rtems_device_minor_number minor ) -{ - console_tbl *cptr = Console_Port_Tbl[minor]; - - /* - * First perform the configuration dependent probe, then the - * device dependent probe - */ - if ((!cptr->deviceProbe || cptr->deviceProbe(minor)) && - cptr->pDeviceFns->deviceProbe(minor)) { - return true; - } - return false; -} - -/* - * Method to return the first available device. - */ -static rtems_device_minor_number bsp_First_Available_Device( void ) -{ - rtems_device_minor_number minor; - - for (minor=0; minor < Console_Port_Count ; minor++) { - console_tbl *cptr = Console_Port_Tbl[minor]; - - /* - * First perform the configuration dependent probe, then the - * device dependent probe - */ - - if ((!cptr->deviceProbe || cptr->deviceProbe(minor)) && - cptr->pDeviceFns->deviceProbe(minor)) { - return minor; - } - } - - /* - * Error No devices were found. We will want to bail here. - */ - rtems_fatal_error_occurred(RTEMS_IO_ERROR); -} - -static bool parse_printk_or_console( - const char *param, - rtems_device_minor_number *minor_out -) -{ - static const char *opt; - const char *option; - const char *comma; - size_t length; - size_t index; - rtems_device_minor_number minor; - console_tbl *conscfg; - - /* - * Check the command line for the type of mode the console is. - */ - opt = bsp_cmdline_arg(param); - if ( !opt ) { - return false; - } - - /* - * Fine the length, there can be more command line visible. - */ - length = 0; - while ((opt[length] != ' ') && (opt[length] != '\0')) { - ++length; - if (length > NAME_MAX) { - printk("invalid option (%s): too long\n", param); - return false; - } - } - - /* - * Only match up to a comma or NULL - */ - index = 0; - while ((opt[index] != '=') && (index < length)) { - ++index; - } - - if (opt[index] != '=') { - printk("invalid option (%s): no equals\n", param); - return false; - } - - ++index; - option = &opt[index]; - - while ((opt[index] != ',') && (index < length)) { - ++index; - } - - if (opt[index] == ',') - comma = &opt[index]; - else - comma = NULL; - - length = &opt[index] - option; - - conscfg = console_find_console_entry( option, length, &minor ); - if ( conscfg == NULL ) { - return false; - } - - *minor_out = minor; - if (comma) { - option = comma + 1; - if (strncmp (option, "115200", sizeof ("115200") - 1) == 0) - conscfg->pDeviceParams = (void *)115200; - else if (strncmp (option, "57600", sizeof ("57600") - 1) == 0) - conscfg->pDeviceParams = (void *)57600; - else if (strncmp (option, "38400", sizeof ("38400") - 1) == 0) - conscfg->pDeviceParams = (void *)38400; - else if (strncmp (option, "19200", sizeof ("19200") - 1) == 0) - conscfg->pDeviceParams = (void *)19200; - else if (strncmp (option, "9600", sizeof ("9600") - 1) == 0) - conscfg->pDeviceParams = (void *)9600; - else if (strncmp (option, "4800", sizeof ("4800") - 1) == 0) - conscfg->pDeviceParams = (void *)4800; - } - - return true; -} - -/* - * Helper to retrieve device name - */ -static inline const char *get_name( - rtems_device_minor_number minor -) -{ - return Console_Port_Tbl[minor]->sDeviceName; -} - -/* - * Parse the arguments early so the printk and console ports are - * set appropriately. - */ -void pc386_parse_console_arguments(void) -{ - rtems_device_minor_number minor; - rtems_device_minor_number minor_console = 0; - rtems_device_minor_number minor_printk = 0; - - /* - * Assume that if only --console is specified, that printk() should - * follow that selection by default. - */ - if ( parse_printk_or_console( "--console=", &minor ) ) { - minor_console = minor; - minor_printk = minor; - } - - /* - * But if explicitly specified, attempt to honor it. - */ - if ( parse_printk_or_console( "--printk=", &minor ) ) { - minor_printk = minor; - } - - printk( "Console: %s printk: %s\n", - get_name(minor_console),get_name(minor_printk) ); - - /* - * Any output after this can cause problems until termios is initialised. - */ - Console_Port_Minor = minor_console; - BSPPrintkPort = minor_printk; -} - -/* - * This handles the selection of the console after the devices are - * initialized. - */ -void bsp_console_select(void) -{ - #ifdef RTEMS_RUNTIME_CONSOLE_SELECT - /* - * WARNING: This code is really needed any more and should be removed. - * references to COM1 and COM2 like they are wrong. - */ - if ( BSP_runtime_console_select ) - BSP_runtime_console_select(&BSPPrintkPort, &Console_Port_Minor); - - /* - * If no video card, fall back to serial port console - */ - if((Console_Port_Minor == BSP_CONSOLE_VGA) - && (*(unsigned char*) NB_MAX_ROW_ADDR == 0) - && (*(unsigned short*)NB_MAX_COL_ADDR == 0)) { - Console_Port_Minor = BSP_CONSOLE_COM2; - BSPPrintkPort = BSP_CONSOLE_COM1; - } - #endif - - /* - * If the device that was selected isn't available then - * let the user know and select the first available device. - */ - if ( !bsp_Is_Available( Console_Port_Minor ) ) { - printk( - "Error finding %s setting console to first available\n", - get_name(Console_Port_Minor) - ); - Console_Port_Minor = bsp_First_Available_Device(); - } -} diff --git a/c/src/lib/libbsp/i386/pc386/console/defkeymap.c b/c/src/lib/libbsp/i386/pc386/console/defkeymap.c deleted file mode 100644 index a6bf5103a1..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/defkeymap.c +++ /dev/null @@ -1,262 +0,0 @@ -/* Do not edit this file! It was automatically generated by */ -/* loadkeys --mktable defkeymap.map > defkeymap.c */ - -#include -#include -#include - -u_short plain_map[NR_KEYS] = { - 0xf200, 0xf01b, 0xf031, 0xf032, 0xf033, 0xf034, 0xf035, 0xf036, - 0xf037, 0xf038, 0xf039, 0xf030, 0xf02d, 0xf03d, 0xf07f, 0xf009, - 0xfb71, 0xfb77, 0xfb65, 0xfb72, 0xfb74, 0xfb79, 0xfb75, 0xfb69, - 0xfb6f, 0xfb70, 0xf05b, 0xf05d, 0xf201, 0xf702, 0xfb61, 0xfb73, - 0xfb64, 0xfb66, 0xfb67, 0xfb68, 0xfb6a, 0xfb6b, 0xfb6c, 0xf03b, - 0xf027, 0xf060, 0xf700, 0xf05c, 0xfb7a, 0xfb78, 0xfb63, 0xfb76, - 0xfb62, 0xfb6e, 0xfb6d, 0xf02c, 0xf02e, 0xf02f, 0xf700, 0xf30c, - 0xf703, 0xf020, 0xf207, 0xf100, 0xf101, 0xf102, 0xf103, 0xf104, - 0xf105, 0xf106, 0xf107, 0xf108, 0xf109, 0xf208, 0xf209, 0xf307, - 0xf308, 0xf309, 0xf30b, 0xf304, 0xf305, 0xf306, 0xf30a, 0xf301, - 0xf302, 0xf303, 0xf300, 0xf310, 0xf206, 0xf200, 0xf03c, 0xf10a, - 0xf10b, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, - 0xf30e, 0xf702, 0xf30d, 0xf01c, 0xf701, 0xf205, 0xf114, 0xf603, - 0xf118, 0xf601, 0xf602, 0xf117, 0xf600, 0xf119, 0xf115, 0xf116, - 0xf11a, 0xf10c, 0xf10d, 0xf11b, 0xf11c, 0xf110, 0xf311, 0xf11d, - 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, -}; - -u_short shift_map[NR_KEYS] = { - 0xf200, 0xf01b, 0xf021, 0xf040, 0xf023, 0xf024, 0xf025, 0xf05e, - 0xf026, 0xf02a, 0xf028, 0xf029, 0xf05f, 0xf02b, 0xf07f, 0xf009, - 0xfb51, 0xfb57, 0xfb45, 0xfb52, 0xfb54, 0xfb59, 0xfb55, 0xfb49, - 0xfb4f, 0xfb50, 0xf07b, 0xf07d, 0xf201, 0xf702, 0xfb41, 0xfb53, - 0xfb44, 0xfb46, 0xfb47, 0xfb48, 0xfb4a, 0xfb4b, 0xfb4c, 0xf03a, - 0xf022, 0xf07e, 0xf700, 0xf07c, 0xfb5a, 0xfb58, 0xfb43, 0xfb56, - 0xfb42, 0xfb4e, 0xfb4d, 0xf03c, 0xf03e, 0xf03f, 0xf700, 0xf30c, - 0xf703, 0xf020, 0xf207, 0xf10a, 0xf10b, 0xf10c, 0xf10d, 0xf10e, - 0xf10f, 0xf110, 0xf111, 0xf112, 0xf113, 0xf213, 0xf203, 0xf307, - 0xf308, 0xf309, 0xf30b, 0xf304, 0xf305, 0xf306, 0xf30a, 0xf301, - 0xf302, 0xf303, 0xf300, 0xf310, 0xf206, 0xf200, 0xf03e, 0xf10a, - 0xf10b, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, - 0xf30e, 0xf702, 0xf30d, 0xf200, 0xf701, 0xf205, 0xf114, 0xf603, - 0xf20b, 0xf601, 0xf602, 0xf117, 0xf600, 0xf20a, 0xf115, 0xf116, - 0xf11a, 0xf10c, 0xf10d, 0xf11b, 0xf11c, 0xf110, 0xf311, 0xf11d, - 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, -}; - -u_short altgr_map[NR_KEYS] = { - 0xf200, 0xf200, 0xf200, 0xf040, 0xf200, 0xf024, 0xf200, 0xf200, - 0xf07b, 0xf05b, 0xf05d, 0xf07d, 0xf05c, 0xf200, 0xf200, 0xf200, - 0xfb71, 0xfb77, 0xf918, 0xfb72, 0xfb74, 0xfb79, 0xfb75, 0xfb69, - 0xfb6f, 0xfb70, 0xf200, 0xf07e, 0xf201, 0xf702, 0xf914, 0xfb73, - 0xf917, 0xf919, 0xfb67, 0xfb68, 0xfb6a, 0xfb6b, 0xfb6c, 0xf200, - 0xf200, 0xf200, 0xf700, 0xf200, 0xfb7a, 0xfb78, 0xf916, 0xfb76, - 0xf915, 0xfb6e, 0xfb6d, 0xf200, 0xf200, 0xf200, 0xf700, 0xf30c, - 0xf703, 0xf200, 0xf207, 0xf50c, 0xf50d, 0xf50e, 0xf50f, 0xf510, - 0xf511, 0xf512, 0xf513, 0xf514, 0xf515, 0xf208, 0xf202, 0xf911, - 0xf912, 0xf913, 0xf30b, 0xf90e, 0xf90f, 0xf910, 0xf30a, 0xf90b, - 0xf90c, 0xf90d, 0xf90a, 0xf310, 0xf206, 0xf200, 0xf07c, 0xf516, - 0xf517, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, - 0xf30e, 0xf702, 0xf30d, 0xf200, 0xf701, 0xf205, 0xf114, 0xf603, - 0xf118, 0xf601, 0xf602, 0xf117, 0xf600, 0xf119, 0xf115, 0xf116, - 0xf11a, 0xf10c, 0xf10d, 0xf11b, 0xf11c, 0xf110, 0xf311, 0xf11d, - 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, -}; - -u_short ctrl_map[NR_KEYS] = { - 0xf200, 0xf200, 0xf200, 0xf000, 0xf01b, 0xf01c, 0xf01d, 0xf01e, - 0xf01f, 0xf07f, 0xf200, 0xf200, 0xf01f, 0xf200, 0xf008, 0xf200, - 0xf011, 0xf017, 0xf005, 0xf012, 0xf014, 0xf019, 0xf015, 0xf009, - 0xf00f, 0xf010, 0xf01b, 0xf01d, 0xf201, 0xf702, 0xf001, 0xf013, - 0xf004, 0xf006, 0xf007, 0xf008, 0xf00a, 0xf00b, 0xf00c, 0xf200, - 0xf007, 0xf000, 0xf700, 0xf01c, 0xf01a, 0xf018, 0xf003, 0xf016, - 0xf002, 0xf00e, 0xf00d, 0xf200, 0xf20e, 0xf07f, 0xf700, 0xf30c, - 0xf703, 0xf000, 0xf207, 0xf100, 0xf101, 0xf102, 0xf103, 0xf104, - 0xf105, 0xf106, 0xf107, 0xf108, 0xf109, 0xf208, 0xf204, 0xf307, - 0xf308, 0xf309, 0xf30b, 0xf304, 0xf305, 0xf306, 0xf30a, 0xf301, - 0xf302, 0xf303, 0xf300, 0xf310, 0xf206, 0xf200, 0xf200, 0xf10a, - 0xf10b, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, - 0xf30e, 0xf702, 0xf30d, 0xf01c, 0xf701, 0xf205, 0xf114, 0xf603, - 0xf118, 0xf601, 0xf602, 0xf117, 0xf600, 0xf119, 0xf115, 0xf116, - 0xf11a, 0xf10c, 0xf10d, 0xf11b, 0xf11c, 0xf110, 0xf311, 0xf11d, - 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, -}; - -u_short shift_ctrl_map[NR_KEYS] = { - 0xf200, 0xf200, 0xf200, 0xf000, 0xf200, 0xf200, 0xf200, 0xf200, - 0xf200, 0xf200, 0xf200, 0xf200, 0xf01f, 0xf200, 0xf200, 0xf200, - 0xf011, 0xf017, 0xf005, 0xf012, 0xf014, 0xf019, 0xf015, 0xf009, - 0xf00f, 0xf010, 0xf200, 0xf200, 0xf201, 0xf702, 0xf001, 0xf013, - 0xf004, 0xf006, 0xf007, 0xf008, 0xf00a, 0xf00b, 0xf00c, 0xf200, - 0xf200, 0xf200, 0xf700, 0xf200, 0xf01a, 0xf018, 0xf003, 0xf016, - 0xf002, 0xf00e, 0xf00d, 0xf200, 0xf200, 0xf200, 0xf700, 0xf30c, - 0xf703, 0xf200, 0xf207, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, - 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf208, 0xf200, 0xf307, - 0xf308, 0xf309, 0xf30b, 0xf304, 0xf305, 0xf306, 0xf30a, 0xf301, - 0xf302, 0xf303, 0xf300, 0xf310, 0xf206, 0xf200, 0xf200, 0xf200, - 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, - 0xf30e, 0xf702, 0xf30d, 0xf200, 0xf701, 0xf205, 0xf114, 0xf603, - 0xf118, 0xf601, 0xf602, 0xf117, 0xf600, 0xf119, 0xf115, 0xf116, - 0xf11a, 0xf10c, 0xf10d, 0xf11b, 0xf11c, 0xf110, 0xf311, 0xf11d, - 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, -}; - -u_short alt_map[NR_KEYS] = { - 0xf200, 0xf81b, 0xf831, 0xf832, 0xf833, 0xf834, 0xf835, 0xf836, - 0xf837, 0xf838, 0xf839, 0xf830, 0xf82d, 0xf83d, 0xf87f, 0xf809, - 0xf871, 0xf877, 0xf865, 0xf872, 0xf874, 0xf879, 0xf875, 0xf869, - 0xf86f, 0xf870, 0xf85b, 0xf85d, 0xf80d, 0xf702, 0xf861, 0xf873, - 0xf864, 0xf866, 0xf867, 0xf868, 0xf86a, 0xf86b, 0xf86c, 0xf83b, - 0xf827, 0xf860, 0xf700, 0xf85c, 0xf87a, 0xf878, 0xf863, 0xf876, - 0xf862, 0xf86e, 0xf86d, 0xf82c, 0xf82e, 0xf82f, 0xf700, 0xf30c, - 0xf703, 0xf820, 0xf207, 0xf500, 0xf501, 0xf502, 0xf503, 0xf504, - 0xf505, 0xf506, 0xf507, 0xf508, 0xf509, 0xf208, 0xf209, 0xf907, - 0xf908, 0xf909, 0xf30b, 0xf904, 0xf905, 0xf906, 0xf30a, 0xf901, - 0xf902, 0xf903, 0xf900, 0xf310, 0xf206, 0xf200, 0xf83c, 0xf50a, - 0xf50b, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, - 0xf30e, 0xf702, 0xf30d, 0xf01c, 0xf701, 0xf205, 0xf114, 0xf603, - 0xf118, 0xf210, 0xf211, 0xf117, 0xf600, 0xf119, 0xf115, 0xf116, - 0xf11a, 0xf10c, 0xf10d, 0xf11b, 0xf11c, 0xf110, 0xf311, 0xf11d, - 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, -}; - -u_short ctrl_alt_map[NR_KEYS] = { - 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, - 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, - 0xf811, 0xf817, 0xf805, 0xf812, 0xf814, 0xf819, 0xf815, 0xf809, - 0xf80f, 0xf810, 0xf200, 0xf200, 0xf201, 0xf702, 0xf801, 0xf813, - 0xf804, 0xf806, 0xf807, 0xf808, 0xf80a, 0xf80b, 0xf80c, 0xf200, - 0xf200, 0xf200, 0xf700, 0xf200, 0xf81a, 0xf818, 0xf803, 0xf816, - 0xf802, 0xf80e, 0xf80d, 0xf200, 0xf200, 0xf200, 0xf700, 0xf30c, - 0xf703, 0xf200, 0xf207, 0xf500, 0xf501, 0xf502, 0xf503, 0xf504, - 0xf505, 0xf506, 0xf507, 0xf508, 0xf509, 0xf208, 0xf200, 0xf307, - 0xf308, 0xf309, 0xf30b, 0xf304, 0xf305, 0xf306, 0xf30a, 0xf301, - 0xf302, 0xf303, 0xf300, 0xf20c, 0xf206, 0xf200, 0xf200, 0xf50a, - 0xf50b, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, - 0xf30e, 0xf702, 0xf30d, 0xf200, 0xf701, 0xf205, 0xf114, 0xf603, - 0xf118, 0xf601, 0xf602, 0xf117, 0xf600, 0xf119, 0xf115, 0xf20c, - 0xf11a, 0xf10c, 0xf10d, 0xf11b, 0xf11c, 0xf110, 0xf311, 0xf11d, - 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, -}; - -ushort *key_maps[MAX_NR_KEYMAPS] = { - plain_map, shift_map, altgr_map, 0, - ctrl_map, shift_ctrl_map, 0, 0, - alt_map, 0, 0, 0, - ctrl_alt_map, 0 -}; - -unsigned int keymap_count = 7; - -/* - * Philosophy: most people do not define more strings, but they who do - * often want quite a lot of string space. So, we statically allocate - * the default and allocate dynamically in chunks of 512 bytes. - */ - -char func_buf[] = { - '\033', '[', '[', 'A', 0, - '\033', '[', '[', 'B', 0, - '\033', '[', '[', 'C', 0, - '\033', '[', '[', 'D', 0, - '\033', '[', '[', 'E', 0, - '\033', '[', '1', '7', '~', 0, - '\033', '[', '1', '8', '~', 0, - '\033', '[', '1', '9', '~', 0, - '\033', '[', '2', '0', '~', 0, - '\033', '[', '2', '1', '~', 0, - '\033', '[', '2', '3', '~', 0, - '\033', '[', '2', '4', '~', 0, - '\033', '[', '2', '5', '~', 0, - '\033', '[', '2', '6', '~', 0, - '\033', '[', '2', '8', '~', 0, - '\033', '[', '2', '9', '~', 0, - '\033', '[', '3', '1', '~', 0, - '\033', '[', '3', '2', '~', 0, - '\033', '[', '3', '3', '~', 0, - '\033', '[', '3', '4', '~', 0, - '\033', '[', '1', '~', 0, - '\033', '[', '2', '~', 0, - '\033', '[', '3', '~', 0, - '\033', '[', '4', '~', 0, - '\033', '[', '5', '~', 0, - '\033', '[', '6', '~', 0, - '\033', '[', 'M', 0, - '\033', '[', 'P', 0, -}; - -char *funcbufptr = func_buf; -int funcbufsize = sizeof(func_buf); -int funcbufleft = 0; /* space left */ - -char *func_table[MAX_NR_FUNC] = { - func_buf + 0, - func_buf + 5, - func_buf + 10, - func_buf + 15, - func_buf + 20, - func_buf + 25, - func_buf + 31, - func_buf + 37, - func_buf + 43, - func_buf + 49, - func_buf + 55, - func_buf + 61, - func_buf + 67, - func_buf + 73, - func_buf + 79, - func_buf + 85, - func_buf + 91, - func_buf + 97, - func_buf + 103, - func_buf + 109, - func_buf + 115, - func_buf + 120, - func_buf + 125, - func_buf + 130, - func_buf + 135, - func_buf + 140, - func_buf + 145, - 0, - 0, - func_buf + 149, - 0, -}; - -struct kbdiacr accent_table[MAX_DIACR] = { - {'`', 'A', '\300'}, {'`', 'a', '\340'}, - {'\'', 'A', '\301'}, {'\'', 'a', '\341'}, - {'^', 'A', '\302'}, {'^', 'a', '\342'}, - {'~', 'A', '\303'}, {'~', 'a', '\343'}, - {'"', 'A', '\304'}, {'"', 'a', '\344'}, - {'O', 'A', '\305'}, {'o', 'a', '\345'}, - {'0', 'A', '\305'}, {'0', 'a', '\345'}, - {'A', 'A', '\305'}, {'a', 'a', '\345'}, - {'A', 'E', '\306'}, {'a', 'e', '\346'}, - {',', 'C', '\307'}, {',', 'c', '\347'}, - {'`', 'E', '\310'}, {'`', 'e', '\350'}, - {'\'', 'E', '\311'}, {'\'', 'e', '\351'}, - {'^', 'E', '\312'}, {'^', 'e', '\352'}, - {'"', 'E', '\313'}, {'"', 'e', '\353'}, - {'`', 'I', '\314'}, {'`', 'i', '\354'}, - {'\'', 'I', '\315'}, {'\'', 'i', '\355'}, - {'^', 'I', '\316'}, {'^', 'i', '\356'}, - {'"', 'I', '\317'}, {'"', 'i', '\357'}, - {'-', 'D', '\320'}, {'-', 'd', '\360'}, - {'~', 'N', '\321'}, {'~', 'n', '\361'}, - {'`', 'O', '\322'}, {'`', 'o', '\362'}, - {'\'', 'O', '\323'}, {'\'', 'o', '\363'}, - {'^', 'O', '\324'}, {'^', 'o', '\364'}, - {'~', 'O', '\325'}, {'~', 'o', '\365'}, - {'"', 'O', '\326'}, {'"', 'o', '\366'}, - {'/', 'O', '\330'}, {'/', 'o', '\370'}, - {'`', 'U', '\331'}, {'`', 'u', '\371'}, - {'\'', 'U', '\332'}, {'\'', 'u', '\372'}, - {'^', 'U', '\333'}, {'^', 'u', '\373'}, - {'"', 'U', '\334'}, {'"', 'u', '\374'}, - {'\'', 'Y', '\335'}, {'\'', 'y', '\375'}, - {'T', 'H', '\336'}, {'t', 'h', '\376'}, - {'s', 's', '\337'}, {'"', 'y', '\377'}, - {'s', 'z', '\337'}, {'i', 'j', '\377'}, -}; - -unsigned int accent_table_size = 68; diff --git a/c/src/lib/libbsp/i386/pc386/console/exar17d15x.c b/c/src/lib/libbsp/i386/pc386/console/exar17d15x.c deleted file mode 100644 index d9929c36b4..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/exar17d15x.c +++ /dev/null @@ -1,224 +0,0 @@ -/** - * @file - * - * @brief Driver for Exar XR17D15x Multiport UARTs - * - * This driver supports 2, 4 or 8 port Exar parts which are NS16550 - * compatible. - */ - -/* - * COPYRIGHT (c) 1989-2012. - * On-Line Applications Research Corporation (OAR). - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include "../../../../../../../bsps/shared/dev/serial/legacy-console.h" - -#define MAX_BOARDS 4 - -/* - * This is the rate for the clock internal to the parts. - */ -#define EXAR_CLOCK_RATE (921600*16) - -/* - * Supported PCI Ids - */ -#define PCI_VENDOR_ID_EXAR 0x13A8 -#define PCI_VENDOR_ID_EXAR_XR17D158 0x0158 -#define PCI_VENDOR_ID_EXAR_XR17D154 0x0154 -#define PCI_VENDOR_ID_EXAR_XR17D152 0x0152 - -/* - * Structure to manage each instance found. - */ -typedef struct { - uint16_t vendor; - uint16_t device; - uint8_t ports; -} exar_parts_t; - -static exar_parts_t Supported[] = { - { PCI_VENDOR_ID_EXAR, PCI_VENDOR_ID_EXAR_XR17D158, 8 }, - { PCI_VENDOR_ID_EXAR, PCI_VENDOR_ID_EXAR_XR17D154, 4 }, - { PCI_VENDOR_ID_EXAR, PCI_VENDOR_ID_EXAR_XR17D152, 2 }, - { 0, 0, 0 } -}; - -/* - * Information saved from PCI scan - */ -typedef struct { - bool found; - uint32_t base; - uint8_t irq; - uint8_t bus; - uint8_t slot; - uint8_t ports; -} exar17d15x_conf_t; - -/* - * Register Access Routines - */ -static uint8_t xr17d15x_get_register(uint32_t addr, uint8_t i) -{ - uint8_t val = 0; - volatile uint8_t *reg = (volatile uint8_t *)(addr + i); - - val = *reg; - // printk( "RD %p -> 0x%02x\n", reg, val ); - return val; -} - -static void xr17d15x_set_register(uint32_t addr, uint8_t i, uint8_t val) -{ - volatile uint8_t *reg = (volatile uint8_t *)(addr + i); - - // printk( "WR %p <- 0x%02x\n", reg, val ); - *reg = val; -} - -rtems_device_driver exar17d15x_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor_arg, - void *arg -) -{ - // int pbus, pdev, pfun; - exar17d15x_conf_t conf[MAX_BOARDS]; - int boards = 0; - int b = 0; - int p; - console_tbl *ports; - console_tbl *port_p; - int pbus; - int pdev; - int pfun; - int status; - int instance; - int i; - int total_ports = 0; - - for ( b=0 ; bsDeviceName = strdup( name ); - port_p->deviceType = SERIAL_NS16550; - #if 1 - port_p->pDeviceFns = &ns16550_fns_polled; - #else - port_p->pDeviceFns = &ns16550_fns; - #endif - - port_p->deviceProbe = NULL; - port_p->pDeviceFlow = NULL; - port_p->ulMargin = 16; - port_p->ulHysteresis = 8; - port_p->pDeviceParams = (void *) 9600; - port_p->ulCtrlPort1 = conf[b].base + (p * 0x0200); - port_p->ulCtrlPort2 = 0; /* NA */ - port_p->ulDataPort = 0; /* NA */ - port_p->getRegister = xr17d15x_get_register; - port_p->setRegister = xr17d15x_set_register; - port_p->getData = NULL; /* NA */ - port_p->setData = NULL; /* NA */ - port_p->ulClock = EXAR_CLOCK_RATE; - port_p->ulIntVector = conf[b].irq; - - port_p++; - } /* end ports */ - } /* end boards */ - - /* - * Register the devices - */ - if ( boards ) - console_register_devices( ports, total_ports ); - - return RTEMS_SUCCESSFUL; -} diff --git a/c/src/lib/libbsp/i386/pc386/console/fb_cirrus.c b/c/src/lib/libbsp/i386/pc386/console/fb_cirrus.c deleted file mode 100644 index bb05b5a338..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/fb_cirrus.c +++ /dev/null @@ -1,766 +0,0 @@ -/* - * FB driver for Cirrus GD5446 graphic hardware. - * Tested to be compatible with QEMU GD5446 emulation but not on real HW. - * - * Copyright (c) 2012 - Alexandru-Sever Horin (alex.sever.h@gmail.com). - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - * - * The code is based on next information sources: - * - CL-GD5446 Technical Reference Manual, 1996, Second Edition - * - RTEMS fb_vga.c - Rosimildo da Silva ( rdasilva@connecttel.com ) - * - Cirrus xf86 driver - used as VGA hardware setup sequence documentation - */ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -/* flag to limit driver to protect against multiple opens */ -static Atomic_Flag driver_mutex; - -/* screen information for the VGA driver - * standard structures - */ -static struct fb_var_screeninfo fb_var; -static struct fb_fix_screeninfo fb_fix; - -#define CIRRUS_VENDOR_ID 0x1013 -#define CIRRUS_GD5446_DEVICE_ID 0x00b8 - -typedef struct _DisplayModeRec { - struct _DisplayModeRec *prev; - struct _DisplayModeRec *next; - char *name; /* identifier for the mode */ - int type; - - /* These are the values that the user sees/provides */ - int Clock; /* pixel clock freq (kHz) */ - int HDisplay; /* horizontal timing */ - int HSyncStart; - int HSyncEnd; - int HTotal; - int HSkew; - int VDisplay; /* vertical timing */ - int VSyncStart; - int VSyncEnd; - int VTotal; - int VScan; - int Flags; - - /* These are the values the hardware uses */ - int ClockIndex; - int SynthClock; /* Actual clock freq to - * be programmed (kHz) */ - int CrtcHDisplay; - int CrtcHBlankStart; - int CrtcHSyncStart; - int CrtcHSyncEnd; - int CrtcHBlankEnd; - int CrtcHTotal; - int CrtcHSkew; - int CrtcVDisplay; - int CrtcVBlankStart; - int CrtcVSyncStart; - int CrtcVSyncEnd; - int CrtcVBlankEnd; - int CrtcVTotal; - int CrtcHAdjusted; - int CrtcVAdjusted; - int PrivSize; - int32_t *Private; - int PrivFlags; - - float HSync, VRefresh; -} DisplayModeRec, *DisplayModePtr; - -static DisplayModeRec available_modes[] = { - { - .Clock = 31500 , - .HDisplay = 640 , - .HSyncStart = 664 , - .HSyncEnd = 704 , - .HTotal = 832 , - .HSkew = 0 , - .VDisplay = 480 , /* vertical timing */ - .VSyncStart = 489 , - .VSyncEnd = 491 , - .VTotal = 520 , - .VScan = 0, - .Flags = 0 - }, - { - .Clock = 40000 , - .HDisplay = 800 , - .HSyncStart = 840 , - .HSyncEnd = 968 , - .HTotal = 1056 , - .HSkew = 0 , - .VDisplay = 600 , /* vertical timing */ - .VSyncStart = 601 , - .VSyncEnd = 605 , - .VTotal = 628 , - .VScan = 0, - .Flags = 0 - }, -}; -static DisplayModePtr active_mode; - -/* The display mode used for the board hardcoded in the following define - * Index in above structure - */ -#define CIRRUS_DISPLAY_MODE 0 - -/* The display bytes per pixel used for the board hardcoded in the following define - * Index in above structure - */ -#define CIRRUS_DEFAULT_BPP 24 - -/* cirrus board information */ -struct cirrus_board_str{ - int pci_bus; - int pci_device; - int pci_function; - void *reg_base; -}; - -static struct cirrus_board_str cirrus_board_info; - -/* - * get information from the board - */ -static int -cirrus_pci_read( struct cirrus_board_str *cirrus_board, uint32_t *mem_base, uint32_t *cirrus_register_base) -{ - int r; - - r = pci_read_config_dword( - cirrus_board->pci_bus, cirrus_board->pci_device, cirrus_board->pci_function, - PCI_BASE_ADDRESS_0, mem_base); - if( r != PCIB_ERR_SUCCESS) - return RTEMS_UNSATISFIED; - - r = pci_read_config_dword( - cirrus_board->pci_bus, cirrus_board->pci_device, cirrus_board->pci_function, - PCI_BASE_ADDRESS_1, cirrus_register_base); - if( r != PCIB_ERR_SUCCESS) - return RTEMS_UNSATISFIED; - - *mem_base &= PCI_BASE_ADDRESS_MEM_MASK; - *cirrus_register_base &= PCI_BASE_ADDRESS_MEM_MASK; - - return RTEMS_SUCCESSFUL; -} - -static inline int -fb_cirrus_read_config_dword( - struct cirrus_board_str *fbst, - unsigned char where, - uint32_t *pval) -{ - return pci_read_config_dword( - fbst->pci_bus, fbst->pci_device, fbst->pci_function, - where, pval); -} - -static inline int -fb_cirrus_write_config_dword( - struct cirrus_board_str *fbst, - unsigned char where, - uint32_t val) -{ - return pci_write_config_dword( - fbst->pci_bus, fbst->pci_device, fbst->pci_function, - where, val); -} - -static inline void -fb_cirrus_write_reg8 ( - const struct cirrus_board_str *fbst, - unsigned int reg, - unsigned int val) -{ - *(volatile uint8_t*)((char *)fbst->reg_base + reg) = val; -} - -static inline unsigned int -fb_cirrus_read_reg8 ( - const struct cirrus_board_str *fbst, - unsigned int reg) -{ - return *(volatile uint8_t*)((char *)fbst->reg_base + reg); -} - -#define SEQ_INDEX 0x04 -#define SEQ_DATA 0x05 - -static inline void -fb_cirrus_write_seq_reg ( - const struct cirrus_board_str *fbst, - unsigned int reg, - unsigned int val) -{ - fb_cirrus_write_reg8(fbst, SEQ_INDEX, reg); - fb_cirrus_write_reg8(fbst, SEQ_DATA, val); -} - -static inline unsigned int -fb_cirrus_read_seq_reg ( - const struct cirrus_board_str *fbst, - unsigned int reg) -{ - fb_cirrus_write_reg8(fbst, SEQ_INDEX, reg); - return fb_cirrus_read_reg8(fbst, SEQ_DATA); -} - -#define CRT_INDEX 0x14 -#define CRT_DATA 0x15 - -static inline void -fb_cirrus_write_crt_reg ( - const struct cirrus_board_str *fbst, - unsigned int reg, - unsigned int val) -{ - fb_cirrus_write_reg8(fbst, CRT_INDEX, reg); - fb_cirrus_write_reg8(fbst, CRT_DATA, val); -} - -static inline unsigned int -fb_cirrus_read_crt_reg ( - const struct cirrus_board_str *fbst, - unsigned int reg) -{ - fb_cirrus_write_reg8(fbst, CRT_INDEX, reg); - return fb_cirrus_read_reg8(fbst, CRT_DATA); -} - -#define GDC_INDEX 0x0E -#define GDC_DATA 0x0F - -static inline void -fb_cirrus_write_gdc_reg ( - const struct cirrus_board_str *fbst, - unsigned int reg, - unsigned int val) -{ - fb_cirrus_write_reg8(fbst, GDC_INDEX, reg); - fb_cirrus_write_reg8(fbst, GDC_DATA, val); -} - -static inline unsigned int -fb_cirrus_read_gdc_reg ( - const struct cirrus_board_str *fbst, - unsigned int reg) -{ - fb_cirrus_write_reg8(fbst, GDC_INDEX, reg); - return fb_cirrus_read_reg8(fbst, GDC_DATA); -} - -#define VGA_DAC_MASK 0x06 - -static inline void -fb_cirrus_write_hdr_reg ( - const struct cirrus_board_str *fbst, - unsigned int val) -{ - volatile unsigned int dummy RTEMS_UNUSED; - dummy = fb_cirrus_read_reg8(fbst, VGA_DAC_MASK); - dummy = fb_cirrus_read_reg8(fbst, VGA_DAC_MASK); - dummy = fb_cirrus_read_reg8(fbst, VGA_DAC_MASK); - dummy = fb_cirrus_read_reg8(fbst, VGA_DAC_MASK); - fb_cirrus_write_reg8(fbst, VGA_DAC_MASK, val); -} - -/* Functionality to support multiple VGA frame buffers can be added easily, - * but is not supported at this moment because there is no need for two or - * more "classic" VGA adapters. Multiple frame buffer drivers may be - * implemented and If we had implement it they would be named as "/dev/fb0", - * "/dev/fb1", "/dev/fb2" and so on. - */ - -/* - * fb_cirrus device driver INITIALIZE entry point. - */ -rtems_device_driver -frame_buffer_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - rtems_status_code status; - int res; - - printk( "FB_CIRRUS -- driver initializing..\n" ); - - res = pci_find_device( - CIRRUS_VENDOR_ID, - CIRRUS_GD5446_DEVICE_ID, - minor, - &cirrus_board_info.pci_bus, - &cirrus_board_info.pci_device, - &cirrus_board_info.pci_function - ); - - if ( res != PCIB_ERR_SUCCESS ) { - printk( "FB_CIRRUS initialize -- device not found\n" ); - - return RTEMS_UNSATISFIED; - } - else{ - printk( "FB_CIRRUS -- driver initializing..\n" ); - /* - * Register the device - */ - status = rtems_io_register_name (FRAMEBUFFER_DEVICE_0_NAME, major, 0); - if (status != RTEMS_SUCCESSFUL) { - printk("Error registering " FRAMEBUFFER_DEVICE_0_NAME - " FB_CIRRUS framebuffer device!\n"); - rtems_fatal_error_occurred( status ); - } - - _Atomic_Flag_clear(&driver_mutex, ATOMIC_ORDER_RELEASE); - - return RTEMS_SUCCESSFUL; - } -} - -/* - * This function is used to initialize the Start Address - the first - * displayed location in the video memory. - * Usually mandatory - */ -static void -cirrus_adjust_frame( struct cirrus_board_str *board, int x, int y) -{ - uint32_t Base; - uint8_t tmp; - - Base = ((y * fb_var.xres + x) >> 3); - if (fb_var.bits_per_pixel != 1) - Base *= (fb_var.bits_per_pixel >> 2); - - printk("FB_CIRRUS: cirrus_adjust_frame %d %d >>> %d %x\n", x, y, Base, Base); - - if ((Base & ~0x000FFFFF) != 0) { - printk("FB_CIRRUS: Internal error: cirrus_adjust_frame: cannot handle overflow\n"); - return; - } - - fb_cirrus_write_crt_reg( board, 0x0C, (Base >> 8) & 0xff); - fb_cirrus_write_crt_reg( board, 0x0D, Base & 0xff); - - tmp = fb_cirrus_read_crt_reg( board, 0x1B); - tmp &= 0xF2; - tmp |= (Base >> 16) & 0x01; - tmp |= (Base >> 15) & 0x0C; - fb_cirrus_write_crt_reg( board, 0x1B, tmp); - - tmp = fb_cirrus_read_crt_reg( board, 0x1D); - tmp &= 0x7F; - tmp |= (Base >> 12) & 0x80; - fb_cirrus_write_crt_reg( board, 0x1D, tmp); -} - -static int -cirrus_set_mode(DisplayModePtr mode) -{ - int depthcode = fb_var.bits_per_pixel;; - int width; - int HDiv2 = 0, VDiv2 = 0; - const struct cirrus_board_str *cirrus_board_ptr = &cirrus_board_info; - int temp; - int hdr = -1; - - printk("FB_CIRRUS: mode %d bpp, %d Hz %d %d %d %d %d %d %d %d\n", - fb_var.bits_per_pixel, - mode->Clock, - mode->HDisplay, - mode->HSyncStart, - mode->HSyncEnd, - mode->HTotal, - mode->VDisplay, - mode->VSyncStart, - mode->VSyncEnd, - mode->VTotal); - - if ( mode->Clock > 85500 ) { - /* The actual DAC register value is set later. */ - /* The CRTC is clocked at VCLK / 2, so we must half the */ - /* horizontal timings. */ - if (!mode->CrtcHAdjusted) { - mode->HDisplay >>= 1; - mode->HSyncStart >>= 1; - mode->HTotal >>= 1; - mode->HSyncEnd >>= 1; - mode->SynthClock >>= 1; - mode->CrtcHAdjusted = TRUE; - } - depthcode += 64; - HDiv2 = 1; - } - if (mode->VTotal >= 1024 ) { - /* For non-interlaced vertical timing >= 1024, the vertical timings */ - /* are divided by 2 and VGA CRTC 0x17 bit 2 is set. */ - if (!mode->CrtcVAdjusted) { - mode->VDisplay >>= 1; - mode->VSyncStart >>= 1; - mode->VSyncEnd >>= 1; - mode->VTotal >>= 1; - mode->CrtcVAdjusted = TRUE; - } - VDiv2 = 1; - } - - /**************************************************** - * Sequential registers - */ - fb_cirrus_write_seq_reg(cirrus_board_ptr, 0x00, 0x00); - fb_cirrus_write_seq_reg(cirrus_board_ptr, 0x01, 0x01); - fb_cirrus_write_seq_reg(cirrus_board_ptr, 0x02, 0x0F); - fb_cirrus_write_seq_reg(cirrus_board_ptr, 0x03, 0x00); - fb_cirrus_write_seq_reg(cirrus_board_ptr, 0x04, 0x0E); - - /**************************************************** - * CRTC Controller Registers - */ - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x00, (mode->HTotal >> 3) - 5 ); - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x01, (mode->HDisplay >> 3) - 1); - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x02, (mode->HSyncStart >> 3) - 1); - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x03, ((mode->HSyncEnd >> 3) & 0x1F) | 0x80); - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x04, (mode->HSyncStart >> 3)); - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x05, - (((mode->HSyncEnd >> 3) & 0x20 ) << 2 ) - | (((mode->HSyncEnd >> 3)) & 0x1F)); - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x06, (mode->VTotal - 2) & 0xFF); - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x07, - (((mode->VTotal -2) & 0x100) >> 8 ) - | (((mode->VDisplay -1) & 0x100) >> 7 ) - | ((mode->VSyncStart & 0x100) >> 6 ) - | (((mode->VSyncStart) & 0x100) >> 5 ) - | 0x10 - | (((mode->VTotal -2) & 0x200) >> 4 ) - | (((mode->VDisplay -1) & 0x200) >> 3 ) - | ((mode->VSyncStart & 0x200) >> 2 )); - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x08, 0x00); - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x09, ((mode->VSyncStart & 0x200) >>4) | 0x40); - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x0A, 0x00); - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x0B, 0x00); - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x0C, 0x00); - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x0D, 0x00); - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x0E, 0x00); - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x0F, 0x00); - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x10, mode->VSyncStart & 0xFF); - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x11, (mode->VSyncEnd & 0x0F) | 0x20); - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x12, (mode->VDisplay -1) & 0xFF); - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x13, 0x00); /* no interlace */ - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x14, 0x00); - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x15, mode->VSyncStart & 0xFF); - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x16, (mode->VSyncStart +1) & 0xFF); - - temp = 0xAF; - if(VDiv2) - temp |= 0x04; - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x17, temp); - - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x18, 0xFF); - - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x1A , - (((mode->HTotal >> 3) & 0xC0 ) >> 2) - | (((mode->VTotal - 2) & 0x300 ) >> 2)); - - width = fb_fix.line_length >> 3; - if (fb_var.bits_per_pixel == 1) - width <<= 2; - if(width >= 0xFF) - printk("FB_CIRRUS: Warning line size over the limit ... reduce bpp or width resolution"); - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x13, width); - /* Offset extension (see CR13) */ - temp = fb_cirrus_read_crt_reg( cirrus_board_ptr, 0x1B); - temp &= 0xAF; - temp |= (width >> (3+4)) & 0x10; - temp |= (width >> (3+3)) & 0x40; - temp |= 0x22; - fb_cirrus_write_crt_reg( cirrus_board_ptr, 0x1B, temp); - - /**************************************************** - * Sequential register - * Enable linear mode and high-res packed pixel mode - */ - temp = fb_cirrus_read_seq_reg( cirrus_board_ptr, 0x07); - temp &= 0xe0; - switch (depthcode) { - case 1: - case 4: - temp |= 0x10; - break; - case 8: - temp |= 0x11; - break; - case 64+8: - temp |= 0x17; - break; - case 15: - temp |= 0x17; - hdr = 0xC0; /* 5:5:5 Sierra */ - break; - case 16: - temp |= 0x17; - hdr = 0xC1; /* 5:6:5 XGA mode */ - break; - case 24: - temp |= 0x15; - hdr = 0xC5; /* 8:8:8 16M colors */ - break; - case 32: - temp |= 0x19; - hdr = 0xC5; /* 8:8:8 16M colors */ - break; - default: - printk("FB_CIRRUS: Cannot Initialize display to requested mode\n"); - printk("FB_CIRRUS: returning RTEMS_UNSATISFIED on depthcode %d\n", depthcode); - return RTEMS_UNSATISFIED; - } - fb_cirrus_write_seq_reg( cirrus_board_ptr, 0x07, temp); - /* this just set packed pixel mode with according bpp */ - - /**************************************************** - * HDR Register - */ - if(hdr > 0) - fb_cirrus_write_hdr_reg( cirrus_board_ptr, hdr); - - /**************************************************** - * Graphic Data Controller Registers - */ - temp = fb_cirrus_read_gdc_reg( cirrus_board_ptr, 0x12); - if (HDiv2) - temp |= 0x20; - else - temp &= ~0x20; - fb_cirrus_write_gdc_reg( cirrus_board_ptr, 0x12, temp); - - /* Enable high-color modes */ - fb_cirrus_write_gdc_reg(cirrus_board_ptr, 0x05, 0x40); - - /* VGA graphics mode */ - fb_cirrus_write_gdc_reg(cirrus_board_ptr, 0x06, 0x01); - - return TRUE; -} - -static void -cirrus_prepare_mode( void ) -{ - - active_mode = &available_modes[CIRRUS_DISPLAY_MODE]; - - fb_var.bits_per_pixel = CIRRUS_DEFAULT_BPP; - - fb_var.xres = active_mode->HDisplay; - fb_var.yres = active_mode->VDisplay; - - fb_fix.line_length = (fb_var.xres * fb_var.bits_per_pixel + 7) / 8; - - fb_fix.type = FB_TYPE_PACKED_PIXELS; - fb_fix.visual = FB_VISUAL_TRUECOLOR; - -} - -/* - * fb_cirrus device driver OPEN entry point - */ -rtems_device_driver -frame_buffer_open( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - int r; - uint32_t smem_start, regs_start; - - if (_Atomic_Flag_test_and_set(&driver_mutex, ATOMIC_ORDER_ACQUIRE) != 0 ) { - printk( "FB_CIRRUS could not lock driver_mutex\n" ); - - return RTEMS_UNSATISFIED; - } - - r = cirrus_pci_read(&cirrus_board_info, &smem_start, ®s_start); - if ( r == RTEMS_UNSATISFIED ) - return RTEMS_UNSATISFIED; - - fb_fix.smem_start = (volatile char *)smem_start; - fb_fix.smem_len = 0x1000000; - cirrus_board_info.reg_base = (void *)regs_start; - - cirrus_prepare_mode(); - - cirrus_set_mode( active_mode ); - - cirrus_adjust_frame( &cirrus_board_info, 0, 0); - - if (1) { - uint32_t pixmask; - int x, y; - - if(fb_var.bits_per_pixel == 32) - pixmask = 0xffffff; - else - pixmask = (1 << fb_var.bits_per_pixel) - 1; - - printk("FB_CIRRUS: mode set, test patter output\n"); - - for(y = 0; y < fb_var.yres; y++) { - for(x = 0; x < fb_var.xres; x++) { - uint32_t color; - char *addr = (char *)fb_fix.smem_start; - addr += y * fb_fix.line_length; - addr += x * fb_var.bits_per_pixel / 8; - color = x & 1 ? 0 : y & 1 ? pixmask & 0x000ff00f : pixmask; - if(y == fb_var.yres - 1) { - if((x > 0) && (x < fb_var.xres-1)) - color = pixmask & 0x00555555; - } - switch (fb_var.bits_per_pixel) { - case 8: *(volatile uint8_t*) addr = color; - break; - case 16: *(volatile uint16_t*) addr = color; - break; - case 24: *(volatile uint32_t*) addr = - (*(volatile uint32_t*) addr & 0xff000000) | color; - break; - case 32: *(volatile uint32_t*) addr = color; - break; - } - } - } - } - - return RTEMS_SUCCESSFUL; - -} - -/* - * fb_cirrus device driver CLOSE entry point - */ -rtems_device_driver -frame_buffer_close( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - _Atomic_Flag_clear(&driver_mutex, ATOMIC_ORDER_RELEASE); - - /* restore previous state. for VGA this means return to text mode. - * leave out if graphics hardware has been initialized in - * frame_buffer_initialize() */ - - /* VGA text mode */ - fb_cirrus_write_gdc_reg(&cirrus_board_info, 0x06, 0x00); - - printk( "FB_CIRRUS: close called.\n" ); - return RTEMS_SUCCESSFUL; -} - -/* - * fb_cirrus device driver READ entry point. - */ -rtems_device_driver -frame_buffer_read( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *)arg; - rw_args->bytes_moved = ((rw_args->offset + rw_args->count) > fb_fix.smem_len ) ? (fb_fix.smem_len - rw_args->offset) : rw_args->count; - memcpy(rw_args->buffer, (const void *) (fb_fix.smem_start + rw_args->offset), rw_args->bytes_moved); - return RTEMS_SUCCESSFUL; -} - -/* - * frame_buffer device driver WRITE entry point. - */ -rtems_device_driver -frame_buffer_write( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *)arg; - rw_args->bytes_moved = ((rw_args->offset + rw_args->count) > fb_fix.smem_len ) ? (fb_fix.smem_len - rw_args->offset) : rw_args->count; - memcpy( (void *) (fb_fix.smem_start + rw_args->offset), rw_args->buffer, rw_args->bytes_moved); - return RTEMS_SUCCESSFUL; -} - -static int -get_fix_screen_info( struct fb_fix_screeninfo *info ) -{ - *info = fb_fix; - return 0; -} - -static int -get_var_screen_info( struct fb_var_screeninfo *info ) -{ - *info = fb_var; - return 0; -} - -/* - * IOCTL entry point -- This method is called to carry - * all services of this interface. - */ -rtems_device_driver -frame_buffer_control( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - rtems_libio_ioctl_args_t *args = arg; - - printk( "FB_CIRRUS ioctl called, cmd=%x\n", args->command ); - - switch( args->command ) { - case FBIOGET_FSCREENINFO: - args->ioctl_return = get_fix_screen_info( ( struct fb_fix_screeninfo * ) args->buffer ); - break; - case FBIOGET_VSCREENINFO: - args->ioctl_return = get_var_screen_info( ( struct fb_var_screeninfo * ) args->buffer ); - break; - case FBIOPUT_VSCREENINFO: - /* not implemented yet */ - args->ioctl_return = -1; - return RTEMS_UNSATISFIED; - case FBIOGETCMAP: - /* no palette - truecolor mode */ - args->ioctl_return = -1; - return RTEMS_UNSATISFIED; - case FBIOPUTCMAP: - /* no palette - truecolor mode */ - args->ioctl_return = -1; - return RTEMS_UNSATISFIED; - default: - args->ioctl_return = 0; - break; - } - return RTEMS_SUCCESSFUL; -} diff --git a/c/src/lib/libbsp/i386/pc386/console/fb_vesa_rm.c b/c/src/lib/libbsp/i386/pc386/console/fb_vesa_rm.c deleted file mode 100644 index 1c42956fce..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/fb_vesa_rm.c +++ /dev/null @@ -1,1004 +0,0 @@ -/** - * @file fb_vesa_rm.c - * - * @ingroup i386_pc386 - * - * @brief FB driver for graphic hardware compatible with VESA Bios Extension - * Real mode interface utilized - * Tested on real HW. - * - * Public sources related: - * - VESA BIOS EXTENSION (VBE) Core Function Standard, Ver: 3.0, Sep 16, 1998 - * - VESA Enhanced Extended Display Identification Data (E-EDID) Standard - * Release A, Revision 2, September 25, 2006 - * - * Hardware is completely initialized upon boot of the system. - * Therefore there is no way to change graphics mode later. - * - * Interrupt 0x10 is used for entering graphics BIOS. - * - * Driver reads parameter from multiboot command line to setup video: - * "--video=x[-]" - * "--video=auto" - try EDID to find mode that fits the display attached best - * "--video=none" / "--video=off" - do not initialize the driver - * If cmdline parameter is not specified the rtems_fb_default_mode - * variable content is tested (see doc below). - * Command line option has higher priority. rtems_fb_default_mode is probed - * only if cmdline "--video=" is not specified at all. - * - * If neither of the above options is specified the driver is not initialized. - */ - -/* - * Copyright (c) 2014 - CTU in Prague - * Jan Doležal ( dolezj21@fel.cvut.cz ) - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - * - * The code for rtems_buffer_* functions was greatly - * inspired or coppied from: - * - RTEMS fb_cirrus.c - Alexandru-Sever Horin (alex.sever.h@gmail.com) - */ - -#include - -#include - -#include -#include -#include - -#include - -#include - -#include -#include - -#include - -#include - -#define FB_VESA_NAME "FB_VESA_RM" - -/** - * @brief Allows to enable initialization of VESA real mode driver from - * an application by setting the value of this variable to non null value in - * user's module. The value of this variable will be then updated - * when linked with application's object. - * - * Further the value should point to string in the following format: - * "x[-]" - e.g. "1024x768-32" - * "auto" - try EDID to find mode that fits the display attached best - * "none" / "off" - do not initialize the driver - * the given parameters are used if applicable. - * - * Command line argument "--video=" has priority over this string. - */ -const char * const rtems_fb_default_mode; - -/** - * @brief Initializes VBE framebuffer during bootup. - * - * utilizes switches to real mode interrupts and therefore must be - * called during bootup before tick is set up and real-time - * interrupt vectors utilized - */ -void vesa_realmode_bootup_init(void); - -/* flag to limit driver to protect against multiple opens */ -static Atomic_Flag driver_mutex; - -/* screen information for the VGA driver - * standard structures - from RTEMS fb interface - */ -static struct fb_var_screeninfo fb_var; -static struct fb_fix_screeninfo fb_fix; - -static int32_t vbe_used_mode; - -uint32_t VBE_controller_information( VBE_vbe_info_block *info_block, - uint16_t queried_VBE_Version) -{ - uint16_t size; - VBE_vbe_info_block *VBE_buffer = - (VBE_vbe_info_block *)i386_get_default_rm_buffer(&size); - i386_realmode_interrupt_registers parret; - parret.reg_eax = VBE_RetVBEConInf; - uint16_t seg, off; - i386_Physical_to_real(VBE_buffer, &seg, &off); - parret.reg_edi = (uint32_t)off; - parret.reg_es = seg; - /* indicate to graphic's bios that VBE2.0 extended information is desired */ - if (queried_VBE_Version >= 0x200) - { - memcpy( - &VBE_buffer->VbeSignature, - VBE20plus_SIGNATURE, - sizeof(VBE_buffer->VbeSignature) - ); - } - if (i386_real_interrupt_call(INTERRUPT_NO_VIDEO_SERVICES, &parret) == 0) - return -1; - if ((parret.reg_eax & 0xFFFF) == - (VBE_callSuccessful<<8 | VBE_functionSupported)) - { - *info_block = *VBE_buffer; - } - return (parret.reg_eax & 0xFFFF); -} - -uint32_t VBE_mode_information( VBE_mode_info_block *info_block, - uint16_t mode_number) -{ - uint16_t size; - VBE_mode_info_block *VBE_buffer = - (VBE_mode_info_block *)i386_get_default_rm_buffer(&size); - i386_realmode_interrupt_registers parret; - parret.reg_eax = VBE_RetVBEModInf; - parret.reg_ecx = mode_number; - uint16_t seg, off; - i386_Physical_to_real(VBE_buffer, &seg, &off); - parret.reg_edi = (uint32_t)off; - parret.reg_es = seg; - if (i386_real_interrupt_call(INTERRUPT_NO_VIDEO_SERVICES, &parret) == 0) - return -1; - if ((parret.reg_eax & 0xFFFF) == - (VBE_callSuccessful<<8 | VBE_functionSupported)) - { - *info_block = *VBE_buffer; - } - return (parret.reg_eax & 0xFFFF); -} - -uint32_t VBE_set_mode( uint16_t mode_number, - VBE_CRTC_info_block *info_block) -{ - uint16_t size; - VBE_CRTC_info_block *VBE_buffer = - (VBE_CRTC_info_block *)i386_get_default_rm_buffer(&size); - i386_realmode_interrupt_registers parret; - /* copy CRTC */ - *VBE_buffer = *info_block; - parret.reg_eax = VBE_SetVBEMod; - parret.reg_ebx = mode_number; - uint16_t seg, off; - i386_Physical_to_real(VBE_buffer, &seg, &off); - parret.reg_edi = (uint32_t)off; - parret.reg_es = seg; - if (i386_real_interrupt_call(INTERRUPT_NO_VIDEO_SERVICES, &parret) == 0) - return -1; - return (parret.reg_eax & 0xFFFF); -} - -uint32_t VBE_current_mode(uint16_t *mode_number) -{ - i386_realmode_interrupt_registers parret; - parret.reg_eax = VBE_RetCurVBEMod; - if (i386_real_interrupt_call(INTERRUPT_NO_VIDEO_SERVICES, &parret) == 0) - return -1; - *mode_number = (uint16_t)parret.reg_ebx; - return (parret.reg_eax & 0xFFFF); -} - -uint32_t VBE_report_DDC_capabilities(uint16_t controller_unit_number, - uint8_t *seconds_to_transfer_EDID_block, - uint8_t *DDC_level_supported) -{ - i386_realmode_interrupt_registers parret; - parret.reg_eax = VBE_DisDatCha; - parret.reg_ebx = VBEDDC_Capabilities; - parret.reg_ecx = controller_unit_number; - parret.reg_edi = 0; - parret.reg_es = 0; - if (i386_real_interrupt_call(INTERRUPT_NO_VIDEO_SERVICES, &parret) == 0) - return -1; - *seconds_to_transfer_EDID_block = (uint8_t)parret.reg_ebx >> 8; - *DDC_level_supported = (uint8_t)parret.reg_ebx; - return (parret.reg_eax & 0xFFFF); -} - -uint32_t VBE_read_EDID(uint16_t controller_unit_number, - uint16_t EDID_block_number, - EDID_edid1 *buffer) -{ - uint16_t size; - EDID_edid1 *VBE_buffer = (EDID_edid1*)i386_get_default_rm_buffer(&size); - i386_realmode_interrupt_registers parret; - parret.reg_eax = VBE_DisDatCha; - parret.reg_ebx = VBEDDC_ReadEDID; - parret.reg_ecx = controller_unit_number; - parret.reg_edx = EDID_block_number; - uint16_t seg, off; - i386_Physical_to_real(VBE_buffer, &seg, &off); - parret.reg_edi = (uint32_t)off; - parret.reg_es = seg; - if (i386_real_interrupt_call(INTERRUPT_NO_VIDEO_SERVICES, &parret) == 0) - return -1; - if ((parret.reg_eax & 0xFFFF) == - (VBE_callSuccessful<<8 | VBE_functionSupported)) - { - *buffer = *VBE_buffer; - } - return (parret.reg_eax & 0xFFFF); -} - -/** - * @brief Basic graphic's mode parameters - */ -typedef struct { - /** number of the graphic's mode */ - uint16_t mode_number; - /** number of pixels in one line */ - uint16_t resX; - /** number of lines */ - uint16_t resY; - /** bits per pixel */ - uint8_t bpp; -} Mode_params; - -typedef enum { - NO_SUITABLE_MODE = -1, - BAD_FORMAT = -2, - AUTO_SELECT = -3, - DONT_INIT = -4, - NO_MODE_REQ = -5, -} mode_err_ret_val; - -/** - * @brief Find mode by resolution in the given list of modes - * - * finds mode in \p mode_list of \p list_length length according to resolution - * given in \p searched_resolution . If bpp is given in that struct as well - * mode with such color depth and resolution is searched for. Otherwise bpp - * has to be zero. Mode number found is returned and also filled into - * \p searched_resolution . bpp is also filled into \p searchedResolution if it - * was 0 before call. - * - * @param[in] mode_list list of modes to be searched - * @param[in] list_length number of modes in the list - * @param[in,out] searched_resolution element filled with searched resolution - * or/and bpp; mode_number is filled in if appropriate mode found - * @retval mode number satisfying given parameters - * @retval -1 no suitable mode found - */ -static int32_t find_mode_by_resolution(Mode_params *mode_list, - uint8_t list_length, - Mode_params *searched_resolution) -{ - uint8_t i = 0; - while (i < list_length) - { - if (searched_resolution->resX == mode_list[i].resX && - searched_resolution->resY == mode_list[i].resY) - { - if (searched_resolution->bpp==0 || - searched_resolution->bpp==mode_list[i].bpp) - { - searched_resolution->bpp = mode_list[i].bpp; - searched_resolution->mode_number = mode_list[i].mode_number; - return mode_list[i].mode_number; - } - } - i++; - } - return NO_SUITABLE_MODE; -} - -/** - * @brief Find mode given in string format. - * - * expected format - * x[-] - * numbers , and are decadic - * - * @param[in] mode_list list of modes to be searched - * @param[in] list_length number of modes in the list - * @param[in] video_string string to be parsed - * @retval video mode number to be set - * @retval -1 no suitable mode found - * @retval -2 bad format of the video_string - * @retval -3 automatic mode selection requested - * @retval -4 request to not initialize graphics - * @retval -5 no mode requested/empty video string - */ -static int32_t find_mode_from_string(Mode_params *mode_list, - uint8_t list_length, - const char *video_string) -{ - const char* opt; - Mode_params cmdline_mode; - char* endptr; - cmdline_mode.bpp = 16; /* default bpp */ - opt = video_string; - if (opt) - { - if (strncmp(opt, "auto", 4) == 0) - return AUTO_SELECT; - if (strncmp(opt, "none", 4) == 0 || - strncmp(opt, "off", 3) == 0) - { - return DONT_INIT; - } - cmdline_mode.resX = strtol(opt, &endptr, 10); - if (*endptr != 'x') - { - return BAD_FORMAT; - } - opt = endptr+1; - cmdline_mode.resY = strtol(opt, &endptr, 10); - switch (*endptr) - { - case '-': - opt = endptr+1; - if (strlen(opt) <= 2) - cmdline_mode.bpp = strtol(opt, &endptr, 10); - else - { - cmdline_mode.bpp = strtol(opt, &endptr, 10); - if (*endptr != ' ') - { - return BAD_FORMAT; - } - } - case ' ': - case 0: - break; - default: - return BAD_FORMAT; - } - - return find_mode_by_resolution(mode_list, list_length, &cmdline_mode); - } - return NO_MODE_REQ; -} - -/** - * @brief Find mode given within command line. - * - * Parse command line option "--video=" if available. - * expected format - * --video=x[-] - * numbers , and are decadic - * - * @param[in] mode_list list of modes to be searched - * @param[in] list_length number of modes in the list - * @retval video mode number to be set - * @retval -1 no suitable mode found - * @retval -2 bad format of the video_string - * @retval -3 automatic mode selection requested - * @retval -4 request to not initialize graphics - * @retval -5 no mode requested/empty video string - */ -static int32_t find_mode_using_cmdline(Mode_params *mode_list, - uint8_t list_length) -{ - const char* opt; - opt = bsp_cmdline_arg("--video="); - if (opt) - { - opt += sizeof("--video=")-1; - return find_mode_from_string(mode_list, list_length, opt); - } - return NO_MODE_REQ; -} - -/** - * @brief Find mode number best fitting to monitor attached - * - * @param[in] mode_list list of modes to be searched - * @param[in] list_length number of modes in the list - * @retval video mode number to be set - * @retval -1 on parsing error or when no suitable mode found - */ -static int32_t find_mode_using_EDID( Mode_params *mode_list, - uint8_t list_length) -{ - EDID_edid1 edid; - uint8_t checksum, iterator; - uint8_t index, j; - Mode_params EDIDmode; - checksum = 0; - iterator = 0; - EDIDmode.bpp = 0; - if (VBE_read_EDID(0, 0, &edid) != - (VBE_callSuccessful<<8 | VBE_functionSupported)) - { - printk(FB_VESA_NAME " Function 15h (read EDID) not supported.\n"); - return -1; - } -/* version of EDID structure */ - if (edid.Version == 1) - { /* EDID version 1 */ - while (iterator < sizeof(EDID_edid1)) - { - checksum += *((uint8_t *)&edid+iterator); - iterator++; - } - if (checksum) - /* not implemented: try to read EDID again */ - printk(FB_VESA_NAME " EDID v1 checksum failed\n"); - - /* try to find Detailed Timing Descriptor (defined in BASE EDID) - in controller mode list; first should be preffered mode */ - index = 0; - while (index < 4) - { - /* skip if it is monitor descriptor */ - if (edid.dtd_md[index].md.Flag0[0] == 0 && - edid.dtd_md[index].md.Flag0[1] == 0 && - edid.dtd_md[index].md.Flag1 == 0) - { - index++; - continue; - } - EDIDmode.resX = DTD_horizontal_active(&edid.dtd_md[0].dtd); - EDIDmode.resY = DTD_vertical_active(&edid.dtd_md[0].dtd); - if (find_mode_by_resolution(mode_list, list_length, &EDIDmode) != - -1) - return EDIDmode.mode_number; - - index++; - } - /* try to find Detailed Timing Descriptor (defined in optional EXTENSION - Blocks) in controller mode list */ - if (edid.ExtensionFlag > 0) - { - /* not implemented */ - } - /* try to find CVT (defined in BASE EDID) in controller mode list */ - index = 1; - while (index < 4) - { - if (edid.dtd_md[index].md.DataTypeTag == - EDID_DTT_CVT3ByteTimingCodes && - edid.dtd_md[index].md.Flag0[0] == 0 && - edid.dtd_md[index].md.Flag0[1] == 0 && - edid.dtd_md[index].md.Flag1 == 0 && - edid.dtd_md[index].md.Flag2 == 0) - { - EDID_CVT_timing_codes_3B *cvt = (EDID_CVT_timing_codes_3B *) - &edid.dtd_md[index].md.DescriptorData[0]; - j = 0; - while (j < 4) - { - EDIDmode.resY = edid1_CVT_addressable_lines_high( - &cvt->cvt[j] - ); - switch (edid1_CVT_aspect_ratio(&cvt->cvt[j])) - { - case EDID_CVT_AspectRatio_4_3: - EDIDmode.resX = (EDIDmode.resY*4)/3; - break; - case EDID_CVT_AspectRatio_16_9: - EDIDmode.resX = (EDIDmode.resY*16)/9; - break; - case EDID_CVT_AspectRatio_16_10: - EDIDmode.resX = (EDIDmode.resY*16)/10; - break; - case EDID_CVT_AspectRatio_15_9: - EDIDmode.resX = (EDIDmode.resY*15)/9; - break; - } - EDIDmode.resX = (EDIDmode.resX/8)*8; - if (find_mode_by_resolution( - mode_list, list_length, &EDIDmode) != -1) - return EDIDmode.mode_number; - - j++; - } - } - index++; - } - /* try to find CVT (defined in optional EXTENSION Blocks) - in controller mode list */ - /* not implemented */ - /* try to find Standard Timings (listed in BASE EDID) - in controller mode list */ - index = 0; - while (index < 8) - { - /* check if descriptor is unused */ - if (edid1_STI_is_unused(&edid.STI[index])) - { - index++; - continue; - } - EDIDmode.resX = (edid.STI[index].HorizontalActivePixels+31)*8; - switch (edid.STI[index].ImageAspectRatio_RefreshRate & - EDID1_STI_ImageAspectRatioMask) - { - case EDID_STI_AspectRatio_16_10: - EDIDmode.resY = (EDIDmode.resX*10)/16; - break; - case EDID_STI_AspectRatio_4_3: - EDIDmode.resY = (EDIDmode.resX*3)/4; - break; - case EDID_STI_AspectRatio_5_4: - EDIDmode.resY = (EDIDmode.resX*4)/5; - break; - case EDID_STI_AspectRatio_16_9: - EDIDmode.resY = (EDIDmode.resX*9)/16; - break; - } - if (find_mode_by_resolution(mode_list, list_length, &EDIDmode) != - -1) - return EDIDmode.mode_number; - - index++; - } - /* try to find Standard Timings (listed in optional EXTENSION Blocks) - in controller mode list */ - /* not implemented */ - /* use Established Timings */ - if (edid1_established_tim(&edid, EST_1280x1024_75Hz)) - { - EDIDmode.resX = 1280; - EDIDmode.resY = 1024; - EDIDmode.bpp = 0; - if (find_mode_by_resolution(mode_list, list_length, &EDIDmode) != - -1) - return EDIDmode.mode_number; - } - if (edid1_established_tim(&edid, EST_1152x870_75Hz)) - { - EDIDmode.resX = 1152; - EDIDmode.resY = 870; - EDIDmode.bpp = 0; - if (find_mode_by_resolution(mode_list, list_length, &EDIDmode) != - -1) - return EDIDmode.mode_number; - } - if (edid1_established_tim(&edid, EST_1024x768_75Hz) || - edid1_established_tim(&edid, EST_1024x768_70Hz) || - edid1_established_tim(&edid, EST_1024x768_60Hz) || - edid1_established_tim(&edid, EST_1024x768_87Hz)) - { - EDIDmode.resX = 1024; - EDIDmode.resY = 768; - EDIDmode.bpp = 0; - if (find_mode_by_resolution(mode_list, list_length, &EDIDmode) != - -1) - return EDIDmode.mode_number; - } - if (edid1_established_tim(&edid, EST_832x624_75Hz)) - { - EDIDmode.resX = 832; - EDIDmode.resY = 624; - EDIDmode.bpp = 0; - if (find_mode_by_resolution(mode_list, list_length, &EDIDmode) != - -1) - return EDIDmode.mode_number; - } - if (edid1_established_tim(&edid, EST_800x600_60Hz) || - edid1_established_tim(&edid, EST_800x600_56Hz) || - edid1_established_tim(&edid, EST_800x600_75Hz) || - edid1_established_tim(&edid, EST_800x600_72Hz)) - { - EDIDmode.resX = 800; - EDIDmode.resY = 600; - EDIDmode.bpp = 0; - if (find_mode_by_resolution(mode_list, list_length, &EDIDmode) != - -1) - return EDIDmode.mode_number; - } - if (edid1_established_tim(&edid, EST_720x400_88Hz) || - edid1_established_tim(&edid, EST_720x400_70Hz)) - { - EDIDmode.resX = 720; - EDIDmode.resY = 400; - EDIDmode.bpp = 0; - if (find_mode_by_resolution(mode_list, list_length, &EDIDmode) != - -1) - return EDIDmode.mode_number; - } - if (edid1_established_tim(&edid, EST_640x480_75Hz) || - edid1_established_tim(&edid, EST_640x480_72Hz) || - edid1_established_tim(&edid, EST_640x480_67Hz) || - edid1_established_tim(&edid, EST_640x480_60Hz)) - { - EDIDmode.resX = 640; - EDIDmode.resY = 480; - EDIDmode.bpp = 0; - if (find_mode_by_resolution(mode_list, list_length, &EDIDmode) != - -1) - return EDIDmode.mode_number; - } - } - else - printk(FB_VESA_NAME " error reading EDID: unsupported version\n"); - return -1; -} - -void vesa_realmode_bootup_init(void) -{ - uint32_t vbe_ret_val; - uint16_t size; - VBE_vbe_info_block *vib = (VBE_vbe_info_block *) - i386_get_default_rm_buffer(&size); - vbe_ret_val = VBE_controller_information(vib, 0x300); - if (vbe_ret_val == -1) - { - printk(FB_VESA_NAME " error calling real mode interrupt.\n"); - return; - } - if (vbe_ret_val != (VBE_callSuccessful<<8 | VBE_functionSupported)) - { - printk(FB_VESA_NAME " Function 00h (read VBE info block)" - "not supported.\n"); - } -/* Helper array is later filled with mode numbers and their parameters - sorted from the biggest values to the smalest where priorities of - parameters are from the highest to the lowest: resolution X, - resolution Y, bits per pixel. - The array is used for search the monitor provided parameters in EDID - structure and if found we set such mode using corresponding - VESA function. */ -#define MAX_NO_OF_SORTED_MODES 100 - Mode_params sorted_mode_params[MAX_NO_OF_SORTED_MODES]; - - uint16_t *vmpSegOff = (uint16_t *)&vib->VideoModePtr; - uint16_t *modeNOPtr = (uint16_t*) - i386_Real_to_physical(*(vmpSegOff+1), *vmpSegOff); - uint16_t iterator = 0; - - if (*(uint16_t*)vib->VideoModePtr == VBE_STUB_VideoModeList) - { - printk(FB_VESA_NAME " VBE Core not implemented!\n"); - } - else - { - /* prepare list of modes */ - while (*(modeNOPtr+iterator) != VBE_END_OF_VideoModeList && - *(modeNOPtr+iterator) != 0) - { /* some bios implementations ends the list incorrectly with 0 */ - if (iterator < MAX_NO_OF_SORTED_MODES) - { - sorted_mode_params[iterator].mode_number =*(modeNOPtr+iterator); - iterator ++; - } - else - break; - } - if (iterator < MAX_NO_OF_SORTED_MODES) - sorted_mode_params[iterator].mode_number = 0; - } - - VBE_mode_info_block *mib = (VBE_mode_info_block *) - i386_get_default_rm_buffer(&size); - iterator = 0; - uint8_t nextFilteredMode = 0; - uint16_t required_mode_attributes = VBE_modSupInHWMask | - VBE_ColorModeMask | VBE_GraphicsModeMask | VBE_LinFraBufModeAvaiMask; - /* get parameters of modes and filter modes according to set - required parameters */ - while (iterator < MAX_NO_OF_SORTED_MODES && - sorted_mode_params[iterator].mode_number!=0) - { - VBE_mode_information(mib, sorted_mode_params[iterator].mode_number); - if ((mib->ModeAttributes&required_mode_attributes) == - required_mode_attributes) - { - sorted_mode_params[nextFilteredMode].mode_number = - sorted_mode_params[iterator].mode_number; - sorted_mode_params[nextFilteredMode].resX = mib->XResolution; - sorted_mode_params[nextFilteredMode].resY = mib->YResolution; - sorted_mode_params[nextFilteredMode].bpp = mib->BitsPerPixel; - nextFilteredMode ++; - } - iterator ++; - } - sorted_mode_params[nextFilteredMode].mode_number = 0; - - uint8_t number_of_modes = nextFilteredMode; - - /* first search for video argument in multiboot options */ - vbe_used_mode = find_mode_using_cmdline(sorted_mode_params, - number_of_modes); - - if (vbe_used_mode == NO_MODE_REQ) { - vbe_used_mode = find_mode_from_string(sorted_mode_params, - number_of_modes, rtems_fb_default_mode); - if (vbe_used_mode != NO_MODE_REQ) { - printk(FB_VESA_NAME " using application option to select" - " video mode\n"); - } - } - else - { - printk(FB_VESA_NAME " using command line option '--video='" - "to select video mode\n"); - } - - switch (vbe_used_mode) { - case NO_SUITABLE_MODE: - printk(FB_VESA_NAME " requested mode not found\n"); - return; - case BAD_FORMAT: - printk(FB_VESA_NAME " bad format of video requested\n"); - return; - case DONT_INIT: - printk(FB_VESA_NAME " selected not to initialize graphics\n"); - return; - case NO_MODE_REQ: - printk(FB_VESA_NAME " not initialized, no video selected\n"); - return; - } - - /* sort filtered modes */ - Mode_params modeXchgPlace; - iterator = 0; - uint8_t j; - uint8_t idxBestMode; - while (iterator < number_of_modes) - { - idxBestMode = iterator; - j = iterator+1; - while (j < number_of_modes) - { - if (sorted_mode_params[j].resX > - sorted_mode_params[idxBestMode].resX) - idxBestMode = j; - else if (sorted_mode_params[j].resX == - sorted_mode_params[idxBestMode].resX) - { - if (sorted_mode_params[j].resY > - sorted_mode_params[idxBestMode].resY) - idxBestMode = j; - else if (sorted_mode_params[j].resY == - sorted_mode_params[idxBestMode].resY) - { - if (sorted_mode_params[j].bpp > - sorted_mode_params[idxBestMode].bpp) - idxBestMode = j; - } - } - j++; - } - if (idxBestMode != iterator) - { - modeXchgPlace = sorted_mode_params[iterator]; - sorted_mode_params[iterator] = sorted_mode_params[idxBestMode]; - sorted_mode_params[idxBestMode] = modeXchgPlace; - } - iterator++; - } - - if (vbe_used_mode == AUTO_SELECT) - { - printk(FB_VESA_NAME " auto video mode selected" - "\n\ttrying EDID ...\n"); - /* second search monitor for good resolution */ - vbe_used_mode = find_mode_using_EDID(sorted_mode_params, - number_of_modes); - if (vbe_used_mode == -1) - { - printk(FB_VESA_NAME" monitor's EDID video parameters not supported" - "\n\tusing mode with highest resolution, bpp\n"); - /* third set highest values */ - vbe_used_mode = sorted_mode_params[0].mode_number; - } - } - - /* fill framebuffer structs with info about selected mode */ - vbe_ret_val = VBE_mode_information(mib, vbe_used_mode); - if ((vbe_ret_val&0xff)!=VBE_functionSupported || - (vbe_ret_val>>8)!=VBE_callSuccessful) - { - printk(FB_VESA_NAME " Cannot get mode info anymore. ax=0x%lx\n", - vbe_ret_val); - } - - fb_var.xres = mib->XResolution; - fb_var.yres = mib->YResolution; - fb_var.bits_per_pixel = mib->BitsPerPixel; - fb_var.red.offset = mib->LinRedFieldPosition; - fb_var.red.length = mib->LinRedMaskSize; - fb_var.red.msb_right = 0; - fb_var.green.offset = mib->LinGreenFieldPosition; - fb_var.green.length = mib->LinGreenMaskSize; - fb_var.green.msb_right = 0; - fb_var.blue.offset = mib->LinBlueFieldPosition; - fb_var.blue.length = mib->LinBlueMaskSize; - fb_var.blue.msb_right = 0; - fb_var.transp.offset = mib->LinRsvdFieldPosition; - fb_var.transp.length = mib->LinRsvdMaskSize; - fb_var.transp.msb_right =0; - - fb_fix.smem_start = (char *)mib->PhysBasePtr; - fb_fix.line_length = mib->LinBytesPerScanLine; - fb_fix.smem_len = fb_fix.line_length*fb_var.yres; - fb_fix.type = FB_TYPE_PACKED_PIXELS; - if (fb_var.bits_per_pixel < 24) - fb_fix.visual = FB_VISUAL_DIRECTCOLOR; - else - fb_fix.visual = FB_VISUAL_TRUECOLOR; - - /* set selected mode */ - vbe_ret_val = VBE_set_mode(vbe_used_mode | VBE_linearFlatFrameBufMask, - (VBE_CRTC_info_block *)(i386_get_default_rm_buffer(&size))); - if (vbe_ret_val>>8 == VBE_callFailed) - printk(FB_VESA_NAME " VBE: Requested mode is not available."); - - if ((vbe_ret_val&0xff)!= (VBE_functionSupported | VBE_callSuccessful<<8)) - printk(FB_VESA_NAME " Call to function 2h (set VBE mode) failed. " - "ax=0x%" PRIx32 "\n", vbe_ret_val); - - vib = (void *) 0; - mib = (void *) 0; -} - -/* - * fb_vesa device driver INITIALIZE entry point. - */ -rtems_device_driver -frame_buffer_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - rtems_status_code status; - - printk(FB_VESA_NAME " frame buffer -- driver initializing..\n" ); - - /* - * Register the device. - */ - status = rtems_io_register_name(FRAMEBUFFER_DEVICE_0_NAME, major, 0); - if (status != RTEMS_SUCCESSFUL) - { - printk("Error registering " FRAMEBUFFER_DEVICE_0_NAME - " - " FB_VESA_NAME " frame buffer device!\n"); - rtems_fatal_error_occurred( status ); - } - - _Atomic_Flag_clear(&driver_mutex, ATOMIC_ORDER_RELEASE); - - return RTEMS_SUCCESSFUL; -} - -/* - * fb_vesa device driver OPEN entry point - */ -rtems_device_driver -frame_buffer_open( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - printk( FB_VESA_NAME " open device\n" ); - - if (_Atomic_Flag_test_and_set(&driver_mutex, ATOMIC_ORDER_ACQUIRE) != 0 ) - { - printk( FB_VESA_NAME " could not lock vesa_mutex\n" ); - - return RTEMS_UNSATISFIED; - } - - return RTEMS_SUCCESSFUL; - -} - -/* - * fb_vesa device driver CLOSE entry point - */ -rtems_device_driver -frame_buffer_close( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - printk( FB_VESA_NAME " close device\n" ); - _Atomic_Flag_clear(&driver_mutex, ATOMIC_ORDER_RELEASE); - /* restore previous state. for VGA this means return to text mode. - * leave out if graphics hardware has been initialized in - * frame_buffer_initialize() */ - - printk(FB_VESA_NAME ": close called.\n" ); - return RTEMS_SUCCESSFUL; -} - -/* - * fb_vesa device driver READ entry point. - */ -rtems_device_driver -frame_buffer_read( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - printk( FB_VESA_NAME " read device\n" ); - rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *)arg; - rw_args->bytes_moved = - ((rw_args->offset + rw_args->count) > fb_fix.smem_len ) ? - (fb_fix.smem_len - rw_args->offset) : - rw_args->count; - memcpy(rw_args->buffer, (const void *) - (fb_fix.smem_start + rw_args->offset), rw_args->bytes_moved); - return RTEMS_SUCCESSFUL; -} - -/* - * frame_vesa device driver WRITE entry point. - */ -rtems_device_driver -frame_buffer_write( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - printk( FB_VESA_NAME " write device\n" ); - rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *)arg; - rw_args->bytes_moved = - ((rw_args->offset + rw_args->count) > fb_fix.smem_len ) ? - (fb_fix.smem_len - rw_args->offset) : - rw_args->count; - memcpy( (void *) (fb_fix.smem_start + rw_args->offset), - rw_args->buffer, rw_args->bytes_moved); - return RTEMS_SUCCESSFUL; -} - -static int get_fix_screen_info( struct fb_fix_screeninfo *info ) -{ - *info = fb_fix; - return 0; -} - -static int get_var_screen_info( struct fb_var_screeninfo *info ) -{ - *info = fb_var; - return 0; -} - -/* - * IOCTL entry point -- This method is called to carry - * all services of this interface. - */ -rtems_device_driver -frame_buffer_control( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - rtems_libio_ioctl_args_t *args = arg; - - printk( FB_VESA_NAME " ioctl called, cmd=%" PRIx32 "\n", args->command ); - printk("fbxres %lu, fbyres %lu\n", fb_var.xres, fb_var.yres); - printk("fbbpp %lu\n", fb_var.bits_per_pixel); - - switch (args->command) - { - case FBIOGET_FSCREENINFO: - args->ioctl_return = - get_fix_screen_info( ( struct fb_fix_screeninfo * ) args->buffer ); - break; - case FBIOGET_VSCREENINFO: - args->ioctl_return = - get_var_screen_info( ( struct fb_var_screeninfo * ) args->buffer ); - break; - case FBIOPUT_VSCREENINFO: - /* not implemented yet */ - args->ioctl_return = -1; - return RTEMS_UNSATISFIED; - case FBIOGETCMAP: - /* no palette - truecolor mode */ - args->ioctl_return = -1; - return RTEMS_UNSATISFIED; - case FBIOPUTCMAP: - /* no palette - truecolor mode */ - args->ioctl_return = -1; - return RTEMS_UNSATISFIED; - default: - args->ioctl_return = 0; - break; - } - return RTEMS_SUCCESSFUL; -} diff --git a/c/src/lib/libbsp/i386/pc386/console/fb_vga.c b/c/src/lib/libbsp/i386/pc386/console/fb_vga.c deleted file mode 100644 index 75ad56eb98..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/fb_vga.c +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright (c) 2000 - Rosimildo da Silva ( rdasilva@connecttel.com ) - * - * MODULE DESCRIPTION: - * This module implements FB driver for "Bare VGA". It uses the - * routines for "bare hardware" found in vgainit.c. - * - */ - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -#include - -/* these routines are defined in vgainit.c.*/ -extern void ega_hwinit( void ); -extern void ega_hwterm( void ); - -/* flag to limit driver to protect against multiple opens */ -static Atomic_Flag driver_mutex; - -/* screen information for the VGA driver */ -static struct fb_var_screeninfo fb_var = -{ - .xres = 640, - .yres = 480, - .bits_per_pixel = 4 -}; - -static struct fb_fix_screeninfo fb_fix = -{ - .smem_start = (volatile char *)0xA0000, /* buffer pointer */ - .smem_len = 0x10000, /* buffer size */ - .type = FB_TYPE_VGA_PLANES, /* type of dsplay */ - .visual = FB_VISUAL_PSEUDOCOLOR, /* color scheme used */ - .line_length = 80 /* chars per line */ -}; - - -static uint16_t red16[] = { - 0x0000, 0x0000, 0x0000, 0x0000, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, - 0x5555, 0x5555, 0x5555, 0x5555, 0xffff, 0xffff, 0xffff, 0xffff -}; -static uint16_t green16[] = { - 0x0000, 0x0000, 0xaaaa, 0xaaaa, 0x0000, 0x0000, 0x5555, 0xaaaa, - 0x5555, 0x5555, 0xffff, 0xffff, 0x5555, 0x5555, 0xffff, 0xffff -}; -static uint16_t blue16[] = { - 0x0000, 0xaaaa, 0x0000, 0xaaaa, 0x0000, 0xaaaa, 0x0000, 0xaaaa, - 0x5555, 0xffff, 0x5555, 0xffff, 0x5555, 0xffff, 0x5555, 0xffff -}; - -/* Functionality to support multiple VGA frame buffers can be added easily, - * but is not supported at this moment because there is no need for two or - * more "classic" VGA adapters. Multiple frame buffer drivers may be - * implemented and If we had implement it they would be named as "/dev/fb0", - * "/dev/fb1", "/dev/fb2" and so on. - */ -/* - * fbvga device driver INITIALIZE entry point. - */ -rtems_device_driver frame_buffer_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - rtems_status_code status; - - printk( "FBVGA -- driver initializing..\n" ); - - /* - * Register the device - */ - status = rtems_io_register_name (FRAMEBUFFER_DEVICE_0_NAME, major, 0); - if (status != RTEMS_SUCCESSFUL) { - printk("Error registering " FRAMEBUFFER_DEVICE_0_NAME - " FBVGA framebuffer device!\n"); - rtems_fatal_error_occurred( status ); - } - - _Atomic_Flag_clear(&driver_mutex, ATOMIC_ORDER_RELEASE); - - return RTEMS_SUCCESSFUL; -} - -/* - * fbvga device driver OPEN entry point - */ -rtems_device_driver frame_buffer_open( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - if (_Atomic_Flag_test_and_set(&driver_mutex, ATOMIC_ORDER_ACQUIRE) != 0 ) { - /* restore previous state. for VGA this means return to text mode. - * leave out if graphics hardware has been initialized in - * frame_buffer_initialize() - */ - ega_hwinit(); - printk( "FBVGA open called.\n" ); - return RTEMS_SUCCESSFUL; - } - - return RTEMS_UNSATISFIED; -} - -/* - * fbvga device driver CLOSE entry point - */ -rtems_device_driver frame_buffer_close( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - _Atomic_Flag_clear(&driver_mutex, ATOMIC_ORDER_RELEASE); - /* restore previous state. for VGA this means return to text mode. - * leave out if graphics hardware has been initialized in - * frame_buffer_initialize() */ - ega_hwterm(); - printk( "FBVGA close called.\n" ); - return RTEMS_SUCCESSFUL; - -/* - * fbvga device driver READ entry point. - */ -rtems_device_driver frame_buffer_read( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *)arg; - rw_args->bytes_moved = ((rw_args->offset + rw_args->count) > fb_fix.smem_len ) ? (fb_fix.smem_len - rw_args->offset) : rw_args->count; - memcpy(rw_args->buffer, (const void *) (fb_fix.smem_start + rw_args->offset), rw_args->bytes_moved); - return RTEMS_SUCCESSFUL; -} - -/* - * frame_buffer device driver WRITE entry point. - */ -rtems_device_driver frame_buffer_write( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *)arg; - rw_args->bytes_moved = ((rw_args->offset + rw_args->count) > fb_fix.smem_len ) ? (fb_fix.smem_len - rw_args->offset) : rw_args->count; - memcpy( (void *) (fb_fix.smem_start + rw_args->offset), rw_args->buffer, rw_args->bytes_moved); - return RTEMS_SUCCESSFUL; -} - -static int get_fix_screen_info( struct fb_fix_screeninfo *info ) -{ - *info = fb_fix; - return 0; -} - -static int get_var_screen_info( struct fb_var_screeninfo *info ) -{ - *info = fb_var; - return 0; -} - -static int get_palette( struct fb_cmap *cmap ) -{ - uint32_t i; - - if ( cmap->start + cmap->len >= 16 ) - return 1; - - for( i = 0; i < cmap->len; i++ ) { - cmap->red[ cmap->start + i ] = red16[ cmap->start + i ]; - cmap->green[ cmap->start + i ] = green16[ cmap->start + i ]; - cmap->blue[ cmap->start + i ] = blue16[ cmap->start + i ]; - } - return 0; -} - -static int set_palette( struct fb_cmap *cmap ) -{ - uint32_t i; - - if ( cmap->start + cmap->len >= 16 ) - return 1; - - for( i = 0; i < cmap->len; i++ ) { - red16[ cmap->start + i ] = cmap->red[ cmap->start + i ]; - green16[ cmap->start + i ] = cmap->green[ cmap->start + i ]; - blue16[ cmap->start + i ] = cmap->blue[ cmap->start + i ]; - } - return 0; -} - -/* - * IOCTL entry point -- This method is called to carry - * all services of this interface. - */ -rtems_device_driver frame_buffer_control( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - rtems_libio_ioctl_args_t *args = arg; - - printk( "FBVGA ioctl called, cmd=%x\n", args->command ); - - switch( args->command ) { - case FBIOGET_FSCREENINFO: - args->ioctl_return = get_fix_screen_info( ( struct fb_fix_screeninfo * ) args->buffer ); - break; - case FBIOGET_VSCREENINFO: - args->ioctl_return = get_var_screen_info( ( struct fb_var_screeninfo * ) args->buffer ); - break; - case FBIOPUT_VSCREENINFO: - /* not implemented yet*/ - args->ioctl_return = -1; - return RTEMS_UNSATISFIED; - case FBIOGETCMAP: - args->ioctl_return = get_palette( ( struct fb_cmap * ) args->buffer ); - break; - case FBIOPUTCMAP: - args->ioctl_return = set_palette( ( struct fb_cmap * ) args->buffer ); - break; - - default: - args->ioctl_return = 0; - break; - } - return RTEMS_SUCCESSFUL; -} diff --git a/c/src/lib/libbsp/i386/pc386/console/gdb_select.c b/c/src/lib/libbsp/i386/pc386/console/gdb_select.c deleted file mode 100644 index adc996913b..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/gdb_select.c +++ /dev/null @@ -1,170 +0,0 @@ -/** - * @file - * - * @ingroup GDB - * - * @brief pc386 gdb select - * - * This file contains a routine to enable and select the UART the gdb stub - * connects too. Currently limited to COM1 and COM2. See - * shared/comm/i386-stub-glue.c file. - */ - -/* - * COPYRIGHT (c) 2016. - * Chris Johns - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "../../../../../../../bsps/shared/dev/serial/legacy-console.h" - -/* - * Used in the stub to print output. - */ -int remote_debug; -/* - * Defined in the stub, used here. - */ -void set_debug_traps(void); - -/* - * Added here to get a valid baudrate. Needs to go once we - * move to the standard UART driver. - */ -int BSPBaseBaud; - -static bool gdb_port_probe(int minor) -{ - /* Return false as GDB has claimed the port */ - return false; -} - -void pc386_parse_gdb_arguments(void) -{ - static const char *opt; - - /* - * Check the command line to see if com1-com4 are disabled. - */ - opt = bsp_cmdline_arg("--gdb="); - if ( opt ) { - const char *option; - const char *comma; - size_t length; - size_t index; - rtems_device_minor_number minor; - uint32_t baudrate = 115200; - bool halt = false; - console_tbl *port; - - /* - * Fine the length, there can be more command line visible. - */ - length = 0; - while ((opt[length] != ' ') && (opt[length] != '\0')) { - ++length; - if (length > NAME_MAX) { - printk("invalid option (--gdb): too long\n"); - return; - } - } - - /* - * Only match up to a comma or NULL - */ - index = 0; - while ((opt[index] != '=') && (index < length)) { - ++index; - } - - if (opt[index] != '=') { - printk("invalid option (--gdb): no equals\n"); - return; - } - - ++index; - option = &opt[index]; - - while ((opt[index] != ',') && (index < length)) { - ++index; - } - - if (opt[index] == ',') - comma = &opt[index]; - else - comma = NULL; - - length = &opt[index] - option; - - port = console_find_console_entry( option, length, &minor ); - - if ( port == NULL ) { - printk("invalid option (--gdb): port not found\n"); - return; - } - - if (comma) { - option = comma + 1; - baudrate = strtoul(option, 0, 10); - switch (baudrate) { - case 115200: - case 57600: - case 38400: - case 19200: - case 9600: - case 4800: - port->pDeviceParams = (void*) baudrate; - BSPBaseBaud = baudrate; /* REMOVE ME */ - break; - default: - printk("invalid option (--gdb): bad baudrate\n"); - return; - } - } - - /* - * Provide a probe that fails so the device is not part of termios. All - * functions are polling. - */ - port->deviceProbe = gdb_port_probe; - port->pDeviceFns = &ns16550_fns_polled; - - opt = bsp_cmdline_arg("--gdb-remote-debug"); - if ( opt ) { - remote_debug = 1; - } - - opt = bsp_cmdline_arg("--gdb-break"); - if ( opt ) { - halt = true; - } - - printk("GDB stub: enable %s%s%s\n", - port->sDeviceName, - remote_debug ? ", remote-debug" : "", - halt ? ", halting" : ""); - - i386_stub_glue_init(minor); - set_debug_traps(); - i386_stub_glue_init_breakin(); - - if ( halt ) { - printk("GDB stub: waiting for remote connection..\n"); - breakpoint(); - } - } -} diff --git a/c/src/lib/libbsp/i386/pc386/console/i386kbd.h b/c/src/lib/libbsp/i386/pc386/console/i386kbd.h deleted file mode 100644 index 627b37c750..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/i386kbd.h +++ /dev/null @@ -1,192 +0,0 @@ -/** - * @file - * - * @ingroup i386_pc386 - * - * @brief I386 keyboard definitions. - */ - -/* - * linux/include/asm-i386/keyboard.h - * - * Created 3 Nov 1996 by Geert Uytterhoeven - */ - -/* - * This file contains the i386 architecture specific keyboard definitions - */ - -#ifndef _I386_KEYBOARD_H -#define _I386_KEYBOARD_H - -#include - -#define KEYBOARD_IRQ 1 -#define DISABLE_KBD_DURING_INTERRUPTS 0 - -extern int pckbd_setkeycode(unsigned int scancode, unsigned int keycode); -extern int pckbd_getkeycode(unsigned int scancode); -extern int pckbd_translate(unsigned char scancode, unsigned char *keycode, - char raw_mode); -extern char pckbd_unexpected_up(unsigned char keycode); -extern void pckbd_leds(unsigned char leds); -extern void pckbd_init_hw(void); -extern unsigned char pckbd_sysrq_xlate[128]; - -#define kbd_setkeycode pckbd_setkeycode -#define kbd_getkeycode pckbd_getkeycode -#define kbd_translate pckbd_translate -#define kbd_unexpected_up pckbd_unexpected_up -#define kbd_leds pckbd_leds -#define kbd_init_hw pckbd_init_hw -#define kbd_sysrq_xlate pckbd_sysrq_xlate - -#define SYSRQ_KEY 0x54 - -/* resource allocation */ -#define kbd_request_region() /* request_region(0x60, 16, "keyboard") */ -#define kbd_request_irq(handler) /* request_irq(KEYBOARD_IRQ, handler, 0, "keyboard", NULL) */ - -/* How to access the keyboard macros on this platform. */ -#define kbd_read_input() inb(KBD_DATA_REG) -#define kbd_read_status() inb(KBD_STATUS_REG) -#define kbd_write_output(val) outb(val, KBD_DATA_REG) -#define kbd_write_command(val) outb(val, KBD_CNTL_REG) - -/* Some stoneage hardware needs delays after some operations. */ -#define kbd_pause() do { } while(0) - -/* - * Machine specific bits for the PS/2 driver - */ - -#define AUX_IRQ 12 - -#define aux_request_irq(hand, dev_id) /* request_irq(AUX_IRQ, hand, SA_SHIRQ, "PS/2 Mouse", dev_id) */ - -#define aux_free_irq(dev_id) /* free_irq(AUX_IRQ, dev_id) */ - -/* - * include/linux/pc_keyb.h - * - * PC Keyboard And Keyboard Controller - * - * (c) 1997 Martin Mares - */ - -/* - * Configuration Switches - */ - -#undef KBD_REPORT_ERR /* Report keyboard errors */ -#define KBD_REPORT_UNKN /* Report unknown scan codes */ -#define KBD_REPORT_TIMEOUTS /* Report keyboard timeouts */ -#undef KBD_IS_FOCUS_9000 /* We have the brain-damaged FOCUS-9000 keyboard */ -#undef INITIALIZE_MOUSE /* Define if your PS/2 mouse needs initialization. */ - -#define KBD_INIT_TIMEOUT 1000 /* Timeout in ms for initializing the keyboard */ -#define KBC_TIMEOUT 250 /* Timeout in ms for sending to keyboard controller */ -#define KBD_TIMEOUT 1000 /* Timeout in ms for keyboard command acknowledge */ - -/* - * Internal variables of the driver - */ - -extern unsigned char pckbd_read_mask; -extern unsigned char aux_device_present; - -/* - * Keyboard Controller Registers on normal PCs. - */ - -#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) */ - -/* - * Keyboard Controller Commands - */ - -#define KBD_CCMD_READ_MODE 0x20 /* Read mode bits */ -#define KBD_CCMD_WRITE_MODE 0x60 /* Write mode bits */ -#define KBD_CCMD_GET_VERSION 0xA1 /* Get controller version */ -#define KBD_CCMD_MOUSE_DISABLE 0xA7 /* Disable mouse interface */ -#define KBD_CCMD_MOUSE_ENABLE 0xA8 /* Enable mouse interface */ -#define KBD_CCMD_TEST_MOUSE 0xA9 /* Mouse interface test */ -#define KBD_CCMD_SELF_TEST 0xAA /* Controller self test */ -#define KBD_CCMD_KBD_TEST 0xAB /* Keyboard interface test */ -#define KBD_CCMD_KBD_DISABLE 0xAD /* Keyboard interface disable */ -#define KBD_CCMD_KBD_ENABLE 0xAE /* Keyboard interface enable */ -#define KBD_CCMD_WRITE_AUX_OBUF 0xD3 /* Write to output buffer as if - initiated by the auxiliary device */ -#define KBD_CCMD_WRITE_MOUSE 0xD4 /* Write the following byte to the mouse */ - -/* - * Keyboard Commands - */ - -#define KBD_CMD_SET_LEDS 0xED /* Set keyboard leds */ -#define KBD_CMD_SET_RATE 0xF3 /* Set typematic rate */ -#define KBD_CMD_ENABLE 0xF4 /* Enable scanning */ -#define KBD_CMD_DISABLE 0xF5 /* Disable scanning */ -#define KBD_CMD_RESET 0xFF /* Reset */ - -/* - * Keyboard Replies - */ - -#define KBD_REPLY_POR 0xAA /* Power on reset */ -#define KBD_REPLY_ACK 0xFA /* Command ACK */ -#define KBD_REPLY_RESEND 0xFE /* Command NACK, send the cmd again */ - -/* - * Status Register Bits - */ - -#define KBD_STAT_OBF 0x01 /* Keyboard output buffer full */ -#define KBD_STAT_IBF 0x02 /* Keyboard input buffer full */ -#define KBD_STAT_SELFTEST 0x04 /* Self test successful */ -#define KBD_STAT_CMD 0x08 /* Last write was a command write (0=data) */ -#define KBD_STAT_UNLOCKED 0x10 /* Zero if keyboard locked */ -#define KBD_STAT_MOUSE_OBF 0x20 /* Mouse output buffer full */ -#define KBD_STAT_GTO 0x40 /* General receive/xmit timeout */ -#define KBD_STAT_PERR 0x80 /* Parity error */ - -#define AUX_STAT_OBF (KBD_STAT_OBF | KBD_STAT_MOUSE_OBF) - -/* - * Controller Mode Register Bits - */ - -#define KBD_MODE_KBD_INT 0x01 /* Keyboard data generate IRQ1 */ -#define KBD_MODE_MOUSE_INT 0x02 /* Mouse data generate IRQ12 */ -#define KBD_MODE_SYS 0x04 /* The system flag (?) */ -#define KBD_MODE_NO_KEYLOCK 0x08 /* The keylock doesn't affect the keyboard if set */ -#define KBD_MODE_DISABLE_KBD 0x10 /* Disable keyboard interface */ -#define KBD_MODE_DISABLE_MOUSE 0x20 /* Disable mouse interface */ -#define KBD_MODE_KCC 0x40 /* Scan code conversion to PC format */ -#define KBD_MODE_RFU 0x80 - -/* - * Mouse Commands - */ - -#define AUX_SET_RES 0xE8 /* Set resolution */ -#define AUX_SET_SCALE11 0xE6 /* Set 1:1 scaling */ -#define AUX_SET_SCALE21 0xE7 /* Set 2:1 scaling */ -#define AUX_GET_SCALE 0xE9 /* Get scaling factor */ -#define AUX_SET_STREAM 0xEA /* Set stream mode */ -#define AUX_SET_SAMPLE 0xF3 /* Set sample rate */ -#define AUX_ENABLE_DEV 0xF4 /* Enable aux device */ -#define AUX_DISABLE_DEV 0xF5 /* Disable aux device */ -#define AUX_RESET 0xFF /* Reset aux device */ -#define AUX_ACK 0xFA /* Command byte ACK. */ - -#define AUX_BUF_SIZE 2048 /* This might be better divisible by - three to make overruns stay in sync - but then the read function would need - a lock etc - ick */ - -#define mark_bh(x) - -#endif /* _I386_KEYBOARD_H */ diff --git a/c/src/lib/libbsp/i386/pc386/console/inch.c b/c/src/lib/libbsp/i386/pc386/console/inch.c deleted file mode 100644 index f5d5079236..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/inch.c +++ /dev/null @@ -1,300 +0,0 @@ -/*-------------------------------------------------------------------------+ -| inch.c v1.1 - PC386 BSP - 1997/08/07 -+--------------------------------------------------------------------------+ -| (C) Copyright 1997 - -| - NavIST Group - Real-Time Distributed Systems and Industrial Automation -| -| http://pandora.ist.utl.pt -| -| Instituto Superior Tecnico * Lisboa * PORTUGAL -+--------------------------------------------------------------------------+ -| Disclaimer: -| -| This file is provided "AS IS" without warranty of any kind, either -| expressed or implied. -+--------------------------------------------------------------------------+ -| This code is based on: -| inch.c,v 1.3 1995/12/19 20:07:25 joel Exp - go32 BSP -| With the following copyright notice: -| With the following copyright notice: -| ************************************************************************** -| * COPYRIGHT (c) 1989-1998. -| * On-Line Applications Research Corporation (OAR). -| * -| * The license and distribution terms for this file may be -| * found in the file LICENSE in this distribution or at -| * http://www.rtems.org/license/LICENSE. -| ************************************************************************** -+--------------------------------------------------------------------------*/ - -#include -#include -#include - -/*-------------------------------------------------------------------------+ -| Constants -+--------------------------------------------------------------------------*/ -#define KBD_CTL 0x61 /* -------------------------------- */ -#define KBD_DATA 0x60 /* Ports for PC keyboard controller */ -#define KBD_STATUS 0x64 /* -------------------------------- */ - -#define KBD_BUF_SIZE 256 - -/*-------------------------------------------------------------------------+ -| Global Variables -+--------------------------------------------------------------------------*/ -static char key_map[] = -{ - 0,033,'1','2','3','4','5','6','7','8','9','0','-','=','\b','\t', - 'q','w','e','r','t','y','u','i','o','p','[',']',015,0x80, - 'a','s','d','f','g','h','j','k','l',';',047,0140,0x80, - 0134,'z','x','c','v','b','n','m',',','.','/',0x80, - '*',0x80,' ',0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,'0',0177 -}; /* Keyboard scancode -> character map with no modifiers. */ - -static char shift_map[] = -{ - 0,033,'!','@','#','$','%','^','&','*','(',')','_','+','\b','\t', - 'Q','W','E','R','T','Y','U','I','O','P','{','}',015,0x80, - 'A','S','D','F','G','H','J','K','L',':',042,'~',0x80, - '|','Z','X','C','V','B','N','M','<','>','?',0x80, - '*',0x80,' ',0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x80,'7','8','9',0x80,'4','5','6',0x80, - '1','2','3','0',177 -}; /* Keyboard scancode -> character map with SHIFT key modifier. */ - -static unsigned short kbd_buffer[KBD_BUF_SIZE]; -static uint16_t kbd_first = 0; -static uint16_t kbd_last = 0; -static uint16_t kbd_end = KBD_BUF_SIZE - 1; - -/*-------------------------------------------------------------------------+ -| Function: _IBMPC_scankey -| Description: This function can be called during a poll for input, or by -| an ISR. Basically any time you want to process a keypress. -| Global Variables: key_map, shift_map. -| Arguments: outChar - character read in case of a valid reading, -| otherwise unchanged. -| Returns: TRUE in case a valid character has been read, -| FALSE otherwise. -+--------------------------------------------------------------------------*/ -static bool -_IBMPC_scankey(char *outChar) -{ - unsigned char inChar; - static int alt_pressed = 0; - static int ctrl_pressed = 0; - static int shift_pressed = 0; - static int caps_pressed = 0; - static int extended = 0; - - *outChar = '\0'; /* default value if we return false */ - - /* Read keyboard controller, toggle enable */ - inport_byte(KBD_CTL, inChar); - outport_byte(KBD_CTL, inChar & ~0x80); - outport_byte(KBD_CTL, inChar | 0x80); - outport_byte(KBD_CTL, inChar & ~0x80); - - /* See if it has data */ - inport_byte(KBD_STATUS, inChar); - if ((inChar & 0x01) == 0) - return false; - - /* Read the data. Handle nonsense with shift, control, etc. */ - inport_byte(KBD_DATA, inChar); - - if (extended) - extended--; - - switch (inChar) - { - case 0xe0: - extended = 2; - return false; - break; - - case 0x38: - alt_pressed = 1; - return false; - break; - case 0xb8: - alt_pressed = 0; - return false; - break; - - case 0x1d: - ctrl_pressed = 1; - return false; - break; - case 0x9d: - ctrl_pressed = 0; - return false; - break; - - case 0x2a: - if (extended) - return false; - case 0x36: - shift_pressed = 1; - return false; - break; - case 0xaa: - if (extended) - return false; - case 0xb6: - shift_pressed = 0; - return false; - break; - - case 0x3a: - caps_pressed = 1; - return false; - break; - case 0xba: - caps_pressed = 0; - return false; - break; - - case 0x53: - if (ctrl_pressed && alt_pressed) - bsp_reset(); /* ctrl+alt+del -> reboot */ - break; - - /* - * Ignore unrecognized keys--usually arrow and such - */ - default: - if ((inChar & 0x80) || (inChar > 0x39)) - /* High-bit on means key is being released, not pressed */ - return false; - break; - } /* switch */ - - /* Strip high bit, look up in our map */ - inChar &= 0x7f; - if (ctrl_pressed) - { - *outChar = key_map[inChar]; - *outChar &= 037; - } - else - { - *outChar = shift_pressed ? shift_map[inChar] : key_map[inChar]; - if (caps_pressed) - { - if (*outChar >= 'A' && *outChar <= 'Z') - *outChar += 'a' - 'A'; - else if (*outChar >= 'a' && *outChar <= 'z') - *outChar -= 'a' - 'A'; - } - } - - return true; -} /* _IBMPC_scankey */ - -/*-------------------------------------------------------------------------+ -| Function: _IBMPC_chrdy -| Description: Check keyboard ISR buffer and return character if not empty. -| Global Variables: kbd_buffer, kbd_first, kbd_last. -| Arguments: c - character read if keyboard buffer not empty, otherwise -| unchanged. -| Returns: TRUE if keyboard buffer not empty, FALSE otherwise. -+--------------------------------------------------------------------------*/ -static bool -_IBMPC_chrdy(char *c) -{ -#if CCJ_REMOVED_NO_IDEA_ABOUT_THIS_CODE_OR_COMMENT - /* FIX ME!!! It doesn't work without something like the following line. - Find out why! */ - printk(""); -#endif - - /* Check buffer our ISR builds */ - if (kbd_first != kbd_last) - { - *c = kbd_buffer[kbd_first]; - - kbd_first = (kbd_first + 1) % KBD_BUF_SIZE; - return true; - } - else - return false; -} /* _IBMPC_chrdy */ - -/*-------------------------------------------------------------------------+ -| Function: _IBMPC_inch -| Description: Poll keyboard until a character is ready and return it. -| Global Variables: None. -| Arguments: None. -| Returns: character read from keyboard. -+--------------------------------------------------------------------------*/ -char -_IBMPC_inch(void) -{ - char c; - while (!_IBMPC_chrdy(&c)) - continue; - - return c; -} /* _IBMPC_inch */ - -/* - * Routine that can be used before interrupt management is initialized. - */ -int BSP_wait_polled_input(void) -{ - char c; - while (!_IBMPC_scankey(&c)) - continue; - - return c; -} - -/* - * Check if a key has been pressed. This is a non-destructive - * call, meaning, it keeps the key in the buffer. - */ -int rtems_kbpoll( void ) -{ - int rc; - - /* - * The locking or disable of interrupts does not help - * there because if interrupts are enabled after leave of this - * function the state can change without notice anyway. - */ - RTEMS_COMPILER_MEMORY_BARRIER(); - - rc = ( kbd_first != kbd_last ) ? TRUE : FALSE; - - RTEMS_COMPILER_MEMORY_BARRIER(); - - return rc; -} - -int getch( void ) -{ - int c; - - while( kbd_first == kbd_last ) - { - rtems_task_wake_after( 10 ); - } - c = kbd_buffer[ kbd_first ]; - kbd_first = (kbd_first + 1) % KBD_BUF_SIZE; - return c; -} - -void add_to_queue( unsigned short b ) -{ - unsigned int next; - kbd_buffer[ kbd_last ] = b; - next = (kbd_last == kbd_end) ? 0 : kbd_last + 1; - if( next != kbd_first ) - { - kbd_last = next; - } -} diff --git a/c/src/lib/libbsp/i386/pc386/console/kbd_parser.c b/c/src/lib/libbsp/i386/pc386/console/kbd_parser.c deleted file mode 100644 index f3d2f9c55a..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/kbd_parser.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - * The contents of this file were formerly in console.c which - * had the following copyright notice: - * - * (C) Copyright 1997 - * NavIST Group - Real-Time Distributed Systems and Industrial Automation - * http://pandora.ist.utl.pt - * Instituto Superior Tecnico * Lisboa * PORTUGAL - * - * The original code and subsequent modifications are: - * - * COPYRIGHT (c) 1989-2011. - * On-Line Applications Research Corporation (OAR). - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#include -#include -#include - -/* adds a kbd message to the queue */ -static void kbd_parser( void *ptr, unsigned short keycode, unsigned long mods ) -{ - struct MW_UID_MESSAGE m; - struct kbd_struct * kbd = (struct kbd_struct *)ptr; - - m.type = MV_UID_KBD; - m.m.kbd.code = keycode; - m.m.kbd.modifiers = kbd->ledflagstate; - m.m.kbd.mode = kbd->kbdmode; - /* printk( "kbd: msg: keycode=%X, mod=%X\n", keycode, mods ); */ - - uid_send_message( &m ); -} - -void register_kbd_msg_queue( char *q_name, int port ) -{ - kbd_set_driver_handler( kbd_parser ); -} - -void unregister_kbd_msg_queue( int port ) -{ - kbd_set_driver_handler( NULL ); -} diff --git a/c/src/lib/libbsp/i386/pc386/console/keyboard.c b/c/src/lib/libbsp/i386/pc386/console/keyboard.c deleted file mode 100644 index 0c8991b829..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/keyboard.c +++ /dev/null @@ -1,881 +0,0 @@ -/* - * Rosimildo da Silva: rdasilva@connecttel.com - */ - -#include -#include -#include -#include "i386kbd.h" -#include -#include -#include -#include - -#define SIZE(x) (sizeof(x)/sizeof((x)[0])) - -#ifndef KBD_DEFMODE -#define KBD_DEFMODE ((1 << VC_REPEAT) | (1 << VC_META)) -#endif - -#ifndef KBD_DEFLEDS -/* - * Some laptops take the 789uiojklm,. keys as number pad when NumLock - * is on. This seems a good reason to start with NumLock off. - */ -#define KBD_DEFLEDS 0 -#endif - -#ifndef KBD_DEFLOCK -#define KBD_DEFLOCK 0 -#endif - -static int kbd_test_and_set_bit(int nr, atomic_uint_least32_t * addr) -{ - uint_least32_t mask; - int retval; - - addr += nr >> 5; - mask = 1UL << (nr & 0x1f); - - retval = (atomic_fetch_or(addr, mask) & mask) != 0; - - return retval; -} - -static int kbd_test_and_clear_bit(int nr, atomic_uint_least32_t * addr) -{ - uint_least32_t mask; - int retval; - - addr += nr >> 5; - mask = 1UL << (nr & 0x1f); - - retval = (atomic_fetch_and(addr, ~mask) & mask) != 0; - - return retval; -} - -static int kbd_test_bit(int nr, atomic_uint_least32_t * addr) -{ - unsigned long mask; - - addr += nr >> 5; - mask = 1 << (nr & 0x1f); - return ((mask & atomic_load(addr)) != 0); -} - -/* - * global state includes the following, and various static variables - * in this module: prev_scancode, shift_state, diacr, npadch, dead_key_next. - * (last_console is now a global variable) - */ -#define KBD_BITS_PER_ELEMENT (sizeof(atomic_uint_least32_t)*CHAR_BIT) - -/* shift state counters.. */ -static unsigned char k_down[NR_SHIFT] = {0, }; -/* keyboard key bitmap */ -static atomic_uint_least32_t - key_down[(256 + KBD_BITS_PER_ELEMENT - 1) / KBD_BITS_PER_ELEMENT] = { 0, }; - -static int dead_key_next = 0; -/* - * In order to retrieve the shift_state (for the mouse server), either - * the variable must be global, or a new procedure must be created to - * return the value. I chose the former way. - */ -int shift_state = 0; -static int npadch = -1; /* -1 or number assembled on pad */ -static unsigned char diacr = 0; -static char rep = 0; /* flag telling character repeat */ - -/* default console for RTEMS */ -static int fg_console = 0; - -struct kbd_struct kbd_table[MAX_NR_CONSOLES]; -static struct kbd_struct * kbd = kbd_table; - -void compute_shiftstate(void); - -typedef void (*k_hand)(unsigned char value, char up_flag); -typedef void (k_handfn)(unsigned char value, char up_flag); - -static k_handfn - do_self, do_fn, do_spec, do_pad, do_dead, do_cons, do_cur, do_shift, - do_meta, do_ascii, do_lock, do_lowercase, do_slock, do_dead2, - do_ignore; - -static k_hand key_handler[16] = { - do_self, do_fn, do_spec, do_pad, do_dead, do_cons, do_cur, do_shift, - do_meta, do_ascii, do_lock, do_lowercase, do_slock, do_dead2, - do_ignore, do_ignore -}; - -/* Key types processed even in raw modes */ - -#define TYPES_ALLOWED_IN_RAW_MODE ((1 << KT_SPEC) | (1 << KT_SHIFT)) - -typedef void (*void_fnp)(void); -typedef void (void_fn)(void); - -static void show_mem(void) -{ -} -static void show_state(void) -{ -} - -static void_fn do_null, enter, show_ptregs, send_intr, lastcons, caps_toggle, - num, hold, scroll_forw, scroll_back, caps_on, compose, - SAK, decr_console, incr_console, spawn_console, bare_num; - -static void_fnp spec_fn_table[] = { - do_null, enter, show_ptregs, show_mem, - show_state, send_intr, lastcons, caps_toggle, - num, hold, scroll_forw, scroll_back, - bsp_reset, caps_on, compose, SAK, - decr_console, incr_console, spawn_console, bare_num -}; - -#define SPECIALS_ALLOWED_IN_RAW_MODE (1 << KVAL(K_SAK)) - -/* maximum values each key_handler can handle */ -const int max_vals[] = { - 255, SIZE(func_table) - 1, SIZE(spec_fn_table) - 1, NR_PAD - 1, - NR_DEAD - 1, 255, 3, NR_SHIFT - 1, - 255, NR_ASCII - 1, NR_LOCK - 1, 255, - NR_LOCK - 1, 255 -}; - -const int NR_TYPES = SIZE(max_vals); - -/* N.B. drivers/macintosh/mac_keyb.c needs to call put_queue */ -static void put_queue(int); -static unsigned char handle_diacr(unsigned char); - -#ifdef CONFIG_MAGIC_SYSRQ -static int sysrq_pressed; -#endif - -/* - * Many other routines do put_queue, but I think either - * they produce ASCII, or they produce some user-assigned - * string, and in both cases we might assume that it is - * in utf-8 already. - */ -static void to_utf8(ushort c) -{ - if (c < 0x80) - put_queue(c); /* 0******* */ - else if (c < 0x800) { - put_queue(0xc0 | (c >> 6)); /* 110***** 10****** */ - put_queue(0x80 | (c & 0x3f)); - } else { - put_queue(0xe0 | (c >> 12)); /* 1110**** 10****** 10****** */ - put_queue(0x80 | ((c >> 6) & 0x3f)); - put_queue(0x80 | (c & 0x3f)); - } - /* UTF-8 is defined for words of up to 31 bits, - but we need only 16 bits here */ -} - -/* - * Translation of escaped scancodes to keycodes. - * This is now user-settable (for machines were it makes sense). - */ - -int setkeycode(unsigned int scancode, unsigned int keycode) -{ - return kbd_setkeycode(scancode, keycode); -} - -int getkeycode(unsigned int scancode) -{ - return kbd_getkeycode(scancode); -} - -void handle_scancode(unsigned char scancode, int down) -{ - unsigned char keycode; - char up_flag = down ? 0 : 0200; - char raw_mode; - - mark_bh(CONSOLE_BH); - -#if 0 - tty = ttytab? ttytab[fg_console]: NULL; - if (tty && (!tty->driver_data)) { - /* - * We touch the tty structure via the the ttytab array - * without knowing whether or not tty is open, which - * is inherently dangerous. We currently rely on that - * fact that console_open sets tty->driver_data when - * it opens it, and clears it when it closes it. - */ - tty = NULL; - } -#endif - - kbd = kbd_table + fg_console; - if ((raw_mode = (kbd->kbdmode == VC_RAW))) { - put_queue(scancode | up_flag); - /* we do not return yet, because we want to maintain - the key_down array, so that we have the correct - values when finishing RAW mode or when changing VT's */ - } - - /* - * Convert scancode to keycode - */ - if (!kbd_translate(scancode, &keycode, raw_mode)) - return; - - /* - * At this point the variable `keycode' contains the keycode. - * Note: the keycode must not be 0 (++Geert: on m68k 0 is valid). - * We keep track of the up/down status of the key, and - * return the keycode if in MEDIUMRAW mode. - */ - - if (up_flag) { - rep = 0; - if(!kbd_test_and_clear_bit(keycode, key_down)) - up_flag = kbd_unexpected_up(keycode); - } else - rep = kbd_test_and_set_bit(keycode, key_down); - -#ifdef CONFIG_MAGIC_SYSRQ /* Handle the SysRq Hack */ - if (keycode == SYSRQ_KEY) { - sysrq_pressed = !up_flag; - return; - } else if (sysrq_pressed) { - if (!up_flag && sysrq_enabled) - handle_sysrq(kbd_sysrq_xlate[keycode], kbd_pt_regs, kbd, tty); - return; - } -#endif - - if (kbd->kbdmode == VC_MEDIUMRAW) { - /* soon keycodes will require more than one byte */ - put_queue(keycode + up_flag); - raw_mode = 1; /* Most key classes will be ignored */ - } - /* - * Small change in philosophy: earlier we defined repetition by - * rep = keycode == prev_keycode; - * prev_keycode = keycode; - * but now by the fact that the depressed key was down already. - * Does this ever make a difference? Yes. - */ - - /* - * Repeat a key only if the input buffers are empty or the - * characters get echoed locally. This makes key repeat usable - * with slow applications and under heavy loads. - */ - if (!rep || vc_kbd_mode(kbd,VC_REPEAT) ) { -/* - || (vc_kbd_mode(kbd,VC_REPEAT) && tty && - (L_ECHO(tty) || (tty->driver.chars_in_buffer(tty) == 0)))) { -*/ - u_short keysym; - u_char type; - - /* the XOR below used to be an OR */ - int shift_final = shift_state ^ kbd->lockstate ^ kbd->slockstate; - ushort *key_map = key_maps[shift_final]; - - if (key_map != NULL) { - keysym = key_map[keycode]; - type = KTYP(keysym); - - if (type >= 0xf0) { - type -= 0xf0; - if (raw_mode && ! (TYPES_ALLOWED_IN_RAW_MODE & (1 << type))) - return; - if (type == KT_LETTER) { - type = KT_LATIN; - if (vc_kbd_led(kbd, VC_CAPSLOCK)) { - key_map = key_maps[shift_final ^ (1<slockstate = 0; - - } else { - /* maybe only if (kbd->kbdmode == VC_UNICODE) ? */ - if (!up_flag && !raw_mode) - to_utf8(keysym); - } - } else { - /* maybe beep? */ - /* we have at least to update shift_state */ -#if 1 /* how? two almost equivalent choices follow */ - compute_shiftstate(); -#else - keysym = U(plain_map[keycode]); - type = KTYP(keysym); - if (type == KT_SHIFT) - (*key_handler[type])(keysym & 0xff, up_flag); -#endif - } - } -} - -static void ( *driver_input_handler_kbd )( void *, unsigned short, unsigned long ) = 0; -/* - */ -void kbd_set_driver_handler( - void ( *handler )( void *, unsigned short, unsigned long ) -) -{ - driver_input_handler_kbd = handler; -} - -static void put_queue(int ch) -{ - if ( driver_input_handler_kbd ) { - driver_input_handler_kbd( ( void *)kbd, (unsigned short)ch, 0 ); - } else { - add_to_queue( ch ); - } -} - -static void puts_queue(char *cp) -{ - while (*cp) { - put_queue( *cp ); - cp++; - } -} - -static void applkey(int key, char mode) -{ - static char buf[] = { 0x1b, 'O', 0x00, 0x00 }; - - buf[1] = (mode ? 'O' : '['); - buf[2] = key; - puts_queue(buf); -} - -static void enter(void) -{ - if (diacr) { - put_queue(diacr); - diacr = 0; - } - put_queue(13); - - if (vc_kbd_mode(kbd,VC_CRLF)) - put_queue(10); -} - -static void caps_toggle(void) -{ - if (rep) - return; - chg_vc_kbd_led(kbd, VC_CAPSLOCK); -} - -static void caps_on(void) -{ - if (rep) - return; - set_vc_kbd_led(kbd, VC_CAPSLOCK); -} - -static void show_ptregs(void) -{ -} - -static void hold(void) -{ - if (rep ) - return; - chg_vc_kbd_led(kbd, VC_SCROLLOCK ); -} - -static void num(void) -{ - if (vc_kbd_mode(kbd,VC_APPLIC)) - applkey('P', 1); - else - bare_num(); -} - -/* - * Bind this to Shift-NumLock if you work in application keypad mode - * but want to be able to change the NumLock flag. - * Bind this to NumLock if you prefer that the NumLock key always - * changes the NumLock flag. - */ -static void bare_num(void) -{ - if (!rep) - chg_vc_kbd_led(kbd,VC_NUMLOCK); -} - -static void lastcons(void) -{ -} - -static void decr_console(void) -{ -} - -static void incr_console(void) -{ -} - -static void send_intr(void) -{ -} - -static void scroll_forw(void) -{ -} - -static void scroll_back(void) -{ -} - -static void compose(void) -{ - dead_key_next = 1; -} - -int spawnpid, spawnsig; - -static void spawn_console(void) -{ -} - -static void SAK(void) -{ -} - -static void do_ignore(unsigned char value, char up_flag) -{ -} - -static void do_null() -{ - compute_shiftstate(); -} - -static void do_spec(unsigned char value, char up_flag) -{ - if (up_flag) - return; - if (value >= SIZE(spec_fn_table)) - return; - - if ((kbd->kbdmode == VC_RAW || kbd->kbdmode == VC_MEDIUMRAW) && - !(SPECIALS_ALLOWED_IN_RAW_MODE & (1 << value))) - return; - - spec_fn_table[value](); -} - -static void do_lowercase(unsigned char value, char up_flag) -{ -} - -static void do_self(unsigned char value, char up_flag) -{ - if (up_flag) - return; /* no action, if this is a key release */ - - if (diacr) - value = handle_diacr(value); - - if (dead_key_next) { - dead_key_next = 0; - diacr = value; - return; - } - put_queue(value); -} - -#define A_GRAVE '`' -#define A_ACUTE '\'' -#define A_CFLEX '^' -#define A_TILDE '~' -#define A_DIAER '"' -#define A_CEDIL ',' -static unsigned char ret_diacr[NR_DEAD] = - {A_GRAVE, A_ACUTE, A_CFLEX, A_TILDE, A_DIAER, A_CEDIL }; - -/* Obsolete - for backwards compatibility only */ -static void do_dead(unsigned char value, char up_flag) -{ - value = ret_diacr[value]; - printk( " do_dead( %X ) ", value ); - do_dead2(value,up_flag); -} - -/* - * Handle dead key. Note that we now may have several - * dead keys modifying the same character. Very useful - * for Vietnamese. - */ -static void do_dead2(unsigned char value, char up_flag) -{ - if (up_flag) - return; - diacr = (diacr ? handle_diacr(value) : value); -} - -/* - * We have a combining character DIACR here, followed by the character CH. - * If the combination occurs in the table, return the corresponding value. - * Otherwise, if CH is a space or equals DIACR, return DIACR. - * Otherwise, conclude that DIACR was not combining after all, - * queue it and return CH. - */ -unsigned char handle_diacr(unsigned char ch) -{ - int d = diacr; - int i; - - diacr = 0; - - for (i = 0; i < accent_table_size; i++) { - if (accent_table[i].diacr == d && accent_table[i].base == ch) - return accent_table[i].result; - } - if (ch == ' ' || ch == d) - return d; - - put_queue(d); - return ch; -} - -static void do_cons(unsigned char value, char up_flag) -{ - if (up_flag) - return; -} - -static void do_fn(unsigned char value, char up_flag) -{ - if (up_flag) - return; - - if (value < SIZE(func_table)) { - if (func_table[value]) - puts_queue(func_table[value]); - } else - printk( "do_fn called with value=%d\n", value); -} - -static void do_pad(unsigned char value, char up_flag) -{ - static const char *pad_chars = "0123456789+-*/\015,.?()"; - static const char *app_map = "pqrstuvwxylSRQMnnmPQ"; - - if (up_flag) - return; /* no action, if this is a key release */ - - /* kludge... shift forces cursor/number keys */ - if (vc_kbd_mode(kbd,VC_APPLIC) && !k_down[KG_SHIFT]) { - applkey(app_map[value], 1); - return; - } - if (!vc_kbd_led(kbd,VC_NUMLOCK)) - switch (value) { - case KVAL(K_PCOMMA): - case KVAL(K_PDOT): - do_fn(KVAL(K_REMOVE), 0); - return; - case KVAL(K_P0): - do_fn(KVAL(K_INSERT), 0); - return; - case KVAL(K_P1): - do_fn(KVAL(K_SELECT), 0); - return; - case KVAL(K_P2): - do_cur(KVAL(K_DOWN), 0); - return; - case KVAL(K_P3): - do_fn(KVAL(K_PGDN), 0); - return; - case KVAL(K_P4): - do_cur(KVAL(K_LEFT), 0); - return; - case KVAL(K_P6): - do_cur(KVAL(K_RIGHT), 0); - return; - case KVAL(K_P7): - do_fn(KVAL(K_FIND), 0); - return; - case KVAL(K_P8): - do_cur(KVAL(K_UP), 0); - return; - case KVAL(K_P9): - do_fn(KVAL(K_PGUP), 0); - return; - case KVAL(K_P5): - applkey('G', vc_kbd_mode(kbd, VC_APPLIC)); - return; - } - - put_queue(pad_chars[value]); - - if (value == KVAL(K_PENTER) && vc_kbd_mode(kbd, VC_CRLF)) - put_queue(10); - -} - -static void do_cur(unsigned char value, char up_flag) -{ - static const char *cur_chars = "BDCA"; - if (up_flag) - return; - - applkey(cur_chars[value], vc_kbd_mode(kbd,VC_CKMODE)); -} - -static void do_shift(unsigned char value, char up_flag) -{ - int old_state = shift_state; - - if (rep) - return; - - /* Mimic typewriter: - a CapsShift key acts like Shift but undoes CapsLock */ - if (value == KVAL(K_CAPSSHIFT)) { - value = KVAL(K_SHIFT); - if (!up_flag) - clr_vc_kbd_led(kbd, VC_CAPSLOCK); - } - - if (up_flag) { - /* handle the case that two shift or control - keys are depressed simultaneously */ - if (k_down[value]) - k_down[value]--; - } else - k_down[value]++; - - if (k_down[value]) - shift_state |= (1 << value); - else - shift_state &= ~ (1 << value); - - /* kludge */ - if (up_flag && shift_state != old_state && npadch != -1) { - if (kbd->kbdmode == VC_UNICODE) - to_utf8(npadch & 0xffff); - else - put_queue(npadch & 0xff); - npadch = -1; - } -} - -/* called after returning from RAW mode or when changing consoles - - recompute k_down[] and shift_state from key_down[] */ -/* maybe called when keymap is undefined, so that shiftkey release is seen */ -void compute_shiftstate(void) -{ - int i, j, k, sym, val; - - shift_state = 0; - for(i=0; i < SIZE(k_down); i++) - k_down[i] = 0; - - for(i=0; i < SIZE(key_down); i++) - if(atomic_load(key_down + i)) { /* skip this word if not a single bit on */ - k = i*KBD_BITS_PER_ELEMENT; - for(j=0; jledmode = LED_SHOW_IOCTL; - } else - ; - kbd->ledmode = LED_SHOW_FLAGS; - set_leds(); -} - -static struct ledptr { - unsigned int *addr; - unsigned int mask; - unsigned char valid:1; -} ledptrs[3]; - -void register_leds( - int console, - unsigned int led, - unsigned int *addr, - unsigned int mask -) -{ - struct kbd_struct *kbd = kbd_table + console; - - if (led < 3) { - ledptrs[led].addr = addr; - ledptrs[led].mask = mask; - ledptrs[led].valid = 1; - kbd->ledmode = LED_SHOW_MEM; - } else - kbd->ledmode = LED_SHOW_FLAGS; -} - -static inline unsigned char getleds(void) -{ - - struct kbd_struct *kbd = kbd_table + fg_console; - - unsigned char leds; - - if (kbd->ledmode == LED_SHOW_IOCTL) - return ledioctl; - leds = kbd->ledflagstate; - if (kbd->ledmode == LED_SHOW_MEM) { - if (ledptrs[0].valid) { - if (*ledptrs[0].addr & ledptrs[0].mask) - leds |= 1; - else - leds &= ~1; - } - if (ledptrs[1].valid) { - if (*ledptrs[1].addr & ledptrs[1].mask) - leds |= 2; - else - leds &= ~2; - } - if (ledptrs[2].valid) { - if (*ledptrs[2].addr & ledptrs[2].mask) - leds |= 4; - else - leds &= ~4; - } - } - return leds; -} - -/* - * This routine is the bottom half of the keyboard interrupt - * routine, and runs with all interrupts enabled. It does - * console changing, led setting and copy_to_cooked, which can - * take a reasonably long time. - * - * Aside from timing (which isn't really that important for - * keyboard interrupts as they happen often), using the software - * interrupt routines for this thing allows us to easily mask - * this when we don't want any of the above to happen. Not yet - * used, but this allows for easy and efficient race-condition - * prevention later on. - */ -static void kbd_bh(void) -{ - unsigned char leds = getleds(); - if (leds != ledstate) { - ledstate = leds; - kbd_leds(leds); - } -} - -void set_leds(void) -{ - kbd_bh(); -} - -int kbd_init(void) -{ - - int i; - struct kbd_struct kbd0; - kbd0.ledflagstate = kbd0.default_ledflagstate = KBD_DEFLEDS; - kbd0.ledmode = LED_SHOW_MEM; - kbd0.lockstate = KBD_DEFLOCK; - kbd0.slockstate = 0; - kbd0.modeflags = KBD_DEFMODE; - kbd0.kbdmode = VC_XLATE; - - for (i = 0 ; i < MAX_NR_CONSOLES ; i++) - kbd_table[i] = kbd0; - - kbd_init_hw(); - mark_bh(KEYBOARD_BH); - return 0; -} diff --git a/c/src/lib/libbsp/i386/pc386/console/outch.c b/c/src/lib/libbsp/i386/pc386/console/outch.c deleted file mode 100644 index 90ffedf250..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/outch.c +++ /dev/null @@ -1,328 +0,0 @@ -/* - * outch.c - This file contains code for displaying characters - * on the console uisng information that should be - * maintained by the BIOS in its data Area. - * - * Copyright (C) 1998 Eric Valette (valette@crf.canon.fr) - * Canon Centre Recherche France. - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - * - * Till Straumann , 2003/9: - * - added handling of basic escape sequences (cursor movement - * and erasing; just enough for the line editor 'libtecla' to - * work...) - */ - -#include - -#include -#include - -#include - -extern void wr_cursor(int, unsigned short); - -#define TAB_SPACE 4 -static unsigned short *bitMapBaseAddr; -static unsigned short ioCrtBaseAddr; -static unsigned short maxCol; -static unsigned short maxRow; -static unsigned char row; -static unsigned char column; -static unsigned short attribute; -static unsigned int nLines; - -static void -scroll(void) -{ - int i, j; /* Counters */ - unsigned short *pt_scroll, *pt_bitmap; /* Pointers on the bit-map */ - - pt_bitmap = bitMapBaseAddr; - j = 0; - pt_bitmap = pt_bitmap + j; - pt_scroll = pt_bitmap + maxCol; - for (i = j; i < (maxRow - 1) * maxCol; i++) { - *pt_bitmap++ = *pt_scroll++; - } - - /* - * Blank characters are displayed on the last line. - */ - for (i = 0; i < maxCol; i++) { - *pt_bitmap++ = (short) (' ' | attribute); - } -} - -static void -doCRNL(int cr, int nl) -{ - if (nl) { - if (++row == maxRow) { - scroll(); /* Scroll the screen now */ - row = maxRow - 1; - } - nLines++; - } - if (cr) - column = 0; - /* Move cursor on the next location */ - if (cr || nl) - wr_cursor(row * maxCol + column, ioCrtBaseAddr); -} - -int (*videoHook)(char, int *)=0; - -static void -advanceCursor(void) -{ - if (++column == maxCol) - doCRNL(1,1); - else - wr_cursor(row * maxCol + column, ioCrtBaseAddr); -} - -static void -gotorc(int r, int c) -{ - column = c; - row = r; - - wr_cursor(row * maxCol + column, ioCrtBaseAddr); -} - -#define ESC ((char)27) -/* erase current location without moving the cursor */ -#define BLANK ((char)0x7f) - -static void -videoPutChar(char car) -{ - unsigned short *pt_bitmap = bitMapBaseAddr + row * maxCol + column; - - switch (car) { - case '\b': { - if (column) column--; - /* Move cursor on the previous location */ - wr_cursor(row * maxCol + column, ioCrtBaseAddr); - return; - } - case '\t': { - int i; - - i = TAB_SPACE - (column & (TAB_SPACE - 1)); - column += i; - if (column >= maxCol) { - doCRNL(1,1); - return; - } - while (i--) *pt_bitmap++ = ' ' | attribute; - wr_cursor(row * maxCol + column, ioCrtBaseAddr); - return; - } - case '\n': { - doCRNL(0,1); - return; - } - case 7: { /* Bell code must be inserted here */ - return; - } - case '\r' : { - doCRNL(1,0); - return; - } - case BLANK: { - *pt_bitmap = ' ' | attribute; - /* DONT move the cursor... */ - return; - } - default: { - *pt_bitmap = (unsigned char)car | attribute; - advanceCursor(); - return; - } - } -} - -/* trivial state machine to handle escape sequences: - * - * --------------------------------- - * | | - * | | - * KEY: esc V [ DCABHKJ esc | - * STATE: 0 -----> 27 -----> '[' ----------> -1 ----- - * ^\ \ \ \ - * KEY: | \other \ other \ other \ other - * <------------------------------------- - * - * in state '-1', the DCABHKJ cases are handled - * - * (cursor motion and screen clearing) - */ - -#define DONE (-1) - -static int -handleEscape(int oldState, char car) -{ -int rval = 0; -int ro,co; - - switch ( oldState ) { - case DONE: /* means the previous char terminated an ESC sequence... */ - case 0: - if ( 27 == car ) { - rval = 27; /* START of an ESC sequence */ - } - break; - - case 27: - if ( '[' == car ) { - rval = car; /* received ESC '[', so far */ - } else { - /* dump suppressed 'ESC'; outch will append the char */ - videoPutChar(ESC); - } - break; - - case '[': - /* handle 'ESC' '[' sequences here */ - ro = row; co = column; - rval = DONE; /* done */ - - switch (car) { - case 'D': /* left */ - if ( co > 0 ) co--; - break; - case 'C': /* right */ - if ( co < maxCol ) co++; - break; - case 'A': /* up */ - if ( ro > 0 ) ro--; - break; - case 'B': /* down */ - if ( ro < maxRow ) ro++; - break; - case 'H': /* home */ - ro = co = 0; - break; - case 'K': /* clear to end of line */ - while ( column < maxCol - 1 ) - videoPutChar(' '); - videoPutChar(BLANK); - break; - case 'J': /* clear to end of screen */ - while ( ((row < maxRow-1) || (column < maxCol-1)) ) - videoPutChar(' '); - videoPutChar(BLANK); - break; - default: - videoPutChar(ESC); - videoPutChar('['); - /* DONT move the cursor */ - ro = -1; - rval = 0; - break; - } - /* reset cursor */ - if ( ro >= 0) - gotorc(ro,co); - - default: - break; - - } - - return rval; -} - -static void -clear_screen(void) -{ - int i,j; - - for (j = 0; j <= maxRow; j++) { - for (i = 0; i <= maxCol; i++) { - videoPutChar(' '); - } - } - column = 0; - row = 0; -} - -/*-------------------------------------------------------------------------+ -| Function: _IBMPC_outch -| Description: Higher level (console) interface to consPutc. -| Global Variables: None. -| Arguments: c - character to write to console. -| Returns: Nothing. -+--------------------------------------------------------------------------*/ -void -_IBMPC_outch(char c) -{ -static int escaped = 0; - - if ( ! (escaped = handleEscape(escaped, c)) ) { - if ( '\n' == c ) - videoPutChar('\r'); - videoPutChar(c); - } -} /* _IBMPC_outch */ - -/*-------------------------------------------------------------------------+ -| Function: _IBMPC_initVideo -| Description: Video system initialization. Hook for any early setup. -| Global Variables: bitMapBaseAddr, ioCrtBaseAddr, maxCol, maxRow, row -| column, attribute, nLines; -| Arguments: None. -| Returns: Nothing. -+--------------------------------------------------------------------------*/ -void -_IBMPC_initVideo(void) -{ - unsigned char* pt = (unsigned char*) (VIDEO_MODE_ADDR); - - if (*pt == VGAMODE7) { - bitMapBaseAddr = (unsigned short*) V_MONO; - } - else { - bitMapBaseAddr = (unsigned short*) V_COLOR; - } - ioCrtBaseAddr = *(unsigned short*) DISPLAY_CRT_BASE_IO_ADDR; - maxCol = * (unsigned short*) NB_MAX_COL_ADDR; - maxRow = * (unsigned char*) NB_MAX_ROW_ADDR; - column = 0; - row = 0; - attribute = ((BLACK << 4) | WHITE)<<8; - nLines = 0; - clear_screen(); -#ifdef DEBUG_EARLY_STAGE - printk("bitMapBaseAddr = %X, display controller base IO = %X\n", - (unsigned) bitMapBaseAddr, - (unsigned) ioCrtBaseAddr); - videoPrintf("maxCol = %d, maxRow = %d\n", (unsigned) maxCol, (unsigned) maxRow); -#endif -} /* _IBMPC_initVideo */ - -/* for old DOS compatibility n-curses type of applications */ -void gotoxy( int x, int y ); -int whereX( void ); -int whereY( void ); - -void gotoxy( int x, int y ) -{ - gotorc(y,x); -} - -int whereX( void ) -{ - return row; -} - -int whereY( void ) -{ - return column; -} diff --git a/c/src/lib/libbsp/i386/pc386/console/pc_keyb.c b/c/src/lib/libbsp/i386/pc386/console/pc_keyb.c deleted file mode 100644 index b6f0eb216a..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/pc_keyb.c +++ /dev/null @@ -1,627 +0,0 @@ -/* - * linux/drivers/char/pc_keyb.c - * - * Separation of the PC low-level part by Geert Uytterhoeven, May 1997 - * See keyboard.c for the whole history. - * - * Major cleanup by Martin Mares, May 1997 - * - * Combined the keyboard and PS/2 mouse handling into one file, - * because they share the same hardware. - * Johan Myreen 1998-10-08. - * - * Code fixes to handle mouse ACKs properly. - * C. Scott Ananian 1999-01-29. - * - * Ported to RTEMS by Rosimildo da Silva - */ - -#include -#include -#include - -#include -#include -#include "i386kbd.h" - -static unsigned char handle_kbd_event(void); -static void kbd_write_command_w(int data); -static void kbd_write_output_w(int data); - -/* Some configuration switches are present in the include file... */ - -/* Simple translation table for the SysRq keys */ - -#ifdef CONFIG_MAGIC_SYSRQ -unsigned char pckbd_sysrq_xlate[128] = - "\000\0331234567890-=\177\t" /* 0x00 - 0x0f */ - "qwertyuiop[]\r\000as" /* 0x10 - 0x1f */ - "dfghjkl;'`\000\\zxcv" /* 0x20 - 0x2f */ - "bnm,./\000*\000 \000\201\202\203\204\205" /* 0x30 - 0x3f */ - "\206\207\210\211\212\000\000789-456+1" /* 0x40 - 0x4f */ - "230\177\000\000\213\214\000\000\000\000\000\000\000\000\000\000" /* 0x50 - 0x5f */ - "\r\000/"; /* 0x60 - 0x6f */ -#endif - -/* used only by send_data - set by keyboard_interrupt */ -static volatile unsigned char reply_expected = 0; -static volatile unsigned char acknowledge = 0; -static volatile unsigned char resend = 0; - -/* - * Translation of escaped scancodes to keycodes. - * This is now user-settable. - * The keycodes 1-88,96-111,119 are fairly standard, and - * should probably not be changed - changing might confuse X. - * X also interprets scancode 0x5d (KEY_Begin). - * - * For 1-88 keycode equals scancode. - */ - -#define E0_KPENTER 96 -#define E0_RCTRL 97 -#define E0_KPSLASH 98 -#define E0_PRSCR 99 -#define E0_RALT 100 -#define E0_BREAK 101 /* (control-pause) */ -#define E0_HOME 102 -#define E0_UP 103 -#define E0_PGUP 104 -#define E0_LEFT 105 -#define E0_RIGHT 106 -#define E0_END 107 -#define E0_DOWN 108 -#define E0_PGDN 109 -#define E0_INS 110 -#define E0_DEL 111 - -#define E1_PAUSE 119 - -/* - * The keycodes below are randomly located in 89-95,112-118,120-127. - * They could be thrown away (and all occurrences below replaced by 0), - * but that would force many users to use the `setkeycodes' utility, where - * they needed not before. It does not matter that there are duplicates, as - * long as no duplication occurs for any single keyboard. - */ -#define SC_LIM 89 - -#define FOCUS_PF1 85 /* actual code! */ -#define FOCUS_PF2 89 -#define FOCUS_PF3 90 -#define FOCUS_PF4 91 -#define FOCUS_PF5 92 -#define FOCUS_PF6 93 -#define FOCUS_PF7 94 -#define FOCUS_PF8 95 -#define FOCUS_PF9 120 -#define FOCUS_PF10 121 -#define FOCUS_PF11 122 -#define FOCUS_PF12 123 - -#define JAP_86 124 -/* tfj@olivia.ping.dk: - * The four keys are located over the numeric keypad, and are - * labelled A1-A4. It's an rc930 keyboard, from - * Regnecentralen/RC International, Now ICL. - * Scancodes: 59, 5a, 5b, 5c. - */ -#define RGN1 124 -#define RGN2 125 -#define RGN3 126 -#define RGN4 127 - -static unsigned char high_keys[128 - SC_LIM] = { - RGN1, RGN2, RGN3, RGN4, 0, 0, 0, /* 0x59-0x5f */ - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60-0x67 */ - 0, 0, 0, 0, 0, FOCUS_PF11, 0, FOCUS_PF12, /* 0x68-0x6f */ - 0, 0, 0, FOCUS_PF2, FOCUS_PF9, 0, 0, FOCUS_PF3, /* 0x70-0x77 */ - FOCUS_PF4, FOCUS_PF5, FOCUS_PF6, FOCUS_PF7, /* 0x78-0x7b */ - FOCUS_PF8, JAP_86, FOCUS_PF10, 0 /* 0x7c-0x7f */ -}; - -/* BTC */ -#define E0_MACRO 112 -/* LK450 */ -#define E0_F13 113 -#define E0_F14 114 -#define E0_HELP 115 -#define E0_DO 116 -#define E0_F17 117 -#define E0_KPMINPLUS 118 -/* - * My OmniKey generates e0 4c for the "OMNI" key and the - * right alt key does nada. [kkoller@nyx10.cs.du.edu] - */ -#define E0_OK 124 -/* - * New microsoft keyboard is rumoured to have - * e0 5b (left window button), e0 5c (right window button), - * e0 5d (menu button). [or: LBANNER, RBANNER, RMENU] - * [or: Windows_L, Windows_R, TaskMan] - */ -#define E0_MSLW 125 -#define E0_MSRW 126 -#define E0_MSTM 127 - -static unsigned char e0_keys[128] = { - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00-0x07 */ - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x08-0x0f */ - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10-0x17 */ - 0, 0, 0, 0, E0_KPENTER, E0_RCTRL, 0, 0, /* 0x18-0x1f */ - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20-0x27 */ - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x28-0x2f */ - 0, 0, 0, 0, 0, E0_KPSLASH, 0, E0_PRSCR, /* 0x30-0x37 */ - E0_RALT, 0, 0, 0, 0, E0_F13, E0_F14, E0_HELP, /* 0x38-0x3f */ - E0_DO, E0_F17, 0, 0, 0, 0, E0_BREAK, E0_HOME, /* 0x40-0x47 */ - E0_UP, E0_PGUP, 0, E0_LEFT, E0_OK, E0_RIGHT, E0_KPMINPLUS, E0_END,/* 0x48-0x4f */ - E0_DOWN, E0_PGDN, E0_INS, E0_DEL, 0, 0, 0, 0, /* 0x50-0x57 */ - 0, 0, 0, E0_MSLW, E0_MSRW, E0_MSTM, 0, 0, /* 0x58-0x5f */ - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60-0x67 */ - 0, 0, 0, 0, 0, 0, 0, E0_MACRO, /* 0x68-0x6f */ - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70-0x77 */ - 0, 0, 0, 0, 0, 0, 0, 0 /* 0x78-0x7f */ -}; - -static void mdelay( unsigned long t ) -{ - Wait_X_ms( t ); -} - -int pckbd_setkeycode(unsigned int scancode, unsigned int keycode) -{ - if (scancode < SC_LIM || scancode > 255 || keycode > 127) - return -EINVAL; - if (scancode < 128) - high_keys[scancode - SC_LIM] = keycode; - else - e0_keys[scancode - 128] = keycode; - return 0; -} - -int pckbd_getkeycode(unsigned int scancode) -{ - return - (scancode < SC_LIM || scancode > 255) ? -EINVAL : - (scancode < 128) ? high_keys[scancode - SC_LIM] : - e0_keys[scancode - 128]; -} - -static int do_acknowledge(unsigned char scancode) -{ - if (reply_expected) { - /* Unfortunately, we must recognise these codes only if we know they - * are known to be valid (i.e., after sending a command), because there - * are some brain-damaged keyboards (yes, FOCUS 9000 again) which have - * keys with such codes :( - */ - if (scancode == KBD_REPLY_ACK) { - acknowledge = 1; - reply_expected = 0; - return 0; - } else if (scancode == KBD_REPLY_RESEND) { - resend = 1; - reply_expected = 0; - return 0; - } - /* Should not happen... */ - printk( "keyboard reply expected - got %02x\n", scancode); - } - return 1; -} - -int pckbd_translate(unsigned char scancode, unsigned char *keycode, - char raw_mode) -{ - static int prev_scancode = 0; - - /* special prefix scancodes.. */ - if (scancode == 0xe0 || scancode == 0xe1) { - prev_scancode = scancode; - return 0; - } - - /* 0xFF is sent by a few keyboards, ignore it. 0x00 is error */ - if (scancode == 0x00 || scancode == 0xff) { - prev_scancode = 0; - return 0; - } - - scancode &= 0x7f; - - if (prev_scancode) { - /* - * usually it will be 0xe0, but a Pause key generates - * e1 1d 45 e1 9d c5 when pressed, and nothing when released - */ - if (prev_scancode != 0xe0) { - if (prev_scancode == 0xe1 && scancode == 0x1d) { - prev_scancode = 0x100; - return 0; - } else if (prev_scancode == 0x100 && scancode == 0x45) { - *keycode = E1_PAUSE; - prev_scancode = 0; - } else { -#ifdef KBD_REPORT_UNKN - if (!raw_mode) - printk("keyboard: unknown e1 escape sequence\n"); -#endif - prev_scancode = 0; - return 0; - } - } else { - prev_scancode = 0; - /* - * The keyboard maintains its own internal caps lock and - * num lock statuses. In caps lock mode E0 AA precedes make - * code and E0 2A follows break code. In num lock mode, - * E0 2A precedes make code and E0 AA follows break code. - * We do our own book-keeping, so we will just ignore these. - */ - /* - * For my keyboard there is no caps lock mode, but there are - * both Shift-L and Shift-R modes. The former mode generates - * E0 2A / E0 AA pairs, the latter E0 B6 / E0 36 pairs. - * So, we should also ignore the latter. - aeb@cwi.nl - */ - if (scancode == 0x2a || scancode == 0x36) - return 0; - - if (e0_keys[scancode]) - *keycode = e0_keys[scancode]; - else { -#ifdef KBD_REPORT_UNKN - if (!raw_mode) - printk( "keyboard: unknown scancode e0 %02x\n", - scancode); -#endif - return 0; - } - } - } else if (scancode >= SC_LIM) { - /* This happens with the FOCUS 9000 keyboard - Its keys PF1..PF12 are reported to generate - 55 73 77 78 79 7a 7b 7c 74 7e 6d 6f - Moreover, unless repeated, they do not generate - key-down events, so we have to zero up_flag below */ - /* Also, Japanese 86/106 keyboards are reported to - generate 0x73 and 0x7d for \ - and \ | respectively. */ - /* Also, some Brazilian keyboard is reported to produce - 0x73 and 0x7e for \ ? and KP-dot, respectively. */ - - *keycode = high_keys[scancode - SC_LIM]; - if (!*keycode) { - if (!raw_mode) { -#ifdef KBD_REPORT_UNKN - printk( "keyboard: unrecognized scancode (%02x)" - " - ignored\n", scancode); -#endif - } - return 0; - } - } else - *keycode = scancode; - return 1; -} - -char pckbd_unexpected_up(unsigned char keycode) -{ - /* unexpected, but this can happen: maybe this was a key release for a - FOCUS 9000 PF key; if we want to see it, we have to clear up_flag */ - if (keycode >= SC_LIM || keycode == 85) - return 0; - else - return 0200; -} - -static void kb_wait(void) -{ - unsigned long timeout = KBC_TIMEOUT; - - do { - /* - * "handle_kbd_event()" will handle any incoming events - * while we wait - keypresses or mouse movement. - */ - unsigned char status = handle_kbd_event(); - - if (! (status & KBD_STAT_IBF)) - return; - mdelay(1); - timeout--; - } while (timeout); -#ifdef KBD_REPORT_TIMEOUTS - printk( "Keyboard timed out[1]\n"); -#endif -} - -/* - * This reads the keyboard status port, and does the - * appropriate action. - * - * It requires that we hold the keyboard controller - * spinlock. - */ -static unsigned char handle_kbd_event(void) -{ - unsigned char status = kbd_read_status(); - unsigned int work = 10000; - - while (status & KBD_STAT_OBF) { - unsigned char scancode; - - scancode = kbd_read_input(); - if (status & KBD_STAT_MOUSE_OBF) { -#if 0 - handle_mouse_event(scancode); -#endif - } else { - if (do_acknowledge(scancode)) - handle_scancode(scancode, !(scancode & 0x80)); - mark_bh(KEYBOARD_BH); - } - - status = kbd_read_status(); - - if(!work--) - { - printk( "pc_keyb: controller jammed (0x%02X).\n", status); - break; - } - return status; - } - - /* - * the commands to set the leds for some reason, returns 0x14, 0x16 - * and I am intepreting as an ACK, because the original code from - * Linux was timeing out here... - */ - acknowledge = 1; - reply_expected = 0; - resend = 0; - return status; -} - -void keyboard_interrupt(void *unused) -{ - handle_kbd_event(); -} - -/* - * send_data sends a character to the keyboard and waits - * for an acknowledge, possibly retrying if asked to. Returns - * the success status. - * - * Don't use 'jiffies', so that we don't depend on interrupts - */ -static int send_data(unsigned char data) -{ - int retries = 3; - - do { - unsigned long timeout = KBD_TIMEOUT; - - acknowledge = 0; /* Set by interrupt routine on receipt of ACK. */ - resend = 0; - reply_expected = 1; - kbd_write_output_w(data); - for (;;) { - if (acknowledge) - return 1; - if (resend) - break; - mdelay(1); - if (!--timeout) { -#ifdef KBD_REPORT_TIMEOUTS - printk("Keyboard timeout[2]\n"); -#endif - return 0; - } - } - } while (retries-- > 0); -#ifdef KBD_REPORT_TIMEOUTS - printk( "keyboard: Too many NACKs -- noisy kbd cable?\n"); -#endif - return 0; -} - -void pckbd_leds(unsigned char leds) -{ - if (!send_data(KBD_CMD_SET_LEDS) || !send_data(leds)) - send_data(KBD_CMD_ENABLE); /* re-enable kbd if any errors */ -} - -/* - * In case we run on a non-x86 hardware we need to initialize both the - * keyboard controller and the keyboard. On a x86, the BIOS will - * already have initialized them. - * - * Some x86 BIOSes do not correctly initialize the keyboard, so the - * "kbd-reset" command line options can be given to force a reset. - * [Ranger] - */ -#ifdef __i386__ - int kbd_startup_reset = 0; -#else - int kbd_startup_reset = 1; -#endif - -/* for "kbd-reset" cmdline param */ -void kbd_reset_setup(char *str, int *ints) -{ - kbd_startup_reset = 1; -} - -#define KBD_NO_DATA (-1) /* No data */ -#define KBD_BAD_DATA (-2) /* Parity or other error */ - -static int kbd_read_data(void) -{ - int retval = KBD_NO_DATA; - unsigned char status; - - status = kbd_read_status(); - if (status & KBD_STAT_OBF) { - unsigned char data = kbd_read_input(); - - retval = data; - if (status & (KBD_STAT_GTO | KBD_STAT_PERR)) - retval = KBD_BAD_DATA; - } - return retval; -} - -static void kbd_clear_input(void) -{ - int maxread = 100; /* Random number */ - - do { - if (kbd_read_data() == KBD_NO_DATA) - break; - } while (--maxread); -} - -static int kbd_wait_for_input(void) -{ - long timeout = KBD_INIT_TIMEOUT; - - do { - int retval = kbd_read_data(); - if (retval >= 0) - return retval; - mdelay(1); - } while (--timeout); - return -1; -} - -static void kbd_write_command_w(int data) -{ - kb_wait(); - kbd_write_command(data); -} - -static void kbd_write_output_w(int data) -{ - kb_wait(); - kbd_write_output(data); -} - -static char * initialize_kbd(void) -{ - int status; - - /* - * Test the keyboard interface. - * This seems to be the only way to get it going. - * If the test is successful a x55 is placed in the input buffer. - */ - kbd_write_command_w(KBD_CCMD_SELF_TEST); - if (kbd_wait_for_input() != 0x55) - return "Keyboard failed self test"; - - /* - * Perform a keyboard interface test. This causes the controller - * to test the keyboard clock and data lines. The results of the - * test are placed in the input buffer. - */ - kbd_write_command_w(KBD_CCMD_KBD_TEST); - if (kbd_wait_for_input() != 0x00) - return "Keyboard interface failed self test"; - - /* - * Enable the keyboard by allowing the keyboard clock to run. - */ - kbd_write_command_w(KBD_CCMD_KBD_ENABLE); - - /* - * Reset keyboard. If the read times out - * then the assumption is that no keyboard is - * plugged into the machine. - * This defaults the keyboard to scan-code set 2. - * - * Set up to try again if the keyboard asks for RESEND. - */ - do { - kbd_write_output_w(KBD_CMD_RESET); - status = kbd_wait_for_input(); - if (status == KBD_REPLY_ACK) - break; - if (status != KBD_REPLY_RESEND) - return "Keyboard reset failed, no ACK"; - } while (1); - - if (kbd_wait_for_input() != KBD_REPLY_POR) - return "Keyboard reset failed, no POR"; - - /* - * Set keyboard controller mode. During this, the keyboard should be - * in the disabled state. - * - * Set up to try again if the keyboard asks for RESEND. - */ - do { - kbd_write_output_w(KBD_CMD_DISABLE); - status = kbd_wait_for_input(); - if (status == KBD_REPLY_ACK) - break; - if (status != KBD_REPLY_RESEND) - return "Disable keyboard: no ACK"; - } while (1); - - kbd_write_command_w(KBD_CCMD_WRITE_MODE); - kbd_write_output_w(KBD_MODE_KBD_INT - | KBD_MODE_SYS - | KBD_MODE_DISABLE_MOUSE - | KBD_MODE_KCC); - - /* ibm powerpc portables need this to use scan-code set 1 -- Cort */ - kbd_write_command_w(KBD_CCMD_READ_MODE); - if (!(kbd_wait_for_input() & KBD_MODE_KCC)) { - /* - * If the controller does not support conversion, - * Set the keyboard to scan-code set 1. - */ - kbd_write_output_w(0xF0); - kbd_wait_for_input(); - kbd_write_output_w(0x01); - kbd_wait_for_input(); - } - - kbd_write_output_w(KBD_CMD_ENABLE); - if (kbd_wait_for_input() != KBD_REPLY_ACK) - return "Enable keyboard: no ACK"; - /* - * Finally, set the typematic rate to maximum. - */ - kbd_write_output_w(KBD_CMD_SET_RATE); - if (kbd_wait_for_input() != KBD_REPLY_ACK) - return "Set rate: no ACK"; - kbd_write_output_w(0x00); - if (kbd_wait_for_input() != KBD_REPLY_ACK) - return "Set rate: no ACK"; - return NULL; -} - -void pckbd_init_hw(void) -{ - /* kbd_request_region(); */ - - /* Flush any pending input. */ - kbd_clear_input(); - - if (kbd_startup_reset) { - char *msg = initialize_kbd(); - if (msg) - printk( "initialize_kbd: %s\n", msg); - } - -#if defined CONFIG_PSMOUSE - psaux_init(); -#endif - - /* Ok, finally allocate the IRQ, and off we go.. */ -#if 0 - kbd_request_irq( keyboard_interrupt ); -#endif - -} diff --git a/c/src/lib/libbsp/i386/pc386/console/printk_support.c b/c/src/lib/libbsp/i386/pc386/console/printk_support.c deleted file mode 100644 index f6ef656583..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/printk_support.c +++ /dev/null @@ -1,84 +0,0 @@ -/* - * @file - * - * @ingroup Console - * - * @brief printk support routines - * - * This file contains the required printk support. - */ - -/* - * COPYRIGHT (c) 1989-2012. - * On-Line Applications Research Corporation (OAR). - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#include -#include -#if BSP_ENABLE_VGA - #include -#endif -#include -#include -#include -#include "../../../../../../../bsps/shared/dev/serial/legacy-console.h" - -rtems_device_minor_number BSPPrintkPort = 0; - -void BSP_outch(char ch); -int BSP_inch(void); - -void BSP_outch(char ch) -{ - #if BSP_ENABLE_VGA - bool isVga = BSPPrintkPort == BSP_CONSOLE_VGA; - #else - bool isVga = false; - #endif - - if ( !isVga ) { - console_tbl *port = Console_Port_Tbl[BSPPrintkPort]; - if (port->pDeviceFns && port->pDeviceFns->deviceWritePolled) { - port->pDeviceFns->deviceWritePolled( BSPPrintkPort, ch ); - } - return; - } - - #if BSP_ENABLE_VGA - _IBMPC_outch( ch ); - #endif -} - -int BSP_inch(void) -{ - #if BSP_ENABLE_VGA - bool isVga = BSPPrintkPort == BSP_CONSOLE_VGA; - #else - bool isVga = false; - #endif - - int result = -1; - - if ( !isVga ) { - console_tbl *port = Console_Port_Tbl[BSPPrintkPort]; - if (port->pDeviceFns && port->pDeviceFns->deviceRead) { - do { - result = port->pDeviceFns->deviceRead( BSPPrintkPort ); - } while (result == -1); - return result; - } - } - - #if BSP_ENABLE_VGA - result = BSP_wait_polled_input(); - #endif - - return result; -} - -BSP_output_char_function_type BSP_output_char = BSP_outch; -BSP_polling_getchar_function_type BSP_poll_char = BSP_inch; diff --git a/c/src/lib/libbsp/i386/pc386/console/ps2_mouse.c b/c/src/lib/libbsp/i386/pc386/console/ps2_mouse.c deleted file mode 100644 index 6a3f8551b4..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/ps2_mouse.c +++ /dev/null @@ -1,562 +0,0 @@ -/* - * linux/drivers/char/pc_keyb.c - * Separation of the PC low-level part by Geert Uytterhoeven, May 1997 - * See keyboard.c for the whole history. - * Major cleanup by Martin Mares, May 1997 - * Combined the keyboard and PS/2 mouse handling into one file, - * because they share the same hardware. - * Johan Myreen 1998-10-08. - * Code fixes to handle mouse ACKs properly. - * C. Scott Ananian 1999-01-29. - * - * RTEMS port: by Rosimildo da Silva. - */ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#define INITIALIZE_MOUSE -/* Some configuration switches are present in the include file... */ -#include -#include "ps2_mouse.h" - -static void kbd_write_command_w(int data); -#if 0 -static void kbd_write_output_w(int data); -#endif - -static unsigned char handle_kbd_event(void); -static void ps2_set_driver_handler(int port, mouse_parser_enqueue_handler handler); - -/* used only by send_data - set by keyboard_interrupt */ -static volatile unsigned char reply_expected = 0; -static volatile unsigned char acknowledge = 0; -static volatile unsigned char resend = 0; - -/* - * PS/2 Auxiliary Device - */ -static int psaux_init(void); - -static struct aux_queue *queue; /* Mouse data buffer. */ -static int aux_count = 0; -/* used when we send commands to the mouse that expect an ACK. */ -static unsigned char mouse_reply_expected = 0; - -#define AUX_INTS_OFF (KBD_MODE_KCC | KBD_MODE_DISABLE_MOUSE | KBD_MODE_SYS | KBD_MODE_KBD_INT) -#define AUX_INTS_ON (KBD_MODE_KCC | KBD_MODE_SYS | KBD_MODE_MOUSE_INT | KBD_MODE_KBD_INT) -#define MAX_RETRIES 60 /* some aux operations take long time*/ - -static void ps2_mouse_interrupt(void *); -static mouse_parser_enqueue_handler driver_input_handler_ps2 = NULL; - -/* - * This routine sets the handler to handle the characters received - * from the serial port. - */ -static void ps2_set_driver_handler( - int port, - mouse_parser_enqueue_handler handler -) -{ - driver_input_handler_ps2 = handler; -} - -static void mdelay( unsigned long t ) -{ - Wait_X_ms( t ); -} - -static void* termios_ttyp_paux = NULL; - -/* - * Wait for keyboard controller input buffer to drain. - * - * Don't use 'jiffies' so that we don't depend on - * interrupts.. - * - * Quote from PS/2 System Reference Manual: - * - * "Address hex 0060 and address hex 0064 should be written only when - * the input-buffer-full bit and output-buffer-full bit in the - * Controller Status register are set 0." - */ - -static void kb_wait(void) -{ - unsigned long timeout = KBC_TIMEOUT; - - do { - /* - * "handle_kbd_event()" will handle any incoming events - * while we wait - keypresses or mouse movement. - */ - unsigned char status = handle_kbd_event(); - - if (! (status & KBD_STAT_IBF)) - return; - - mdelay(1); - timeout--; - } while (timeout); - - #ifdef KBD_REPORT_TIMEOUTS - printk( "Keyboard timed out[1]\n"); - #endif -} - -static int do_acknowledge(unsigned char scancode) -{ - if (reply_expected) { - - /* Unfortunately, we must recognise these codes only if we know they - * are known to be valid (i.e., after sending a command), because there - * are some brain-damaged keyboards (yes, FOCUS 9000 again) which have - * keys with such codes :( - */ - if (scancode == KBD_REPLY_ACK) { - acknowledge = 1; - reply_expected = 0; - return 0; - } else if (scancode == KBD_REPLY_RESEND) { - resend = 1; - reply_expected = 0; - return 0; - } - - /* Should not happen... */ - #if 0 - printk( "keyboard reply expected - got %02x\n", scancode); - #endif - } - return 1; -} - -static inline void handle_mouse_event(unsigned char scancode) -{ - if (mouse_reply_expected) { - if (scancode == AUX_ACK) { - mouse_reply_expected--; - return; - } - mouse_reply_expected = 0; - } - - if (aux_count) { - int head = queue->head; - queue->buf[head] = scancode; - head = (head + 1) & (AUX_BUF_SIZE-1); - if (head != queue->tail) { - queue->head = head; - } - - /* if the input queue is active, add to it */ - if( driver_input_handler_ps2 ) { - driver_input_handler_ps2( &scancode, 1 ); - } else { - /* post this byte to termios */ - rtems_termios_enqueue_raw_characters( termios_ttyp_paux, (char *)&scancode, 1 ); - } - } -} - -/* - * This reads the keyboard status port, and does the - * appropriate action. - * - * It requires that we hold the keyboard controller - * spinlock. - */ -static unsigned char handle_kbd_event(void) -{ - unsigned char status = kbd_read_status(); - unsigned int work = 10000; - - while (status & KBD_STAT_OBF) { - unsigned char scancode; - scancode = kbd_read_input(); - if (status & KBD_STAT_MOUSE_OBF) { - handle_mouse_event(scancode); - } else { - do_acknowledge(scancode); - printk("pc_keyb: %X ", scancode ); - } - status = kbd_read_status(); - if(!work--) { - printk("pc_keyb: controller jammed (0x%02X).\n", status); - break; - } - } - return status; -} - -static void ps2_mouse_interrupt(void * unused) -{ - handle_kbd_event(); -} - -static void kbd_write_command_w(int data) -{ - kb_wait(); - kbd_write_command(data); -} - -static void kbd_write_cmd(int cmd) -{ - kb_wait(); - kbd_write_command(KBD_CCMD_WRITE_MODE); - kb_wait(); - kbd_write_output(cmd); -} - -/* - * Check if this is a dual port controller. - */ -static int detect_auxiliary_port(void) -{ - int loops = 10; - int retval = 0; - - /* Put the value 0x5A in the output buffer using the "Write - * Auxiliary Device Output Buffer" command (0xD3). Poll the - * Status Register for a while to see if the value really - * turns up in the Data Register. If the KBD_STAT_MOUSE_OBF - * bit is also set to 1 in the Status Register, we assume this - * controller has an Auxiliary Port (a.k.a. Mouse Port). - */ - kb_wait(); - kbd_write_command(KBD_CCMD_WRITE_AUX_OBUF); - - kb_wait(); - kbd_write_output(0x5a); /* 0x5a is a random dummy value. */ - - do { - unsigned char status = kbd_read_status(); - if (status & KBD_STAT_OBF) { - kbd_read_input(); - if (status & KBD_STAT_MOUSE_OBF) { - printk( "Detected PS/2 Mouse Port.\n"); - retval = 1; - } - break; - } - mdelay(1); - } while (--loops); - return retval; -} - -/* - * Send a byte to the mouse. - */ -static void aux_write_dev(int val) -{ - kb_wait(); - kbd_write_command(KBD_CCMD_WRITE_MOUSE); - kb_wait(); - kbd_write_output(val); -} - -/* - * Send a byte to the mouse & handle returned ack - */ -static void aux_write_ack(int val) -{ - kb_wait(); - kbd_write_command(KBD_CCMD_WRITE_MOUSE); - kb_wait(); - kbd_write_output(val); - /* we expect an ACK in response. */ - mouse_reply_expected++; - kb_wait(); -} - -static unsigned char get_from_queue(void) -{ - unsigned char result; - result = queue->buf[queue->tail]; - queue->tail = (queue->tail + 1) & (AUX_BUF_SIZE-1); - return result; -} - -static int queue_empty(void) -{ - return queue->head == queue->tail; -} - -/* - * Random magic cookie for the aux device - */ -#define AUX_DEV ((void *)queue) - -static int release_aux(void) -{ - rtems_status_code status; - if (--aux_count) - return 0; - kbd_write_cmd(AUX_INTS_OFF); /* Disable controller ints */ - kbd_write_command_w(KBD_CCMD_MOUSE_DISABLE); - status = rtems_interrupt_handler_remove( - AUX_IRQ, - ps2_mouse_interrupt, - NULL - ); - assert(status == RTEMS_SUCCESSFUL); - return 0; -} - -/* - * Install interrupt handler. - * Enable auxiliary device. - */ - -static int open_aux(void) -{ - rtems_status_code status; - - if (aux_count++) { - return 0; - } - queue->head = queue->tail = 0; /* Flush input queue */ - - status = rtems_interrupt_handler_install( - AUX_IRQ, - "ps2_mouse", - RTEMS_INTERRUPT_UNIQUE, - ps2_mouse_interrupt, - NULL - ); - assert(status == RTEMS_SUCCESSFUL); - - kbd_write_command_w(KBD_CCMD_MOUSE_ENABLE); /* Enable the auxiliary port on - controller. */ - aux_write_ack(AUX_ENABLE_DEV); /* Enable aux device */ - kbd_write_cmd(AUX_INTS_ON); /* Enable controller ints */ - return 0; -} - -/* - * Put bytes from input queue to buffer. - */ -size_t read_aux(char * buffer, size_t count ) -{ - size_t i = count; - unsigned char c; - - if (queue_empty()) { - return 0; - } - while (i > 0 && !queue_empty()) { - c = get_from_queue(); - *buffer++ = c; - i--; - } - return count-i; -} - -/* - * Write to the aux device. - */ -static int write_aux( int minor, const char * buffer, int count ) -{ - int retval = 0; - - if (count) { - int written = 0; - if (count > 32) - count = 32; /* Limit to 32 bytes. */ - do { - char c; - c = *buffer++; - aux_write_dev(c); - written++; - } while (--count); - retval = -EIO; - if (written) { - retval = written; - } - } - return retval; -} - -static int psaux_init( void ) -{ - if( !detect_auxiliary_port() ) { - printk( "PS/2 - mouse not found.\n" ); - return -EIO; - } - queue = (struct aux_queue *)malloc( sizeof(*queue) ); - memset(queue, 0, sizeof(*queue)); - queue->head = queue->tail = 0; - queue->proc_list = NULL; - - #ifdef INITIALIZE_MOUSE - kbd_write_command_w(KBD_CCMD_MOUSE_ENABLE); /* Enable Aux. */ - aux_write_ack(AUX_SET_SAMPLE); - aux_write_ack(100); /* 100 samples/sec */ - aux_write_ack(AUX_SET_RES); - aux_write_ack(3); /* 8 counts per mm */ - aux_write_ack(AUX_SET_SCALE21); /* 2:1 scaling */ - #endif /* INITIALIZE_MOUSE */ - kbd_write_command(KBD_CCMD_MOUSE_DISABLE); /* Disable aux device. */ - kbd_write_cmd(AUX_INTS_OFF); /* Disable controller ints. */ - return 0; -} - -/* - * paux device driver INITIALIZE entry point. - */ -rtems_device_driver paux_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg) -{ - rtems_status_code status; - - /* - * Set up TERMIOS - */ - rtems_termios_initialize(); - - printk( "PS/2 mouse probe.\n" ); - if( psaux_init() < 0 ) { - printk("Error detecting PS/2 mouse --\n"); - /* we might want to finish the application here !!! */ - } - open_aux(); - - /* - * Register the device - */ - status = rtems_io_register_name ("/dev/mouse", major, 0); - if (status != RTEMS_SUCCESSFUL) { - printk("Error registering paux device!\n"); - rtems_fatal_error_occurred (status); - } - return RTEMS_SUCCESSFUL; -} /* tty_initialize */ - -static int paux_last_close(int major, int minor, void *arg) -{ - release_aux(); - return 0; -} - -/* - * Write to the aux device. This routine is invoked by the - * termios framework whenever the "ECHO" feature is on. - * It does nothing write now. - */ -static ssize_t write_aux_echo( int minor, const char * buffer, size_t count ) -{ - return 0; -} - -/* - * paux device driver OPEN entry point - */ -rtems_device_driver paux_open( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg) -{ - rtems_status_code status; - static rtems_termios_callbacks cb = - { - NULL, /* firstOpen */ - paux_last_close, /* lastClose */ - NULL, /* poll read */ - write_aux_echo, /* write */ - NULL, /* setAttributes */ - NULL, /* stopRemoteTx */ - NULL, /* startRemoteTx */ - 0 /* outputUsesInterrupts */ - }; - - status = rtems_termios_open (major, minor, arg, &cb ); - termios_ttyp_paux = ( (rtems_libio_open_close_args_t *)arg)->iop->data1; - return status; -} - -/* - * paux device driver CLOSE entry point - */ -rtems_device_driver paux_close( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg) -{ - return (rtems_termios_close (arg)); -} - -/* - * paux device driver READ entry point. - * Read characters from the PS/2 mouse. - */ -rtems_device_driver paux_read( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg) -{ - return rtems_termios_read (arg); -} /* tty_read */ - -/* - * paux device driver WRITE entry point. - * Write characters to the PS/2 mouse. - */ -rtems_device_driver paux_write( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg) -{ - rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *)arg; - char *buffer = rw_args->buffer; - int maximum = rw_args->count; - rw_args->bytes_moved = write_aux( minor, buffer, maximum ); - return RTEMS_SUCCESSFUL; -} /* tty_write */ - -/* - * Handle ioctl request. - */ -rtems_device_driver paux_control( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - rtems_libio_ioctl_args_t *args = arg; - - switch( args->command ) { - default: - return rtems_termios_ioctl (arg); - break; - - case MW_UID_REGISTER_DEVICE: - printk( "PS2 Mouse: registering\n" ); - mouse_parser_initialize( "ps2" ); - ps2_set_driver_handler( minor, mouse_parser_enqueue ); - break; - - case MW_UID_UNREGISTER_DEVICE: -/* - unregister_mou_msg_queue( -1 ); -*/ - ps2_set_driver_handler( minor, NULL ); - break; - } - args->ioctl_return = 0; - return RTEMS_SUCCESSFUL; -} diff --git a/c/src/lib/libbsp/i386/pc386/console/ps2_mouse.h b/c/src/lib/libbsp/i386/pc386/console/ps2_mouse.h deleted file mode 100644 index dd61e8a367..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/ps2_mouse.h +++ /dev/null @@ -1,151 +0,0 @@ -/** - * @file - * - * @ingroup i386_pc386 - * - * @brief Keyboard and mouse definitions. - */ - -/* - * include/linux/pc_keyb.h - * PC Keyboard And Keyboard Controller - * (c) 1997 Martin Mares - * - * RTEMS port: by Rosimildo da Silva. - * - * This module was ported from Linux. - * - */ - -/* - * Configuration Switches - */ - -#undef KBD_REPORT_ERR /* Report keyboard errors */ -#define KBD_REPORT_UNKN /* Report unknown scan codes */ -#define KBD_REPORT_TIMEOUTS /* Report keyboard timeouts */ -#undef KBD_IS_FOCUS_9000 /* We have the brain-damaged FOCUS-9000 keyboard */ -#undef INITIALIZE_MOUSE /* Define if your PS/2 mouse needs initialization. */ - -#define KBD_INIT_TIMEOUT 1000 /* Timeout in ms for initializing the keyboard */ -#define KBC_TIMEOUT 250 /* Timeout in ms for sending to keyboard controller */ -#define KBD_TIMEOUT 1000 /* Timeout in ms for keyboard command acknowledge */ - -/* - * Internal variables of the driver - */ - -extern unsigned char pckbd_read_mask; -extern unsigned char aux_device_present; - -/* - * Keyboard Controller Registers on normal PCs. - */ - -#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) */ - -/* - * Keyboard Controller Commands - */ - -#define KBD_CCMD_READ_MODE 0x20 /* Read mode bits */ -#define KBD_CCMD_WRITE_MODE 0x60 /* Write mode bits */ -#define KBD_CCMD_GET_VERSION 0xA1 /* Get controller version */ -#define KBD_CCMD_MOUSE_DISABLE 0xA7 /* Disable mouse interface */ -#define KBD_CCMD_MOUSE_ENABLE 0xA8 /* Enable mouse interface */ -#define KBD_CCMD_TEST_MOUSE 0xA9 /* Mouse interface test */ -#define KBD_CCMD_SELF_TEST 0xAA /* Controller self test */ -#define KBD_CCMD_KBD_TEST 0xAB /* Keyboard interface test */ -#define KBD_CCMD_KBD_DISABLE 0xAD /* Keyboard interface disable */ -#define KBD_CCMD_KBD_ENABLE 0xAE /* Keyboard interface enable */ -#define KBD_CCMD_WRITE_AUX_OBUF 0xD3 /* Write to output buffer as if - initiated by the auxiliary device */ -#define KBD_CCMD_WRITE_MOUSE 0xD4 /* Write the following byte to the mouse */ - -/* - * Keyboard Commands - */ - -#define KBD_CMD_SET_LEDS 0xED /* Set keyboard leds */ -#define KBD_CMD_SET_RATE 0xF3 /* Set typematic rate */ -#define KBD_CMD_ENABLE 0xF4 /* Enable scanning */ -#define KBD_CMD_DISABLE 0xF5 /* Disable scanning */ -#define KBD_CMD_RESET 0xFF /* Reset */ - -/* - * Keyboard Replies - */ - -#define KBD_REPLY_POR 0xAA /* Power on reset */ -#define KBD_REPLY_ACK 0xFA /* Command ACK */ -#define KBD_REPLY_RESEND 0xFE /* Command NACK, send the cmd again */ - -/* - * Status Register Bits - */ - -#define KBD_STAT_OBF 0x01 /* Keyboard output buffer full */ -#define KBD_STAT_IBF 0x02 /* Keyboard input buffer full */ -#define KBD_STAT_SELFTEST 0x04 /* Self test successful */ -#define KBD_STAT_CMD 0x08 /* Last write was a command write (0=data) */ -#define KBD_STAT_UNLOCKED 0x10 /* Zero if keyboard locked */ -#define KBD_STAT_MOUSE_OBF 0x20 /* Mouse output buffer full */ -#define KBD_STAT_GTO 0x40 /* General receive/xmit timeout */ -#define KBD_STAT_PERR 0x80 /* Parity error */ - -#define AUX_STAT_OBF (KBD_STAT_OBF | KBD_STAT_MOUSE_OBF) - -/* - * Controller Mode Register Bits - */ - -#define KBD_MODE_KBD_INT 0x01 /* Keyboard data generate IRQ1 */ -#define KBD_MODE_MOUSE_INT 0x02 /* Mouse data generate IRQ12 */ -#define KBD_MODE_SYS 0x04 /* The system flag (?) */ -#define KBD_MODE_NO_KEYLOCK 0x08 /* The keylock doesn't affect the keyboard if set */ -#define KBD_MODE_DISABLE_KBD 0x10 /* Disable keyboard interface */ -#define KBD_MODE_DISABLE_MOUSE 0x20 /* Disable mouse interface */ -#define KBD_MODE_KCC 0x40 /* Scan code conversion to PC format */ -#define KBD_MODE_RFU 0x80 - -/* - * Mouse Commands - */ - -#define AUX_SET_RES 0xE8 /* Set resolution */ -#define AUX_SET_SCALE11 0xE6 /* Set 1:1 scaling */ -#define AUX_SET_SCALE21 0xE7 /* Set 2:1 scaling */ -#define AUX_GET_SCALE 0xE9 /* Get scaling factor */ -#define AUX_SET_STREAM 0xEA /* Set stream mode */ -#define AUX_SET_SAMPLE 0xF3 /* Set sample rate */ -#define AUX_ENABLE_DEV 0xF4 /* Enable aux device */ -#define AUX_DISABLE_DEV 0xF5 /* Disable aux device */ -#define AUX_RESET 0xFF /* Reset aux device */ -#define AUX_ACK 0xFA /* Command byte ACK. */ - -#define AUX_BUF_SIZE 512 /* This might be better divisible by - three to make overruns stay in sync - but then the read function would need - a lock etc - ick */ - -struct aux_queue { - unsigned long head; - unsigned long tail; - struct wait_queue *proc_list; - struct fasync_struct *fasync; - unsigned char buf[AUX_BUF_SIZE]; -}; - -/* How to access the keyboard macros on this platform. */ -#define kbd_read_input() inb(KBD_DATA_REG) -#define kbd_read_status() inb(KBD_STATUS_REG) -#define kbd_write_output(val) outb(val, KBD_DATA_REG) -#define kbd_write_command(val) outb(val, KBD_CNTL_REG) - -/* - * Machine specific bits for the PS/2 driver - */ - -#define AUX_IRQ 12 diff --git a/c/src/lib/libbsp/i386/pc386/console/rtd316.c b/c/src/lib/libbsp/i386/pc386/console/rtd316.c deleted file mode 100644 index 3b4e3c6ab4..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/rtd316.c +++ /dev/null @@ -1,109 +0,0 @@ -/** - * @file - * - * @brief Driver for RTD316 ISA SCC Board - * - * The RTD316 has a single Z85C30. - */ - -/* - * COPYRIGHT (c) 1989-2014. - * On-Line Applications Research Corporation (OAR). - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include "../../../../../../../bsps/shared/dev/serial/legacy-console.h" - -#define RTD_CLOCK_RATE (460800 * 32) - -uint8_t rtd316_com_get_register(uint32_t addr, uint8_t reg) -{ - register uint8_t val = 0; - - outport_byte( addr, reg ); - /* It appears the no delay is needed between the accesses. */ - inport_byte( addr, val ); - - return val; -} - -void rtd316_com_set_register(uint32_t addr,uint8_t reg, uint8_t val) -{ - outport_byte( addr, reg ); - /* It appears the no delay is needed between the accesses. */ - outport_byte( addr, val ); -} - -rtems_device_driver rtd316_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor_arg, - void *arg -) -{ - int p; - console_tbl *ports; - console_tbl *port_p; - - /* - * Now allocate array of device structures and fill them in - */ - ports = calloc( 2, sizeof( console_tbl ) ); - port_p = ports; - - for ( p=0 ; p<2 ; p++ ) { - char name[32]; - sprintf( name, "/dev/rtd316_1_%d", p ); - printk("Found %s\n", name ); - port_p->sDeviceName = strdup( name ); - port_p->deviceType = SERIAL_Z85C30; - #if 0 - port_p->pDeviceFns = &z85c30_fns_polled; - #else - port_p->pDeviceFns = &z85c30_fns; - #endif - - port_p->deviceProbe = NULL; - port_p->pDeviceFlow = NULL; - port_p->ulMargin = 16; - port_p->ulHysteresis = 8; - port_p->pDeviceParams = (void *) 9600; - port_p->getRegister = rtd316_com_get_register; - port_p->setRegister = rtd316_com_set_register; - port_p->getData = NULL; - port_p->setData = NULL; - port_p->ulClock = RTD_CLOCK_RATE; - port_p->ulIntVector = 9; - - if ( p==0 ) { - port_p->ulDataPort = 0; - port_p->ulCtrlPort1 = 0x340; - port_p->ulCtrlPort2 = 0x341; - } else { - port_p->ulDataPort = 1; - port_p->ulCtrlPort1 = 0x342; - port_p->ulCtrlPort2 = 0x343; - } - port_p++; - } /* end ports */ - - /* - * Register the devices - */ - console_register_devices( ports, 2 ); - - return RTEMS_SUCCESSFUL; -} diff --git a/c/src/lib/libbsp/i386/pc386/console/serial_mouse_config.c b/c/src/lib/libbsp/i386/pc386/console/serial_mouse_config.c deleted file mode 100644 index 492d038bd4..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/serial_mouse_config.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - * COPYRIGHT (c) 1989-2011. - * On-Line Applications Research Corporation (OAR). - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#include -#include -#include -#include -#include -#include - -#include -#include "../../../../../../../bsps/shared/dev/serial/legacy-console.h" - -/* select which serial port the mouse is connected to */ -#if defined(SERIAL_MOUSE_COM2) - #define MOUSE_DEVICE "/dev/com2" -#else - #define MOUSE_DEVICE "/dev/com1" -#endif - -static const char *SerialMouseDevice = MOUSE_DEVICE; - -bool bsp_get_serial_mouse_device( - const char **name, - const char **type -) -{ - const char *consname; - - *name = SerialMouseDevice; - *type = "ms"; - - /* Check if this port is not been used as console */ - consname = Console_Port_Tbl[ Console_Port_Minor ]->sDeviceName; - if ( !strcmp(MOUSE_DEVICE, consname) ) { - printk( "SERIAL MOUSE: port selected as console.(%s)\n", *name ); - rtems_fatal_error_occurred( -1 ); - } - - printk("Mouse Device: %s\n", *name ); - return name; -} diff --git a/c/src/lib/libbsp/i386/pc386/console/uart_bus_pci.c b/c/src/lib/libbsp/i386/pc386/console/uart_bus_pci.c deleted file mode 100644 index ac0c3bf86e..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/uart_bus_pci.c +++ /dev/null @@ -1,477 +0,0 @@ -/* - * This file was brought over from FreeBSD for the PCI device table. - * The code for using the table is RTEMS specific is also under the - * FreeBSD license. - * - * COPYRIGHT (c) 1989-2012. - * On-Line Applications Research Corporation (OAR). - */ - -/*- - * Copyright (c) 2006 Marcel Moolenaar - * Copyright (c) 2001 M. Warner Losh - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef __rtems__ -#include -#include -#include -#else -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include - -#endif - -#define DEFAULT_RCLK 1843200 - -#ifndef __rtems__ -static int uart_pci_probe(device_t dev); - -static device_method_t uart_pci_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, uart_pci_probe), - DEVMETHOD(device_attach, uart_bus_attach), - DEVMETHOD(device_detach, uart_bus_detach), - DEVMETHOD(device_resume, uart_bus_resume), - DEVMETHOD_END -}; - -static driver_t uart_pci_driver = { - uart_driver_name, - uart_pci_methods, - sizeof(struct uart_softc), -}; -#endif - -struct pci_id { - uint16_t vendor; - uint16_t device; - uint16_t subven; - uint16_t subdev; - const char *desc; - int rid; - int rclk; - int regshft; -}; - -static const struct pci_id pci_ns8250_ids[] = { -{ 0x1028, 0x0008, 0xffff, 0, "Dell Remote Access Card III", 0x14, - 128 * DEFAULT_RCLK }, -{ 0x1028, 0x0012, 0xffff, 0, "Dell RAC 4 Daughter Card Virtual UART", 0x14, - 128 * DEFAULT_RCLK }, -{ 0x1033, 0x0074, 0x1033, 0x8014, "NEC RCV56ACF 56k Voice Modem", 0x10 }, -{ 0x1033, 0x007d, 0x1033, 0x8012, "NEC RS232C", 0x10 }, -{ 0x103c, 0x1048, 0x103c, 0x1227, "HP Diva Serial [GSP] UART - Powerbar SP2", - 0x10 }, -{ 0x103c, 0x1048, 0x103c, 0x1301, "HP Diva RMP3", 0x14 }, -{ 0x103c, 0x1290, 0xffff, 0, "HP Auxiliary Diva Serial Port", 0x18 }, -{ 0x103c, 0x3301, 0xffff, 0, "HP iLO serial port", 0x10 }, -{ 0x11c1, 0x0480, 0xffff, 0, "Agere Systems Venus Modem (V90, 56KFlex)", 0x14 }, -{ 0x115d, 0x0103, 0xffff, 0, "Xircom Cardbus Ethernet + 56k Modem", 0x10 }, -{ 0x1282, 0x6585, 0xffff, 0, "Davicom 56PDV PCI Modem", 0x10 }, -{ 0x12b9, 0x1008, 0xffff, 0, "3Com 56K FaxModem Model 5610", 0x10 }, -{ 0x131f, 0x1000, 0xffff, 0, "Siig CyberSerial (1-port) 16550", 0x18 }, -{ 0x131f, 0x1001, 0xffff, 0, "Siig CyberSerial (1-port) 16650", 0x18 }, -{ 0x131f, 0x1002, 0xffff, 0, "Siig CyberSerial (1-port) 16850", 0x18 }, -{ 0x131f, 0x2000, 0xffff, 0, "Siig CyberSerial (1-port) 16550", 0x10 }, -{ 0x131f, 0x2001, 0xffff, 0, "Siig CyberSerial (1-port) 16650", 0x10 }, -{ 0x131f, 0x2002, 0xffff, 0, "Siig CyberSerial (1-port) 16850", 0x10 }, -{ 0x135c, 0x0190, 0xffff, 0, "Quatech SSCLP-100", 0x18 }, -{ 0x135c, 0x01c0, 0xffff, 0, "Quatech SSCLP-200/300", 0x18 }, -{ 0x135e, 0x7101, 0xffff, 0, "Sealevel Systems Single Port RS-232/422/485/530", - 0x18 }, -{ 0x1407, 0x0110, 0xffff, 0, "Lava Computer mfg DSerial-PCI Port A", 0x10 }, -{ 0x1407, 0x0111, 0xffff, 0, "Lava Computer mfg DSerial-PCI Port B", 0x10 }, -{ 0x1407, 0x0510, 0xffff, 0, "Lava SP Serial 550 PCI", 0x10 }, -{ 0x1409, 0x7168, 0x1409, 0x4025, "Timedia Technology Serial Port", 0x10, - 8 * DEFAULT_RCLK }, -{ 0x1409, 0x7168, 0x1409, 0x4027, "Timedia Technology Serial Port", 0x10, - 8 * DEFAULT_RCLK }, -{ 0x1409, 0x7168, 0x1409, 0x4028, "Timedia Technology Serial Port", 0x10, - 8 * DEFAULT_RCLK }, -{ 0x1409, 0x7168, 0x1409, 0x5025, "Timedia Technology Serial Port", 0x10, - 8 * DEFAULT_RCLK }, -{ 0x1409, 0x7168, 0x1409, 0x5027, "Timedia Technology Serial Port", 0x10, - 8 * DEFAULT_RCLK }, -{ 0x1415, 0x950b, 0xffff, 0, "Oxford Semiconductor OXCB950 Cardbus 16950 UART", - 0x10, 16384000 }, -{ 0x1415, 0xc120, 0xffff, 0, "Oxford Semiconductor OXPCIe952 PCIe 16950 UART", - 0x10 }, -{ 0x14e4, 0x4344, 0xffff, 0, "Sony Ericsson GC89 PC Card", 0x10}, -{ 0x151f, 0x0000, 0xffff, 0, "TOPIC Semiconductor TP560 56k modem", 0x10 }, -{ 0x1fd4, 0x1999, 0x1fd4, 0x0001, "Sunix SER5xxxx Serial Port", 0x10, - 8 * DEFAULT_RCLK }, -{ 0x8086, 0x0f0a, 0xffff, 0, "Intel ValleyView LPIO1 HSUART#1", 0x10, - 24 * DEFAULT_RCLK, 2 }, -{ 0x8086, 0x0f0c, 0xffff, 0, "Intel ValleyView LPIO1 HSUART#2", 0x10, - 24 * DEFAULT_RCLK, 2 }, -{ 0x8086, 0x1c3d, 0xffff, 0, "Intel AMT - KT Controller", 0x10 }, -{ 0x8086, 0x1d3d, 0xffff, 0, "Intel C600/X79 Series Chipset KT Controller", 0x10 }, -{ 0x8086, 0x2a07, 0xffff, 0, "Intel AMT - PM965/GM965 KT Controller", 0x10 }, -{ 0x8086, 0x2a47, 0xffff, 0, "Mobile 4 Series Chipset KT Controller", 0x10 }, -{ 0x8086, 0x2e17, 0xffff, 0, "4 Series Chipset Serial KT Controller", 0x10 }, -{ 0x8086, 0x3b67, 0xffff, 0, "5 Series/3400 Series Chipset KT Controller", - 0x10 }, -{ 0x8086, 0x8811, 0xffff, 0, "Intel EG20T Serial Port 0", 0x10 }, -{ 0x8086, 0x8812, 0xffff, 0, "Intel EG20T Serial Port 1", 0x10 }, -{ 0x8086, 0x8813, 0xffff, 0, "Intel EG20T Serial Port 2", 0x10 }, -{ 0x8086, 0x8814, 0xffff, 0, "Intel EG20T Serial Port 3", 0x10 }, -{ 0x8086, 0x8c3d, 0xffff, 0, "Intel Lynx Point KT Controller", 0x10 }, -{ 0x8086, 0x8cbd, 0xffff, 0, "Intel Wildcat Point KT Controller", 0x10 }, -{ 0x8086, 0x9c3d, 0xffff, 0, "Intel Lynx Point-LP HECI KT", 0x10 }, -{ 0x9710, 0x9820, 0x1000, 1, "NetMos NM9820 Serial Port", 0x10 }, -{ 0x9710, 0x9835, 0x1000, 1, "NetMos NM9835 Serial Port", 0x10 }, -{ 0x9710, 0x9865, 0xa000, 0x1000, "NetMos NM9865 Serial Port", 0x10 }, -{ 0x9710, 0x9900, 0xa000, 0x1000, - "MosChip MCS9900 PCIe to Peripheral Controller", 0x10 }, -{ 0x9710, 0x9901, 0xa000, 0x1000, - "MosChip MCS9901 PCIe to Peripheral Controller", 0x10 }, -{ 0x9710, 0x9904, 0xa000, 0x1000, - "MosChip MCS9904 PCIe to Peripheral Controller", 0x10 }, -{ 0x9710, 0x9922, 0xa000, 0x1000, - "MosChip MCS9922 PCIe to Peripheral Controller", 0x10 }, -{ 0xdeaf, 0x9051, 0xffff, 0, "Middle Digital PC Weasel Serial Port", 0x10 }, -{ 0xffff, 0, 0xffff, 0, NULL, 0, 0} -}; - -#ifndef __rtems__ -const static struct pci_id * -uart_pci_match(device_t dev, const struct pci_id *id) -{ - uint16_t device, subdev, subven, vendor; - - vendor = pci_get_vendor(dev); - device = pci_get_device(dev); - while (id->vendor != 0xffff && - (id->vendor != vendor || id->device != device)) - id++; - if (id->vendor == 0xffff) - return (NULL); - if (id->subven == 0xffff) - return (id); - subven = pci_get_subvendor(dev); - subdev = pci_get_subdevice(dev); - while (id->vendor == vendor && id->device == device && - (id->subven != subven || id->subdev != subdev)) - id++; - return ((id->vendor == vendor && id->device == device) ? id : NULL); -} - -static int -uart_pci_probe(device_t dev) -{ - struct uart_softc *sc; - const struct pci_id *id; - int result; - - sc = device_get_softc(dev); - - id = uart_pci_match(dev, pci_ns8250_ids); - if (id != NULL) { - sc->sc_class = &uart_ns8250_class; - goto match; - } - /* Add checks for non-ns8250 IDs here. */ - return (ENXIO); - - match: - result = uart_bus_probe(dev, id->regshft, id->rclk, id->rid, 0); - /* Bail out on error. */ - if (result > 0) - return (result); - /* Set/override the device description. */ - if (id->desc) - device_set_desc(dev, id->desc); - return (result); -} - -DRIVER_MODULE(uart, pci, uart_pci_driver, uart_devclass, NULL, NULL); -#endif - -#ifdef __rtems__ - -#include -#include - -#include -#include - -#include -#include -#include -#include -#include "../../../../../../../bsps/shared/dev/serial/legacy-console.h" - -#define MAX_BOARDS 4 - -/* - * Information saved from PCI scan - */ -typedef struct { - bool found; - const char* desc; - uint32_t base; - uint8_t irq; - uint8_t bus; - uint8_t slot; - int ports; - uint32_t clock; -} port_instance_conf_t; - -/* - * Memory Mapped Register Access Routines - */ - -#define UART_PCI_IO (0) - -static uint8_t pci_ns16550_mem_get_register(uint32_t addr, uint8_t i) -{ - uint8_t val = 0; - volatile uint32_t *reg = (volatile uint32_t *)(addr + (i*4)); - val = *reg; - if (UART_PCI_IO) - printk( "RD(%p -> 0x%02x) ", reg, val ); - return val; -} - -static void pci_ns16550_mem_set_register(uint32_t addr, uint8_t i, uint8_t val) -{ - volatile uint32_t *reg = (volatile uint32_t *)(addr + (i*4)); - if (UART_PCI_IO) - printk( "WR(%p <- 0x%02x) ", reg, val ); - *reg = val; -} - -/* - * IO Register Access Routines - */ -static uint8_t pci_ns16550_io_get_register(uint32_t addr, uint8_t i) -{ - uint8_t val = rtems_inb(addr + i); - if (UART_PCI_IO) - printk( "RD(%p -> 0x%02x) ", (void*) addr + i, val ); - return val; -} - -static void pci_ns16550_io_set_register(uint32_t addr, uint8_t i, uint8_t val) -{ - if (UART_PCI_IO) - printk( "WR(%p <- 0x%02x) ", (void*) addr + i, val ); - rtems_outb(addr + i, val); -} - -void pci_uart_probe(void) -{ - port_instance_conf_t conf[MAX_BOARDS]; - int boards = 0; - int b = 0; - console_tbl *ports; - console_tbl *port_p; - int bus; - int dev; - int fun; - int status; - int instance; - int i; - int total_ports = 0; - - for ( b=0 ; b> 1) & 3) != 2))) { - boards++; - conf[instance].found = true; - conf[instance].desc = pci_ns8250_ids[i].desc; - conf[instance].clock = pci_ns8250_ids[i].rclk; - conf[instance].ports = 1; - total_ports += conf[instance].ports; - - pci_read_config_byte( bus, dev, fun, PCI_INTERRUPT_LINE, &irq ); - - conf[instance].irq = irq; - conf[instance].base = base; - } - } - } - } - - /* - * Now allocate array of device structures and fill them in - */ - if (boards) { - int device_instance; - - ports = calloc( total_ports, sizeof( console_tbl ) ); - if (ports != NULL) { - port_p = ports; - device_instance = 1; - for (b = 0; b < MAX_BOARDS; b++) { - uint32_t base = 0; - bool io; - const char* locatable = ""; - const char* prefectable = locatable; - char name[32]; - if ( conf[b].found == false ) - continue; - sprintf( name, "/dev/pcicom%d", device_instance++ ); - port_p->sDeviceName = strdup( name ); - port_p->deviceType = SERIAL_NS16550; - if ( conf[b].irq <= 15 ) { - port_p->pDeviceFns = &ns16550_fns; - } else { - printk( - "%s IRQ=%d >= 16 requires APIC support, using polling\n", - name, - conf[b].irq - ); - port_p->pDeviceFns = &ns16550_fns_polled; - } - - /* - * PCI BAR (http://wiki.osdev.org/PCI#Base_Address_Registers): - * - * Bit 0: 0 = memory, 1 = IO - * - * Memory: - * Bit 2-1 : 0 = any 32bit address, - * 1 = < 1M - * 2 = any 64bit address - * Bit 3 : 0 = no, 1 = yes - * Bit 31-4 : base address (16-byte aligned) - * - * IO: - * Bit 1 : reserved - * Bit 31-2 : base address (4-byte aligned) - */ - - io = (conf[b].base & 1) == 1; - - if (io) { - base = conf[b].base & 0xfffffffc; - } else { - int loc = (conf[b].base >> 1) & 3; - if (loc == 0) { - base = conf[b].base & 0xfffffff0; - locatable = ",A32"; - } else if (loc == 1) { - base = conf[b].base & 0x0000fff0; - locatable = ",A16"; - } - prefectable = (conf[b].base & (1 << 3)) == 0 ? ",no-prefech" : ",prefetch"; - } - - port_p->deviceProbe = NULL; - port_p->pDeviceFlow = NULL; - port_p->ulMargin = 16; - port_p->ulHysteresis = 8; - port_p->pDeviceParams = (void *) 9600; - port_p->ulCtrlPort1 = base; - port_p->ulCtrlPort2 = 0; /* NA */ - port_p->ulDataPort = 0; /* NA */ - if (io) { - port_p->getRegister = pci_ns16550_io_get_register; - port_p->setRegister = pci_ns16550_io_set_register; - } else { - port_p->getRegister = pci_ns16550_mem_get_register; - port_p->setRegister = pci_ns16550_mem_set_register; - } - port_p->getData = NULL; /* NA */ - port_p->setData = NULL; /* NA */ - port_p->ulClock = conf[b].clock; - port_p->ulIntVector = conf[b].irq; - - - printk( - "%s:%d:%s,%s:0x%lx%s%s,irq:%d,clk:%lu\n", /* */ - name, b, conf[b].desc, - io ? "io" : "mem", base, locatable, prefectable, - conf[b].irq, conf[b].clock - ); - - - port_p++; - } /* end boards */ - - /* - * Register the devices - */ - console_register_devices( ports, total_ports ); - - /* - * Do not free the ports memory, the console hold this memory for-ever. - */ - } - } -} -#endif diff --git a/c/src/lib/libbsp/i386/pc386/console/vgacons.c b/c/src/lib/libbsp/i386/pc386/console/vgacons.c deleted file mode 100644 index 2886496e51..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/vgacons.c +++ /dev/null @@ -1,191 +0,0 @@ -/* - * This file contains the termios TTY driver for the i386 - * vga. - * - * COPYRIGHT (c) 1989-2011. - * On-Line Applications Research Corporation (OAR). - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define VGACONS_STATIC static - -/* - * vgacons_init - * - * This function initializes the VGA console to a quiecsent state. - */ -VGACONS_STATIC void vgacons_init(int minor) -{ - /* - * Note: We do not initialize the KBD interface here since - * it was initialized regardless of whether the - * vga is available or not. Therefore it is initialized - * in bsp_start. - */ -} - -/* - * vgacons_open - * - * This function opens a port for communication. - * - * Default state is 9600 baud, 8 bits, No parity, and 1 stop bit. - */ -VGACONS_STATIC int vgacons_open( - int major, - int minor, - void *arg -) -{ - return RTEMS_SUCCESSFUL; -} - -/* - * vgacons_close - * - * This function shuts down the requested port. - */ -VGACONS_STATIC int vgacons_close( - int major, - int minor, - void *arg -) -{ - return(RTEMS_SUCCESSFUL); -} - -/* - * vgacons_write_polled - * - * This routine polls out the requested character. - */ -VGACONS_STATIC void vgacons_write_polled( - int minor, - char c -) -{ - _IBMPC_outch( c ); - if( c == '\n') - _IBMPC_outch( '\r' ); /* LF = LF + CR */ -} - -/* - * vgacons_write_support_polled - * - * Console Termios output entry point when using polled output. - * - */ -VGACONS_STATIC ssize_t vgacons_write_support_polled( - int minor, - const char *buf, - size_t len -) -{ - int nwrite = 0; - - /* - * poll each byte in the string out of the port. - */ - while (nwrite < len) { - vgacons_write_polled(minor, *buf++); - nwrite++; - } - - /* - * return the number of bytes written. - */ - return nwrite; -} - -/* - * vgacons_inbyte_nonblocking_polled - * - * Console Termios polling input entry point. - */ -VGACONS_STATIC int vgacons_inbyte_nonblocking_polled( - int minor -) -{ - if( rtems_kbpoll() ) { - int c = getch(); - return c; - } - - return -1; -} - -/* - * vgacons_set_attributes - * - * This function sets the UART channel to reflect the requested termios - * port settings. - */ -VGACONS_STATIC int vgacons_set_attributes( - int minor, - const struct termios *t -) -{ - return 0; -} - -bool vgacons_probe( - int minor -) -{ - rtems_status_code status; - static bool firstTime = true; - - if ((*(unsigned char*) NB_MAX_ROW_ADDR == 0) && - (*(unsigned short*)NB_MAX_COL_ADDR == 0)) { - return false; - } - - /* - * If there is a video card, let's assume there is also a keyboard. - * The means that we need the ISR installed in case someone wants to - * use the Keyboard or PS2 Mouse. With Microwindows, the console - * can be COM1 and you can still use the mouse/VGA for graphics. - */ - if ( firstTime ) { - status = rtems_interrupt_handler_install( - BSP_KEYBOARD, - "vgacons", - RTEMS_INTERRUPT_UNIQUE, - keyboard_interrupt, - NULL - ); - assert(status == RTEMS_SUCCESSFUL); - } - firstTime = false; - - return true; -} - -const console_fns vgacons_fns = -{ - libchip_serial_default_probe, /* deviceProbe */ - vgacons_open, /* deviceFirstOpen */ - vgacons_close, /* deviceLastClose */ - vgacons_inbyte_nonblocking_polled, /* deviceRead */ - vgacons_write_support_polled, /* deviceWrite */ - vgacons_init, /* deviceInitialize */ - vgacons_write_polled, /* deviceWritePolled */ - vgacons_set_attributes, /* deviceSetAttributes */ - FALSE, /* deviceOutputUsesInterrupts */ -}; diff --git a/c/src/lib/libbsp/i386/pc386/console/vgainit.c b/c/src/lib/libbsp/i386/pc386/console/vgainit.c deleted file mode 100644 index ce83ae59b1..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/vgainit.c +++ /dev/null @@ -1,757 +0,0 @@ -/* - * Copyright (c) 1999 Greg Haerr - * Copyright (c) 1991 David I. Bell - * Permission is granted to use, distribute, or modify this source, - * provided that this copyright notice remains intact. - * - * Alternate EGA/VGA Screen Driver Init, direct hw programming - */ -#include - -#ifdef __rtems__ -#define ROMFONT 0 /* =0 no bios rom fonts available*/ -#else -#define ROMFONT 1 /* =1 uses PC rom fonts */ -#endif - -/* defines are defined in device.h of the MicroWindows package */ -#define MODE_SET 0 /* draw pixels as given (default) */ -#define MODE_XOR 1 /* draw pixels using XOR */ -#define MODE_OR 2 /* draw pixels using OR (notimp)*/ -#define MODE_AND 3 /* draw pixels using AND (notimp)*/ -#define MODE_MAX 3 -typedef int MODE; /* drawing mode*/ - -/* Define one and only one of the following to be nonzero*/ -#define VGA_ET4000 0 /* TSENG LABS ET4000 chip 800x600*/ -#define VGA_STANDARD 1 /* standard VGA 640x480*/ -#define EGA_STANDARD 0 /* standard EGA 640x350*/ - -#define DONE 0 -#define IN 1 -#define OUT 2 - -#define RAM_SCAN_LINES 32 /* number of scan lines in fonts in RAM */ -#define FONT_CHARS 256 /* number of characters in font tables */ -#define CHAR_WIDTH 8 /* number of pixels for character width */ - -#define PALREG 0x3c0 -#define SEQREG 0x3c4 -#define SEQVAL 0x3c5 -#define GRREG 0x3ce -#define GRVAL 0x3cf -#define ATTRREG 0x3da -#define CRTCREG 0x3d4 -#define CRTCVAL 0x3d5 - -#define GENREG1 0x3c2 -#define GENREG2 0x3cc -#define GENREG3 0x3ca - -#define DATA_ROTATE 3 /* register number for data rotate */ - -typedef struct { - int action; - int port1; - int data1; - int port2; - int data2; -} REGIO; - -#if ROMFONT -extern FARADDR rom_char_addr; /* address of ROM font*/ -extern int ROM_CHAR_HEIGHT; /* ROM character height*/ -#endif - -/* local data*/ -static REGIO graphics_on[]; -static REGIO graph_off[]; - -/* entry points*/ -void ega_hwinit(void); -void ega_hwterm(void); - -/* local routines*/ -static void writeregs(REGIO *rp); -static void out_word(unsigned int p,unsigned int d); -static void setmode(MODE mode); - -void -ega_hwinit(void) -{ - writeregs(graphics_on); -} - -void -ega_hwterm(void) -{ - setmode(MODE_SET); - - /* Copy character table from ROM back into bit plane 2 before turning - * off graphics. - */ - out_word(SEQREG, 0x0100); /* syn reset */ - out_word(SEQREG, 0x0402); /* cpu writes only to map 2 */ - out_word(SEQREG, 0x0704); /* sequential addressing */ - out_word(SEQREG, 0x0300); /* clear synchronous reset */ - - out_word(GRREG, 0x0204); /* select map 2 for CPU reads */ - out_word(GRREG, 0x0005); /* disable odd-even addressing */ - -#if ROMFONT - { - FARADDR srcoffset; - FARADDR destoffset; - int data; - int ch; - int row; - - srcoffset = rom_char_addr; - destoffset = EGA_BASE; - for (ch = 0; ch < FONT_CHARS; ch++) { - for(row = 0; row < ROM_CHAR_HEIGHT; row++) { - data = GETBYTE_FP(srcoffset++); - PUTBYTE_FP(destoffset++, data); - } - destoffset += (RAM_SCAN_LINES - ROM_CHAR_HEIGHT); - } - } -#endif - - /* Finally set the registers back for text mode. */ - writeregs(graph_off); -} - -/* Set the graphics registers as indicated by the given table */ -static void -writeregs(REGIO *rp) -{ - for (; rp->action != DONE; rp++) { - switch (rp->action) { - case IN: - inp(rp->port1); - break; - case OUT: - outp(rp->port1, rp->data1); - if (rp->port2) - outp(rp->port2, rp->data2); - break; - } - } -} - -/* Output a word to an I/O port. */ -static void -out_word(unsigned int p,unsigned int d) -{ - outp(p, d & 0xff); - outp(p + 1, (d >> 8) & 0xff); -} - -/* Values for the data rotate register to implement drawing modes. */ -static unsigned char mode_table[MODE_MAX + 1] = { - 0x00, 0x18, 0x10, 0x08 -}; - -/* Set the drawing mode. - * This is either SET, OR, AND, or XOR. - */ -static void -setmode(MODE mode) -{ - if (mode > MODE_MAX) - return; - outp(GRREG, DATA_ROTATE); - outp(GRVAL, mode_table[mode]); -} - -#if VGA_ET4000 - -/* VGA 800x600 16-color graphics (BIOS mode 0x29). - */ -REGIO graphics_on[] = { - /* Reset attr F/F */ - IN, ATTRREG, 0, 0, 0, - - /* Disable palette */ - OUT, PALREG, 0, 0, 0, - - /* Reset sequencer regs */ - OUT, SEQREG, 0, SEQVAL, 0, - OUT, SEQREG, 1, SEQVAL, 1, - OUT, SEQREG, 2, SEQVAL, 0x0f, - OUT, SEQREG, 3, SEQVAL, 0, - OUT, SEQREG, 4, SEQVAL, 6, - - /* Misc out reg */ - OUT, GENREG1, 0xe3, 0, 0, - - /* Sequencer enable */ - OUT, SEQREG, 0, SEQVAL, 0x03, - - /* Unprotect crtc regs 0-7 */ - OUT, CRTCREG, 0x11, CRTCVAL, 0, - - /* Crtc */ - OUT, CRTCREG, 0, CRTCVAL, 0x7a, - OUT, CRTCREG, 1, CRTCVAL, 0x63, - OUT, CRTCREG, 2, CRTCVAL, 0x64, - OUT, CRTCREG, 3, CRTCVAL, 0x1d, - OUT, CRTCREG, 4, CRTCVAL, 0x68, - OUT, CRTCREG, 5, CRTCVAL, 0x9a, - OUT, CRTCREG, 6, CRTCVAL, 0x78, - OUT, CRTCREG, 7, CRTCVAL, 0xf0, - OUT, CRTCREG, 8, CRTCVAL, 0x00, - OUT, CRTCREG, 9, CRTCVAL, 0x60, - OUT, CRTCREG, 10, CRTCVAL, 0x00, - OUT, CRTCREG, 11, CRTCVAL, 0x00, - OUT, CRTCREG, 12, CRTCVAL, 0x00, - OUT, CRTCREG, 13, CRTCVAL, 0x00, - OUT, CRTCREG, 14, CRTCVAL, 0x00, - OUT, CRTCREG, 15, CRTCVAL, 0x00, - OUT, CRTCREG, 16, CRTCVAL, 0x5c, - OUT, CRTCREG, 17, CRTCVAL, 0x8e, - OUT, CRTCREG, 18, CRTCVAL, 0x57, - OUT, CRTCREG, 19, CRTCVAL, 0x32, - OUT, CRTCREG, 20, CRTCVAL, 0x00, - OUT, CRTCREG, 21, CRTCVAL, 0x5b, - OUT, CRTCREG, 22, CRTCVAL, 0x75, - OUT, CRTCREG, 23, CRTCVAL, 0xc3, - OUT, CRTCREG, 24, CRTCVAL, 0xff, - - /* Graphics controller */ - OUT, GENREG2, 0x00, 0, 0, - OUT, GENREG3, 0x01, 0, 0, - OUT, GRREG, 0, GRVAL, 0x00, - OUT, GRREG, 1, GRVAL, 0x00, - OUT, GRREG, 2, GRVAL, 0x00, - OUT, GRREG, 3, GRVAL, 0x00, - OUT, GRREG, 4, GRVAL, 0x00, - OUT, GRREG, 5, GRVAL, 0x00, - OUT, GRREG, 6, GRVAL, 0x05, - OUT, GRREG, 7, GRVAL, 0x0f, - OUT, GRREG, 8, GRVAL, 0xff, - - /* Reset attribute flip/flop */ - IN, ATTRREG, 0, 0, 0, - - /* Palette */ - OUT, PALREG, 0, PALREG, 0x00, - OUT, PALREG, 1, PALREG, 0x01, - OUT, PALREG, 2, PALREG, 0x02, - OUT, PALREG, 3, PALREG, 0x03, - OUT, PALREG, 4, PALREG, 0x04, - OUT, PALREG, 5, PALREG, 0x05, - OUT, PALREG, 6, PALREG, 0x06, - OUT, PALREG, 7, PALREG, 0x07, - OUT, PALREG, 8, PALREG, 0x38, - OUT, PALREG, 9, PALREG, 0x39, - OUT, PALREG, 10, PALREG, 0x3a, - OUT, PALREG, 11, PALREG, 0x3b, - OUT, PALREG, 12, PALREG, 0x3c, - OUT, PALREG, 13, PALREG, 0x3d, - OUT, PALREG, 14, PALREG, 0x3e, - OUT, PALREG, 15, PALREG, 0x3f, - OUT, PALREG, 16, PALREG, 0x01, - OUT, PALREG, 17, PALREG, 0x00, - OUT, PALREG, 18, PALREG, 0x0f, - OUT, PALREG, 19, PALREG, 0x00, - - /* Enable palette */ - OUT, PALREG, 0x20, 0, 0, - - /* End of table */ - DONE, 0, 0, 0, 0 -}; - -/* VGA 80x25 text (BIOS mode 3). - */ -static REGIO graph_off[] = { - /* Reset attr F/F */ - IN, ATTRREG, 0, 0, 0, - - /* Disable palette */ - OUT, PALREG, 0, 0, 0, - - /* Reset sequencer regs */ - OUT, SEQREG, 0, SEQVAL, 1, - OUT, SEQREG, 1, SEQVAL, 1, - OUT, SEQREG, 2, SEQVAL, 3, - OUT, SEQREG, 3, SEQVAL, 0, - OUT, SEQREG, 4, SEQVAL, 2, - - /* Misc out reg */ - OUT, GENREG1, 0x63, 0, 0, - - /* Sequencer enable */ - OUT, SEQREG, 0, SEQVAL, 3, - - /* Unprotect crtc regs 0-7 */ - OUT, CRTCREG, 0x11, CRTCVAL, 0, - - /* Crtc */ - OUT, CRTCREG, 0, CRTCVAL, 0x5f, /* horiz total */ - OUT, CRTCREG, 1, CRTCVAL, 0x4f, /* horiz end */ - OUT, CRTCREG, 2, CRTCVAL, 0x50, /* horiz blank */ - OUT, CRTCREG, 3, CRTCVAL, 0x82, /* end blank */ - OUT, CRTCREG, 4, CRTCVAL, 0x55, /* horiz retrace */ - OUT, CRTCREG, 5, CRTCVAL, 0x81, /* end retrace */ - OUT, CRTCREG, 6, CRTCVAL, 0xbf, /* vert total */ - OUT, CRTCREG, 7, CRTCVAL, 0x1f, /* overflows */ - OUT, CRTCREG, 8, CRTCVAL, 0x00, /* row scan */ - OUT, CRTCREG, 9, CRTCVAL, 0x4f, /* max scan line */ - OUT, CRTCREG, 10, CRTCVAL, 0x00, /* cursor start */ - OUT, CRTCREG, 11, CRTCVAL, 0x0f, /* cursor end */ - OUT, CRTCREG, 12, CRTCVAL, 0x0e, /* start high addr */ - OUT, CRTCREG, 13, CRTCVAL, 0xb0, /* low addr */ - OUT, CRTCREG, 14, CRTCVAL, 0x16, /* cursor high */ - OUT, CRTCREG, 15, CRTCVAL, 0x30, /* cursor low */ - OUT, CRTCREG, 16, CRTCVAL, 0x9c, /* vert retrace */ - OUT, CRTCREG, 17, CRTCVAL, 0x8e, /* retrace end */ - OUT, CRTCREG, 18, CRTCVAL, 0x8f, /* vert end */ - OUT, CRTCREG, 19, CRTCVAL, 0x28, /* offset */ - OUT, CRTCREG, 20, CRTCVAL, 0x1f, /* underline */ - OUT, CRTCREG, 21, CRTCVAL, 0x96, /* vert blank */ - OUT, CRTCREG, 22, CRTCVAL, 0xb9, /* end blank */ - OUT, CRTCREG, 23, CRTCVAL, 0xa3, /* crt mode */ - OUT, CRTCREG, 24, CRTCVAL, 0xff, /* line compare */ - - /* Graphics controller */ - OUT, GENREG2, 0x00, 0, 0, - OUT, GENREG3, 0x01, 0, 0, - OUT, GRREG, 0, GRVAL, 0x00, - OUT, GRREG, 1, GRVAL, 0x00, - OUT, GRREG, 2, GRVAL, 0x00, - OUT, GRREG, 3, GRVAL, 0x00, - OUT, GRREG, 4, GRVAL, 0x00, - OUT, GRREG, 5, GRVAL, 0x10, - OUT, GRREG, 6, GRVAL, 0x0e, - OUT, GRREG, 7, GRVAL, 0x00, - OUT, GRREG, 8, GRVAL, 0xff, - - /* Reset attribute flip/flop */ - IN, ATTRREG, 0, 0, 0, - - /* Palette */ - OUT, PALREG, 0, PALREG, 0x00, - OUT, PALREG, 1, PALREG, 0x01, - OUT, PALREG, 2, PALREG, 0x02, - OUT, PALREG, 3, PALREG, 0x03, - OUT, PALREG, 4, PALREG, 0x04, - OUT, PALREG, 5, PALREG, 0x05, - OUT, PALREG, 6, PALREG, 0x06, - OUT, PALREG, 7, PALREG, 0x07, - OUT, PALREG, 8, PALREG, 0x10, - OUT, PALREG, 9, PALREG, 0x11, - OUT, PALREG, 10, PALREG, 0x12, - OUT, PALREG, 11, PALREG, 0x13, - OUT, PALREG, 12, PALREG, 0x14, - OUT, PALREG, 13, PALREG, 0x15, - OUT, PALREG, 14, PALREG, 0x16, - OUT, PALREG, 15, PALREG, 0x17, - OUT, PALREG, 16, PALREG, 0x08, - OUT, PALREG, 17, PALREG, 0x00, - OUT, PALREG, 18, PALREG, 0x0f, - OUT, PALREG, 19, PALREG, 0x00, - - /* Enable palette */ - OUT, PALREG, 0x20, 0, 0, - - /* End of table */ - DONE, 0, 0, 0, 0 -}; - -#endif - -#if VGA_STANDARD - -/* VGA 640x480 16-color graphics (BIOS mode 0x12). - */ -static REGIO graphics_on[] = { - /* Reset attr F/F */ - { IN, ATTRREG, 0, 0, 0 }, - - /* Disable palette */ - { OUT, PALREG, 0, 0, 0 }, - - /* Reset sequencer regs */ - { OUT, SEQREG, 0, SEQVAL, 0 }, - { OUT, SEQREG, 1, SEQVAL, 1 }, - { OUT, SEQREG, 2, SEQVAL, 0x0f }, - { OUT, SEQREG, 3, SEQVAL, 0 }, - { OUT, SEQREG, 4, SEQVAL, 6 }, - - /* Misc out reg */ - { OUT, GENREG1, 0xe3, 0, 0 }, - - /* Sequencer enable */ - { OUT, SEQREG, 0, SEQVAL, 0x03 }, - - /* Unprotect crtc regs 0-7 */ - { OUT, CRTCREG, 0x11, CRTCVAL, 0 }, - - /* Crtc */ - { OUT, CRTCREG, 0, CRTCVAL, 0x5f }, - { OUT, CRTCREG, 1, CRTCVAL, 0x4f }, - { OUT, CRTCREG, 2, CRTCVAL, 0x50 }, - { OUT, CRTCREG, 3, CRTCVAL, 0x82 }, - { OUT, CRTCREG, 4, CRTCVAL, 0x54 }, - { OUT, CRTCREG, 5, CRTCVAL, 0x80 }, - { OUT, CRTCREG, 6, CRTCVAL, 0x0b }, - { OUT, CRTCREG, 7, CRTCVAL, 0x3e }, - { OUT, CRTCREG, 8, CRTCVAL, 0x00 }, - { OUT, CRTCREG, 9, CRTCVAL, 0x40 }, - { OUT, CRTCREG, 10, CRTCVAL, 0x00 }, - { OUT, CRTCREG, 11, CRTCVAL, 0x00 }, - { OUT, CRTCREG, 12, CRTCVAL, 0x00 }, - { OUT, CRTCREG, 13, CRTCVAL, 0x00 }, - { OUT, CRTCREG, 14, CRTCVAL, 0x00 }, - { OUT, CRTCREG, 15, CRTCVAL, 0x59 }, - { OUT, CRTCREG, 16, CRTCVAL, 0xea }, - { OUT, CRTCREG, 17, CRTCVAL, 0x8c }, - { OUT, CRTCREG, 18, CRTCVAL, 0xdf }, - { OUT, CRTCREG, 19, CRTCVAL, 0x28 }, - { OUT, CRTCREG, 20, CRTCVAL, 0x00 }, - { OUT, CRTCREG, 21, CRTCVAL, 0xe7 }, - { OUT, CRTCREG, 22, CRTCVAL, 0x04 }, - { OUT, CRTCREG, 23, CRTCVAL, 0xe3 }, - { OUT, CRTCREG, 24, CRTCVAL, 0xff }, - - /* Graphics controller */ - { OUT, GENREG2, 0x00, 0, 0 }, - { OUT, GENREG3, 0x01, 0, 0 }, - { OUT, GRREG, 0, GRVAL, 0x00 }, - { OUT, GRREG, 1, GRVAL, 0x00 }, - { OUT, GRREG, 2, GRVAL, 0x00 }, - { OUT, GRREG, 3, GRVAL, 0x00 }, - { OUT, GRREG, 4, GRVAL, 0x00 }, - { OUT, GRREG, 5, GRVAL, 0x00 }, - { OUT, GRREG, 6, GRVAL, 0x05 }, - { OUT, GRREG, 7, GRVAL, 0x0f }, - { OUT, GRREG, 8, GRVAL, 0xff }, - - /* Reset attribute flip/flop */ - { IN, ATTRREG, 0, 0, 0 }, - - /* Palette */ - { OUT, PALREG, 0, PALREG, 0x00 }, - { OUT, PALREG, 1, PALREG, 0x01 }, - { OUT, PALREG, 2, PALREG, 0x02 }, - { OUT, PALREG, 3, PALREG, 0x03 }, - { OUT, PALREG, 4, PALREG, 0x04 }, - { OUT, PALREG, 5, PALREG, 0x05 }, - { OUT, PALREG, 6, PALREG, 0x06 }, - { OUT, PALREG, 7, PALREG, 0x07 }, - { OUT, PALREG, 8, PALREG, 0x38 }, - { OUT, PALREG, 9, PALREG, 0x39 }, - { OUT, PALREG, 10, PALREG, 0x3a }, - { OUT, PALREG, 11, PALREG, 0x3b }, - { OUT, PALREG, 12, PALREG, 0x3c }, - { OUT, PALREG, 13, PALREG, 0x3d }, - { OUT, PALREG, 14, PALREG, 0x3e }, - { OUT, PALREG, 15, PALREG, 0x3f }, - { OUT, PALREG, 16, PALREG, 0x01 }, - { OUT, PALREG, 17, PALREG, 0x00 }, - { OUT, PALREG, 18, PALREG, 0x0f }, - { OUT, PALREG, 19, PALREG, 0x00 }, - - /* Enable palette */ - { OUT, PALREG, 0x20, 0, 0 }, - - /* End of table */ - { DONE, 0, 0, 0, 0 } -}; - -/* VGA 80x25 text (BIOS mode 3). - */ -static REGIO graph_off[] = { - /* Reset attr F/F */ - { IN, ATTRREG, 0, 0, 0 }, - - /* Disable palette */ - { OUT, PALREG, 0, 0, 0 }, - - /* Reset sequencer regs */ - { OUT, SEQREG, 0, SEQVAL, 1 }, - { OUT, SEQREG, 1, SEQVAL, 1 }, - { OUT, SEQREG, 2, SEQVAL, 3 }, - { OUT, SEQREG, 3, SEQVAL, 0 }, - { OUT, SEQREG, 4, SEQVAL, 2 }, - - /* Misc out reg */ - { OUT, GENREG1, 0x63, 0, 0 }, - - /* Sequencer enable */ - { OUT, SEQREG, 0, SEQVAL, 3 }, - - /* Unprotect crtc regs 0-7 */ - { OUT, CRTCREG, 0x11, CRTCVAL, 0 }, - - /* Crtc */ - { OUT, CRTCREG, 0, CRTCVAL, 0x5f }, /* horiz total */ - { OUT, CRTCREG, 1, CRTCVAL, 0x4f }, /* horiz end */ - { OUT, CRTCREG, 2, CRTCVAL, 0x50 }, /* horiz blank */ - { OUT, CRTCREG, 3, CRTCVAL, 0x82 }, /* end blank */ - { OUT, CRTCREG, 4, CRTCVAL, 0x55 }, /* horiz retrace */ - { OUT, CRTCREG, 5, CRTCVAL, 0x81 }, /* end retrace */ - { OUT, CRTCREG, 6, CRTCVAL, 0xbf }, /* vert total */ - { OUT, CRTCREG, 7, CRTCVAL, 0x1f }, /* overflows */ - { OUT, CRTCREG, 8, CRTCVAL, 0x00 }, /* row scan */ - { OUT, CRTCREG, 9, CRTCVAL, 0x4f }, /* max scan line */ - { OUT, CRTCREG, 10, CRTCVAL, 0x00 }, /* cursor start */ - { OUT, CRTCREG, 11, CRTCVAL, 0x0f }, /* cursor end */ - { OUT, CRTCREG, 12, CRTCVAL, 0x0e }, /* start high addr */ - { OUT, CRTCREG, 13, CRTCVAL, 0xb0 }, /* low addr */ - { OUT, CRTCREG, 14, CRTCVAL, 0x16 }, /* cursor high */ - { OUT, CRTCREG, 15, CRTCVAL, 0x30 }, /* cursor low */ - { OUT, CRTCREG, 16, CRTCVAL, 0x9c }, /* vert retrace */ - { OUT, CRTCREG, 17, CRTCVAL, 0x8e }, /* retrace end */ - { OUT, CRTCREG, 18, CRTCVAL, 0x8f }, /* vert end */ - { OUT, CRTCREG, 19, CRTCVAL, 0x28 }, /* offset */ - { OUT, CRTCREG, 20, CRTCVAL, 0x1f }, /* underline */ - { OUT, CRTCREG, 21, CRTCVAL, 0x96 }, /* vert blank */ - { OUT, CRTCREG, 22, CRTCVAL, 0xb9 }, /* end blank */ - { OUT, CRTCREG, 23, CRTCVAL, 0xa3 }, /* crt mode */ - { OUT, CRTCREG, 24, CRTCVAL, 0xff }, /* line compare */ - - /* Graphics controller */ - { OUT, GENREG2, 0x00, 0, 0 }, - { OUT, GENREG3, 0x01, 0, 0 }, - { OUT, GRREG, 0, GRVAL, 0x00 }, - { OUT, GRREG, 1, GRVAL, 0x00 }, - { OUT, GRREG, 2, GRVAL, 0x00 }, - { OUT, GRREG, 3, GRVAL, 0x00 }, - { OUT, GRREG, 4, GRVAL, 0x00 }, - { OUT, GRREG, 5, GRVAL, 0x10 }, - { OUT, GRREG, 6, GRVAL, 0x0e }, - { OUT, GRREG, 7, GRVAL, 0x00 }, - { OUT, GRREG, 8, GRVAL, 0xff }, - - /* Reset attribute flip/flop */ - { IN, ATTRREG, 0, 0, 0 }, - - /* Palette */ - { OUT, PALREG, 0, PALREG, 0x00 }, - { OUT, PALREG, 1, PALREG, 0x01 }, - { OUT, PALREG, 2, PALREG, 0x02 }, - { OUT, PALREG, 3, PALREG, 0x03 }, - { OUT, PALREG, 4, PALREG, 0x04 }, - { OUT, PALREG, 5, PALREG, 0x05 }, - { OUT, PALREG, 6, PALREG, 0x06 }, - { OUT, PALREG, 7, PALREG, 0x07 }, - { OUT, PALREG, 8, PALREG, 0x10 }, - { OUT, PALREG, 9, PALREG, 0x11 }, - { OUT, PALREG, 10, PALREG, 0x12 }, - { OUT, PALREG, 11, PALREG, 0x13 }, - { OUT, PALREG, 12, PALREG, 0x14 }, - { OUT, PALREG, 13, PALREG, 0x15 }, - { OUT, PALREG, 14, PALREG, 0x16 }, - { OUT, PALREG, 15, PALREG, 0x17 }, - { OUT, PALREG, 16, PALREG, 0x08 }, - { OUT, PALREG, 17, PALREG, 0x00 }, - { OUT, PALREG, 18, PALREG, 0x0f }, - { OUT, PALREG, 19, PALREG, 0x00 }, - - /* Enable palette */ - { OUT, PALREG, 0x20, 0, 0 }, - - /* End of table */ - { DONE, 0, 0, 0, 0 } -}; - -#endif - -#if EGA_STANDARD - -/* EGA 640x350 16-color graphics (BIOS mode 0x10). - */ -static REGIO graphics_on[] = { - /* Reset attr F/F */ - IN, ATTRREG, 0, 0, 0, - - /* Disable palette */ - OUT, PALREG, 0, 0, 0, - - /* Reset sequencer regs */ - OUT, SEQREG, 0, SEQVAL, 0, - OUT, SEQREG, 1, SEQVAL, 1, - OUT, SEQREG, 2, SEQVAL, 0x0f, - OUT, SEQREG, 3, SEQVAL, 0, - OUT, SEQREG, 4, SEQVAL, 6, - - /* Misc out reg */ - OUT, GENREG1, 0xa7, 0, 0, - - /* Sequencer enable */ - OUT, SEQREG, 0, SEQVAL, 0x03, - - /* Unprotect crtc regs 0-7 */ - OUT, CRTCREG, 0x11, CRTCVAL, 0, - - /* Crtc */ - OUT, CRTCREG, 0, CRTCVAL, 0x5b, - OUT, CRTCREG, 1, CRTCVAL, 0x4f, - OUT, CRTCREG, 2, CRTCVAL, 0x53, - OUT, CRTCREG, 3, CRTCVAL, 0x37, - OUT, CRTCREG, 4, CRTCVAL, 0x52, - OUT, CRTCREG, 5, CRTCVAL, 0x00, - OUT, CRTCREG, 6, CRTCVAL, 0x6c, - OUT, CRTCREG, 7, CRTCVAL, 0x1f, - OUT, CRTCREG, 8, CRTCVAL, 0x00, - OUT, CRTCREG, 9, CRTCVAL, 0x00, - OUT, CRTCREG, 10, CRTCVAL, 0x00, - OUT, CRTCREG, 11, CRTCVAL, 0x00, - OUT, CRTCREG, 12, CRTCVAL, 0x00, - OUT, CRTCREG, 13, CRTCVAL, 0x00, - OUT, CRTCREG, 14, CRTCVAL, 0x00, - OUT, CRTCREG, 15, CRTCVAL, 0x00, - OUT, CRTCREG, 16, CRTCVAL, 0x5e, - OUT, CRTCREG, 17, CRTCVAL, 0x2b, - OUT, CRTCREG, 18, CRTCVAL, 0x5d, - OUT, CRTCREG, 19, CRTCVAL, 0x28, - OUT, CRTCREG, 20, CRTCVAL, 0x0f, - OUT, CRTCREG, 21, CRTCVAL, 0x5f, - OUT, CRTCREG, 22, CRTCVAL, 0x0a, - OUT, CRTCREG, 23, CRTCVAL, 0xe3, - OUT, CRTCREG, 24, CRTCVAL, 0xff, - - /* Graphics controller */ - OUT, GENREG2, 0x00, 0, 0, - OUT, GENREG3, 0x01, 0, 0, - OUT, GRREG, 0, GRVAL, 0x00, - OUT, GRREG, 1, GRVAL, 0x00, - OUT, GRREG, 2, GRVAL, 0x00, - OUT, GRREG, 3, GRVAL, 0x00, - OUT, GRREG, 4, GRVAL, 0x00, - OUT, GRREG, 5, GRVAL, 0x00, - OUT, GRREG, 6, GRVAL, 0x05, - OUT, GRREG, 7, GRVAL, 0x0f, - OUT, GRREG, 8, GRVAL, 0xff, - - /* Reset attribute flip/flop */ - IN, ATTRREG, 0, 0, 0, - - /* Palette */ - OUT, PALREG, 0, PALREG, 0x00, - OUT, PALREG, 1, PALREG, 0x01, - OUT, PALREG, 2, PALREG, 0x02, - OUT, PALREG, 3, PALREG, 0x03, - OUT, PALREG, 4, PALREG, 0x04, - OUT, PALREG, 5, PALREG, 0x05, - OUT, PALREG, 6, PALREG, 0x06, - OUT, PALREG, 7, PALREG, 0x07, - OUT, PALREG, 8, PALREG, 0x38, - OUT, PALREG, 9, PALREG, 0x39, - OUT, PALREG, 10, PALREG, 0x3a, - OUT, PALREG, 11, PALREG, 0x3b, - OUT, PALREG, 12, PALREG, 0x3c, - OUT, PALREG, 13, PALREG, 0x3d, - OUT, PALREG, 14, PALREG, 0x3e, - OUT, PALREG, 15, PALREG, 0x3f, - OUT, PALREG, 16, PALREG, 0x01, - OUT, PALREG, 17, PALREG, 0x00, - OUT, PALREG, 18, PALREG, 0x0f, - OUT, PALREG, 19, PALREG, 0x00, - - /* Enable palette */ - OUT, PALREG, 0x20, 0, 0, - - /* End of table */ - DONE, 0, 0, 0, 0 -}; - -/* EGA 80x25 text (BIOS mode 3). - */ -static REGIO graph_off[] = { - /* Reset attr F/F */ - IN, ATTRREG, 0, 0, 0, - - /* Disable palette */ - OUT, PALREG, 0, 0, 0, - - /* Reset sequencer regs */ - OUT, SEQREG, 0, SEQVAL, 1, - OUT, SEQREG, 1, SEQVAL, 1, - OUT, SEQREG, 2, SEQVAL, 3, - OUT, SEQREG, 3, SEQVAL, 0, - OUT, SEQREG, 4, SEQVAL, 3, - - /* Misc out reg */ - OUT, GENREG1, 0xa7, 0, 0, - - /* Sequencer enable */ - OUT, SEQREG, 0, SEQVAL, 3, - - /* Crtc */ - OUT, CRTCREG, 0, CRTCVAL, 0x5b, /* horiz total */ - OUT, CRTCREG, 1, CRTCVAL, 0x4f, /* horiz end */ - OUT, CRTCREG, 2, CRTCVAL, 0x53, /* horiz blank */ - OUT, CRTCREG, 3, CRTCVAL, 0x37, /* end blank */ - OUT, CRTCREG, 4, CRTCVAL, 0x51, /* horiz retrace */ - OUT, CRTCREG, 5, CRTCVAL, 0x5b, /* end retrace */ - OUT, CRTCREG, 6, CRTCVAL, 0x6c, /* vert total */ - OUT, CRTCREG, 7, CRTCVAL, 0x1f, /* overflows */ - OUT, CRTCREG, 8, CRTCVAL, 0x00, /* row scan */ - OUT, CRTCREG, 9, CRTCVAL, 0x0d, /* max scan line */ - OUT, CRTCREG, 10, CRTCVAL, 0x00, /* cursor start */ - OUT, CRTCREG, 11, CRTCVAL, 0x0f, /* cursor end */ - OUT, CRTCREG, 12, CRTCVAL, 0x00, /* start high addr */ - OUT, CRTCREG, 13, CRTCVAL, 0x00, /* low addr */ - OUT, CRTCREG, 14, CRTCVAL, 0x00, /* cursor high */ - OUT, CRTCREG, 15, CRTCVAL, 0x00, /* cursor low */ - OUT, CRTCREG, 16, CRTCVAL, 0x5e, /* vert retrace */ - OUT, CRTCREG, 17, CRTCVAL, 0x2b, /* retrace end */ - OUT, CRTCREG, 18, CRTCVAL, 0x5d, /* vert end */ - OUT, CRTCREG, 19, CRTCVAL, 0x28, /* offset */ - OUT, CRTCREG, 20, CRTCVAL, 0x0f, /* underline */ - OUT, CRTCREG, 21, CRTCVAL, 0x5e, /* vert blank */ - OUT, CRTCREG, 22, CRTCVAL, 0x0a, /* end blank */ - OUT, CRTCREG, 23, CRTCVAL, 0xa3, /* crt mode */ - OUT, CRTCREG, 24, CRTCVAL, 0xff, /* line compare */ - - /* Graphics controller */ - OUT, GENREG2, 0x00, 0, 0, - OUT, GENREG3, 0x01, 0, 0, - OUT, GRREG, 0, GRVAL, 0x00, - OUT, GRREG, 1, GRVAL, 0x00, - OUT, GRREG, 2, GRVAL, 0x00, - OUT, GRREG, 3, GRVAL, 0x00, - OUT, GRREG, 4, GRVAL, 0x00, - OUT, GRREG, 5, GRVAL, 0x10, - OUT, GRREG, 6, GRVAL, 0x0e, - OUT, GRREG, 7, GRVAL, 0x00, - OUT, GRREG, 8, GRVAL, 0xff, - - /* Reset attribute flip/flop */ - IN, ATTRREG, 0, 0, 0, - - /* Palette */ - OUT, PALREG, 0, PALREG, 0x00, - OUT, PALREG, 1, PALREG, 0x01, - OUT, PALREG, 2, PALREG, 0x02, - OUT, PALREG, 3, PALREG, 0x03, - OUT, PALREG, 4, PALREG, 0x04, - OUT, PALREG, 5, PALREG, 0x05, - OUT, PALREG, 6, PALREG, 0x14, - OUT, PALREG, 7, PALREG, 0x07, - OUT, PALREG, 8, PALREG, 0x38, - OUT, PALREG, 9, PALREG, 0x39, - OUT, PALREG, 10, PALREG, 0x3a, - OUT, PALREG, 11, PALREG, 0x3b, - OUT, PALREG, 12, PALREG, 0x3c, - OUT, PALREG, 13, PALREG, 0x3d, - OUT, PALREG, 14, PALREG, 0x3e, - OUT, PALREG, 15, PALREG, 0x3f, - OUT, PALREG, 16, PALREG, 0x08, - OUT, PALREG, 17, PALREG, 0x00, - OUT, PALREG, 18, PALREG, 0x0f, - OUT, PALREG, 19, PALREG, 0x00, - - /* Enable palette */ - OUT, PALREG, 0x20, 0, 0, - - /* End of table */ - DONE, 0, 0, 0, 0 -}; - -#endif diff --git a/c/src/lib/libbsp/i386/pc386/console/videoAsm.S b/c/src/lib/libbsp/i386/pc386/console/videoAsm.S deleted file mode 100644 index 03f31f879b..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/videoAsm.S +++ /dev/null @@ -1,48 +0,0 @@ -/* - * videoAsm.S - This file contains code for displaying cursor on the console - * - * Copyright (C) 1998 valette@crf.canon.fr - * - * This code is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This code is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - - .file "videoAsm.s" - -#include - - .text - .align 4 - .globl wr_cursor /* Move cursor position */ - -/* - * void wr_cursor(newPosition, ioBaseAddr) - */ - -wr_cursor: pushl %ecx - movl 8(%esp), %ecx /* Get new cursor position */ - movb $CC_CURSHIGH, %al /* Cursor high location */ - movl 12(%esp), %edx /* Get IO base address */ - outb (%dx) - incw %dx /* Program Data register */ - movb %ch, %al - outb (%dx) /* Update high location cursor */ - decw %dx /* Program Index Register */ - movb $CC_CURSLOW, %al /* Cursor low location */ - outb (%dx) - incw %dx /* Program Data Register */ - movb %cl, %al - outb (%dx) /* Update low location cursor */ - popl %ecx - ret diff --git a/c/src/lib/libbsp/i386/pc386/console/vt.c b/c/src/lib/libbsp/i386/pc386/console/vt.c deleted file mode 100644 index 022cb5d461..0000000000 --- a/c/src/lib/libbsp/i386/pc386/console/vt.c +++ /dev/null @@ -1,348 +0,0 @@ -/* - * linux/drivers/char/vt.c - * - * Copyright (C) 1992 obz under the linux copyright - * - * Dynamic diacritical handling - aeb@cwi.nl - Dec 1993 - * Dynamic keymap and string allocation - aeb@cwi.nl - May 1994 - * Restrict VT switching via ioctl() - grif@cs.ucr.edu - Dec 1995 - * Some code moved for less code duplication - Andi Kleen - Mar 1997 - * - * - * by: Rosimildo da Silva -- - * Ported to RTEMS to provide the basic interface to the console - * driver. Removed all stuff not required, such as VT_, Fonts, etc. - */ - -#include /* memcpy */ -#include -#include - -#include -#include -#include -#include -#include - -/* - * Console (vt and kd) routines, as defined by USL SVR4 manual, and by - * experimentation and study of X386 SYSV handling. - * - * One point of difference: SYSV vt's are /dev/vtX, which X >= 0, and - * /dev/console is a separate ttyp. Under Linux, /dev/tty0 is /dev/console, - * and the vc start at /dev/ttyX, X >= 1. We maintain that here, so we will - * always treat our set of vt as numbered 1..MAX_NR_CONSOLES (corresponding to - * ttys 0..MAX_NR_CONSOLES-1). Explicitly naming VT 0 is illegal, but using - * /dev/tty0 (fg_console) as a target is legal, since an implicit aliasing - * to the current console is done by the main ioctl code. - */ - -struct vt_struct *vt_cons[MAX_NR_CONSOLES]; - -/* Keyboard type: Default is KB_101, but can be set by machine - * specific code. - */ -unsigned char keyboard_type = KB_101; - -/* - * Generates sound of some frequency for some number of clock ticks - * - * If freq is 0, will turn off sound, else will turn it on for that time. - * If msec is 0, will return immediately, else will sleep for msec time, then - * turn sound off. - * - * We also return immediately, which is what was implied within the X - * comments - KDMKTONE doesn't put the process to sleep. - */ - -#if defined(__i386__) || defined(__alpha__) || defined(__powerpc__) \ - || (defined(__mips__) && !defined(CONFIG_SGI)) - -static void -kd_nosound(unsigned long ignored) -{ - /* disable counter 2 */ - outb(inb_p(0x61)&0xFC, 0x61); - return; -} - -static void -_kd_mksound(unsigned int hz, unsigned int ticks) -{ - unsigned int count = 0; - rtems_interrupt_lock_context lock_context; - - if (hz > 20 && hz < 32767) - count = 1193180 / hz; - - rtems_interrupt_lock_acquire(&rtems_i386_i8254_access_lock, &lock_context); -/* del_timer(&sound_timer); */ - if (count) { - /* enable counter 2 */ - outb_p(inb_p(0x61)|3, 0x61); - /* set command for counter 2, 2 byte write */ - outb_p(0xB6, TIMER_MODE); - /* select desired HZ */ - outb_p(count & 0xff, TIMER_CNTR2); - outb((count >> 8) & 0xff, TIMER_CNTR2); - -/* - if (ticks) { - sound_timer.expires = jiffies+ticks; - add_timer(&sound_timer); - } -*/ - } else - kd_nosound(0); - - rtems_interrupt_lock_release(&rtems_i386_i8254_access_lock, &lock_context); - return; -} - -#else - -void -_kd_mksound(unsigned int hz, unsigned int ticks) -{ -} - -#endif - -void (*kd_mksound)(unsigned int hz, unsigned int ticks) = _kd_mksound; - -#define i (tmp.kb_index) -#define s (tmp.kb_table) -#define v (tmp.kb_value) -static inline int -do_kdsk_ioctl(int cmd, struct kbentry *user_kbe, int perm, struct kbd_struct *kbd) -{ - struct kbentry tmp; - ushort *key_map, val; - - tmp = *user_kbe; - if (i >= NR_KEYS) /* s cannot be >= MAX_NR_KEYMAPS */ - return -EINVAL; - - switch (cmd) { - case KDGKBENT: - key_map = key_maps[s]; - if (key_map) { - val = U(key_map[i]); - if (kbd->kbdmode != VC_UNICODE && KTYP(val) >= NR_TYPES) - val = K_HOLE; - } else - val = (i ? K_HOLE : K_NOSUCHMAP); - user_kbe->kb_value = val; - return 0; - - case KDSKBENT: - return -EINVAL; - } - return 0; -} -#undef i -#undef s -#undef v - -#define HZ 100 - -static inline int -do_kbkeycode_ioctl(int cmd, struct kbkeycode *user_kbkc, int perm) -{ - struct kbkeycode tmp; - int kc = 0; - - tmp = *user_kbkc; - switch (cmd) { - case KDGETKEYCODE: - kc = getkeycode(tmp.scancode); - if (kc >= 0) - user_kbkc->keycode = kc; - break; - case KDSETKEYCODE: - if (!perm) - return -EPERM; - kc = setkeycode(tmp.scancode, tmp.keycode); - break; - } - return kc; -} - -static inline int -do_kdgkb_ioctl(int cmd, struct kbsentry *user_kdgkb, int perm) -{ - return -EINVAL; -} - -/* - * We handle the console-specific ioctl's here. We allow the - * capability to modify any console, not just the fg_console. - */ -int vt_ioctl( unsigned int cmd, unsigned long arg) -{ - int perm; - unsigned int console; - unsigned char ucval; - struct kbd_struct * kbd; - - console = 0; - /* - * To have permissions to do most of the vt ioctls, we either have - * to be the owner of the tty, or super-user. - */ - perm = 1; - kbd = kbd_table + console; - switch (cmd) { - case KIOCSOUND: - if (!perm) - return -EPERM; - if (arg) - arg = 1193180 / arg; - kd_mksound(arg, 0); - return 0; - - case KDMKTONE: - if (!perm) - return -EPERM; - { - unsigned int ticks, count; - - /* - * Generate the tone for the appropriate number of ticks. - * If the time is zero, turn off sound ourselves. - */ - ticks = HZ * ((arg >> 16) & 0xffff) / 1000; - count = ticks ? (arg & 0xffff) : 0; - if (count) - count = 1193180 / count; - kd_mksound(count, ticks); - return 0; - } - - case KDGKBTYPE: - /* - * this is naive. - */ - ucval = keyboard_type; - goto setchar; - - case KDSETMODE: - case KDGETMODE: - return -EINVAL; - - case KDSKBMODE: - if (!perm) - return -EPERM; - switch(arg) { - case K_RAW: - kbd->kbdmode = VC_RAW; - break; - case K_MEDIUMRAW: - kbd->kbdmode = VC_MEDIUMRAW; - break; - case K_XLATE: - kbd->kbdmode = VC_XLATE; - compute_shiftstate(); - break; - case K_UNICODE: - kbd->kbdmode = VC_UNICODE; - compute_shiftstate(); - break; - default: - return -EINVAL; - } - return 0; - - case KDGKBMODE: - ucval = ((kbd->kbdmode == VC_RAW) ? K_RAW : - (kbd->kbdmode == VC_MEDIUMRAW) ? K_MEDIUMRAW : - (kbd->kbdmode == VC_UNICODE) ? K_UNICODE : - K_XLATE); - goto setint; - - /* this could be folded into KDSKBMODE, but for compatibility - reasons it is not so easy to fold KDGKBMETA into KDGKBMODE */ - case KDSKBMETA: - switch(arg) { - case K_METABIT: - clr_vc_kbd_mode(kbd, VC_META); - break; - case K_ESCPREFIX: - set_vc_kbd_mode(kbd, VC_META); - break; - default: - return -EINVAL; - } - return 0; - - case KDGKBMETA: - ucval = (vc_kbd_mode(kbd, VC_META) ? K_ESCPREFIX : K_METABIT); - setint: - *(int *)arg = ucval; - return 0; - - case KDGETKEYCODE: - case KDSETKEYCODE: - return do_kbkeycode_ioctl(cmd, (struct kbkeycode *)arg, perm); - - case KDGKBENT: - case KDSKBENT: - return do_kdsk_ioctl(cmd, (struct kbentry *)arg, perm, kbd); - - case KDGKBDIACR: - { - struct kbdiacrs *a = (struct kbdiacrs *)arg; - a->kb_cnt = accent_table_size; - memcpy( a->kbdiacr, accent_table, accent_table_size*sizeof(struct kbdiacr) ); - return 0; - } - - case KDSKBDIACR: - { - struct kbdiacrs *a = (struct kbdiacrs *)arg; - unsigned int ct; - - if (!perm) - return -EPERM; - ct = a->kb_cnt; - if (ct >= MAX_DIACR) - return -EINVAL; - accent_table_size = ct; - memcpy(accent_table, a->kbdiacr, ct*sizeof(struct kbdiacr)); - return 0; - } - - /* the ioctls below read/set the flags usually shown in the leds */ - /* don't use them - they will go away without warning */ - case KDGKBLED: - ucval = kbd->ledflagstate | (kbd->default_ledflagstate << 4); - goto setchar; - - case KDSKBLED: - if (!perm) - return -EPERM; - if (arg & ~0x77) - return -EINVAL; - kbd->ledflagstate = (arg & 7); - kbd->default_ledflagstate = ((arg >> 4) & 7); - set_leds(); - return 0; - - /* the ioctls below only set the lights, not the functions */ - /* for those, see KDGKBLED and KDSKBLED above */ - case KDGETLED: - ucval = getledstate(); - setchar: - *(char*)arg = ucval; - return 0; - - case KDSETLED: - if (!perm) - return -EPERM; - setledstate(kbd, arg); - return 0; - - default: - return -EINVAL; - } -} -- cgit v1.2.3