Author: blueswirl Date: 2009-01-10 12:37:34 +0100 (Sat, 10 Jan 2009) New Revision: 377
Added: openbios-devel/drivers/pc_kbd.c openbios-devel/drivers/pc_serial.c Modified: openbios-devel/arch/sparc64/console.c openbios-devel/arch/sparc64/openbios.c openbios-devel/arch/sparc64/openbios.h openbios-devel/arch/sparc64/tree.fs openbios-devel/arch/x86/openbios.c openbios-devel/config/examples/cross-sparc64_config.xml openbios-devel/config/examples/sparc64_config.xml openbios-devel/drivers/build.xml openbios-devel/drivers/floppy.c openbios-devel/drivers/pci.c openbios-devel/drivers/pci_database.c openbios-devel/drivers/pci_database.h openbios-devel/include/openbios/drivers.h Log: Add EBUS bridge, refactor PC serial and keyboard, generalize floppy
Modified: openbios-devel/arch/sparc64/console.c =================================================================== --- openbios-devel/arch/sparc64/console.c 2009-01-09 21:00:38 UTC (rev 376) +++ openbios-devel/arch/sparc64/console.c 2009-01-10 11:37:34 UTC (rev 377) @@ -17,229 +17,11 @@ #include "boot.h"
/* ****************************************************************** - * serial console functions + * simple polling video/keyboard console functions * ****************************************************************** */
-#define SER_SIZE 8 - -#define RBR(x) x==2?0x2f8:0x3f8 -#define THR(x) x==2?0x2f8:0x3f8 -#define IER(x) x==2?0x2f9:0x3f9 -#define IIR(x) x==2?0x2fa:0x3fa -#define LCR(x) x==2?0x2fb:0x3fb -#define MCR(x) x==2?0x2fc:0x3fc -#define LSR(x) x==2?0x2fd:0x3fd -#define MSR(x) x==2?0x2fe:0x3fe -#define SCR(x) x==2?0x2ff:0x3ff -#define DLL(x) x==2?0x2f8:0x3f8 -#define DLM(x) x==2?0x2f9:0x3f9 - -static int uart_charav(int port) -{ - return ((inb(LSR(port)) & 1) != 0); -} - -static char uart_getchar(int port) -{ - while (!uart_charav(port)); - return ((char) inb(RBR(port)) & 0177); -} - -static void uart_putchar(int port, unsigned char c) -{ - if (c == '\n') - uart_putchar(port, '\r'); - while (!(inb(LSR(port)) & 0x20)); - outb(c, THR(port)); -} - -static void uart_init_line(int port, unsigned long baud) -{ - int i, baudconst; - - switch (baud) { - case 115200: - baudconst = 1; - break; - case 57600: - baudconst = 2; - break; - case 38400: - baudconst = 3; - break; - case 19200: - baudconst = 6; - break; - case 9600: - default: - baudconst = 12; - break; - } - - outb(0x87, LCR(port)); - outb(0x00, DLM(port)); - outb(baudconst, DLL(port)); - outb(0x07, LCR(port)); - outb(0x0f, MCR(port)); - - for (i = 10; i > 0; i--) { - if (inb(LSR(port)) == (unsigned int) 0) - break; - inb(RBR(port)); - } -} - #ifdef CONFIG_DEBUG_CONSOLE -#ifdef CONFIG_DEBUG_CONSOLE_SERIAL - -static void serial_cls(void); -static void serial_putchar(int c); - -int uart_init(int port, unsigned long speed) -{ - uart_init_line(port, speed); - return -1; -} - -static void serial_putchar(int c) -{ - uart_putchar(CONFIG_SERIAL_PORT, (unsigned char) (c & 0xff)); -} - -static void serial_cls(void) -{ - serial_putchar(27); - serial_putchar('['); - serial_putchar('H'); - serial_putchar(27); - serial_putchar('['); - serial_putchar('J'); -} - -#endif - /* ****************************************************************** - * simple polling video/keyboard console functions - * ****************************************************************** */ - -/* - * keyboard driver - */ - -static const char normal[] = { - 0x0, 0x1b, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', - '=', '\b', '\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', - 'p', '[', ']', 0xa, 0x0, 'a', 's', 'd', 'f', 'g', 'h', 'j', - 'k', 'l', ';', 0x27, 0x60, 0x0, 0x5c, 'z', 'x', 'c', 'v', 'b', - 'n', 'm', ',', '.', '/', 0x0, '*', 0x0, ' ', 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, '0', 0x7f -}; - -static const char shifted[] = { - 0x0, 0x1b, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', - '+', '\b', '\t', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', - 'P', '{', '}', 0xa, 0x0, 'A', 'S', 'D', 'F', 'G', 'H', 'J', - 'K', 'L', ':', 0x22, '~', 0x0, '|', 'Z', 'X', 'C', 'V', 'B', - 'N', 'M', '<', '>', '?', 0x0, '*', 0x0, ' ', 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, '7', '8', - '9', 0x0, '4', '5', '6', 0x0, '1', '2', '3', '0', 0x7f -}; - -static int key_ext; -static int key_lshift = 0, key_rshift = 0, key_caps = 0; - -static char last_key; - -static void keyboard_cmd(unsigned char cmd, unsigned char val) -{ - outb(cmd, 0x60); - /* wait until keyboard controller accepts cmds: */ - while (inb(0x64) & 2); - outb(val, 0x60); - while (inb(0x64) & 2); -} - -static void keyboard_controller_cmd(unsigned char cmd, unsigned char val) -{ - outb(cmd, 0x64); - /* wait until keyboard controller accepts cmds: */ - while (inb(0x64) & 2); - outb(val, 0x60); - while (inb(0x64) & 2); -} - -static char keyboard_poll(void) -{ - unsigned int c; - if (inb(0x64) & 1) { - c = inb(0x60); - switch (c) { - case 0xe0: - key_ext = 1; - return 0; - case 0x2a: - key_lshift = 1; - return 0; - case 0x36: - key_rshift = 1; - return 0; - case 0xaa: - key_lshift = 0; - return 0; - case 0xb6: - key_rshift = 0; - return 0; - case 0x3a: - if (key_caps) { - key_caps = 0; - keyboard_cmd(0xed, 0); - } else { - key_caps = 1; - keyboard_cmd(0xed, 4); /* set caps led */ - } - return 0; - } - - if (key_ext) { - // void printk(const char *format, ...); - printk("extended keycode: %x\n", c); - - key_ext = 0; - return 0; - } - - if (c & 0x80) /* unhandled key release */ - return 0; - - if (key_lshift || key_rshift) - return key_caps ? normal[c] : shifted[c]; - else - return key_caps ? shifted[c] : normal[c]; - } - return 0; -} - -static int keyboard_dataready(void) -{ - if (last_key) - return 1; - - last_key = keyboard_poll(); - - return (last_key != 0); -} - -static unsigned char keyboard_readdata(void) -{ - char tmp; - while (!keyboard_dataready()); - tmp = last_key; - last_key = 0; - return tmp; -} - -/* ****************************************************************** * common functions, implementing simple concurrent console * ****************************************************************** */
@@ -258,7 +40,7 @@ return 1; #endif #ifdef CONFIG_DEBUG_CONSOLE_VGA - if (keyboard_dataready()) + if (pc_kbd_dataready()) return 1; #endif return 0; @@ -271,8 +53,8 @@ return (uart_getchar(CONFIG_SERIAL_PORT)); #endif #ifdef CONFIG_DEBUG_CONSOLE_VGA - if (keyboard_dataready()) - return (keyboard_readdata()); + if (pc_kbd_dataready()) + return (pc_kbd_readdata()); #endif return 0; } @@ -280,153 +62,13 @@ void cls(void) { #ifdef CONFIG_DEBUG_CONSOLE_SERIAL - serial_cls(); + serial_putchar(27); + serial_putchar('['); + serial_putchar('H'); + serial_putchar(27); + serial_putchar('['); + serial_putchar('J'); #endif }
#endif // CONFIG_DEBUG_CONSOLE - -/* ( addr len -- actual ) */ -static void -su_read(unsigned long *address) -{ - char *addr; - int len; - - len = POP(); - addr = (char *)POP(); - - if (len != 1) - printk("su_read: bad len, addr %lx len %x\n", (unsigned long)addr, len); - - if (uart_charav(*address)) { - *addr = (char)uart_getchar(*address); - PUSH(1); - } else { - PUSH(0); - } -} - -/* ( addr len -- actual ) */ -static void -su_read_keyboard(void) -{ - unsigned char *addr; - int len; - - len = POP(); - addr = (unsigned char *)POP(); - - if (len != 1) - printk("su_read: bad len, addr %lx len %x\n", (unsigned long)addr, len); - - if (keyboard_dataready()) { - *addr = keyboard_readdata(); - PUSH(1); - } else { - PUSH(0); - } -} - -/* ( addr len -- actual ) */ -static void -su_write(unsigned long *address) -{ - unsigned char *addr; - int i, len; - - len = POP(); - addr = (unsigned char *)POP(); - - for (i = 0; i < len; i++) { - uart_putchar(*address, addr[i]); - } - PUSH(len); -} - -static void -su_close(void) -{ -} - -static void -su_open(unsigned long *address) -{ - int len; - phandle_t ph; - unsigned long *prop; - char *args; - - fword("my-self"); - fword("ihandle>phandle"); - ph = (phandle_t)POP(); - prop = (unsigned long *)get_property(ph, "address", &len); - *address = *prop; - fword("my-args"); - args = pop_fstr_copy(); - - RET ( -1 ); -} - -DECLARE_UNNAMED_NODE(su, INSTALL_OPEN, sizeof(unsigned long)); - -NODE_METHODS(su) = { - { "open", su_open }, - { "close", su_close }, - { "read", su_read }, - { "write", su_write }, -}; - -DECLARE_UNNAMED_NODE(su_keyboard, INSTALL_OPEN, sizeof(unsigned long)); - -NODE_METHODS(su_keyboard) = { - { "open", su_open }, - { "close", su_close }, - { "read", su_read_keyboard }, -}; - -void -ob_su_init(uint64_t base, uint64_t offset, int intr) -{ - push_str("/pci/isa"); - fword("find-device"); - fword("new-device"); - - push_str("su"); - fword("device-name"); - - push_str("serial"); - fword("device-type"); - - PUSH((base + offset) >> 32); - fword("encode-int"); - PUSH((base + offset) & 0xffffffff); - fword("encode-int"); - fword("encode+"); - PUSH(SER_SIZE); - fword("encode-int"); - fword("encode+"); - push_str("reg"); - fword("property"); - - fword("finish-device"); - - REGISTER_NODE_METHODS(su, "/pci/isa/su"); - - push_str("/chosen"); - fword("find-device"); - - push_str("/pci/isa/su"); - fword("open-dev"); - fword("encode-int"); - push_str("stdin"); - fword("property"); - - push_str("/pci/isa/su"); - fword("open-dev"); - fword("encode-int"); - push_str("stdout"); - fword("property"); - - keyboard_controller_cmd(0x60, 0x40); // Write mode command, translated mode -}
Modified: openbios-devel/arch/sparc64/openbios.c =================================================================== --- openbios-devel/arch/sparc64/openbios.c 2009-01-09 21:00:38 UTC (rev 376) +++ openbios-devel/arch/sparc64/openbios.c 2009-01-10 11:37:34 UTC (rev 377) @@ -326,6 +326,7 @@ uint64_t ram_size; uint32_t clock_frequency; uint16_t machine_id; + const char *stdin_path, *stdout_path;
nvram_read(0, (char *)&nv_info, sizeof(ohwcfg_v3_t));
@@ -413,9 +414,9 @@ fword("find-device");
if (nv_info.boot_devices[0] == 'c') - bootpath = "/pci/isa/ide0/disk@0,0:a"; + bootpath = "disk:a"; else - bootpath = "/pci/isa/ide1/cdrom@0,0:a"; + bootpath = "cdrom:a"; push_str(bootpath); fword("encode-string"); push_str("bootpath"); @@ -425,6 +426,24 @@ fword("encode-string"); push_str("bootargs"); fword("property"); + + if (fw_cfg_read_i16(FW_CFG_NOGRAPHIC)) { + stdin_path = stdout_path = "/pci/pci/pci/ebus/su"; + } else { + stdin_path = "/pci/pci/pci/ebus/kb_ps2"; + stdout_path = "/pci/pci/pci/QEMU,VGA"; + } + push_str(stdin_path); + fword("open-dev"); + fword("encode-int"); + push_str("stdin"); + fword("property"); + + push_str(stdout_path); + fword("open-dev"); + fword("encode-int"); + push_str("stdout"); + fword("property"); }
void arch_nvram_put(char *data) @@ -466,17 +485,11 @@ modules_init(); // XXX use PCI IDE setup_timers(); - ob_ide_init("/pci/isa", 0x1f0, 0x3f4, 0x170, 0x374); + ob_ide_init("/pci/pci/pci/ebus", 0x1f0, 0x3f4, 0x170, 0x374); #ifdef CONFIG_DRIVER_PCI ob_pci_init(); #endif -#ifdef CONFIG_DRIVER_FLOPPY - ob_floppy_init(); -#endif - nvconf_init(); - ob_su_init(0x1fe02000000ULL, 0x3f8ULL, 0); - device_end();
bind_func("platform-boot", boot );
Modified: openbios-devel/arch/sparc64/openbios.h =================================================================== --- openbios-devel/arch/sparc64/openbios.h 2009-01-09 21:00:38 UTC (rev 376) +++ openbios-devel/arch/sparc64/openbios.h 2009-01-10 11:37:34 UTC (rev 377) @@ -21,7 +21,6 @@
/* console.c */ #ifdef CONFIG_DEBUG_CONSOLE -extern int uart_init(int port, unsigned long speed); extern void video_init(void); #endif
Modified: openbios-devel/arch/sparc64/tree.fs =================================================================== --- openbios-devel/arch/sparc64/tree.fs 2009-01-09 21:00:38 UTC (rev 376) +++ openbios-devel/arch/sparc64/tree.fs 2009-01-10 11:37:34 UTC (rev 377) @@ -32,17 +32,3 @@
" /openprom" find-device " OBP 3.10.24 1999/01/01 01:01" encode-string " version" property - -dev / - -\ simple pci bus node -new-device - " pci" device-name -finish-device - -dev /pci - -\ simple isa bus node -new-device - " isa" device-name -finish-device
Modified: openbios-devel/arch/x86/openbios.c =================================================================== --- openbios-devel/arch/x86/openbios.c 2009-01-09 21:00:38 UTC (rev 376) +++ openbios-devel/arch/x86/openbios.c 2009-01-10 11:37:34 UTC (rev 377) @@ -48,7 +48,7 @@ ob_ide_init("/pci/isa", 0x1f0, 0x3f4, 0x170, 0x374); #endif #ifdef CONFIG_DRIVER_FLOPPY - ob_floppy_init(); + ob_floppy_init("/isa", "floppy0"); #endif #ifdef CONFIG_XBOX init_video(phys_to_virt(0x3C00000), 640, 480, 32, 2560);
Modified: openbios-devel/config/examples/cross-sparc64_config.xml =================================================================== --- openbios-devel/config/examples/cross-sparc64_config.xml 2009-01-09 21:00:38 UTC (rev 376) +++ openbios-devel/config/examples/cross-sparc64_config.xml 2009-01-10 11:37:34 UTC (rev 377) @@ -74,5 +74,8 @@ <option name="CONFIG_DRIVER_FLOPPY" type="boolean" value="true"/> <option name="CONFIG_DEBUG_FLOPPY" type="boolean" value="false"/> <option name="CONFIG_DRIVER_VGA" type="boolean" value="true"/> + <option name="CONFIG_DRIVER_EBUS" type="boolean" value="true"/> + <option name="CONFIG_DRIVER_PC_KBD" type="boolean" value="true"/> + <option name="CONFIG_DRIVER_PC_SERIAL" type="boolean" value="true"/>
</config>
Modified: openbios-devel/config/examples/sparc64_config.xml =================================================================== --- openbios-devel/config/examples/sparc64_config.xml 2009-01-09 21:00:38 UTC (rev 376) +++ openbios-devel/config/examples/sparc64_config.xml 2009-01-10 11:37:34 UTC (rev 377) @@ -74,5 +74,8 @@ <option name="CONFIG_DRIVER_FLOPPY" type="boolean" value="true"/> <option name="CONFIG_DEBUG_FLOPPY" type="boolean" value="false"/> <option name="CONFIG_DRIVER_VGA" type="boolean" value="true"/> + <option name="CONFIG_DRIVER_EBUS" type="boolean" value="true"/> + <option name="CONFIG_DRIVER_PC_KBD" type="boolean" value="true"/> + <option name="CONFIG_DRIVER_PC_SERIAL" type="boolean" value="true"/>
</config>
Modified: openbios-devel/drivers/build.xml =================================================================== --- openbios-devel/drivers/build.xml 2009-01-09 21:00:38 UTC (rev 376) +++ openbios-devel/drivers/build.xml 2009-01-10 11:37:34 UTC (rev 377) @@ -19,6 +19,8 @@ <object source="vga_set_mode.c" condition="DRIVER_VGA"/> <object source="vga_vbe.c" condition="DRIVER_VGA"/> <object source="macio.c" condition="DRIVER_MACIO"/> + <object source="pc_kbd.c" condition="DRIVER_PC_KBD"/> + <object source="pc_serial.c" condition="DRIVER_PC_SERIAL"/> </library>
<dictionary name="openbios" target="forth"> @@ -26,5 +28,5 @@ <object source="sbus.fs" condition="DRIVER_SBUS"/> <object source="esp.fs" condition="DRIVER_ESP"/> </dictionary> - + </build>
Modified: openbios-devel/drivers/floppy.c =================================================================== --- openbios-devel/drivers/floppy.c 2009-01-09 21:00:38 UTC (rev 376) +++ openbios-devel/drivers/floppy.c 2009-01-10 11:37:34 UTC (rev 377) @@ -1112,9 +1112,12 @@ };
-int ob_floppy_init(void) +int ob_floppy_init(const char *path, const char *dev_name) { - REGISTER_NAMED_NODE(ob_floppy, "/isa/floppy0"); + char nodebuff[128]; + + snprintf(nodebuff, sizeof(nodebuff), "%s/%s", path, dev_name); + REGISTER_NAMED_NODE(ob_floppy, nodebuff); floppy_init(); return 0; }
Added: openbios-devel/drivers/pc_kbd.c =================================================================== --- openbios-devel/drivers/pc_kbd.c (rev 0) +++ openbios-devel/drivers/pc_kbd.c 2009-01-10 11:37:34 UTC (rev 377) @@ -0,0 +1,216 @@ +/* + * Copyright (C) 2003, 2004 Stefan Reinauer + * + * See the file "COPYING" for further information about + * the copyright and warranty status of this work. + */ + +#include "openbios/config.h" +#include "openbios/bindings.h" +#include "openbios/kernel.h" +#include "openbios/drivers.h" +#include "libc/vsprintf.h" + +/* ****************************************************************** + * simple polling video/keyboard console functions + * ****************************************************************** */ + +/* + * keyboard driver + */ + +static const char normal[] = { + 0x0, 0x1b, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', + '=', '\b', '\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', + 'p', '[', ']', 0xa, 0x0, 'a', 's', 'd', 'f', 'g', 'h', 'j', + 'k', 'l', ';', 0x27, 0x60, 0x0, 0x5c, 'z', 'x', 'c', 'v', 'b', + 'n', 'm', ',', '.', '/', 0x0, '*', 0x0, ' ', 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, '0', 0x7f +}; + +static const char shifted[] = { + 0x0, 0x1b, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', + '+', '\b', '\t', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', + 'P', '{', '}', 0xa, 0x0, 'A', 'S', 'D', 'F', 'G', 'H', 'J', + 'K', 'L', ':', 0x22, '~', 0x0, '|', 'Z', 'X', 'C', 'V', 'B', + 'N', 'M', '<', '>', '?', 0x0, '*', 0x0, ' ', 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, '7', '8', + '9', 0x0, '4', '5', '6', 0x0, '1', '2', '3', '0', 0x7f +}; + +static int key_ext; +static int key_lshift = 0, key_rshift = 0, key_caps = 0; + +static char last_key; + +static void pc_kbd_cmd(unsigned char cmd, unsigned char val) +{ + outb(cmd, 0x60); + /* wait until keyboard controller accepts cmds: */ + while (inb(0x64) & 2); + outb(val, 0x60); + while (inb(0x64) & 2); +} + +static void pc_kbd_controller_cmd(unsigned char cmd, unsigned char val) +{ + outb(cmd, 0x64); + /* wait until keyboard controller accepts cmds: */ + while (inb(0x64) & 2); + outb(val, 0x60); + while (inb(0x64) & 2); +} + +static char pc_kbd_poll(void) +{ + unsigned int c; + if (inb(0x64) & 1) { + c = inb(0x60); + switch (c) { + case 0xe0: + key_ext = 1; + return 0; + case 0x2a: + key_lshift = 1; + return 0; + case 0x36: + key_rshift = 1; + return 0; + case 0xaa: + key_lshift = 0; + return 0; + case 0xb6: + key_rshift = 0; + return 0; + case 0x3a: + if (key_caps) { + key_caps = 0; + pc_kbd_cmd(0xed, 0); + } else { + key_caps = 1; + pc_kbd_cmd(0xed, 4); /* set caps led */ + } + return 0; + } + + if (key_ext) { + // void printk(const char *format, ...); + printk("extended keycode: %x\n", c); + + key_ext = 0; + return 0; + } + + if (c & 0x80) /* unhandled key release */ + return 0; + + if (key_lshift || key_rshift) + return key_caps ? normal[c] : shifted[c]; + else + return key_caps ? shifted[c] : normal[c]; + } + return 0; +} + +int pc_kbd_dataready(void) +{ + if (last_key) + return 1; + + last_key = pc_kbd_poll(); + + return (last_key != 0); +} + +unsigned char pc_kbd_readdata(void) +{ + char tmp; + while (!pc_kbd_dataready()); + tmp = last_key; + last_key = 0; + return tmp; +} + +/* ( addr len -- actual ) */ +static void +pc_kbd_read(void) +{ + unsigned char *addr; + int len; + + len = POP(); + addr = (unsigned char *)POP(); + + if (len != 1) + printk("pc_kbd_read: bad len, addr %lx len %x\n", (unsigned long)addr, len); + + if (pc_kbd_dataready()) { + *addr = pc_kbd_readdata(); + PUSH(1); + } else { + PUSH(0); + } +} + +static void +pc_kbd_close(void) +{ +} + +static void +pc_kbd_open(unsigned long *address) +{ + int len; + phandle_t ph; + unsigned long *prop; + char *args; + + fword("my-self"); + fword("ihandle>phandle"); + ph = (phandle_t)POP(); + prop = (unsigned long *)get_property(ph, "address", &len); + *address = *prop; + fword("my-args"); + args = pop_fstr_copy(); + + RET ( -1 ); +} + +DECLARE_UNNAMED_NODE(pc_kbd, INSTALL_OPEN, sizeof(unsigned long)); + +NODE_METHODS(pc_kbd) = { + { "open", pc_kbd_open }, + { "close", pc_kbd_close }, + { "read", pc_kbd_read }, +}; + +void +ob_pc_kbd_init(const char *path, const char *dev_name, uint64_t base, + uint64_t offset, int intr) +{ + phandle_t chosen, aliases; + char nodebuff[128]; + + snprintf(nodebuff, sizeof(nodebuff), "%s/%s", path, dev_name); + REGISTER_NAMED_NODE(pc_kbd, nodebuff); + + push_str(nodebuff); + fword("find-device"); + + push_str(dev_name); + fword("device-name"); + + push_str("keyboard"); + fword("device-type"); + + chosen = find_dev("/chosen"); + push_str(nodebuff); + fword("open-dev"); + set_int_property(chosen, "keyboard", POP()); + + aliases = find_dev("/aliases"); + set_property(aliases, "keyboard", nodebuff, strlen(nodebuff) + 1); + + pc_kbd_controller_cmd(0x60, 0x40); // Write mode command, translated mode +}
Added: openbios-devel/drivers/pc_serial.c =================================================================== --- openbios-devel/drivers/pc_serial.c (rev 0) +++ openbios-devel/drivers/pc_serial.c 2009-01-10 11:37:34 UTC (rev 377) @@ -0,0 +1,195 @@ +/* + * Copyright (C) 2003, 2004 Stefan Reinauer + * + * See the file "COPYING" for further information about + * the copyright and warranty status of this work. + */ + +#include "openbios/config.h" +#include "openbios/bindings.h" +#include "openbios/kernel.h" +#include "openbios/drivers.h" +#include "libc/vsprintf.h" + +/* ****************************************************************** + * serial console functions + * ****************************************************************** */ + +#define SER_SIZE 8 + +#define RBR(x) x==2?0x2f8:0x3f8 +#define THR(x) x==2?0x2f8:0x3f8 +#define IER(x) x==2?0x2f9:0x3f9 +#define IIR(x) x==2?0x2fa:0x3fa +#define LCR(x) x==2?0x2fb:0x3fb +#define MCR(x) x==2?0x2fc:0x3fc +#define LSR(x) x==2?0x2fd:0x3fd +#define MSR(x) x==2?0x2fe:0x3fe +#define SCR(x) x==2?0x2ff:0x3ff +#define DLL(x) x==2?0x2f8:0x3f8 +#define DLM(x) x==2?0x2f9:0x3f9 + +int uart_charav(int port) +{ + return ((inb(LSR(port)) & 1) != 0); +} + +char uart_getchar(int port) +{ + while (!uart_charav(port)); + return ((char) inb(RBR(port)) & 0177); +} + +static void uart_putchar(int port, unsigned char c) +{ + if (c == '\n') + uart_putchar(port, '\r'); + while (!(inb(LSR(port)) & 0x20)); + outb(c, THR(port)); +} + +static void uart_init_line(int port, unsigned long baud) +{ + int i, baudconst; + + switch (baud) { + case 115200: + baudconst = 1; + break; + case 57600: + baudconst = 2; + break; + case 38400: + baudconst = 3; + break; + case 19200: + baudconst = 6; + break; + case 9600: + default: + baudconst = 12; + break; + } + + outb(0x87, LCR(port)); + outb(0x00, DLM(port)); + outb(baudconst, DLL(port)); + outb(0x07, LCR(port)); + outb(0x0f, MCR(port)); + + for (i = 10; i > 0; i--) { + if (inb(LSR(port)) == (unsigned int) 0) + break; + inb(RBR(port)); + } +} + +#ifdef CONFIG_DEBUG_CONSOLE_SERIAL +int uart_init(int port, unsigned long speed) +{ + uart_init_line(port, speed); + return -1; +} + +void serial_putchar(int c) +{ + uart_putchar(CONFIG_SERIAL_PORT, (unsigned char) (c & 0xff)); +} +#endif + +/* ( addr len -- actual ) */ +static void +pc_serial_read(unsigned long *address) +{ + char *addr; + int len; + + len = POP(); + addr = (char *)POP(); + + if (len != 1) + printk("pc_serial_read: bad len, addr %lx len %x\n", (unsigned long)addr, len); + + if (uart_charav(*address)) { + *addr = (char)uart_getchar(*address); + PUSH(1); + } else { + PUSH(0); + } +} + +/* ( addr len -- actual ) */ +static void +pc_serial_write(unsigned long *address) +{ + unsigned char *addr; + int i, len; + + len = POP(); + addr = (unsigned char *)POP(); + + for (i = 0; i < len; i++) { + uart_putchar(*address, addr[i]); + } + PUSH(len); +} + +static void +pc_serial_close(void) +{ +} + +static void +pc_serial_open(unsigned long *address) +{ + int len; + phandle_t ph; + unsigned long *prop; + char *args; + + fword("my-self"); + fword("ihandle>phandle"); + ph = (phandle_t)POP(); + prop = (unsigned long *)get_property(ph, "address", &len); + *address = *prop; + fword("my-args"); + args = pop_fstr_copy(); + + RET ( -1 ); +} + +DECLARE_UNNAMED_NODE(pc_serial, INSTALL_OPEN, sizeof(unsigned long)); + +NODE_METHODS(pc_serial) = { + { "open", pc_serial_open }, + { "close", pc_serial_close }, + { "read", pc_serial_read }, + { "write", pc_serial_write }, +}; + +void +ob_pc_serial_init(const char *path, const char *dev_name, uint64_t base, + uint64_t offset, int intr) +{ + char nodebuff[128]; + + snprintf(nodebuff, sizeof(nodebuff), "%s/%s", path, dev_name); + REGISTER_NAMED_NODE(pc_serial, nodebuff); + + push_str(nodebuff); + fword("find-device"); + + push_str("serial"); + fword("device-type"); + + PUSH((base + offset) >> 32); + fword("encode-int"); + PUSH((base + offset) & 0xffffffff); + fword("encode-int"); + fword("encode+"); + PUSH(SER_SIZE); + fword("encode-int"); + fword("encode+"); + push_str("reg"); + fword("property"); +}
Modified: openbios-devel/drivers/pci.c =================================================================== --- openbios-devel/drivers/pci.c 2009-01-09 21:00:38 UTC (rev 376) +++ openbios-devel/drivers/pci.c 2009-01-10 11:37:34 UTC (rev 377) @@ -415,6 +415,24 @@ return 0; }
+int ebus_config_cb(const pci_config_t *config) +{ + printk("ebus config %s addr %x size %x\n", config->path, + config->assigned[0] & ~0x0000000F, config->sizes[0]); +#ifdef CONFIG_DRIVER_EBUS +#ifdef CONFIG_DRIVER_FLOPPY + ob_floppy_init(config->path, "fdthree"); +#endif +#ifdef CONFIG_DRIVER_PC_SERIAL + ob_pc_serial_init(config->path, "su", arch->io_base, 0x3f8ULL, 0); +#endif +#ifdef CONFIG_DRIVER_PC_KBD + ob_pc_kbd_init(config->path, "kb_ps2", arch->io_base, 0x60ULL, 0); +#endif +#endif + return 0; +} + static void ob_pci_add_properties(pci_addr addr, const pci_dev_t *pci_dev, const pci_config_t *config) {
Modified: openbios-devel/drivers/pci_database.c =================================================================== --- openbios-devel/drivers/pci_database.c 2009-01-09 21:00:38 UTC (rev 376) +++ openbios-devel/drivers/pci_database.c 2009-01-10 11:37:34 UTC (rev 377) @@ -312,6 +312,21 @@ }, };
+static const pci_dev_t miscbrg_devices[] = { + { + 0x108e, 0x1000, NULL, + "ebus", "ebus", "pci108e,1000\0pciclass,068000\0", + 3, 2, 1, + ebus_config_cb, NULL, + }, + { + 0xFFFF, 0xFFFF, + NULL, NULL, NULL, NULL, + -1, -1, -1, + NULL, NULL, + }, +}; + static const pci_subclass_t bridg_subclass[] = { { 0x00, "PCI host bridge", NULL, hbrg_devices, NULL, @@ -358,7 +373,7 @@ NULL, NULL, }, { - 0x80, "misc PCI bridge", NULL, NULL, NULL, + 0x80, "misc PCI bridge", NULL, miscbrg_devices, NULL, NULL, NULL, }, {
Modified: openbios-devel/drivers/pci_database.h =================================================================== --- openbios-devel/drivers/pci_database.h 2009-01-09 21:00:38 UTC (rev 376) +++ openbios-devel/drivers/pci_database.h 2009-01-10 11:37:34 UTC (rev 377) @@ -31,6 +31,7 @@ extern int vga_config_cb(const pci_config_t *config); extern int host_config_cb(const pci_config_t *config); extern int bridge_config_cb(const pci_config_t *config); +extern int ebus_config_cb(const pci_config_t *config);
static inline int pci_compat_len(const pci_dev_t *dev) {
Modified: openbios-devel/include/openbios/drivers.h =================================================================== --- openbios-devel/include/openbios/drivers.h 2009-01-09 21:00:38 UTC (rev 376) +++ openbios-devel/include/openbios/drivers.h 2009-01-10 11:37:34 UTC (rev 377) @@ -74,7 +74,21 @@ extern char boot_device; #endif #ifdef CONFIG_DRIVER_FLOPPY -int ob_floppy_init(void); +int ob_floppy_init(const char *path, const char *dev_name); #endif +#ifdef CONFIG_DRIVER_PC_KBD +void ob_pc_kbd_init(const char *path, const char *dev_name, uint64_t base, + uint64_t offset, int intr); +int pc_kbd_dataready(void); +unsigned char pc_kbd_readdata(void); +#endif +#ifdef CONFIG_DRIVER_PC_SERIAL +void ob_pc_serial_init(const char *path, const char *dev_name, uint64_t base, + uint64_t offset, int intr); +int uart_init(int port, unsigned long speed); +int uart_charav(int port); +char uart_getchar(int port); +void serial_putchar(int c); +#endif
#endif /* OPENBIOS_DRIVERS_H */