[OpenBIOS] r377 - in openbios-devel: arch/sparc64 arch/x86 config/examples drivers include/openbios

svn at openbios.org svn at openbios.org
Sat Jan 10 12:37:34 CET 2009


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 at 0,0:a";
+        bootpath = "disk:a";
     else
-        bootpath = "/pci/isa/ide1/cdrom at 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 */




More information about the OpenBIOS mailing list