Rev 1769 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1769 | Rev 1784 | ||
|---|---|---|---|
| Line 49... | Line 49... | ||
| 49 | #include <arch/mm/tlb.h> |
49 | #include <arch/mm/tlb.h> |
| 50 | 50 | ||
| 51 | #define KEYBOARD_POLL_PAUSE 50000 /* 50ms */ |
51 | #define KEYBOARD_POLL_PAUSE 50000 /* 50ms */ |
| 52 | 52 | ||
| 53 | static void ofw_sparc64_putchar(chardev_t *d, const char ch); |
53 | static void ofw_sparc64_putchar(chardev_t *d, const char ch); |
| 54 | static char ofw_sparc64_getchar(chardev_t *d); |
- | |
| 55 | static void ofw_sparc64_suspend(chardev_t *d); |
- | |
| 56 | static void ofw_sparc64_resume(chardev_t *d); |
- | |
| 57 | - | ||
| 58 | mutex_t canwork; |
- | |
| 59 | 54 | ||
| 60 | static volatile int ofw_console_active; |
55 | static volatile int ofw_console_active; |
| 61 | 56 | ||
| 62 | static chardev_t ofw_sparc64_console; |
57 | static chardev_t ofw_sparc64_console; |
| 63 | static chardev_operations_t ofw_sparc64_console_ops = { |
58 | static chardev_operations_t ofw_sparc64_console_ops = { |
| 64 | .write = ofw_sparc64_putchar, |
59 | .write = ofw_sparc64_putchar, |
| 65 | .read = ofw_sparc64_getchar, |
- | |
| 66 | .resume = ofw_sparc64_resume, |
- | |
| 67 | .suspend = ofw_sparc64_suspend |
- | |
| 68 | }; |
60 | }; |
| 69 | 61 | ||
| 70 | /** Initialize kernel console to use OpenFirmware services. */ |
62 | /** Initialize kernel console to use OpenFirmware services. */ |
| 71 | void ofw_sparc64_console_init(void) |
63 | void ofw_sparc64_console_init(void) |
| 72 | { |
64 | { |
| 73 | chardev_initialize("ofw_sparc64_console", &ofw_sparc64_console, &ofw_sparc64_console_ops); |
65 | chardev_initialize("ofw_sparc64_console", &ofw_sparc64_console, &ofw_sparc64_console_ops); |
| 74 | stdin = &ofw_sparc64_console; |
66 | stdin = NULL; |
| 75 | stdout = &ofw_sparc64_console; |
67 | stdout = &ofw_sparc64_console; |
| 76 | mutex_initialize(&canwork); |
- | |
| 77 | ofw_console_active = 1; |
68 | ofw_console_active = 1; |
| 78 | } |
69 | } |
| 79 | 70 | ||
| 80 | /** Initialize kernel console to use framebuffer and keyboard directly. */ |
71 | /** Initialize kernel console to use framebuffer and keyboard directly. */ |
| 81 | void standalone_sparc64_console_init(void) |
72 | void standalone_sparc64_console_init(void) |
| Line 92... | Line 83... | ||
| 92 | * @param d Character device (ignored). |
83 | * @param d Character device (ignored). |
| 93 | * @param ch Character to be written. |
84 | * @param ch Character to be written. |
| 94 | */ |
85 | */ |
| 95 | void ofw_sparc64_putchar(chardev_t *d, const char ch) |
86 | void ofw_sparc64_putchar(chardev_t *d, const char ch) |
| 96 | { |
87 | { |
| 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 | if (ch == '\n') |
88 | if (ch == '\n') |
| 107 | ofw_putchar('\r'); |
89 | ofw_putchar('\r'); |
| 108 | ofw_putchar(ch); |
90 | ofw_putchar(ch); |
| 109 | - | ||
| 110 | pstate.am = false; |
- | |
| 111 | pstate_write(pstate.value); |
- | |
| 112 | } |
- | |
| 113 | - | ||
| 114 | /** Read one character using OpenFirmware. |
- | |
| 115 | * |
- | |
| 116 | * The call is non-blocking. |
- | |
| 117 | * |
- | |
| 118 | * @param d Character device (ignored). |
- | |
| 119 | * @return Character read or zero if no character was read. |
- | |
| 120 | */ |
- | |
| 121 | char ofw_sparc64_getchar(chardev_t *d) |
- | |
| 122 | { |
- | |
| 123 | char ch; |
- | |
| 124 | pstate_reg_t pstate; |
- | |
| 125 | - | ||
| 126 | /* |
- | |
| 127 | * 32-bit OpenFirmware depends on PSTATE.AM bit set. |
- | |
| 128 | */ |
- | |
| 129 | pstate.value = pstate_read(); |
- | |
| 130 | pstate.am = true; |
- | |
| 131 | pstate_write(pstate.value); |
- | |
| 132 | - | ||
| 133 | ch = ofw_getchar(); |
- | |
| 134 | - | ||
| 135 | pstate.am = false; |
- | |
| 136 | pstate_write(pstate.value); |
- | |
| 137 | - | ||
| 138 | return ch; |
- | |
| 139 | } |
- | |
| 140 | - | ||
| 141 | void ofw_sparc64_suspend(chardev_t *d) |
- | |
| 142 | { |
- | |
| 143 | mutex_lock(&canwork); |
- | |
| 144 | } |
- | |
| 145 | - | ||
| 146 | void ofw_sparc64_resume(chardev_t *d) |
- | |
| 147 | { |
- | |
| 148 | mutex_unlock(&canwork); |
- | |
| 149 | } |
- | |
| 150 | - | ||
| 151 | /** Kernel thread for pushing characters read from OFW to input buffer. |
- | |
| 152 | * |
- | |
| 153 | * @param arg Ignored. |
- | |
| 154 | */ |
- | |
| 155 | void kofwinput(void *arg) |
- | |
| 156 | { |
- | |
| 157 | - | ||
| 158 | while (ofw_console_active) { |
- | |
| 159 | char ch = 0; |
- | |
| 160 | - | ||
| 161 | mutex_lock(&canwork); |
- | |
| 162 | mutex_unlock(&canwork); |
- | |
| 163 | - | ||
| 164 | ch = ofw_sparc64_getchar(NULL); |
- | |
| 165 | if (ch) { |
- | |
| 166 | if (ch == '\r') |
- | |
| 167 | ch = '\n'; |
- | |
| 168 | chardev_push_character(&ofw_sparc64_console, ch); |
- | |
| 169 | } |
- | |
| 170 | thread_usleep(KEYBOARD_POLL_PAUSE); |
- | |
| 171 | } |
- | |
| 172 | } |
91 | } |
| 173 | 92 | ||
| 174 | /** Kernel thread for polling keyboard. |
93 | /** Kernel thread for polling keyboard. |
| 175 | * |
94 | * |
| 176 | * @param arg Ignored. |
95 | * @param arg Ignored. |