[OpenBIOS] r41 - in openbios-devel: arch/sparc32 config/examples

svn@openbios.org svn at openbios.org
Mon Jun 5 14:37:25 CEST 2006


Author: stepan
Date: 2006-06-05 14:37:25 +0200 (Mon, 05 Jun 2006)
New Revision: 41

Modified:
   openbios-devel/arch/sparc32/console.c
   openbios-devel/arch/sparc32/openbios.c
   openbios-devel/config/examples/cross-sparc32_config.xml
   openbios-devel/config/examples/sparc32_config.xml
Log:
sparc32 -20 merge remainder


Modified: openbios-devel/arch/sparc32/console.c
===================================================================
--- openbios-devel/arch/sparc32/console.c	2006-06-05 12:35:11 UTC (rev 40)
+++ openbios-devel/arch/sparc32/console.c	2006-06-05 12:37:25 UTC (rev 41)
@@ -17,10 +17,30 @@
 
 #ifdef CONFIG_DEBUG_CONSOLE_SERIAL
 
+#define KBD_BASE    0x71000004
 #define SERIAL_BASE 0x71100004
 #define CTRL(port) (SERIAL_BASE + (port) * 2 + 0)
 #define DATA(port) (SERIAL_BASE + (port) * 2 + 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 */
+
+/* Write Register 5 */
+#define	TxENAB		0x8	/* Tx Enable */
+
+/* Write Register 14 (Misc control bits) */
+#define	BRENAB 	1	/* Baud rate generator enable */
+#define	BRSRC	2	/* Baud rate generator source */
+
 static int uart_charav(int port)
 {
 	return ((inb(CTRL(port)) & 1) != 0);
@@ -42,13 +62,20 @@
 
 static void uart_init_line(int port, unsigned long baud)
 {
-	outb(3, CTRL(port)); // reg 3
-	outb(1, CTRL(port)); // enable rx
+        outb(3, CTRL(port)); // reg 3
+        outb(RxENAB, CTRL(port)); // enable rx
 
-	outb(5, CTRL(port)); // reg 5
-	outb(8, CTRL(port)); // enable tx
+        outb(5, CTRL(port)); // reg 5
+        outb(TxENAB, CTRL(port)); // enable tx
 
-	// XXX: baud rate
+        baud = BPS_TO_BRG(baud, ZS_CLOCK / ZS_CLOCK_DIVISOR);
+
+        outb(12, CTRL(port)); // reg 12
+        outb(baud & 0xff, CTRL(port));
+        outb(13, CTRL(port)); // reg 13
+        outb((baud >> 8) & 0xff, CTRL(port));
+        outb(14, CTRL(port)); // reg 14
+        outb(BRSRC | BRENAB, CTRL(port));
 }
 
 int uart_init(int port, unsigned long speed)
@@ -75,6 +102,143 @@
 #endif
 
 /* ******************************************************************
+ *          simple polling video/keyboard console functions
+ * ****************************************************************** */
+
+#ifdef CONFIG_DEBUG_CONSOLE_VIDEO
+
+#define VMEM_BASE 0x00800000
+#define VMEM_SIZE (1024*768*1)
+#define DAC_BASE  0x00200000
+#define DAC_SIZE  16
+
+static unsigned char *vmem;
+static volatile uint32_t *dac;
+
+typedef struct osi_fb_info {
+	unsigned long   mphys;
+	int             rb, w, h, depth;
+} osi_fb_info_t;
+
+int TCX_GetFBInfo( osi_fb_info_t *fb )
+{
+    fb->w = 1024;
+    fb->h = 768;
+    fb->depth = 8;
+    fb->rb = 1024;
+    fb->mphys = vmem;
+
+    return 0;
+}
+
+#define openbios_GetFBInfo(x) TCX_GetFBInfo(x)
+
+#include "../../modules/video.c"
+#include "../../modules/console.c"
+
+static void video_putchar(int c)
+{
+    char buf[2];
+
+    buf[0] = c & 0xff;
+    buf[1] = 0;
+
+    console_draw_str(buf);
+}
+
+static void video_cls(void)
+{
+    memset((void *)vmem, 0, VMEM_SIZE);
+}
+
+void tcx_init(unsigned long base)
+{
+#if 1
+    unsigned int i;
+
+    // Create 1:1 mapping for video memory
+    for (i = 0; i < VMEM_SIZE; i += 4096) {
+        map_page(base + VMEM_BASE + i, base + VMEM_BASE + i, 0);
+    }
+    vmem = (char *)base + VMEM_BASE;
+#else
+    vmem = map_io(base + VMEM_BASE, VMEM_SIZE);
+#endif
+    dac = map_io(base + DAC_BASE, DAC_SIZE);
+
+    console_init();
+}
+
+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;
+
+static int
+keyboard_dataready(void)
+{
+    return ((inb(KBD_BASE) & 1) == 1);
+}
+
+static unsigned char
+keyboard_readdata(void)
+{
+    unsigned char ch;
+
+    while (!keyboard_dataready()) { }
+
+    do {
+        ch = inb(KBD_BASE + 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;
+}
+
+#endif
+
+/* ******************************************************************
  *      common functions, implementing simple concurrent console
  * ****************************************************************** */
 
@@ -83,6 +247,9 @@
 #ifdef CONFIG_DEBUG_CONSOLE_SERIAL
 	serial_putchar(c);
 #endif
+#ifdef CONFIG_DEBUG_CONSOLE_VIDEO
+	video_putchar(c);
+#endif
 	return c;
 }
 
@@ -92,6 +259,10 @@
 	if (uart_charav(CONFIG_SERIAL_PORT))
 		return 1;
 #endif
+#ifdef CONFIG_DEBUG_CONSOLE_VIDEO
+	if (keyboard_dataready())
+		return 1;
+#endif
 	return 0;
 }
 
@@ -101,6 +272,10 @@
 	if (uart_charav(CONFIG_SERIAL_PORT))
 		return (uart_getchar(CONFIG_SERIAL_PORT));
 #endif
+#ifdef CONFIG_DEBUG_CONSOLE_VIDEO
+	if (keyboard_dataready())
+		return (keyboard_readdata());
+#endif
 	return 0;
 }
 
