Subversion Repositories HelenOS-historic

Rev

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.