[OpenBIOS] r391 - in openbios-devel: config/examples drivers include/openbios

svn at openbios.org svn at openbios.org
Mon Jan 12 18:46:19 CET 2009


Author: blueswirl
Date: 2009-01-12 18:46:19 +0100 (Mon, 12 Jan 2009)
New Revision: 391

Added:
   openbios-devel/drivers/escc.c
   openbios-devel/drivers/escc.h
Modified:
   openbios-devel/config/examples/cross-sparc32_config.xml
   openbios-devel/config/examples/sparc32_config.xml
   openbios-devel/drivers/build.xml
   openbios-devel/drivers/obio.c
   openbios-devel/drivers/obio.h
   openbios-devel/include/openbios/drivers.h
Log:
Extract ESCC serial driver

Modified: openbios-devel/config/examples/cross-sparc32_config.xml
===================================================================
--- openbios-devel/config/examples/cross-sparc32_config.xml	2009-01-11 11:49:00 UTC (rev 390)
+++ openbios-devel/config/examples/cross-sparc32_config.xml	2009-01-12 17:46:19 UTC (rev 391)
@@ -74,5 +74,7 @@
   <option name="CONFIG_DRIVER_ESP" type="boolean" value="true"/>
   <option name="CONFIG_DRIVER_FLOPPY" type="boolean" value="true"/>
   <option name="CONFIG_DEBUG_FLOPPY" type="boolean" value="false"/>
+  <option name="CONFIG_DRIVER_ESCC" type="boolean" value="true"/>
+  <option name="CONFIG_DRIVER_ESCC_SUN" type="boolean" value="true"/>
 
 </config>

Modified: openbios-devel/config/examples/sparc32_config.xml
===================================================================
--- openbios-devel/config/examples/sparc32_config.xml	2009-01-11 11:49:00 UTC (rev 390)
+++ openbios-devel/config/examples/sparc32_config.xml	2009-01-12 17:46:19 UTC (rev 391)
@@ -74,5 +74,6 @@
   <option name="CONFIG_DRIVER_ESP" type="boolean" value="true"/>
   <option name="CONFIG_DRIVER_FLOPPY" type="boolean" value="true"/>
   <option name="CONFIG_DEBUG_FLOPPY" type="boolean" value="false"/>
+  <option name="CONFIG_DRIVER_ESCC" type="boolean" value="true"/>
 
 </config>

Modified: openbios-devel/drivers/build.xml
===================================================================
--- openbios-devel/drivers/build.xml	2009-01-11 11:49:00 UTC (rev 390)
+++ openbios-devel/drivers/build.xml	2009-01-12 17:46:19 UTC (rev 391)
@@ -21,6 +21,7 @@
   <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"/>
+  <object source="escc.c" condition="DRIVER_ESCC"/>
  </library>
 
  <dictionary name="openbios" target="forth">