@@ -109,6 +284,10 @@
 #ifdef CONFIG_DEBUG_CONSOLE_SERIAL
 	serial_cls();
 #endif
+#ifdef CONFIG_DEBUG_CONSOLE_VIDEO
+	video_cls();
+#endif
 }
 
+
 #endif				// CONFIG_DEBUG_CONSOLE

Modified: openbios-devel/arch/sparc32/openbios.c
===================================================================
--- openbios-devel/arch/sparc32/openbios.c	2006-06-05 12:35:11 UTC (rev 40)
+++ openbios-devel/arch/sparc32/openbios.c	2006-06-05 12:37:25 UTC (rev 41)
@@ -18,10 +18,12 @@
 
 void boot(void);
 void ob_ide_init(void);
+void tcx_init(unsigned long base);
 
 #define IOMMU_BASE    0x10000000 /* First page of sun4m IOMMU */
 #define SLAVIO_BASE   0x71000000
 #define MACIO_BASE    0x70000000
+#define TCX_BASE      0x50000000
 
 static unsigned char intdict[256 * 1024];
 
@@ -46,10 +48,13 @@
 
 	modules_init();
 #ifdef CONFIG_DRIVER_SBUS
-        init_mmu_swift(IOMMU_BASE);
-   
+        ob_init_mmu(IOMMU_BASE);
 	ob_sbus_init();
+
+#ifdef CONFIG_DEBUG_CONSOLE_VIDEO
+	init_video();
 #endif
+#endif
 #ifdef CONFIG_DRIVER_ESP
 	ob_esp_init(MACIO_BASE);
 #endif
@@ -68,10 +73,16 @@
         extern struct mem cmem;
 
         mem_init(&cmem, (char *) &_vmem, (char *)&_evmem);
+#ifdef CONFIG_DRIVER_SBUS
+        init_mmu_swift(IOMMU_BASE);
+#endif
 #ifdef CONFIG_DEBUG_CONSOLE
 #ifdef CONFIG_DEBUG_CONSOLE_SERIAL
 	uart_init(CONFIG_SERIAL_PORT, CONFIG_SERIAL_SPEED);
 #endif
+#ifdef CONFIG_DEBUG_CONSOLE_VIDEO
+	tcx_init(TCX_BASE);
+#endif
 	/* Clear the screen.  */
 	cls();
 #endif
@@ -83,9 +94,6 @@
 			(unsigned long)sys_info.dict_end 
                         - (unsigned long)sys_info.dict_start);
 	
-#ifdef CONFIG_DEBUG_CONSOLE_VIDEO
-	video_init();
-#endif
 #ifdef CONFIG_DEBUG_BOOT
 	printk("forth started.\n");
 	printk("initializing memory...");

Modified: openbios-devel/config/examples/cross-sparc32_config.xml
===================================================================
--- openbios-devel/config/examples/cross-sparc32_config.xml	2006-06-05 12:35:11 UTC (rev 40)
+++ openbios-devel/config/examples/cross-sparc32_config.xml	2006-06-05 12:37:25 UTC (rev 41)
@@ -26,6 +26,7 @@
   <option name="CONFIG_DEBUG_INTERPRETER" type="boolean" value="false"/>
   <option name="CONFIG_DEBUG_CONSOLE" type="boolean" value="true"/>
   <option name="CONFIG_DEBUG_CONSOLE_SERIAL" type="boolean" value="true"/>
+  <option name="CONFIG_DEBUG_CONSOLE_VIDEO" type="boolean" value="true"/>
   <option name="CONFIG_DEBUG_ESP" type="boolean" value="false"/>
   <option name="CONFIG_DEBUG_SUN_PARTS" type="boolean" value="false"/>
   <option name="CONFIG_DEBUG_OBP" type="boolean" value="false"/>

Modified: openbios-devel/config/examples/sparc32_config.xml
===================================================================
--- openbios-devel/config/examples/sparc32_config.xml	2006-06-05 12:35:11 UTC (rev 40)
+++ openbios-devel/config/examples/sparc32_config.xml	2006-06-05 12:37:25 UTC (rev 41)
@@ -26,6 +26,7 @@
   <option name="CONFIG_DEBUG_INTERPRETER" type="boolean" value="false"/>
   <option name="CONFIG_DEBUG_CONSOLE" type="boolean" value="true"/>
   <option name="CONFIG_DEBUG_CONSOLE_SERIAL" type="boolean" value="true"/>
+  <option name="CONFIG_DEBUG_CONSOLE_VIDEO" type="boolean" value="true"/>
   <option name="CONFIG_DEBUG_ESP" type="boolean" value="false"/>
   <option name="CONFIG_DEBUG_SUN_PARTS" type="boolean" value="false"/>
   <option name="CONFIG_DEBUG_OBP" type="boolean" value="false"/>




More information about the OpenBIOS mailing list