Changeset 481c520 in mainline for arch/sparc64/src/console.c
- Timestamp:
- 2006-02-27T12:30:11Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 02f441c0
- Parents:
- 4a2b52f
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/sparc64/src/console.c
r4a2b52f r481c520 32 32 #include <genarch/fb/fb.h> 33 33 #include <arch/drivers/fb.h> 34 #include <genarch/ofw/ofw.h> 35 #include <console/chardev.h> 36 #include <console/console.h> 37 #include <arch/asm.h> 38 #include <arch/register.h> 39 #include <proc/thread.h> 40 #include <synch/mutex.h> 34 41 35 void fb_sparc64_console_init(void) 42 static void ofw_sparc64_putchar(chardev_t *d, const char ch); 43 static char ofw_sparc64_getchar(chardev_t *d); 44 static void ofw_sparc64_suspend(chardev_t *d); 45 static void ofw_sparc64_resume(chardev_t *d); 46 47 mutex_t canwork; 48 49 static volatile int ofw_console_active; 50 51 static chardev_t ofw_sparc64_console; 52 static chardev_operations_t ofw_sparc64_console_ops = { 53 .write = ofw_sparc64_putchar, 54 .read = ofw_sparc64_getchar, 55 .resume = ofw_sparc64_resume, 56 .suspend = ofw_sparc64_suspend 57 }; 58 59 /** Initialize kernel console to use OpenFirmware services. */ 60 void ofw_sparc64_console_init(void) 36 61 { 62 chardev_initialize("ofw_sparc64_console", &ofw_sparc64_console, &ofw_sparc64_console_ops); 63 stdin = &ofw_sparc64_console; 64 stdout = &ofw_sparc64_console; 65 mutex_initialize(&canwork); 66 ofw_console_active = 1; 67 } 68 69 /** Initialize kernel console to use framebuffer and keyboard directly. */ 70 void standalone_sparc64_console_init(void) 71 { 72 ofw_console_active = 0; 73 stdin = NULL; 37 74 fb_init(FB_VIRT_ADDRESS, FB_X_RES, FB_Y_RES, FB_COLOR_DEPTH/8); 38 75 } 76 77 /** Write one character using OpenFirmware. 78 * 79 * @param d Character device (ignored). 80 * @param ch Character to be written. 81 */ 82 void ofw_sparc64_putchar(chardev_t *d, const char ch) 83 { 84 pstate_reg_t pstate; 85 86 /* 87 * 32-bit OpenFirmware depends on PSTATE.AM bit set. 88 */ 89 pstate.value = pstate_read(); 90 pstate.am = true; 91 pstate_write(pstate.value); 92 93 if (ch == '\n') 94 ofw_putchar('\r'); 95 ofw_putchar(ch); 96 97 pstate.am = false; 98 pstate_write(pstate.value); 99 } 100 101 /** Read one character using OpenFirmware. 102 * 103 * The call is non-blocking. 104 * 105 * @param d Character device (ignored). 106 * @return Character read or zero if no character was read. 107 */ 108 char ofw_sparc64_getchar(chardev_t *d) 109 { 110 char ch; 111 pstate_reg_t pstate; 112 113 /* 114 * 32-bit OpenFirmware depends on PSTATE.AM bit set. 115 */ 116 pstate.value = pstate_read(); 117 pstate.am = true; 118 pstate_write(pstate.value); 119 120 ch = ofw_getchar(); 121 122 pstate.am = false; 123 pstate_write(pstate.value); 124 125 return ch; 126 } 127 128 void ofw_sparc64_suspend(chardev_t *d) 129 { 130 mutex_lock(&canwork); 131 } 132 133 void ofw_sparc64_resume(chardev_t *d) 134 { 135 mutex_unlock(&canwork); 136 } 137 138 /** Kernel thread for pushing characters read from OFW to input buffer. 139 * 140 * @param arg Ignored. 141 */ 142 void kofwinput(void *arg) 143 { 144 145 while (ofw_console_active) { 146 char ch = 0; 147 148 mutex_lock(&canwork); 149 mutex_unlock(&canwork); 150 151 ch = ofw_sparc64_getchar(NULL); 152 if (ch) { 153 if (ch == '\r') 154 ch = '\n'; 155 chardev_push_character(&ofw_sparc64_console, ch); 156 } 157 thread_usleep(25000); 158 } 159 }
Note:
See TracChangeset
for help on using the changeset viewer.