Added: openbios-devel/drivers/escc.c
===================================================================
--- openbios-devel/drivers/escc.c	                        (rev 0)
+++ openbios-devel/drivers/escc.c	2009-01-12 17:46:19 UTC (rev 391)
@@ -0,0 +1,420 @@
+#include "openbios/config.h"
+#include "openbios/bindings.h"
+#include "libc/byteorder.h"
+#include "libc/vsprintf.h"
+#include "openbios/drivers.h"
+#include "ofmem.h"
+
+#include "escc.h"
+
+/* ******************************************************************
+ *                       serial console functions
+ * ****************************************************************** */
+
+static volatile unsigned char *serial_dev;
+
+#define CTRL(addr) (*(volatile unsigned char *)(addr))
+#ifdef CONFIG_DRIVER_ESCC_SUN
+#define DATA(addr) (*(volatile unsigned char *)(addr + 2))
+#else
+#define DATA(addr) (*(volatile unsigned char *)(addr + 16))
+#endif
+
+/* Conversion routines to/from brg time constants from/to bits
+ * per second.
+ */
+#define BRG_TO_BPS(brg, freq) ((freq) / 2 / ((brg) + 2))
+#define BPS_TO_BRG(bps, freq) ((((freq) + (bps)) / (2 * (bps))) - 2)
+
+#ifdef CONFIG_DRIVER_ESCC_SUN
+#define ESCC_CLOCK              4915200 /* Zilog input clock rate. */
+#else
+#define ESCC_CLOCK              3686400
+#endif
+#define ESCC_CLOCK_DIVISOR      16      /* Divisor this driver uses. */
+
+/* Write Register 3 */
+#define RxENAB          0x1     /* Rx Enable */
+#define Rx8             0xc0    /* Rx 8 Bits/Character */
+
+/* Write Register 4 */
+#define SB1             0x4     /* 1 stop bit/char */
+#define X16CLK          0x40    /* x16 clock mode */
+
+/* Write Register 5 */
+#define RTS             0x2     /* RTS */
+#define TxENAB          0x8     /* Tx Enable */
+#define Tx8             0x60    /* Tx 8 bits/character */
+#define DTR             0x80    /* DTR */
+
+/* Write Register 14 (Misc control bits) */
+#define BRENAB  1       /* Baud rate generator enable */
+#define BRSRC   2       /* Baud rate generator source */
+
+/* Read Register 0 */
+#define Rx_CH_AV        0x1     /* Rx Character Available */
+#define Tx_BUF_EMP      0x4     /* Tx Buffer empty */
+
+int uart_charav(int port)
+{
+    return (CTRL(port) & Rx_CH_AV) != 0;
+}
+
+char uart_getchar(int port)
+{
+    while (!uart_charav(port))
+        ;
+    return DATA(port) & 0177;
+}
+
+static void uart_putchar(int port, unsigned char c)
+{
+    if (!serial_dev)
+        return;
+
+    if (c == '\n')
+        uart_putchar(port, '\r');
+    while (!(CTRL(port) & Tx_BUF_EMP))
+        ;
+    DATA(port) = c;
+}
+
+static void uart_init_line(volatile unsigned char *port, unsigned long baud)
+{
+    CTRL(port) = 4; // reg 4
+    CTRL(port) = SB1 | X16CLK; // no parity, async, 1 stop bit, 16x
+                               // clock
+
+    baud = BPS_TO_BRG(baud, ESCC_CLOCK / ESCC_CLOCK_DIVISOR);
+
+    CTRL(port) = 12; // reg 12
+    CTRL(port) = baud & 0xff;
+    CTRL(port) = 13; // reg 13
+    CTRL(port) = (baud >> 8) & 0xff;
+    CTRL(port) = 14; // reg 14
+    CTRL(port) = BRSRC | BRENAB;
+
+    CTRL(port) = 3; // reg 3
+    CTRL(port) = RxENAB | Rx8; // enable rx, 8 bits/char
+
+    CTRL(port) = 5; // reg 5
+    CTRL(port) = RTS | TxENAB | Tx8 | DTR; // enable tx, 8 bits/char,
+                                           // set RTS & DTR
+
+}
+
+int uart_init(uint64_t port, unsigned long speed)
+{
+#ifdef CONFIG_DRIVER_ESCC_SUN
+    serial_dev = map_io(port & ~7ULL, ZS_REGS);
+    serial_dev += port & 7ULL;
+#else
+    serial_dev = (unsigned char *)(unsigned long)port;
+#endif
+    uart_init_line(serial_dev, speed);
+    return -1;
+}
+
+void serial_putchar(int c)
+{
+    uart_putchar((int)(serial_dev + CONFIG_SERIAL_PORT),
+                 (unsigned char) (c & 0xff));
+}
+
+void serial_cls(void)
+{
+    serial_putchar(27);
+    serial_putchar('[');
+    serial_putchar('H');
+    serial_putchar(27);
+    serial_putchar('[');
+    serial_putchar('J');
+}
+
+/* ( addr len -- actual ) */
+static void
+escc_read(unsigned long *address)
+{
+    char *addr;
+    int len;
+
+    len = POP();
+    addr = (char *)POP();
+
+    if (len != 1)
+        printk("escc_read: bad len, addr %x len %x\n", (unsigned int)addr, len);
+
+    if (uart_charav(*address)) {
+        *addr = (char)uart_getchar(*address);
+        PUSH(1);
+    } else {
+        PUSH(0);
+    }
+}
+
+/* ( addr len -- actual ) */
+static void
+escc_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
+escc_close(void)
+{
+}
+
+static void
+escc_open(unsigned long *address)
+{
+    int len;
+    phandle_t ph;
+    unsigned long *prop;
+#ifdef CONFIG_DRIVER_ESCC_SUN
+    char *args;
+#endif
+
+    fword("my-self");
+    fword("ihandle>phandle");
+    ph = (phandle_t)POP();
+    prop = (unsigned long *)get_property(ph, "address", &len);
+    *address = *prop;
+#ifdef CONFIG_DRIVER_ESCC_SUN
+    fword("my-args");
+    args = pop_fstr_copy();
+    if (args) {
+        if (args[0] == 'a')
+            *address += 4;
+        //printk("escc_open: address %lx, args %s\n", *address, args);
+        free(args);
+    }
+#endif
+    RET ( -1 );
+}
+
+DECLARE_UNNAMED_NODE(escc, INSTALL_OPEN, sizeof(unsigned long));
+
+NODE_METHODS(escc) = {
+    { "open",               escc_open              },
+    { "close",              escc_close             },
+    { "read",               escc_read              },
+    { "write",              escc_write             },
+};
+
+#ifdef CONFIG_DRIVER_ESCC_SUN
+static volatile unsigned char *kbd_dev;
+
+void kbd_init(uint64_t base)
+{
+    kbd_dev = map_io(base, 2 * 4);
+    kbd_dev += 4;
+}
+
+static const unsigned char sunkbd_keycode[128] = {
+    0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0,
+    '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 0, 8,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
+    'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']',
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '\\', 13,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/',
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ' ',
+};
+
+static const unsigned char sunkbd_keycode_shifted[128] = {
+    0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0,
+    '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', 0, 8,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
+    'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}',
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', '|', 13,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?',
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ' ',
+};
+
+static int shiftstate;
+
+int
+keyboard_dataready(void)
+{
+    return ((kbd_dev[0] & 1) == 1);
+}
+
+unsigned char
+keyboard_readdata(void)
+{
+    unsigned char ch;
+
+    while (!keyboard_dataready()) { }
+
+    do {
+        ch = kbd_dev[2] & 0xff;
+        if (ch == 99)
+            shiftstate |= 1;
+        else if (ch == 110)
+            shiftstate |= 2;
+        else if (ch == 227)
+            shiftstate &= ~1;
+        else if (ch == 238)
+            shiftstate &= ~2;
+        //printk("getch: %d\n", ch);
+    }
+    while ((ch & 0x80) == 0 || ch == 238 || ch == 227); // Wait for key release
+    //printk("getch rel: %d\n", ch);
+    ch &= 0x7f;
+    if (shiftstate)
+        ch = sunkbd_keycode_shifted[ch];
+    else
+        ch = sunkbd_keycode[ch];
+    //printk("getch xlate: %d\n", ch);
+
+    return ch;
+}
+
+/* ( addr len -- actual ) */
+static void
+escc_read_keyboard(void)
+{
+    unsigned char *addr;
+    int len;
+
+    len = POP();
+    addr = (unsigned char *)POP();
+
+    if (len != 1)
+        printk("escc_read: bad len, addr %x len %x\n", (unsigned int)addr, len);
+
+    if (keyboard_dataready()) {
+        *addr = keyboard_readdata();
+        PUSH(1);
+    } else {
+        PUSH(0);
+    }
+}
+
+DECLARE_UNNAMED_NODE(escc_keyboard, INSTALL_OPEN, sizeof(unsigned long));
+
+NODE_METHODS(escc_keyboard) = {
+    { "open",               escc_open              },
+    { "close",              escc_close             },
+    { "read",               escc_read_keyboard     },
+};
+
+void
+ob_zs_init(uint64_t base, uint64_t offset, int intr, int slave, int keyboard)
+{
+    char nodebuff[256];
+
+    ob_new_obio_device("zs", "serial");
+
+    ob_reg(base, offset, ZS_REGS, 1);
+
+    PUSH(slave);
+    fword("encode-int");
+    push_str("slave");
+    fword("property");
+
+    if (keyboard) {
+        PUSH(-1);
+        fword("encode-int");
+        push_str("keyboard");
+        fword("property");
+
+        PUSH(-1);
+        fword("encode-int");
+        push_str("mouse");
+        fword("property");
+    }
+
+    ob_intr(intr);
+
+    fword("finish-device");
+
+    snprintf(nodebuff, sizeof(nodebuff), "/obio/zs at 0,%x",
+             (int)offset & 0xffffffff);
+    if (keyboard) {
+        REGISTER_NODE_METHODS(escc_keyboard, nodebuff);
+    } else {
+        REGISTER_NODE_METHODS(escc, nodebuff);
+    }
+}
+
+#else
+
+static void
+escc_add_channel(const char *path, const char *node, uint32_t addr,
+                 uint32_t offset)
+{
+    char buf[64];
+    phandle_t dnode;
+
+    push_str(path);
+    fword("find-device");
+    fword("new-device");
+
+    push_str(node);
+    fword("device-name");
+
+    snprintf(buf, sizeof(buf), "%s/%s", path, node);
+
+    REGISTER_NODE_METHODS(escc, buf);
+
+    dnode = find_dev(buf);
+    set_property(dnode, "device_type", "serial",
+                 strlen("serial") + 1);
+    memcpy(buf, node, 5);
+    memcpy(&buf[5], "CHRP,es2", 9);
+    set_property(dnode, "compatible", buf, 5 + 9);
+    fword("finish-device");
+}
+
+void
+escc_init(const char *path, unsigned long addr)
+{
+    char buf[64];
+    int props[2];
+    phandle_t dnode;
+
+    push_str(path);
+    fword("find-device");
+    fword("new-device");
+
+    push_str("escc");
+    fword("device-name");
+
+    snprintf(buf, sizeof(buf), "%s/escc", path);
+
+    dnode = find_dev(buf);
+
+    set_int_property(dnode, "#address-cells", 1);
+    props[0] = __cpu_to_be32(IO_ESCC_OFFSET);
+    props[1] = __cpu_to_be32(IO_ESCC_SIZE);
+    set_property(dnode, "reg", (char *)&props, sizeof(props));
+    set_property(dnode, "device_type", "escc",
+                 strlen("escc") + 1);
+    set_property(dnode, "compatible", "chrp\0CHRP,es0", 14);
+
+    fword("finish-device");
+
+    escc_add_channel(buf, "ch-a", IO_ESCC_OFFSET, 2);
+    escc_add_channel(buf, "ch-b", IO_ESCC_OFFSET, 0);
+
+    /* Reinitialize uart */
+    uart_init(addr + IO_ESCC_OFFSET, CONFIG_SERIAL_SPEED);
+}
+#endif

