Changeset 65fb232 in mainline
- Timestamp:
- 2005-12-30T22:38:23Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 6ccb238
- Parents:
- 80bff342
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/sparc64/include/console.h
r80bff342 r65fb232 30 30 #define __sparc64_CONSOLE_H__ 31 31 32 extern void kofwinput(void *arg); 32 33 extern void ofw_sparc64_console_init(void); 33 34 -
arch/sparc64/src/console.c
r80bff342 r65fb232 33 33 #include <arch/asm.h> 34 34 #include <arch/register.h> 35 #include <arch/types.h> 36 #include <typedefs.h> 37 #include <proc/thread.h> 38 #include <synch/mutex.h> 35 39 36 40 static void ofw_sparc64_putchar(chardev_t *d, const char ch); 41 static char ofw_sparc64_getchar(chardev_t *d); 42 static void ofw_sparc64_suspend(chardev_t *d); 43 static void ofw_sparc64_resume(chardev_t *d); 44 45 mutex_t canwork; 37 46 38 47 static chardev_t ofw_sparc64_console; 39 48 static chardev_operations_t ofw_sparc64_console_ops = { 40 .write = ofw_sparc64_putchar 49 .write = ofw_sparc64_putchar, 50 .read = ofw_sparc64_getchar, 51 .resume = ofw_sparc64_resume, 52 .suspend = ofw_sparc64_suspend 41 53 }; 42 54 … … 44 56 { 45 57 chardev_initialize("ofw_sparc64_console", &ofw_sparc64_console, &ofw_sparc64_console_ops); 58 stdin = &ofw_sparc64_console; 46 59 stdout = &ofw_sparc64_console; 60 mutex_initialize(&canwork); 47 61 } 48 62 49 /** Printone character.63 /** Write one character. 50 64 * 51 * @param ch Character to be printed. 65 * @param d Character device (ignored). 66 * @param ch Character to be written. 52 67 */ 53 68 void ofw_sparc64_putchar(chardev_t *d, const char ch) … … 69 84 pstate_write(pstate.value); 70 85 } 86 87 /** Read one character. 88 * 89 * The call is non-blocking. 90 * 91 * @param d Character device (ignored). 92 * @return Character read or zero if no character was read. 93 */ 94 char ofw_sparc64_getchar(chardev_t *d) 95 { 96 char ch; 97 pstate_reg_t pstate; 98 99 /* 100 * 32-bit OpenFirmware depends on PSTATE.AM bit set. 101 */ 102 pstate.value = pstate_read(); 103 pstate.am = true; 104 pstate_write(pstate.value); 105 106 ch = ofw_getchar(); 107 108 pstate.am = false; 109 pstate_write(pstate.value); 110 111 return ch; 112 } 113 114 void ofw_sparc64_suspend(chardev_t *d) 115 { 116 mutex_lock(&canwork); 117 } 118 119 void ofw_sparc64_resume(chardev_t *d) 120 { 121 mutex_unlock(&canwork); 122 } 123 124 /** Kernel thread for pushing characters read from OFW to input buffer. 125 * 126 * @param arg Ignored. 127 */ 128 void kofwinput(void *arg) 129 { 130 131 while (1) { 132 char ch = 0; 133 134 mutex_lock(&canwork); 135 mutex_unlock(&canwork); 136 137 ch = ofw_sparc64_getchar(NULL); 138 if (ch) { 139 if (ch == '\r') 140 ch = '\n'; 141 chardev_push_character(&ofw_sparc64_console, ch); 142 } 143 thread_usleep(25000); 144 } 145 } -
arch/sparc64/src/sparc64.c
r80bff342 r65fb232 28 28 29 29 #include <arch.h> 30 #include < print.h>30 #include <debug.h> 31 31 #include <arch/trap/trap.h> 32 32 #include <arch/console.h> 33 33 #include <arch/drivers/tick.h> 34 #include <proc/thread.h> 34 35 35 36 void arch_pre_mm_init(void) … … 51 52 void arch_post_smp_init(void) 52 53 { 54 thread_t *t; 55 56 /* 57 * Create thread that reads characters from OFW's input. 58 */ 59 t = thread_create(kofwinput, NULL, TASK, 0); 60 if (!t) 61 panic("cannot create kofwinput\n"); 62 thread_ready(t); 53 63 } 54 64 -
genarch/include/ofw/ofw.h
r80bff342 r65fb232 56 56 extern __native ofw_call(const char *service, const int nargs, const int nret, ...); 57 57 extern void ofw_putchar(const char ch); 58 extern char ofw_getchar(void); 58 59 extern phandle ofw_find_device(const char *name); 59 60 extern int ofw_get_property(const phandle device, const char *name, void *buf, const int buflen); -
genarch/src/ofw/ofw.c
r80bff342 r65fb232 36 36 37 37 phandle ofw_chosen; 38 ihandle ofw_stdin; 38 39 ihandle ofw_stdout; 39 40 … … 44 45 ofw_done(); 45 46 47 if (ofw_get_property(ofw_chosen, "stdin", &ofw_stdin, sizeof(ofw_stdin)) <= 0) 48 ofw_stdin = 0; 49 46 50 if (ofw_get_property(ofw_chosen, "stdout", &ofw_stdout, sizeof(ofw_stdout)) <= 0) 47 ofw_stdout = 0; 51 ofw_stdout = 0; 48 52 } 49 53 … … 85 89 } 86 90 91 /** Read character from OFW's input. 92 * 93 * This call is non-blocking. 94 * 95 * @return 0 if no character was read, character read otherwise. 96 */ 97 char ofw_getchar(void) 98 { 99 char ch; 100 101 if (ofw_stdin == 0) 102 return 0; 103 104 if (ofw_call("read", 3, 1, ofw_stdin, &ch, 1) == 1) 105 return ch; 106 else 107 return 0; 108 } 109 87 110 phandle ofw_find_device(const char *name) 88 111 { -
generic/include/console/chardev.h
r80bff342 r65fb232 64 64 chardev_t *chardev, 65 65 chardev_operations_t *op); 66 void chardev_push_character(chardev_t *chardev, __u8 ch);66 extern void chardev_push_character(chardev_t *chardev, __u8 ch); 67 67 68 68 #endif /* __CHARDEV_H__ */
Note:
See TracChangeset
for help on using the changeset viewer.