Subversion Repositories HelenOS-historic

Rev

Rev 883 | Rev 894 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 883 Rev 893
Line 29... Line 29...
29
#include <arch/console.h>
29
#include <arch/console.h>
30
#include <arch/types.h>
30
#include <arch/types.h>
31
#include <typedefs.h>
31
#include <typedefs.h>
32
#include <genarch/fb/fb.h>
32
#include <genarch/fb/fb.h>
33
#include <arch/drivers/fb.h>
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
 
-
 
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. */
35
void fb_sparc64_console_init(void)
60
void ofw_sparc64_console_init(void)
-
 
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)
36
{
71
{
-
 
72
    ofw_console_active = 0;
-
 
73
    stdin = NULL;
37
    fb_init(FB_VIRT_ADDRESS, FB_X_RES, FB_Y_RES, FB_COLOR_DEPTH/8);
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
}