Added: openbios-devel/drivers/escc.h
===================================================================
--- openbios-devel/drivers/escc.h	                        (rev 0)
+++ openbios-devel/drivers/escc.h	2009-01-12 17:46:19 UTC (rev 391)
@@ -0,0 +1,9 @@
+
+#define IO_ESCC_SIZE    0x00001000
+#define IO_ESCC_OFFSET  0x00013000
+
+#define ZS_REGS         8
+
+void escc_init(const char *path, unsigned long addr);
+void ob_zs_init(uint64_t base, uint64_t offset, int intr, int slave,
+                int keyboard);

Modified: openbios-devel/drivers/obio.c
===================================================================
--- openbios-devel/drivers/obio.c	2009-01-11 11:49:00 UTC (rev 390)
+++ openbios-devel/drivers/obio.c	2009-01-12 17:46:19 UTC (rev 391)
@@ -24,6 +24,7 @@
 #include "openbios/firmware_abi.h"
 #define NO_QEMU_PROTOS
 #include "openbios/fw_cfg.h"
+#include "escc.h"
 
 #define UUID_FMT "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
 
@@ -48,7 +49,7 @@
 /* DECLARE data structures for the nodes.  */
 DECLARE_UNNAMED_NODE( ob_obio, INSTALL_OPEN, sizeof(int) );
 
-static void
+void
 ob_new_obio_device(const char *name, const char *type)
 {
     push_str("/obio");
@@ -96,13 +97,13 @@
     return 0;
 }
 
-static unsigned long
+unsigned long
 ob_reg(uint64_t base, uint64_t offset, unsigned long size, int map)
 {
     return map_reg(base, offset, size, map, 0);
 }
 
-static void
+void
 ob_intr(int intr)
 {
     PUSH(intr);
@@ -114,337 +115,7 @@
     fword("property");
 }
 
-/* ******************************************************************
- *                       serial console functions
- * ****************************************************************** */
-
-static volatile unsigned char *kbd_dev, *serial_dev;
-
-#define CTRL(addr) (*(volatile unsigned char *)(addr))
-#define DATA(addr) (*(volatile unsigned char *)(addr + 2))
-
-/* Conversion routines to/from brg time constants from/to bits
- * per second.
- */
-#define BRG_TO_BPS(brg, freq) ((freq) / 2 / ((brg) + 2))
-#define BPS_TO_BRG(bps, freq) ((((freq) + (bps)) / (2 * (bps))) - 2)
-
-#define ZS_CLOCK		4915200 /* Zilog input clock rate. */
-#define ZS_CLOCK_DIVISOR	16      /* Divisor this driver uses. */
-
-/* Write Register 3 */
-#define	RxENAB  	0x1	/* Rx Enable */
-#define	Rx8		0xc0	/* Rx 8 Bits/Character */
-
-/* Write Register 4 */
-#define	SB1		0x4	/* 1 stop bit/char */
-#define	X16CLK		0x40	/* x16 clock mode */
-
-/* Write Register 5 */
-#define	RTS		0x2	/* RTS */
-#define	TxENAB		0x8	/* Tx Enable */
-#define	Tx8		0x60	/* Tx 8 bits/character */
-#define	DTR		0x80	/* DTR */
-
-/* Write Register 14 (Misc control bits) */
-#define	BRENAB 	1	/* Baud rate generator enable */
-#define	BRSRC	2	/* Baud rate generator source */
-
-/* Read Register 0 */
-#define	Rx_CH_AV	0x1	/* Rx Character Available */
-#define	Tx_BUF_EMP	0x4	/* Tx Buffer empty */
-
-int uart_charav(int port)
-{
-    return (CTRL(port) & Rx_CH_AV) != 0;
-}
-
-char uart_getchar(int port)
-{
-    while (!uart_charav(port))
-        ;
-    return DATA(port) & 0177;
-}
-
-static void uart_putchar(int port, unsigned char c)
-{
-    if (!serial_dev)
-        return;
-
-    if (c == '\n')
-        uart_putchar(port, '\r');
-    while (!(CTRL(port) & Tx_BUF_EMP))
-        ;
-    DATA(port) = c;
-}
-
-static void uart_init_line(volatile unsigned char *port, unsigned long baud)
-{
-    CTRL(port) = 4; // reg 4
-    CTRL(port) = SB1 | X16CLK; // no parity, async, 1 stop bit, 16x
-                               // clock
-
-    baud = BPS_TO_BRG(baud, ZS_CLOCK / ZS_CLOCK_DIVISOR);
-
-    CTRL(port) = 12; // reg 12
-    CTRL(port) = baud & 0xff;
-    CTRL(port) = 13; // reg 13
-    CTRL(port) = (baud >> 8) & 0xff;
-    CTRL(port) = 14; // reg 14
-    CTRL(port) = BRSRC | BRENAB;
-
-    CTRL(port) = 3; // reg 3
-    CTRL(port) = RxENAB | Rx8; // enable rx, 8 bits/char
-
-    CTRL(port) = 5; // reg 5
-    CTRL(port) = RTS | TxENAB | Tx8 | DTR; // enable tx, 8 bits/char,
-                                           // set RTS & DTR
-
-}
-
-int uart_init(uint64_t port, unsigned long speed)
-{
-    serial_dev = map_io(port & ~7ULL, 2 * 4);
-    serial_dev += port & 7ULL;
-    uart_init_line(serial_dev, speed);
-
-    return -1;
-}
-
-void serial_putchar(int c)
-{
-    uart_putchar((int)(serial_dev + CONFIG_SERIAL_PORT),
-                 (unsigned char) (c & 0xff));
-}
-
-void serial_cls(void)
-{
-    serial_putchar(27);
-    serial_putchar('[');
-    serial_putchar('H');
-    serial_putchar(27);
-    serial_putchar('[');
-    serial_putchar('J');
-}
-
-/* ( addr len -- actual ) */
 static void
-zs_read(unsigned long *address)
-{
-    char *addr;
-    int len;
-
-    len = POP();
-    addr = (char *)POP();
-
-    if (len != 1)
-        printk("zs_read: bad len, addr %x len %x\n", (unsigned int)addr, len);
-
-    if (uart_charav(*address)) {
-        *addr = (char)uart_getchar(*address);
-        PUSH(1);
-    } else {
-        PUSH(0);
-    }
-}
-
-void kbd_init(uint64_t base)
-{
-    kbd_dev = map_io(base, 2 * 4);
-    kbd_dev += 4;
-}
-
-static const unsigned char sunkbd_keycode[128] = {
-    0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0,
-    '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 0, 8,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
-    'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']',
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '\\', 13,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/',
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    ' ',
-};
-
-static const unsigned char sunkbd_keycode_shifted[128] = {
-    0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0,
-    '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', 0, 8,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
-    'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}',
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', '|', 13,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?',
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    ' ',
-};
-
-static int shiftstate;
-
-int
-keyboard_dataready(void)
-{
-    return ((kbd_dev[0] & 1) == 1);
-}
-
-unsigned char
-keyboard_readdata(void)
-{
-    unsigned char ch;
-
-    while (!keyboard_dataready()) { }
-
-    do {
-        ch = kbd_dev[2] & 0xff;
-        if (ch == 99)
-            shiftstate |= 1;
-        else if (ch == 110)
-            shiftstate |= 2;
-        else if (ch == 227)
-            shiftstate &= ~1;
-        else if (ch == 238)
-            shiftstate &= ~2;
-        //printk("getch: %d\n", ch);
-    }
-    while ((ch & 0x80) == 0 || ch == 238 || ch == 227); // Wait for key release
-    //printk("getch rel: %d\n", ch);
-    ch &= 0x7f;
-    if (shiftstate)
-        ch = sunkbd_keycode_shifted[ch];
-    else
-        ch = sunkbd_keycode[ch];
-    //printk("getch xlate: %d\n", ch);
-
-    return ch;
-}
-
-/* ( addr len -- actual ) */
-static void
-zs_read_keyboard(void)
-{
-    unsigned char *addr;
-    int len;
-
-    len = POP();
-    addr = (unsigned char *)POP();
-
-    if (len != 1)
-        printk("zs_read: bad len, addr %x len %x\n", (unsigned int)addr, len);
-
-    if (keyboard_dataready()) {
-        *addr = keyboard_readdata();
-        PUSH(1);
-    } else {
-        PUSH(0);
-    }
-}
-
-/* ( addr len -- actual ) */
-static void
-zs_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
-zs_close(void)
-{
-}
-
-static void
-zs_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();
-    if (args) {
-        if (args[0] == 'a')
-            *address += 4;
-        //printk("zs_open: address %lx, args %s\n", *address, args);
-        free(args);
-    }
-
-    RET ( -1 );
-}
-
-DECLARE_UNNAMED_NODE(zs, INSTALL_OPEN, sizeof(unsigned long));
-
-NODE_METHODS(zs) = {
-	{ "open",               zs_open              },
-	{ "close",              zs_close             },
-	{ "read",               zs_read              },
-	{ "write",              zs_write             },
-};
-
-DECLARE_UNNAMED_NODE(zs_keyboard, INSTALL_OPEN, sizeof(unsigned long));
-
-NODE_METHODS(zs_keyboard) = {
-	{ "open",               zs_open              },
-	{ "close",              zs_close             },
-	{ "read",               zs_read_keyboard     },
-};
-
-static void
-ob_zs_init(uint64_t base, uint64_t offset, int intr, int slave, int keyboard)
-{
-    char nodebuff[256];
-
-    ob_new_obio_device("zs", "serial");
-
-    ob_reg(base, offset, ZS_REGS, 1);
-
-    PUSH(slave);
-    fword("encode-int");
-    push_str("slave");
-    fword("property");
-
-    if (keyboard) {
-        PUSH(-1);
-        fword("encode-int");
-        push_str("keyboard");
-        fword("property");
-
-        PUSH(-1);
-        fword("encode-int");
-        push_str("mouse");
-        fword("property");
-    }
-
-    ob_intr(intr);
-
-    fword("finish-device");
-
-    snprintf(nodebuff, sizeof(nodebuff), "/obio/zs at 0,%x",
-             (int)offset & 0xffffffff);
-    if (keyboard) {
-        REGISTER_NODE_METHODS(zs_keyboard, nodebuff);
-    } else {
-        REGISTER_NODE_METHODS(zs, nodebuff);
-    }
-}
-
-static void
 ob_eccmemctl_init(void)
 {
     uint32_t version, *regs;

Modified: openbios-devel/drivers/obio.h
===================================================================
--- openbios-devel/drivers/obio.h	2009-01-11 11:49:00 UTC (rev 390)
+++ openbios-devel/drivers/obio.h	2009-01-12 17:46:19 UTC (rev 391)
@@ -3,7 +3,6 @@
 #define SLAVIO_ZS        0x00000000ULL
 #define SLAVIO_ZS1       0x00100000ULL
 #define ZS_INTR          0x2c
-#define ZS_REGS          8
 
 #define SLAVIO_NVRAM     0x00200000ULL
 #define NVRAM_SIZE       0x2000

Modified: openbios-devel/include/openbios/drivers.h
===================================================================
--- openbios-devel/include/openbios/drivers.h	2009-01-11 11:49:00 UTC (rev 390)
+++ openbios-devel/include/openbios/drivers.h	2009-01-12 17:46:19 UTC (rev 391)
@@ -39,8 +39,6 @@
 /* arch/sparc32/console.c */
 void tcx_init(uint64_t base);
 void kbd_init(uint64_t base);
-int keyboard_dataready(void);
-unsigned char keyboard_readdata(void);
 #endif
 #ifdef CONFIG_DRIVER_IDE
 /* drivers/ide.c */
@@ -59,11 +57,6 @@
                  unsigned long aux1_offset, unsigned long aux2_offset);
 int start_cpu(unsigned int pc, unsigned int context_ptr, unsigned int context,
               int cpu);
-void serial_putchar(int c);
-int uart_charav(int port);
-char uart_getchar(int port);
-void serial_cls(void);
-int uart_init(uint64_t port, unsigned long speed);
 
 /* drivers/iommu.c */
 void ob_init_iommu(uint64_t base);
@@ -77,6 +70,10 @@
 extern volatile unsigned int *reset_reg;
 extern volatile struct sun4m_timer_regs *counter_regs;
 
+void ob_new_obio_device(const char *name, const char *type);
+unsigned long ob_reg(uint64_t base, uint64_t offset, unsigned long size, int map);
+void ob_intr(int intr);
+
 /* arch/sparc32/romvec.c */
 extern const char *obp_stdin_path, *obp_stdout_path;
 extern char obp_stdin, obp_stdout;
@@ -105,5 +102,15 @@
 char uart_getchar(int port);
 void serial_putchar(int c);
 #endif
-
+#ifdef CONFIG_DRIVER_ESCC
+int uart_init(uint64_t port, unsigned long speed);
+int uart_charav(int port);
+char uart_getchar(int port);
+void serial_putchar(int c);
+void serial_cls(void);
+#ifdef CONFIG_DRIVER_ESCC_SUN
+int keyboard_dataready(void);
+unsigned char keyboard_readdata(void);
+#endif
+#endif
 #endif /* OPENBIOS_DRIVERS_H */




More information about the OpenBIOS mailing list